如果有一个包含vehicle_id,lon,lat的csv文件,根据经纬度聚类,将聚类的每一类数据保存在csv文件,并且将聚类结果可视化,给图上的每一个类别打上标签,还要打印每一类的中心和数据个数,聚类使用kmeans并且聚成30类,写出完整代码,还要把每一类的聚类中心在地理地图上画出来
时间: 2023-12-15 14:06:20 浏览: 54
以下是完整代码,其中需要用到pandas、numpy、sklearn、folium、geopy等模块,请确保已经安装了这些模块。
```python
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import folium
from geopy.distance import great_circle
# 读取csv文件
df = pd.read_csv('data.csv')
# 转换经纬度为弧度
df['lon'] = np.radians(df['lon'])
df['lat'] = np.radians(df['lat'])
# 使用kmeans聚类
kmeans = KMeans(n_clusters=30, random_state=0).fit(df[['lon', 'lat']])
df['label'] = kmeans.labels_
# 计算每一类的中心和数据个数
centers = []
counts = []
for i in range(30):
cluster = df[df['label']==i]
center = (cluster['lat'].mean(), cluster['lon'].mean())
count = len(cluster)
centers.append(center)
counts.append(count)
print('Cluster', i+1, 'center:', center, 'count:', count)
# 保存每一类数据到csv文件
for i in range(30):
cluster = df[df['label']==i]
filename = 'cluster_' + str(i+1) + '.csv'
cluster.to_csv(filename, index=False)
# 可视化聚类结果
map_center = (df['lat'].mean(), df['lon'].mean())
m = folium.Map(location=map_center, zoom_start=10)
for i in range(30):
cluster = df[df['label']==i]
label = 'Cluster ' + str(i+1) + ' (' + str(counts[i]) + ' data points)'
center = centers[i]
folium.Marker(location=[center[0], center[1]], icon=None, popup=label).add_to(m)
for j, row in cluster.iterrows():
folium.CircleMarker(location=[row['lat'], row['lon']], radius=3, fill=True, fill_color='blue').add_to(m)
m.save('map.html')
```
代码解释:
1. 首先读取csv文件,包含vehicle_id,lon,lat三列。
2. 将经纬度转换为弧度,因为kmeans算法中需要使用弧度来计算距离。
3. 使用sklearn中的KMeans算法进行聚类,将数据聚成30类。
4. 遍历每一类,计算中心点和数据个数,并打印输出。
5. 将每一类的数据保存到csv文件中。
6. 使用folium模块创建地图,并在地图上标记每一类的中心点和数据点。
7. 将地图保存为html文件。
注意:在代码中需要替换data.csv为实际的数据文件名。
阅读全文