c^(i):xi分配到第i个簇
μ:质心
μci:即第xi个样本分配到的簇的质心
Step
1.从样本中随机选取K个点作为簇质心
2.每个点都指向离它最近的簇质心
3.遍历结束后,重新计算K值,即计算K个簇的平均值作为新的质心
重复23直到质心不再发生变化或达到指定迭代次数
简单实例
import numpy as npdef kmeans(data, k, max_iters=100):# 随机初始化k个质心centroids = data[np.random.choice(len(data), k, replace=False)]for _ in range(max_iters):# 分配每个数据点到最近的质心distances = np.linalg.norm(data[:, np.newaxis] - centroids, axis=2)labels = np.argmin(distances, axis=1)# 计算新的质心new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)])# 如果质心不再变化,停止迭代if np.all(centroids == new_centroids):breakcentroids = new_centroidsreturn labels, centroids# 示例数据
data = np.array([[1, 2],[5, 8],[1.5, 1.8],[8, 8],[1, 0.6],[9, 11]
])k = 2 # 聚类数
labels, centroids = kmeans(data, k)print("聚类标签:", labels)
print("质心:", centroids)