c^(i):xi分配到第i个簇
μ:质心
μci:即第xi个样本分配到的簇的质心
Step
1.从样本中随机选取K个点作为簇质心
2.每个点都指向离它最近的簇质心
3.遍历结束后,重新计算K值,即计算K个簇的平均值作为新的质心
重复23直到质心不再发生变化或达到指定迭代次数
简单实例
import numpy as np
def 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):
break
centroids = new_centroids
return 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)