K-Means算法
思想
K-均值算法(聚类算法)
优点:易于实现
缺点:可能收敛于局部最小值,在大规模数据收敛慢
K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
如果我们想直接求上式的最小值并不容易,这是一个NP难的问题,K-Means采用的启发式方式很简单
引申:启发式算法(heuristic algorithm)是相对于最优化算法提出的。一个问题的最优算法求得该问题每个实例的最优解。启发式算法可以这样定义:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。启发式算法就是例如遗传算法,模拟退火,各种群算法,蚁群,鱼群,粒子群,人工神经网络等模仿自然界或生命体行为模式的算法,一般又称人工智能算法或全局优化算法。
要点
- 对于K-Means算法,首先要注意的是k值的选择,一般来说,我们会根据对数据的先验经验选择一个合适的k值,如果没有什么先验知识,则可以通过交叉验证选择一个合适的k值。
- 在确定了k的个数后,我们需要选择k个初始化的质心,就像上图b中的随机质心。由于我们是启发式方法,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心,最好这些质心不能太近。
输入是样本集D={x1,x2,...xm}D=\{x_1,x_2,...x_m\}D={x1,x2,...xm},聚类的簇树k,最大迭代次数N
输出是簇划分C={C1,C2,...Ck}C=\{C_1,C_2,...C_k\}C={C1,C2,...Ck}
-
从数据集D中随机选择k个样本作为初始的k个质心向量:{μ1,μ2,...,μk}\{μ_1,μ_2,...,μ_k\}{μ1,μ2,...,μk}
-
对于n=1,2,…,N
a. 将簇划分C初始化为Ct=∅C_t = \emptyCt=∅,t=1,2...kt = 1,2...kt=1,2...k
b. 对于i=1,2…m,计算样本xix_ixi和各个质心向量μj(j=1,2,...k)μ_j(j=1,2,...k)μj(j=1,2,...k)的距离,dij=∣∣xi−uj∣∣22d_{ij} = ||x_i-u_j||_2^2dij=∣∣xi−uj∣∣22将xix_ixi标记最小的为dijd_{ij}dij所对应 的类别λiλ_iλi。此时更新Cλi=Cλi∪xiC_{λi}=C_{λi}∪{x_i}Cλi=Cλi∪xi。
c. 对于j=1,2,…,k,对CjC_jCj中所有的样本点重新计算新的质心
μj=1∣Cj∣∑x∈Cjx μ_j=\frac{1}{|C_j|}\sum_{x\in C_j}x μj=∣Cj∣1x∈Cj∑x
d. 如果所有的k个质心向量都没有发生变化,则转到步骤3 -
输出簇划分C=C1,C2,...CkC={C1,C2,...Ck}C=C1,C2,...Ck
引申:2-范数:∣∣x∣∣2=(∑∣xi∣2)12||x||_2= (\sum|x_i|^2)^{\frac{1}{2}}∣∣x∣∣2=(∑∣xi∣2)21,Euclid范数(欧几里得范数,常用计算向量长度),即向量元素绝对值的平方和再开方,matlab调用函数norm(x, 2)
代码
众所周知,matlab是有kmeans方法的
这是原始数据

这是K-means跑过的数据

代码如下
load data1.txt;
rng default; % For reproducibility
X = [data1(:,1), data1(:,2)];
figure;
plot(X(:,1),X(:,2),'.');
title 'Randomly Generated Data';
opts = statset('Display','final');
[idx,C] = kmeans(X,2,'Distance','cityblock',...
'Replicates',5,'Options',opts);
figure;
plot(X(idx==1,1),X(idx==1,2),'r.','MarkerSize',12)
hold on
plot(X(idx==2,1),X(idx==2,2), 'b.','MarkerSize',12)
plot(C(:,1),C(:,2),'kx',...
'MarkerSize',15,'LineWidth',3)
legend('Cluster 1','Cluster 2','Centroids',...
'Location','NW')
title 'Cluster Assignments and Centroids'
hold off
本文详细介绍了K-Means聚类算法的基本思想及其实现过程,包括如何选择初始质心、迭代更新质心以及最终得到簇划分等内容,并通过Matlab代码示例展示了算法的应用。
2万+

被折叠的 条评论
为什么被折叠?



