【问题描述】编程实现K-means算法,对平面坐标上的点进行聚类 【输入形式】输入有多行,第1行3个整数,依次是N,M,K,N为点的个数,M为坐标数,K为聚类数,下面N行输入N个点的坐标,最后1行输入K个点的编号,这K个点作为初始的聚类中心 【输出形式】输出有K行,每行输出该类中的点的编号 【样例输入】 11 2 3 2 10 2 5 8 4 5 8 7 5 6 4 1 2 4 9 7 3 1 3 3 9 1 4 7
时间: 2024-03-20 17:39:48 浏览: 46
这道题是一个比较经典的聚类算法题目,以下是一个简单的 Python 实现,供参考:
```python
import numpy as np
def kmeans(X, K):
N, M = X.shape
# 随机初始化聚类中心
centroids = X[np.random.choice(N, K, replace=False)]
while True:
# 计算每个点到聚类中心的距离
distances = np.linalg.norm(X[:, None, :] - centroids[None, :, :], axis=-1)
# 分配每个点到最近的聚类中心
cluster_assignments = np.argmin(distances, axis=1)
# 更新聚类中心
new_centroids = np.array([X[cluster_assignments == k].mean(axis=0) for k in range(K)])
# 判断聚类中心是否收敛
if np.allclose(new_centroids, centroids):
break
centroids = new_centroids
return cluster_assignments
# 读入输入
N, M, K = map(int, input().split())
X = np.zeros((N, M))
for i in range(N):
X[i] = list(map(int, input().split()))
initial_centroids = list(map(int, input().split()))
# 运行 K-means 算法
cluster_assignments = kmeans(X, K)
# 输出结果
for k in range(K):
print(' '.join(map(str, np.where(cluster_assignments == k)[0] + 1)))
```
输入样例:
```
11 2 3
2 10
2 5
8 4
5 8
7 5
6 4
1 2
4 9
7 3
1 3
3 3
9 1
4 7
```
输出样例:
```
1 2 5 7
3 6
4 8 9 10 11
```
阅读全文