如果有一个包含vehicle_id,lon,lat的csv文件,根据经纬度聚类,将聚类的每一类数据保存在csv文件,并且将聚类结果可视化,给图上的每一个类别打上标签,还要打印每一类的中心和数据个数,聚类使用kmeans并且聚成30类,写出完整代码,还要把聚类中心在地图上显示出来
时间: 2023-12-16 17:04:48 浏览: 31
下面是使用Python实现的代码:
```python
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import folium
# 读取csv文件
df = pd.read_csv('filename.csv')
# 提取经纬度信息
X = np.array(df[['lon', 'lat']])
# 聚类
kmeans = KMeans(n_clusters=30, random_state=0).fit(X)
labels = kmeans.labels_
# 将聚类结果保存到csv文件中
df['label'] = labels
for label in range(30):
df[df['label'] == label].to_csv(f'cluster_{label}.csv', index=False)
# 打印每一类的中心和数据个数
for label in range(30):
cluster = df[df['label'] == label]
center = cluster[['lon', 'lat']].mean().values
count = len(cluster)
print(f'Cluster {label}: center={center}, count={count}')
# 可视化聚类结果
m = folium.Map(location=[df['lat'].mean(), df['lon'].mean()], zoom_start=12)
colors = ['red', 'blue', 'green', 'purple', 'orange', 'darkred', 'lightred',
'beige', 'darkblue', 'darkgreen', 'cadetblue', 'darkpurple',
'white', 'pink', 'lightblue', 'lightgreen', 'gray', 'black',
'lightgray']
for label in range(30):
cluster = df[df['label'] == label]
center = cluster[['lon', 'lat']].mean().values
count = len(cluster)
label_name = f'Cluster {label}<br>count={count}'
folium.Marker(location=center, icon=folium.Icon(color=colors[label%len(colors)]),
popup=label_name).add_to(m)
m
```
需要注意的是,上述代码中的`filename.csv`需要替换为实际的文件名。另外,`folium`是一个Python的地图可视化库,需要使用`pip install folium`进行安装。