集合中元素相加为给定值的算法_k-means聚类算法的收敛性证明与应用

96d30af5f0ca6b5c738fc5b3f3f9942d.png

一、k-means聚类算法原理与一些性质

聚类问题从本质上来说是将包含若干元素的集合按某一准则划分成若干个互不相交的集合的并集,该准则常常用一个函数来定义,称为目标函数。我们优化(聚类)的目标往往是极大化或者极小化该目标函数。我们将它进行数学表述:

给定一个集合:

我们在

的非空子集定义一个集函数
,并通过该函数构造一个目标函数,通过优化该目标函数实现聚类。首先需要确定一个集合的划分方式:即将集合
分解为
个互不相交的非空集合
的并集,使得

使得目标函数最大(或最小),即

其中

是一个超参数,需要人工设定。

考虑向量聚类问题:

在该问题中,

中的每个元素都是一个
维向量,将第
个元素记为
。对于集合
的一个非空子集
,定义:

该求和的意义是对

中的所有元素进行求和,
中的所有元素的中心,即

其中

表示集合
中的元素个数。

对于集合

的一个给定划分,可以得到

我们将它定义为向量聚类的目标函数,对它进行极小化。不难得到该目标函数的等价形式:

其中

所在类的中心。

极小化该目标函数的意义是使得同一类向量到它的中心位置的距离最近。该问题由于复杂度较高,无法直接求出目标函数的最小值,所以只能从某一种分类出发,逐步进行迭代,使得目标函数朝着改善(即目标函数值减小)的方向前进,这就是著名的

聚类算法。采用以下步骤进行:

1、任选

个数据点
作为初始聚类中心(
是一个超参数,是最终聚成的类别数,需要人为设定)。

2、计算每个数据到

个中心的距离,并将数据划分到最近距离所在的类。这样就得到了集合 的一种划分方式,重新计算每一类的中心位置
,这样就得到了目标函数的一个取值,即

是元素
所在的类的中心,即
中的某一个。

3、计算每个数据到

个中心的距离,并将数据划分到最近距离所在的类。这样就得到了集合
的又一种划分方式,这样可以计算

的值,其中

是集合
中的元素,
仍然是
中的某一个,与
运算的
是根据步骤3中的新划分方式确定的,是
距离
最近的一个。由于
个中心的某一个,而
个中心中距
最近的一个,所以

但此时

不是该新划分下的目标函数,因为
不是新划分下的中心位置。

4、计算3中的新划分得到的每一类的中心位置

,从而得到目标函数的一个新取值。我们下面说明,经过这样的一步操作之后,目标函数值不增(一般会较少,除非
完全重合)。由于

现只需证明

是新划分的每一类的中心位置。由于左右两边对集合
的划分方式是一样的,只是左边的
是每类的中心,而右边不是。证明该不等式,就转化为了证明如下定理:

定理一、 设

是欧式空间的
个向量,则
取到最小值当且仅当
是这
个向量的中心位置,即

证明、

是该函数的一个驻点。显然该目标函数是严格凸的,所以
是目标函数的唯一最小值点。这就说明,只要步骤4中有某个 中心位置发生了变化,那么目标函数值严格较小。综上所述,从步骤2到步骤4,经过一次迭代后,目标函数不增,即

经过这样一次处理后,目标函数的值是递减的,且只要在该过程中中心位置发生了变化,则

即不等号严格成立,目标函数严格减小。

5、对于得到的中心点,计算每个数据,到

个中心的距离,并将数据划分到最近距离所在的类。这样就得到了集合
的又一种划分方式。在该划分方式下,再计算每一类的中心位置;对于该中心位置,再通过距离进行重新划分,一直循环下去,这样的算法称为
算法。

二、k-means聚类算法的收敛性证明

定理二、对于任意给定的迭代聚类中心初值(或者任意给定的一种划分方式),

算法的目标函数一定会收敛。

证明、将目标函数记为

,其中
是对给定数据集的一种划分方式,例如划分
是将数据集划分成
个互不相交的集合,则

显然对于任何划分方式

