Kmeans++及字典学习和图像分割
来源:互联网 发布:商业系统域名 编辑:程序博客网 时间:2024/06/07 00:22
1. Kmeans++
Kmeans 中对聚类中心的初始化比较敏感,不同的初始值会带来不同的聚类结果,这是因为 Kmeans 仅仅是对目标函数求近似最优解,不能保证得到全局最优解。
在常规的 Kmeans 中,聚类中心的初始化都采用随机初始化的方式,这样会存在一个问题:如果数据在某个部分较密集,那么产生的随机数会以更高的概率靠近这些数据。
例如,假设输入数据为:
如下图所示:
如果随机初始化两个聚类中心,那这两个聚类中心都会以更高的概率靠近 1.0 附近的数据,也就是说,很可能出现:随机初始化的两个聚类中心都聚类 1.0 附近的数据较近,这样会导致聚类效果不好。
为了解决上述问题,David Arthur 提出了 Kmeans++ 算法,该方法可以有效的产生好的聚类中心,过程如下:
- 从输入的数据点集合中随机选择一个点作为第一个聚类中心
- 对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
- 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
- 重复2和3直到k个聚类中心被选出来
- 利用这k个初始的聚类中心来运行标准的k-means算法
其中,第 3 步的实现为,先取一个能落在Sum(D(x))中的随机值 Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
假设第一个聚类中心为 1,那么,所有输入数据与聚类中心的距离 D为:
对 D 求前缀和,得到 D1,D1为:
如下图所示:
此时产生一个随机数 random∈(0, 1),并乘以 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 个样本足以。然后把每个块拉成一维,并把所有的样本合并,组成一个矩阵:
其中
2.2 输入归一化
一般会对数据进行归一化,归一化的过程如下式所示:
其中,mean 表示
2.3 输入白化
白化是为了降低输入冗余性,使输入样本具有如下特性:
- 特征之间相关性低
- 所有特征具有相同的协方差
也就是对输入样本 X 进行一种变换,使得到新的 X 满足 X 的协方差矩阵为单位阵。
具体可以通过如下操作完成:
[V, D] = eig(cov(x)),也就是说 VDV' = cov(x)x = V(D + epsilon*I)^(-0.5)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
- Kmeans++及字典学习和图像分割
- Kmeans聚类及图像分割
- OpenCV学习 kmeans实现图像分割
- 机器学习之Kmeans图像分割
- kmeans对图像和数据进行分割
- kmeans算法分割图像
- OPENCV之Kmeans图像分割
- Kmeans 图像分割 by python
- java代码 kmeans算法实现 图像分割
- 图像分割kmeans算法利用hill-clambing确定k
- 基于kmeans聚类算法的图像分割
- Python小白进阶4:基于Kmeans的图像分割
- 图像分割学习资源
- 图像分割学习小结
- kmeans及kmeans++讲解
- OpenCV学习笔记-图像分割
- OpenCV学习笔记-图像分割
- 【图像分割学习1】概述
- 大视野在线测评 1010 [HNOI2008]玩具装箱toy (动态规划)
- 编译复习2
- 【c++类与对象练习】判断字符串str是否为当前串的子串
- eclipse配置问题汇总
- 最短路径模板
- Kmeans++及字典学习和图像分割
- Hubot插件开发:井字游戏
- 0-1背包问题,动态规划
- Linux下的管道编程技术
- Linux地址映射
- linux shell 判断
- 在内存中画图,保存为bmp
- 海量数据处理算法—Bloom Filter
- Android ART runtime简述