![96d30af5f0ca6b5c738fc5b3f3f9942d.png](https://i-blog.csdnimg.cn/blog_migrate/65ffcf2c5e6770bea1ec93c3561c3e16.jpeg)
一、k-means聚类算法原理与一些性质
聚类问题从本质上来说是将包含若干元素的集合按某一准则划分成若干个互不相交的集合的并集,该准则常常用一个函数来定义,称为目标函数。我们优化(聚类)的目标往往是极大化或者极小化该目标函数。我们将它进行数学表述:
给定一个集合:
我们在
使得目标函数最大(或最小),即
其中
考虑向量聚类问题:
在该问题中,
该求和的意义是对
其中
对于集合
我们将它定义为向量聚类的目标函数,对它进行极小化。不难得到该目标函数的等价形式:
其中
极小化该目标函数的意义是使得同一类向量到它的中心位置的距离最近。该问题由于复杂度较高,无法直接求出目标函数的最小值,所以只能从某一种分类出发,逐步进行迭代,使得目标函数朝着改善(即目标函数值减小)的方向前进,这就是著名的
1、任选
2、计算每个数据到
3、计算每个数据到
的值,其中
即
但此时
4、计算3中的新划分得到的每一类的中心位置
现只需证明
定理一、 设
证明、
经过这样一次处理后,目标函数的值是递减的,且只要在该过程中中心位置发生了变化,则
即不等号严格成立,目标函数严格减小。
5、对于得到的中心点,计算每个数据,到
二、k-means聚类算法的收敛性证明
定理二、对于任意给定的迭代聚类中心初值(或者任意给定的一种划分方式),
证明、将目标函数记为
显然对于任何划分方式
存在,这就意味着,随着算法迭代次数增加,目标函数一定会收敛。
定理三、随着迭代次数趋向无穷,
若将第
证明、对于一个给定的数据集来说,元素个数是有限的,所以总的划分方式是有限的,所以
推论、从证明过程可以看出,不仅仅可以证明对于任意一个初值给定方式,目标函数
注、虽然对于给定的初值,算法可以保证收敛,但是对于不同的初值选取情况,算法收敛到的结果可能是不一样的。显然,对于不同的类别数
三、实验设计与代码
原始数据分布如图所示
![4ca70b5b58b7aa1867c84eaad9db8a52.png](https://i-blog.csdnimg.cn/blog_migrate/544592858eb1ef95e21cb2439190c919.jpeg)
对该数据集进行聚类,依次选择类别数为
![5d65fc19c0a3cab2a4dffa15e49bd5c6.png](https://i-blog.csdnimg.cn/blog_migrate/3d5f1a5db3b8a45a8a6ca426856daa90.jpeg)
都将样本聚成3类,但是每次聚类选取不同的中心点,得到的聚类结果如下所示
![7bf380f5d6e6b7e6a9bb458ea7a583c6.png](https://i-blog.csdnimg.cn/blog_migrate/12596fa180edab16443f1da1b6afc69a.jpeg)
从4幅图像可以看出,对于不同的中心点的选择,聚类结果略有差异。而不同中心点的选择的带来的差异仅仅发生在不同类的交接位置,对于类内(靠近类的中心位置)没有影响(只是从实验结果看,不排除有某些反例使得对于类的划分完全不一样)。事实上,从直观理解,决定分类的点应该是每一类边缘的一圈点,跟类内(靠近中心位置的点)关系不大,而类内点占了总数据量的大部分,而边缘点只是小部分。从这个角度来说,可以考虑能否设计某种算法,可以识别出类内点与类中点,将类中点去掉,使得聚类结果仅仅取决于边缘点,这样的画,算法是时间复杂度将会大大降低,有利于处理高维大数据的聚类。从下图可以看出,数据量与算法运行时间几乎是成正比的,所以如果可以实现这种挑选边缘点,利用边缘进行聚类的方法,是极有意义的。下面给出数据量与运行时间的几组测试结果:
![1782988a2e27f87d77597cd56d218ead.png](https://i-blog.csdnimg.cn/blog_migrate/ef924eb3803d904fc01cee65b6893138.png)
四、应用:颜色聚类
下面举一个k-means聚类在图像分割中的应用。下图是一个蠢萌蠢萌的表情包原图
![6067850c3cef712119de7f707e6b367e.png](https://i-blog.csdnimg.cn/blog_migrate/7612218091acd328237121a12ff09769.png)
图片中的每个像素点,是由一个
![090679aa547ed8aeaba8b13536aa010a.png](https://i-blog.csdnimg.cn/blog_migrate/0cf47c92e5ea4f278a5e89816d62e58a.png)
该方法在图像处理邻域很常用,通过颜色聚类,将图像中要研究的对象与背景进行分离,便于我们提取,识别图像中的目标。
五、程序
在本文中没有附上数据集,读者只需将函数中的参数data传入自己的数据集,并设置聚类数目num就能运行。函数:function label=kmeans_clustering(data,num),其中输入变量 data为 N 行 m 列,每一行为一个数据点,num表示聚类数目;输出变量为 N 行 1 列,表示对应的数据点属于哪一类(比如属于第一类的点 label 就为 1)。
function label=kmeans_clustering(data,num)
N=num;%设置聚类数目
[m,n]=size(data);
pattern=zeros(m,n+1);
center=zeros(N,n);%初始化聚类中心
pattern(:,1:n)=data(:,:);
for x=1:N
center(x,:)=data( randi(300,1),:);%第一次随机产生聚类中心
end
while 1
distence=zeros(1,N);
num=zeros(1,N);
new_center=zeros(N,n);
for x=1:m
for y=1:N
distence(y)=norm(data(x,:)-center(y,:));%计算到每个类的距离
end
[minimum, temp]=min(distence);%求最小的距离
pattern(x,n+1)=temp;
end
k=0;
for y=1:N
for x=1:m
if pattern(x,n+1)==y
new_center(y,:)=new_center(y,:)+pattern(x,1:n);
num(y)=num(y)+1;
end
end
new_center(y,:)=new_center(y,:)/num(y);
if norm(new_center(y,:)-center(y,:))<0.1
k=k+1;
end
end
if k==N
break;
else
center=new_center;
end
end
[m, n]=size(pattern);
label=pattern(:,n)