手肘法寻找K-means最优聚类簇数k(matlab实现)

K-Means算法:

  1. 确定k个初始化聚类中心
  2. 计算各数据点到k个中心的距离,分配给最近的中心,形成k类
  3. 重新计算这k类的质心,作为新的k个中心
  4. 重新计算各数据点到新的k个中心的距离,分配给最近的中心,形成新的k类
  5. 重复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:

12220d6782394502b7ca88bf3fbdea02.jpeg

 p为属于Ci类的数据点,mi为Ci类的聚类中心,SSE代表所有类的类内距离的平方的和

手肘法也就是找到SSE下降开始平坦的地方的k

kmeans()中,sumd默认就是每个数据点到它的中心的欧几里得距离的平方

3c36736e6d7c49dda6a82de5aee908d4.png

d9cdf7ec7f4d46a9bbc7f4ed882dd782.jpeg

 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-means最优聚类簇数k(matlab实现)_第1张图片

对于这批数据,应该选择K=60左右

你可能感兴趣的:(聚类算法,matlab实现,matlab,聚类,kmeans)