k-means聚类代码实现(1)
题目描述
本题要求实现一个基于KMeans聚类算法的函数,使其在给定样本集D和初始簇中心centroids的前提下,根据KMeans算法完成聚类.
注意:聚类的结束条件为: 各簇中心不再发生改变.
函数接口定义:
在这里描述函数接口。例如:
def KMeans_with_init_centroids(D, init_centroids)
函数参数说明:
D: 样本集,shape为(N, M)的 numpy array, 其中N为样本数量, M为样本特征维数.
init_centroids: 初始化的K个中心,shape为(K, M)的 numpy array.
输出: 函数需要返回聚类完成后的K个簇的中心centroids 和 每个样本聚类后所属的簇编号 labels.
centroids: 聚类完成后的K个簇中心,shape为(K,M)的numpy array
labels: 聚类后样本所属簇的编号, shape为(N,)的numpy array.
注意: labels中样本的簇编号应该与centroids中的簇中心对应. 例如labels[i] 表示样本集D中第i个样本的所属的簇中心为centroids[labels[i]]
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
import numpy as np
def KMeans_with_init_centroids(D, init_centroids)
/* 请在这里填写答案 */
N = int(input())
D = []
for i in range(N):
D.append(eval(input()))
D = np.array(D).astype(np.float32)
K = int(input())
init_centroids = []
for i in range(K):
init_centroids.append(eval(input()))
init_centroids = np.array(init_centroids).astype(np.float32)
centroids, labels = KMeans_with_init_centroids(D, init_centroids)
print(centroids)
print(labels)
输入样例:
在这里给出一组输入。例如:
5
[1, 2]
[0, 1]
[3, 4]
[7, 9]
[8, 6]
2
[0, 0]
[5, 5]
输出样例:
在这里给出相应的输出。例如:
[[1.3333334 2.3333333]
[7.5 7.5 ]]
[0 0 0 1 1]
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
我的解答
def KMeans_with_init_centroids(D, init_centroids):
#将每个点分配到最近质心
lablels = []
for i in range(len(D)):
lablels.append(-1)
min = float('inf')
for j in range(len(init_centroids)):
if sum((D[i] - init_centroids[j])**2) < min:
min = sum((D[i] - init_centroids[j])**2)
lablels[i] = j
# 计算新的质心
centroids = []
for i in range(len(init_centroids)):
count = 0
sumPoint = [x*0 for x in range(int(init_centroids.shape[0]))]
for j in range(len(lablels)):
if lablels[j] == i:
sumPoint += D[j]
count += 1
sumPoint /= count
centroids.append(list(sumPoint))
centroids = np.array(centroids).astype(np.float32)
#判断是否继续
# 在得到新质心后进行分配
nextLables = []
for i in range(len(D)):
nextLables.append(-1)
min = float('inf')
for j in range(len(centroids)):
if sum((D[i] - centroids[j])**2) < min:
min = sum((D[i] - centroids[j])**2)
nextLables[i] = j
# 比较新质心后和当前质心对聚类的区别
if lablels == nextLables:
# 没有区别 结束
return centroids,np.array(lablels)
else:
# 不同 继续
return KMeans_with_init_centroids(D, centroids)