机器学习:原型聚类-k均值算法k-means(附代码实现)
程序员文章站
2022-07-14 19:22:48
...
首先,聚类的目的是将样本划分为若干个通常不相交的子集,子集内部的样本存在着某种潜在的关系。
k均值算法的核心思想是最小化如下的平方误差:
这个式子表达了聚类内的样本和该聚类的均值向量的紧密程度,E越小则聚类内的样本越紧密。
然而,最小化这个式子是NP难问题,不能快速解决。k均值算法采用了迭代优化的贪心算法:
为了避免运行时间过长,可以认为设定循环轮数或最小调整的幅度阈值。
下图是经过不同迭代轮数后的聚类效果(k=3):
python代码实现:
#聚类数
k = 3
#迭代轮数
for l in range(loops):
#均值向量是否更新初始化
mp_refreshed = False
#聚类结果
result = {0:[],1:[],2:[]}
#将全部样本分配到各个聚类
for i in range(len(x)):
min_dist = sum((x[i]-mean_point[0])**2)
#样本所属聚类
k_flag = 0
#样本分配到距离最近的聚类
for j in range(1,k):
#样本离均值向量的距离
dist = sum((x[i]-mean_point[j])**2)
if dist<min_dist:
min_dist = dist
k_flag = j
result[k_flag].append(i)
#更新均值向量
for i in range(k):
x_sum = np.array([0,0])
for j in range(len(result[i])):
x_sum = np.add(x_sum,x[result[i][j]])
#新的均值向量
new_mp = x_sum / len(result[i])
if (mean_point[i]!=new_mp).any():
mean_point[i] = new_mp
mp_refreshed = True
#所有均值向量都没更新,结束迭代
if not mp_refreshed:
break
print(l,result)
参考资料:周志华《机器学习》
相关博文:
上一篇: K-Means详解
下一篇: SCAN:一种网络结构聚类算法