-1

各クラスタ内のinstagram/hotel比率を計算したい場合。しかし、結果は、私は実際に非常に離れた点を一緒にクラスタリングしていることを示しています。これは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を持つためです。 –

関連する問題