本系列意在长期连载分享,内容上可能也会有所删改;
因此如果转载,请务必保留源地址,非常感谢!
博客园:http://www.cnblogs.com/data-miner/(暂时公式显示有问题)
其他:建设中…
当我们在谈论kmeans:论文概述(2)
算法历程
2001年
在Estlick, Mike, et al. "Algorithmic transformations in the implementation of K- means clustering on reconfigurable hardware." 2001中,作者将K-means算法用在FPGA板子中。在传统K-means中,用到了浮点数运算与乘法运算,而这两种运算在FPGA中非常耗时。为了能在FPGA中高效使用K-means算法,作者提出了修改的K-means算法。
-
先介绍一下明氏距离(Minkowski Distance),其定义如下
- 如果令p=2,即得到常见的欧氏距离(Euclidean Distance);从概率的角度看,欧氏距离即认为数据服从标准多维正态分布,其概率密度函数中,欧氏距离描述的就是空间中的点偏离中心的概率,相同的欧氏距离即对应着概率密度函数的等高线
- 如果令p=0,即得到曼哈顿距离(Manhattan Distance),即每个维度的绝对值的和;当计算像素欧氏距离复杂度较高,有时候可以使用曼哈顿距离作为替代
- 令p→∞,即切比雪夫距离(Chebyshev Distance),即取不同纬度间的最大值;不过我也不知道什么时候会用上它
- 在此我们可以再总结一些常见的距离度量,如马氏距离(MahalanobisDistance);从概率角度看,其作用就是用多维正态分布拟合数据,描述的同样是空间中的点偏离中心的概率,相同的马氏距离即对应着概率密度函数的等高线
- 余弦相似度(Cosine Similarity),描述的是两个向量的夹角大小
- Jaccard相似系数(Jaccard Coefficient),描述的是两个集合的相似性
- 如果令p=2,即得到常见的欧氏距离(Euclidean Distance);从概率的角度看,欧氏距离即认为数据服从标准多维正态分布,其概率密度函数中,欧氏距离描述的就是空间中的点偏离中心的概率,相同的欧氏距离即对应着概率密度函数的等高线
作者表示在FPGA中,欧氏距离的计算量太大,他希望用“曼哈顿距离”和“切比雪夫距离”替代。下图表示,空间中两个聚类中心,使用不同距离的分界面
单独使用“曼哈顿距离”和“切比雪夫距离”都无法很好地替代“欧氏距离”,于是作者将两者融合,并说明效果的下降在允许范围内,而计算量大大降低。(想法很有趣)
2002年
在Kanungo, Tapas, et al. "An Efficient k-Means Clustering Algorithm: Analysis and Implementation." 2002中,面对K-means运算量较大的问题,作者提出了“KD树”加速K-means算法的方法。
但是,其方法基本跟Pelleg, et al. "Accelerating exact k -means algorithms with geometric reasoning." 1999.没什么区别。此处不再赘述。
2004年
在Lee, Sangkeun, and M. H. Hayes. "Properties of the singular value decomposition for efficient data clustering." 2004中,作者对SVD的性质进行了讨论,并表示这些性能能加快K-means的过程。
作者首先给出了对数据集A进行SVD的解释
然后给出了本文最主要的公式,即A中每两个向量的欧氏距离,可以用对应的“右奇异向量”的加权和表示。(注:这里我们进一步分析,由于A是一个m∗n的矩阵,V是一个n∗n的矩阵,若要SVD分解后能加速K-means,至少要求m>n,即样本维数大于样本数量,然而这种情况比较少见。同时,SVD分解本身也是个非常耗时的操作。因此此方法更多的是提供一种思考方式。)
本文还给出了一种设置聚类中心数量K的方法。本质跟PCA类似,就是计算数据集A的主要能量聚集在多少维度上。区别是PCA需要的是这几个维度对应的向量,而这里只需要维度的数量。
文中还有更多利用SVD加速K-means聚类的细节,不再赘述
2005年
在Huang, Joshua Zhexue, et al. "Automated Variable Weighting in k-Means Type Clustering." 2005中,作者针对K-means算法中,每一维特征在聚类结果中权重相同的情况,提出了修改的K-mwans。
作者首先提出,在数据挖掘过程中,往往数据的维数都是成百上千,而其中对分析有意义的维数只是部分。以往根据经验给每一维数据赋权重,作者提出一种算法来自动求出权重。
先给出原始K-means的损失函数,即最小均方误差
然后作者给出修改的K-means的损失函数。本质就是在损失函数里增加了权重,然后继续通过EM算法求解。在最小均方误差的约束下,类内距离小的那一维特征会被赋予较大的权重,类内距离较大的则会被赋予较小的权重。即作者所说的,自动求解权重
关于详细的求解步骤,与收敛性的证明,可以参考原论文
2006年
在Kuncheva, L. I., and D. P. Vetrov. "Evaluation of Stability of k-Means Cluster Ensembles with Respect to Random Initialization." 2006中,作者研究了通过Ensembling来提升K-means等算法的稳定性
-
作者先明确了研究的问题,即
- Ensembling是否能提升聚类的稳定性?
- 是否聚类的稳定性能与准确性正相关?
- 是否能利用聚类稳定性指标来描述聚类的有效性?
作者给出了Ensembling的方法,即把数据分成L组,再分别对L组的数据进行聚类,并将结果融合
-
对于上述问题,作者都没有给出理论证明,都是实验上的说明:
- Ensembling是否能提升聚类的稳定性?
大部分情况下,Ensembling能提升聚类的稳定性。同时需要说明的是,Ensembling更稳定的情况基本发生在聚类中心较大的时候,即Ensembling会倾向于选择更多的聚类中心 - 是否聚类的稳定性能与准确性正相关?
跟设想的结果差不多,聚类的稳定性跟准确性并没有明确的正相关。不同的数据集上,有着完全不同的相关性。 - 是否能利用聚类稳定性指标来描述聚类的有效性?
在这部分,作者主要阐述了利用聚类稳定性指标来选择聚类中心数量的想法。即,作者通过给出一个稳定性指标,表示在稳定性较大的时候的聚类中心数量会很接近真实的类别数量。
- Ensembling是否能提升聚类的稳定性?
2007年
在Arthur, David, and S. Vassilvitskii. "k-means++: the advantages of careful seeding." 2015中,作者提出了K-means++算法,也是较为常用的K-means修改算法之一。这个算法主要提出了一种选择初始化聚类中心的方法,并从理论上证明了这个方案会使收敛更快,且效果更好
- 这个初始化聚类中心的方法其实很简单:即以概率的形式逐个选择聚类中心,并在选择聚类中心时,给距离较远的点更高的权重,即更容易被选择为聚类中心
- 这个想法其实并不是非常新奇,这种逐个选择聚类中心的思想,在1997年就有作者提出过(参考“当我们在谈论kmeans:论文概述(1),1997”)。但是作者在这个初始化聚类中心方法的基础上,接下来又证明了通过这种方法,平均均方误差大大降低,且收敛速度更快。证明过程好复杂,大家可以自己去研读。
2010年
在Chiang, Ming Tso, and B. Mirkin. "Intelligent Choice of the Number of Clusters in K-Means Clustering: An Experimental Study with Different Cluster Spreads." 2010中,针对K-means算法中聚类中心数量难以确定的问题,作者通过实验的方式,比较了多种估计K-means聚类中心数量的方法。并通过实验对比了这些方法在估计类别数量、中心、标记时的准确度。
- 作者首先介绍了Mirkin提出的Intelligent K-means算法,本质是通过异常检测的思想,一步步确定每个类别。具体描述如下
-
为了选择对照算法,作者总结了其他估计聚类数量K的算法。针对不同类型的方法,作者也给出了例子。有兴趣的同学可以参考原文。
基于变化的算法:即定义一个函数,认为在正确的K时会产生极值。
基于结构的算法:即比较类内距离、类间距离以确定K。
基于一致性矩阵的算法:即认为在正确的K时,不同聚类的结果会更加相似,以此确定K。
基于层次聚类:即基于合并或分裂的思想,在一定情况下停止获得K。
基于采样的算法:即对样本采样,分别做聚类;根据这些结果的相似性确定K。
最后通过对比实验,作者给出结论认为Intelligent K-means能较为有效的估计真实聚类中心、以及样本所属类别。同时,Intelligent K-means对类别数量的估计普遍较大。不过由于实验是在高斯分布的仿真实验下进行的,结论并非我所关注,不再赘述。
当我们在谈论kmeans(3)的更多相关文章
-
当我们在谈论kmeans(1)
本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 简书:建设中... 知乎:建设中... 当我们在谈论 ...
-
当我们在谈论kmeans(2)
本稿为初稿,后续可能还会修改:如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/ 其他:建设中- 当我们在谈论kmeans(2 ...
-
当我们在谈论kmeans(5)
本系列意在长期连载分享,内容上可能也会有所删改: 因此如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/(暂时公式显示有问题) 其他: ...
-
K-Means 聚类算法
K-Means 概念定义: K-Means 是一种基于距离的排他的聚类划分方法. 上面的 K-Means 描述中包含了几个概念: 聚类(Clustering):K-Means 是一种聚类分析(Clus ...
-
用scikit-learn学习K-Means聚类
在K-Means聚类算法原理中,我们对K-Means的原理做了总结,本文我们就来讨论用scikit-learn来学习K-Means聚类.重点讲述如何选择合适的k值. 1. K-Means类概述 在sc ...
-
K-Means聚类算法原理
K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体 ...
-
[Erlang 0117] 当我们谈论Erlang Maps时,我们谈论什么 Part 2
声明:本文讨论的Erlang Maps是基于17.0-rc2,时间2014-3-4.后续Maps可能会出现语法或函数API上的有所调整,特此说明. 前情提要: [Erlang 0116] 当我们谈论E ...
-
[Erlang 0116] 当我们谈论Erlang Maps时,我们谈论什么 Part 1
Erlang 增加 Maps数据类型并不是很突然,因为这个提议已经进行了2~3年之久,只不过Joe Armstrong老爷子最近一篇文章Big changes to Erlang掀起不小了风 ...
-
kmeans算法并行化的mpi程序
用c语言写了kmeans算法的串行程序,再用mpi来写并行版的,貌似参照着串行版来写并行版,效果不是很赏心悦目~ 并行化思路: 使用主从模式.由一个节点充当主节点负责数据的划分与分配,其他节点完成本地 ...
随机推荐
-
CoreData数据库
一 CoreData 了解 1 CoreData 数据持久化框架是 Cocoa API 的一部分,首先在iOSS5 版本的系统中出现: 它允许按照 实体-属性-值 模式组织数据: ...
-
HTML学习目录
前面的话 HTML被认为是前端知识体系里面最简单的知识,几年前,很多人都推荐在W3C上学习个几天就能够基本掌握.但随着HTML5和移动端的强势发展,HTML的技能点也越来越难.世上无难事,好学好总结. ...
-
Sphinx中文分词安装配置及API调用
这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...
-
解决win10注册错误 错误代码0x8002801c
使用win10的过程中经常碰到各种注册错误,让人抓狂!!! 现在分享一个完美的解决方法(非原创): 最简洁的办法是:1.自行将msinet.ocx(win10系统64位)组件复制到C:\Windows ...
-
php微信h5支付超简单!!!
本示例应用于tp3.2版本 不懂私聊我QQ:1195989301 请备注来意! 代码链接 请点击下载 密码: ekd4 不喜欢打字望谅解.....
-
BZOJ3932 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=3932 题意:给出一些带有等级的线段,求一点上前K小个等级线段的等级之和 询问是对于每一个点询问前K ...
-
MySQL利用xtrabackup在线修复或新增从库
如果数据库的数据量很大,表大小有几十个G,利用mysqldump导出备份会消耗非常长的时间,会对数据库产生不稳定风险,这时可以利用xtrabackup工具在线复制主库文件,利用复制出来的主库文件可以修 ...
-
js中的模块化
前阵子一直忙着找实习,发现已经有一段时间没写博客了,面试很多时候会被问到模块化,今天就让我们一起来总结下把 一.什么是模块化 在js出现的时候,js一般只是用来实现一些简单的交互,后来js开始得到重视 ...
-
Linux TC(Traffic Control)框架原理解析
近日的工作多多少少和Linux的流控有点关系.自打几年前知道有TC这么一个玩意儿而且多多少少理解了它的原理之后,我就没有再动过它,由于我不喜欢TC命令行,实在是太繁琐了.iptables命令行也比較繁 ...
-
elasticsearch中 refresh 和flush区别【转】
elasticsearch中有两个比较重要的操作:refresh 和 flush refresh操作 当我们向ES发送请求的时候,我们发现es貌似可以在我们发请求的同时进行搜索.而这个实时建索引并可以 ...