-1

Möchten Instagram/Hotel-Verhältnis innerhalb jedes Clusters berechnen. Aber das Ergebnis zeigt, dass ich tatsächlich sehr weit entfernte Punkte zusammenfasse. Dies ist für DBSCAN nicht wahrscheinlich. Was ist los mit dir?DBSCAN Clustering entfernte Punkte zusammen

Vorgehensweise: Verwenden Sie DBSCAN, um Instagram-Posts zu gruppieren, und verwenden Sie dann 1NN, um Hotels zu klassifizieren.

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() 

Ich kann den Fehler nicht finden, können Sie bitte helfen?

enter image description here

enter image description here

+1

Wie weit entfernt sind "sehr entfernte Punkte"? Aus den gegebenen Informationen ist schwer zu sagen, ob dies ein Epsilon-Problem ist. – ako

+0

wie Punkte viel mehr als Epsilon? – ZHU

+1

Noch wichtiger, es gibt viele Punkte dazwischen, die nicht im selben Cluster sind – ZHU

Antwort

1

Sklearn havrsine erwartet die Koordinaten im Bogenmaß nicht Grad.

Also mod 2pi Kopf Punkte sind in der Nähe, ich nehme an.

+0

Aber das sammelt nicht Punkte, die weit weg sind, und hüpft zwischen – ZHU

+0

aus. Das wird natürlich dieses Problem verursachen. Weil der Punkt (x, y) und (x + 10pi, y) den Abstand 0 haben. –

Verwandte Themen