请帮我生成一段用重心法实现聚类的python代码
时间: 2024-03-11 10:50:09 浏览: 29
当然可以,以下是一个简单的用重心法实现聚类的 Python 代码:
```
import numpy as np
def distance(point1, point2):
"""
计算两个点之间的欧几里得距离
"""
return np.sqrt(np.sum((point1 - point2)**2))
def kmeans(data, k):
"""
重心法实现聚类
"""
# 随机选择 k 个点作为初始中心点
centers = data[np.random.choice(range(len(data)), size=k, replace=False)]
while True:
# 初始化簇
clusters = [[] for _ in range(k)]
# 分配每个数据点到最近的中心点
for point in data:
distances = [distance(point, center) for center in centers]
closest_center = np.argmin(distances)
clusters[closest_center].append(point)
# 计算每个簇的中心点
new_centers = np.zeros_like(centers)
for i in range(k):
new_centers[i] = np.mean(clusters[i], axis=0)
# 判断中心点是否发生变化
if np.allclose(new_centers, centers):
break
centers = new_centers
return clusters
```
这个代码实现了一个名为 `kmeans` 的函数,它采用重心法实现聚类。函数的参数包括输入数据 `data` 和聚类数目 `k`。在函数内部,首先随机选择 k 个点作为初始中心点,然后将每个数据点分配到距离最近的中心点所在的簇中。接下来,计算每个簇的中心点,并且检查中心点是否发生变化。如果中心点没有发生变化,聚类过程结束,返回每个簇的数据点。如果中心点发生变化,继续迭代直到中心点不再发生变化。
你可以像下面这样调用这个函数:
```
data = np.random.rand(50, 2)
clusters = kmeans(data, 3)
print(clusters)
```
这将生成一个随机的二维数据集,然后使用重心法将其分成 3 个簇,并打印出每个簇的数据点。