首页 > 解决方案 > 在 python 中使用经度和纬度数据可视化 DBSCAN 集群和半径

问题描述

我正在使用一个包含整个城市点的经度和纬度数据的数据集。我已经应用了 DBSCAN 聚类并计算了聚类的质心。

我已经成功地在 folium 地图上进行地理编码和绘制点,但我找不到在地图上绘制集群的方法(我使用的是 Python)。

如何在 folium 地图上可视化这些集群的形状?


# data_1 contains a columof longitude and a column for latitude 
coords = data_1.as_matrix(columns=['Origin_Latitude', 'Origin_Longitude']) # DBSCAN 
kms_per_radian = 6371 
epsilon = 1.5/kms_per_radian 
db = DBSCAN(eps=epsilon, 
            min_samples=1, 
            algorithm='ball_tree', 
            metric='haversine').fit(np.radians(coords)) 
cluster_labels = db.labels_ 
num_clusters = len(set(cluster_labels)) 
clusters = pd.Series( [coords[cluster_labels==n] for n in range(num_clusters)] )


# Plotting all points from folium.plugins 
import MarkerCluster from folium import plugins 
some_map_1 = folium.Map(location=[data_1['Origin_Latitude'].mean(), data_1['Origin_Longitude'].mean()], zoom_start=25) 
mc = MarkerCluster() 
j = 0 
row = 0 
for row in range(len(clusters)): 
    for j in range(len(clusters[row])): 
        mc.add_child(folium.Marker(location=[clusters[row][j][0],clusters[row][j][1]], popup=row))
        some_map_1.add_child(mc)
        some_map_1

标签: pythonmapscluster-analysisfoliumdbscan

解决方案


像这样的东西应该为你做。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import seaborn as sns; sns.set()
import csv


df = pd.read_csv('C:\\your_path\\properties_2017.csv')
# df.head(10)
df = df.head(10000)

df.shape


df.dropna(axis=0,how='any',subset=['latitude','longitude'],inplace=True)

# Variable with the Longitude and Latitude
X=df.loc[:,['parcelid','latitude','longitude']]
X.head(10)
       
K_clusters = range(1,10)
kmeans = [KMeans(n_clusters=i) for i in K_clusters]
Y_axis = df[['latitude']]
X_axis = df[['longitude']]
score = [kmeans[i].fit(Y_axis).score(Y_axis) for i in range(len(kmeans))] # Visualize
plt.plot(K_clusters, score)
plt.xlabel('Number of Clusters')
plt.ylabel('Score')
plt.title('Elbow Curve')
plt.show()

 

kmeans = KMeans(n_clusters = 3, init ='k-means++')
kmeans.fit(X[X.columns[1:3]]) # Compute k-means clustering.X['cluster_label'] = kmeans.fit_predict(X[X.columns[1:3]])centers = kmeans.cluster_centers_ # Coordinates of cluster centers.labels = kmeans.predict(X[X.columns[1:3]]) # Labels of each pointX.head(10)

X['cluster_label'] = kmeans.fit_predict(X[X.columns[1:3]])
centers = kmeans.cluster_centers_ # Coordinates of cluster centers.
labels = kmeans.predict(X[X.columns[1:3]]) # Labels of each pointX.head(10)

X.head(5)

X = X[['parcelid','cluster_label']]
X.head(5)


       parcelid  cluster_label
    0  10754147              0
    1  10759547              0
    2  10843547              2
    3  10859147              2
    4  10879947              2


clustered_data = df.merge(X, left_on='parcelid', right_on='parcelid')
clustered_data.head(5)

centers = kmeans.cluster_centers_
print(centers)


X=df.loc[:,['parcelid','latitude','longitude']]
X.plot.scatter(x = 'latitude', y = 'longitude', c=labels, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5)

在此处输入图像描述

数据源:

https://www.kaggle.com/xxing9703/kmean-clustering-of-latitude-and-longitude/data


推荐阅读