手肘法寻找K-means最优聚类簇数k

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');

f651a5740c9b4eb3839183220e53fd4d.png

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

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tizzy477

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值