(三)聚类模型——Kmeans聚类算法

一、算法概念

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,简单的可以理解为,我现在班里有二十个学生,我想选出三个小队作为这个班整体的代表,那么我更希望20个学生中可以选出三个队长,要求就是每个队的队员必须更亲近自己的那个队长(在算法中队伍成为簇,而亲近队长就是指簇中的点到质心的距离要近)。

二、算法流程

K-means算法的核心思想是将数据划分为K个独立的簇(cluster),使得每个簇内的数据点距离尽可能小,而簇与簇之间的距离尽可能大。下面是K-means算法的具体步骤:

①初始化:选择K个数据点作为初始质心,这些质心可以是随机选择的,也可以是通过其他方法选定的。

②分配:将每个数据点分配到离它最近的质心所代表的簇中。

③更新:重新计算每个簇的质心,方法是将簇内所有数据点的均值作为新的质心

④重复步骤2和3,直到质心不再发生显著变化或达到迭代次数上限。

三、算法应用

该算法常用于对数据进行进一步的处理,可以搭配主成分分析法,在数据降维后,再对数据进行聚类处理。

四、算法优缺点

1.优点

①简单易懂:算法简单、快速。(有数据有代码之后可以直接进行试验,各种聚类情况都可以参照MATLAB官网的例子)

②效率较高:对处理大数据集,该算法是相对高效率的。

③扩展性强:可通过一些改进和优化应用于不同类型的数据和问题。

2.缺点

①要求用户必须事先给出要生成的簇的数目K

②对初值敏感,可能陷入局部最优解的情况。(对于这一点呢,我们可以考虑选择更加完善的算法,也就是K-means++ ,他能够更好的选择初值,也就提高算法的收敛速度,降低陷入局部最优解的风险)

这里提一下K-means++的算法步骤

(1)随机选择一个点作为第一个质心。

(2)计算数据集中的每个点与当前已选择质心的最近距离。

(3)将距离的平方当作权重,按轮盘赌选择下一个质心。

(4)重复步骤2和3,直到选择了 K 个质心。

(5)选择好质心后,再按照K-means的后续流程进行操作。

③对于孤立点数据敏感,孤立点的存在,会对最终簇和聚集点的选择有影响(会浪费一个聚集点,专门去找那个点,很不值)。

从下面的两个图我们就能看出,当选择3个质心后,有个质心就会跑到最左下角的点,进而单独形成一个簇,这是对数据的一种扭曲,所以我们尽量避免孤立点。

五、算法代码

下方的代码可以在MATLAB官网的手册中有更加深入的了解,具体可以去看 K均值聚类 中的将数据分成两个簇。

opts = statset('Display','final');

[X,textdata] = xlsread('shuju.xlsx');
%调用 Kmeans 函数
%X N*P 的数据矩阵,这里需要解释下,最终图上显示的数据点,是根据X的前两列数据来的,第一列是x坐标,第二列是y坐标。
%Idx N*1 的向量,存储的是每个点的聚类标号
%Ctrs K*P 的矩阵,存储的是 K 个聚类质心位置
%SumD 1*K 的和向量,存储的是类间所有点与该类质心点距离之和
%D N*K 的矩阵,存储的是每个点与所有质心的距离;
[Idx,Ctrs,SumD,D] = kmeans(X,2,'Replicates',2,'Options',opts);
%kmeans函数()里的第一个是原数据矩阵,第二个是想要聚类到几个点上,后面的数据应该是不用动
%画出聚类为 1 的点。X(Idx==1,1),为第一类的样本的第一个坐标;X(Idx==1,2为第二类的样本的第二个坐标
%'r.'这就是表明要画红色的.,而MarkerSize就是设置点的尺寸,后面的14就是设置的尺寸大小
%这里说一下MATLAB常用的形状1、- 实线(默认)  -- 虚线  : 点线  -. 点划线 o 圆圈  + 加号  * 星号   . 点
%x 叉号 s 方形 d 菱形 ^ 上三角  v 下三角 >  右三角  < 左三角  p 五角形  h 六角形
plot(X(Idx==1,1),X(Idx==1,2),'r.','MarkerSize',14)
hold on
plot(X(Idx==2,1),X(Idx==2,2),'b.','MarkerSize',14)
hold on
plot(X(Idx==3,1),X(Idx==3,2),'g.','MarkerSize',14)
hold on 
plot(X(Idx==4,1),X(Idx==4,2),'y.','MarkerSize',14)
%绘出聚类中心点,kx 表示是黑色的叉
plot(Ctrs(:,1),Ctrs(:,2),'kx','MarkerSize',14,'LineWidth',4)
%legend('Cluster 1','Cluster 2','Cluster3','Centroids','Location','NW')
%上面这行代码可以给图表加上标注,但是需要根据你选择的聚类数量进行调整
Ctrs
SumD
               

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值