Kmeans++及字典学习

1. Kmeans++

Kmeans 中对聚类中心的初始化比较敏感,不同的初始值会带来不同的聚类结果,这是因为 Kmeans 仅仅是对目标函数求近似最优解,不能保证得到全局最优解。

在常规的 Kmeans 中,聚类中心的初始化都采用随机初始化的方式,这样会存在一个问题:如果数据在某个部分较密集,那么产生的随机数会以更高的概率靠近这些数据。

例如,假设输入数据为:

[ 0.8 , 0.85 , 0.9 , 0.95 , 1 , 1.05 , 1.1 , 1.2 , 3.0 , 3.1 , 3.2 ] , [0.8, 0.85, 0.9, 0.95, 1,1.05, 1.1, 1.2, 3.0, 3.1, 3.2], [0.8,0.85,0.9,0.95,1,1.05,1.1,1.2,3.0,3.1,3.2]

如下图所示:

这里写图片描述

如果随机初始化两个聚类中心,那这两个聚类中心都会以更高的概率靠近 1.0 附近的数据,也就是说,很可能出现:随机初始化的两个聚类中心都聚类 1.0 附近的数据较近,这样会导致聚类效果不好。

为了解决上述问题,David Arthur 提出了 Kmeans++ 算法,该方法可以有效的产生好的聚类中心,过程如下:

1.从输入的数据点集合中随机选择一个点作为第一个聚类中心

2.对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离 D ( x ) D(x) D(x)

3.选择一个新的数据点作为新的聚类中心,选择的原则是: D ( x ) D(x) D(x)较大的点,被选取作为聚类中心的概率较大

4.重复2和3直到k个聚类中心被选出来

5.利用这k个初始的聚类中心来运行标准的k-means算法


其中,第 3 步的实现为,先取一个能落在 S u m ( D ( x ) ) Sum(D(x)) Sum(D(x))中的随机值 r a n d o m random random,然后用 r a n d o m − = D ( x ) random -= D(x) random=D(x),直到其 &lt; = 0 &lt;=0 <=0,此时的点就是下一个“种子点”。

假设第一个聚类中心为 1,那么,所有输入数据与聚类中心的距离 D为:

D ( x ) = [ 0.2 , 0.15 , 0.1 , 0.05 , 0 , 0.05 , 0.1 , 0.2 , 2. , 2.1 , 2.2 ] D(x) = [0.2, 0.15, 0.1, 0.05, 0, 0.05, 0.1, 0.2, 2., 2.1, 2.2] D(x)=[0.2,0.15,0.1,0.05,0,0.05,0.1,0.2,2.,2.1,2.2]

D D D 求前缀和,得到 D 1 D_1 D1 D 1 D_1 D1为:

D 1 = [ 0.2 , 0.35 , 0.45 , 0.5 , 0.5 , 0.55 , 0.65 , 0.85 , 2.85 , 4.95 , 7.15 ] D_1 = [0.2, 0.35, 0.45, 0.5, 0.5, 0.55, 0.65, 0.85, 2.85, 4.95, 7.15] D1=[0.2,0.35,0.45,0.5,0.5,0.55,0.65,0.85,2.85,4.95,7.15]

如下图所示:

这里写图片描述

此时产生一个随机数 r a n d o m ∈ ( 0 , 1 ) random∈(0, 1) random(0,1),并乘以 D 1 ( e n d ) = 7.15 D_1(end) = 7.15 D1(end)=7.15,那么,该数大于等于 0.85 的概率会非常大,假设为 4,那么第10 个数,4.95 是第一个大于 4 的数,就把输入数据中的第 10 个,也就是 3.1 作为新的聚类中心。

上述过程的意义为:让新的聚类中心以更大的概率远离已有的聚类中心,以避免聚类中心以高概率分布在数据密集的部份。

2. 字典学习

参考《Learning Feature Representations with K-means》。

2.1 第一步:图像分块,作为样本

从输入图像中截取图像块(可以有重叠),块的大小可以为8x8,16x16等,块的大小决定了样本的维度,为了得到更好的字典,块越大,需要的训练样本越多。对于 16x16 的块,100 000 个样本足以。然后把每个块拉成一维,并把所有的样本合并,组成一个矩阵:

X = [ x 1 , x 2 , x i , . . . , x n ] X=[x_1, x_2, x_i, ..., x_n] X=[x1,x2,xi,...,xn]

其中 x i = [ x i 1 , x i 2 , . . . , x i m ] T x_i = [x_{i1}, x_{i2}, ..., x_{im}]^T xi=[xi1,xi2,...,xim]T,m 为样本的维度,也就是图像块的大小,n 为样本的个数。

2.2 输入归一化

一般会对数据进行归一化,归一化的过程如下式所示:

x ( i ) = x ~ ( i ) − m e a n ( x ~ ( i ) ) v a r ( x ~ ( i ) ) + ε {x^{(i)}} = \frac{{{{\tilde x}^{(i)}} - mean({{\tilde x}^{(i)}})}}{{\sqrt {{\mathop{\rm var}} ({{\tilde x}^{(i)}}) + \varepsilon } }} x(i)=var(x~(i))+ε x~(i)mean(x~(i))

其中,mean 表示 x ~ ( i ) {{\tilde x}^{(i)}} x~(i) 的均值, v a r var var 表示 x ~ ( i ) {{\tilde x}^{(i)}} x~(i)方差。对于图像数据,范围在[0-255], ε \varepsilon ε 可以取10,

2.3 输入白化

白化是为了降低输入冗余性,使输入样本具有如下特性:

  1. 特征之间相关性低
  2. 所有特征具有相同的协方差

也就是对输入样本 X 进行一种变换,使得到新的 X 满足 X 的协方差矩阵为单位阵。

具体可以通过如下操作完成:

    [V, D] = eig(cov(x)),也就是说 VDV' = cov(x)
    x = V(D + epsilon*I)^V'x

对于 16x16 的图像块,epsilon可以取 0.01,对于 8x8 的图像块,epsilon可以取 0.1。

2.4 聚类

以新的 X 作为输入样本进行 Kmeans 聚类。

2.5 结果

以“leaves”图作为输入图像,如下所示:

这里写图片描述

未归一化和白化,直接进行聚类的结果如下所示:

这里写图片描述

先归一化和白化,然后进行聚类的结果如下所示:

这里写图片描述

图像中有些字典很像噪声,这是因为这些字典类别中的样本数较少。

3.图像分割

首先对彩色图像进行颜色空间的转换,从 RGB 通道转为 Lab 颜色空间,其中,L表示亮度(Luminosity),a表示从洋红色至绿色的范围,b表示从黄色至蓝色的范围。在此我们以 ab 通道数据作为一个样本,也就是说样本的维度为2,样本的个数就是图像的像素个数。

然后利用 Kmeans 对数据样本进行聚类和标记,每一种类别代表一种分割的区域。

输入图像:

这里写图片描述

分割后的输出图像:

这里写图片描述

4. 参考

《视觉机器学习20讲》

《Learning Feature Representations with K-means》

zouxy09的专栏

5. 代码

GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值