如果有一个包含vehicle_id,lon,lat的csv文件,根据经纬度聚类,将聚类的每一类数据保存在csv文件,并且将聚类结果可视化,给图上的每一个类别打上标签,还要打印每一类的中心和数据个数,聚类使用kmeans并且聚成30类,写出完整代码
时间: 2023-12-17 12:05:45 浏览: 54
以下是使用Python的完整代码实现你所要求的功能:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 读取csv文件
df = pd.read_csv('data.csv')
# 将经度和纬度合并成一个二维数组
coords = df[['lon', 'lat']].values
# 使用kmeans聚类,聚成30类
kmeans = KMeans(n_clusters=30, random_state=0).fit(coords)
# 获取每个数据所属的类别
labels = kmeans.labels_
# 将每个数据的类别加入到原始数据中
df['cluster'] = labels
# 打印每一类的中心和数据个数
for i in range(30):
cluster_data = df[df['cluster'] == i]
center = kmeans.cluster_centers_[i]
num_points = len(cluster_data)
print('Class {}: center={}, num_points={}'.format(i, center, num_points))
# 将每一类数据保存到csv文件
cluster_data.to_csv('cluster_{}.csv'.format(i), index=False)
# 可视化聚类结果
plt.figure(figsize=(10, 10))
plt.scatter(coords[:, 0], coords[:, 1], s=5, c=labels, cmap='viridis')
plt.colorbar()
# 打标签
for i in range(30):
center = kmeans.cluster_centers_[i]
plt.annotate(str(i), center, fontsize=12, fontweight='bold')
plt.title('KMeans Clustering of Vehicle Locations')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.show()
```
其中,`data.csv`是包含vehicle_id,lon,lat的csv文件。代码使用sklearn库中的KMeans算法将数据聚类成30类,并将每一类数据保存到csv文件中。聚类结果可视化并打标签。最后,程序打印每一类的中心和数据个数。
阅读全文