导入多个点的经纬度数据,经纬度距离kmeans聚类代码
时间: 2023-11-06 08:15:01 浏览: 43
以下是一个基于经纬度距离的KMeans聚类代码示例:
```python
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin_min
from math import radians, cos, sin, asin, sqrt
# 读取经纬度数据
df = pd.read_csv('data.csv') # 文件中包含两列:经度和纬度
# 经纬度距离计算函数
def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 将十进制度数转化为弧度
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371 # 地球平均半径,单位为公里
return c * r
# 计算每个点之间的距离矩阵
dist_matrix = np.zeros((len(df), len(df)))
for i in range(len(df)):
for j in range(i+1, len(df)):
dist = haversine(df.iloc[i]['lon'], df.iloc[i]['lat'], df.iloc[j]['lon'], df.iloc[j]['lat'])
dist_matrix[i][j] = dist
dist_matrix[j][i] = dist
# KMeans聚类
kmeans = KMeans(n_clusters=3, random_state=0).fit(dist_matrix)
# 找到每个簇中最近的数据点
closest_points = pairwise_distances_argmin_min(kmeans.cluster_centers_, dist_matrix)
# 输出每个簇的中心点和最近的数据点
for i in range(len(kmeans.cluster_centers_)):
print('Cluster', i)
print('Center:', kmeans.cluster_centers_[i])
print('Closest point:', df.iloc[closest_points[0][i]])
```
该代码会首先读取一个包含经度和纬度数据的CSV文件(文件路径为`data.csv`),然后计算每个点之间的距离矩阵。接着使用KMeans算法将这些点聚类为3个簇,并找到每个簇中距离簇中心最近的数据点。最后输出每个簇的中心点和最近的数据点。需要注意的是,该代码中使用的距离计算函数是基于经纬度的哈弗曼公式。如果你的数据集比较大,可以考虑使用更高效的距离计算方法。