-1

각 클러스터 내에서 인스 트램/호텔 비율을 계산하고 싶습니다. 그러나 결과는 실제로 나는 아주 먼 지점을 함께 모으고 있음을 보여줍니다. DBSCAN에서는 그렇지 않습니다. 뭐가 문제 야?DBSCAN 함께 원거리 클러스터링

절차 : DBSCAN을 사용하여 Instagram 게시를 클러스터링 한 다음 1NN을 사용하여 호텔을 분류하십시오.

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 
from sklearn.cluster import KMeans 
from sklearn.cluster import DBSCAN 
from sklearn.neighbors import KNeighborsClassifier 


if __name__ == '__main__': 
    inst = pd.read_csv('inst.csv', encoding='utf-8') 
    ht = pd.read_csv('ht.csv', encoding='utf-8') 

    inst = inst[(inst.lat >= 48.30) & (inst.lng >= -139.06) & (inst.lat <= 60.00) & (inst.lng <= -114.03)] 
    ht = ht[(ht.lat >= 48.30) & (ht.lng >= -139.06) & (ht.lat <= 60.00) & (ht.lng <= -114.03)] 

    # kmean = KMeans(n_clusters=50,n_jobs=-1) 
    # kmean.fit(inst[['lat', 'lng']]) 
    # 
    # ht_labels = kmean.predict(ht[['lat', 'lng']]) 
    # inst_labels = kmean.predict(inst[['lat', 'lng']]) 
    # 
    # plt.scatter(ht.lng, ht.lat, c=ht_labels, alpha=0.5) 
    # plt.savefig('./fig/hotel_clusters.png') 
    # plt.clf() 
    # 
    # plt.scatter(inst.lng, inst.lat, c=inst_labels, alpha=0.5) 
    # plt.savefig('./fig/instagram_posts_clusters.png') 
    # plt.clf() 

    dbs = DBSCAN(eps=0.05,min_samples=10,metric='haversine', n_jobs=-1) 

    ht_labels = dbs.fit_predict(ht[['lat', 'lng']]) 
    inst_labels = dbs.fit_predict(inst[['lat', 'lng']]) 

    plt.scatter(ht.lng, ht.lat, c=ht_labels, alpha=0.5) 
    plt.savefig('./fig/hotel_clusters1.png') 
    plt.clf() 

    plt.scatter(inst.lng, inst.lat, c=inst_labels, alpha=0.5) 
    plt.savefig('./fig/instagram_posts_clusters1.png') 
    plt.clf() 

    knn = KNeighborsClassifier(n_neighbors=1, n_jobs=-1) 

    knn.fit(inst[['lat', 'lng']], inst_labels) 
    ht_labels = knn.predict(ht[['lat', 'lng']]) 

    plt.scatter(ht.lng, ht.lat, c=ht_labels, alpha=0.5) 
    plt.savefig('./fig/hotel_clusters3.png') 
    plt.clf() 

    plt.scatter(inst.lng, inst.lat, c=inst_labels, alpha=0.5) 
    plt.savefig('./fig/instagram_posts_clusters3.png') 
    plt.clf() 

    ht = ht[['lat', 'lng']] 
    ht['lb'] = ht_labels 
    inst = inst[['lat', 'lng']] 
    inst['lb'] = inst_labels 

    ht1 = ht.groupby(['lb']).count().reset_index().set_index('lb') 
    inst1 = inst.groupby(['lb']).count().reset_index().set_index('lb') 

    print(ht1) 
    ratio = inst1/ht1 
    print(ratio) 

    clu = 2 
    plt.scatter(ht[ht.lb == clu].lng, ht[ht.lb == clu].lat, c='black') 
    print(len(ht[ht.lb == clu])) 
    plt.scatter(ht.lng, ht.lat, c=ht_labels, alpha=0.05) 
    plt.savefig('./fig/hotel_clusters4.png') 
    plt.clf() 

버그를 찾을 수 없습니다. 도와주세요.

enter image description here

enter image description here

+1

"매우 먼 지점"은 얼마나 먼 거리입니까? 이것이 엡실론 문제라면 주어진 정보로부터 말하기는 어렵습니다. – ako

+0

포인트 방식이 엡실론 이상입니까? – ZHU

+1

더 중요한 것은, 같은 클러스터에 있지 않은 지점이 많다는 것입니다. – ZHU

답변

1

Sklearn의 havrsine 라디안이 아닌 각도 좌표를 예상한다.

그래서 mod 2pi 헤드 포인트가 가깝습니다.

+0

그러나 멀리 떨어져있는 지점을 클러스터링하지 않고 그 사이를 건너 뜁니다. – ZHU

+0

물론이 문제가 발생할 수 있습니다. 점 (x, y)와 (x + 10pi, y)는 거리가 0이기 때문에. –

관련 문제