,
。对于从任意一个初始方式开始,不断进行迭代,就会得到对数据集的一列划分:
,同时对应地得到一列目标函数值
。由前文所述,该数列
单调递减且有下界
,由单调有界数列的收敛定理知,
收敛,即

存在,这就意味着,随着算法迭代次数增加,目标函数一定会收敛。

定理三、随着迭代次数趋向无穷,

个中心点必然会收敛,即对于每种确定的初值选取方式,聚类结果是唯一确定的。

若将第

次迭代得到的中心点的位置记为
。现要证明对于任意给定的迭代聚类中心初值(或者任意给定的一种初始划分方式),对任意固定的

存在。

证明、对于一个给定的数据集来说,元素个数是有限的,所以总的划分方式是有限的,所以

只有有限个不同的取值。所以,随着
的增大,
不可能一直严格递减,即严格递减过程必然要中止,即存在
,当
时,
恒为常数。由定理一可知,当
时,
恒为常数,不会再改变(因为中心点只要有一个改变,那么
必然严格递减,与
恒为常数矛盾)。所以对任意固定的
,
存在。证毕。

推论、从证明过程可以看出,不仅仅可以证明对于任意一个初值给定方式,目标函数

与中心点
都会收敛,而且可以得到更强的结论:经过有限次迭代后,目标函数值与中心点位置都会恒为常量,即该算法迭代过程不是一直无限逼近极小值点的过程,而是经过有限步逼近后,必然会严格等于极小值点,此后再进行迭代,划分方法、中心点、目标函数等都不会再改变。由于对于给定的初值,每一步的过程是完全确定的,不含随机因素。所以对于给定初值,聚类结果是唯一确定的。

注、虽然对于给定的初值,算法可以保证收敛,但是对于不同的初值选取情况,算法收敛到的结果可能是不一样的。显然,对于不同的类别数

,聚类结果必然不同。所以初始中心位置(或初始划分方式)与类别数
是该算法需要调节的超参数。

三、实验设计与代码

原始数据分布如图所示

4ca70b5b58b7aa1867c84eaad9db8a52.png
原始数据图

对该数据集进行聚类,依次选择类别数为

,得到的聚类结果如下图所示

5d65fc19c0a3cab2a4dffa15e49bd5c6.png
类别数与聚类结果图

都将样本聚成3类,但是每次聚类选取不同的中心点,得到的聚类结果如下所示

7bf380f5d6e6b7e6a9bb458ea7a583c6.png
中心点的选取对聚类结果的影响

从4幅图像可以看出,对于不同的中心点的选择,聚类结果略有差异。而不同中心点的选择的带来的差异仅仅发生在不同类的交接位置,对于类内(靠近类的中心位置)没有影响(只是从实验结果看,不排除有某些反例使得对于类的划分完全不一样)。事实上,从直观理解,决定分类的点应该是每一类边缘的一圈点,跟类内(靠近中心位置的点)关系不大,而类内点占了总数据量的大部分,而边缘点只是小部分。从这个角度来说,可以考虑能否设计某种算法,可以识别出类内点与类中点,将类中点去掉,使得聚类结果仅仅取决于边缘点,这样的画,算法是时间复杂度将会大大降低,有利于处理高维大数据的聚类。从下图可以看出,数据量与算法运行时间几乎是成正比的,所以如果可以实现这种挑选边缘点,利用边缘进行聚类的方法,是极有意义的。下面给出数据量与运行时间的几组测试结果:

1782988a2e27f87d77597cd56d218ead.png
数据量与运行时间关系

四、应用:颜色聚类

下面举一个k-means聚类在图像分割中的应用。下图是一个蠢萌蠢萌的表情包原图

6067850c3cef712119de7f707e6b367e.png
原始图像

图片中的每个像素点,是由一个

三维向量组成,我们将它看成一个三维空间中的点,那么,整张图片就被映射到了三维空间的一系列点。调用
算法,将这些点聚成三类,得到三个中心位置,每个点用它所在的中心位置的颜色进行代替,再返回到原图像的排列顺序,这样就把该图片的颜色聚成了三类,如下所示:

090679aa547ed8aeaba8b13536aa010a.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)
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值