K-Means算法
- 确定k个初始化聚类中心
- 计算各数据点到k个中心的距离,分配给最近的中心,形成k类
- 重新计算这k类的质心,作为新的k个中心
- 重新计算各数据点到新的k个中心的距离,分配给最近的中心,形成新的k类
- 重复3-4,直到所有数据点分配到的类不变(聚类中心不变),或达到最大迭代次数
Matlab调用kmeans()
Clu = kmeans(data,k,’Start’,’plus’,’MaxIter’,n1,’Replicates’,n2);
Clu:聚类的结果(nx1维的向量)
data:待聚类的数据(nxm维的数据)
k:预先指定聚类的类数k
‘Start’:质心选择方法,plus使用kmeans++算法选择k个种子点(默认plus方法)
‘MaxIter’:最大迭代次数n1(默认n1=100次)
‘Replicates’:重复kmeans聚类次数n2,在n2次结果中返回类内距离sumd最小的结果(需要指定)
手肘法寻找最优聚类数k
p为属于Ci类的数据点,mi为Ci类的聚类中心,SSE代表所有类的类内距离的平方的和
手肘法也就是找到SSE下降开始平坦的地方的k
kmeans()中,sumd默认就是每个数据点到它的中心的欧几里得距离的平方
sumd是一个nx1维矩阵,维度n是聚类的类数
sse = zeros(99,1); %初始化SSE矩阵
for k = 2:1:100 %在2到100类中寻找最优簇数
[~,~,sumd] = kmeans(data,k,'Replicates',5); %计算不同簇数下的sumd
sse(k-1,1) = sum(sumd); %对sumd求和得到SSE
end
n=2:100; %画图
figure(1);
plot(n,sse);
xlabel('k');
ylabel('sse');
title('Elbow method');
对于这批数据,应该选择K=60左右