当我们在谈论kmeans(3)

本系列意在长期连载分享,内容上可能也会有所删改;

因此如果转载,请务必保留源地址,非常感谢!

博客园: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算法。

  1. 先介绍一下明氏距离(Minkowski Distance),其定义如下

    • 如果令p=2,即得到常见的欧氏距离(Euclidean Distance);从概率的角度看,欧氏距离即认为数据服从标准多维正态分布,其概率密度函数中,欧氏距离描述的就是空间中的点偏离中心的概率,相同的欧氏距离即对应着概率密度函数的等高线

    • 如果令p=0,即得到曼哈顿距离(Manhattan Distance),即每个维度的绝对值的和;当计算像素欧氏距离复杂度较高,有时候可以使用曼哈顿距离作为替代

    • 令p→∞,即切比雪夫距离(Chebyshev Distance),即取不同纬度间的最大值;不过我也不知道什么时候会用上它

    • 在此我们可以再总结一些常见的距离度量,如马氏距离(MahalanobisDistance);从概率角度看,其作用就是用多维正态分布拟合数据,描述的同样是空间中的点偏离中心的概率,相同的马氏距离即对应着概率密度函数的等高线

    • 余弦相似度(Cosine Similarity),描述的是两个向量的夹角大小

    • Jaccard相似系数(Jaccard Coefficient),描述的是两个集合的相似性

  2. 作者表示在FPGA中,欧氏距离的计算量太大,他希望用“曼哈顿距离”和“切比雪夫距离”替代。下图表示,空间中两个聚类中心,使用不同距离的分界面

  3. 单独使用“曼哈顿距离”和“切比雪夫距离”都无法很好地替代“欧氏距离”,于是作者将两者融合,并说明效果的下降在允许范围内,而计算量大大降低。(想法很有趣)

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的过程。

  1. 作者首先给出了对数据集A进行SVD的解释

  2. 然后给出了本文最主要的公式,即A中每两个向量的欧氏距离,可以用对应的“右奇异向量”的加权和表示。(注:这里我们进一步分析,由于A是一个m?n的矩阵,V是一个n?n的矩阵,若要SVD分解后能加速K-means,至少要求m>n,即样本维数大于样本数量,然而这种情况比较少见。同时,SVD分解本身也是个非常耗时的操作。因此此方法更多的是提供一种思考方式。)

  3. 本文还给出了一种设置聚类中心数量K的方法。本质跟PCA类似,就是计算数据集A的主要能量聚集在多少维度上。区别是PCA需要的是这几个维度对应的向量,而这里只需要维度的数量。

  4. 文中还有更多利用SVD加速K-means聚类的细节,不再赘述

2005年

  在Huang, Joshua Zhexue, et al. "Automated Variable Weighting in k-Means Type Clustering." 2005中,作者针对K-means算法中,每一维特征在聚类结果中权重相同的情况,提出了修改的K-mwans。

  1. 作者首先提出,在数据挖掘过程中,往往数据的维数都是成百上千,而其中对分析有意义的维数只是部分。以往根据经验给每一维数据赋权重,作者提出一种算法来自动求出权重。
  2. 先给出原始K-means的损失函数,即最小均方误差

  3. 然后作者给出修改的K-means的损失函数。本质就是在损失函数里增加了权重,然后继续通过EM算法求解。在最小均方误差的约束下,类内距离小的那一维特征会被赋予较大的权重,类内距离较大的则会被赋予较小的权重。即作者所说的,自动求解权重

  4. 关于详细的求解步骤,与收敛性的证明,可以参考原论文

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等算法的稳定性

  1. 作者先明确了研究的问题,即

    • Ensembling是否能提升聚类的稳定性?
    • 是否聚类的稳定性能与准确性正相关?
    • 是否能利用聚类稳定性指标来描述聚类的有效性?
  2. 作者给出了Ensembling的方法,即把数据分成L组,再分别对L组的数据进行聚类,并将结果融合

  3. 对于上述问题,作者都没有给出理论证明,都是实验上的说明:
    • Ensembling是否能提升聚类的稳定性?

      大部分情况下,Ensembling能提升聚类的稳定性。同时需要说明的是,Ensembling更稳定的情况基本发生在聚类中心较大的时候,即Ensembling会倾向于选择更多的聚类中心

    • 是否聚类的稳定性能与准确性正相关?

      跟设想的结果差不多,聚类的稳定性跟准确性并没有明确的正相关。不同的数据集上,有着完全不同的相关性。

    • 是否能利用聚类稳定性指标来描述聚类的有效性?

      在这部分,作者主要阐述了利用聚类稳定性指标来选择聚类中心数量的想法。即,作者通过给出一个稳定性指标,表示在稳定性较大的时候的聚类中心数量会很接近真实的类别数量。

2007年

  在Arthur, David, and S. Vassilvitskii. "k-means++: the advantages of careful seeding." 2015中,作者提出了K-means++算法,也是较为常用的K-means修改算法之一。这个算法主要提出了一种选择初始化聚类中心的方法,并从理论上证明了这个方案会使收敛更快,且效果更好

  1. 这个初始化聚类中心的方法其实很简单:即以概率的形式逐个选择聚类中心,并在选择聚类中心时,给距离较远的点更高的权重,即更容易被选择为聚类中心

  1. 这个想法其实并不是非常新奇,这种逐个选择聚类中心的思想,在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聚类中心数量的方法。并通过实验对比了这些方法在估计类别数量、中心、标记时的准确度。

  1. 作者首先介绍了Mirkin提出的Intelligent K-means算法,本质是通过异常检测的思想,一步步确定每个类别。具体描述如下

  1. 为了选择对照算法,作者总结了其他估计聚类数量K的算法。针对不同类型的方法,作者也给出了例子。有兴趣的同学可以参考原文。

    • 基于变化的算法:即定义一个函数,认为在正确的K时会产生极值。
    • 基于结构的算法:即比较类内距离、类间距离以确定K。
    • 基于一致性矩阵的算法:即认为在正确的K时,不同聚类的结果会更加相似,以此确定K。
    • 基于层次聚类:即基于合并或分裂的思想,在一定情况下停止获得K。
    • 基于采样的算法:即对样本采样,分别做聚类;根据这些结果的相似性确定K。
  2. 最后通过对比实验,作者给出结论认为Intelligent K-means能较为有效的估计真实聚类中心、以及样本所属类别。同时,Intelligent K-means对类别数量的估计普遍较大。不过由于实验是在高斯分布的仿真实验下进行的,结论并非我所关注,不再赘述。
时间: 2024-10-10 02:56:51

当我们在谈论kmeans(3)的相关文章

当我们在谈论kmeans(5)

本系列意在长期连载分享,内容上可能也会有所删改: 因此如果转载,请务必保留源地址,非常感谢! 博客园:http://www.cnblogs.com/data-miner/(暂时公式显示有问题) 其他:建设中- 当我们在谈论kmeans:总结 概述 通过前面阅读K-means相关论文,大致能梳理出K-means算法发展过程中的一些轨迹.由于本人所阅读的仅仅是一部分,因此还会有更多的方面,欢迎大家补充(补充时请给出具体例子). K-means算法的提出 对K-means算法的性质进行分析的文章相继发

【转】 聚类算法-Kmeans算法的简单实现

1. 聚类与分类的区别: 首先要来了解的一个概念就是聚类,简单地说就是把相似的东西分到一组,同 Classification (分类)不同,对于一个 classifier ,通常需要你告诉它"这个东西被分为某某类"这样一些例子,理想情况下,一个 classifier 会从它得到的训练集中进行"学习",从而具备对未知数据进行分类的能力,这种提供训练数据的过程通常叫做 supervised learning (监督学习),而在聚类的时候,我们并不关心某一类是什么,我们需

EM算法(1):K-means 算法

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解 EM算法(1) : K-means算法 1. 简介 K-means算法是一类无监督的聚类算法,目的是将没有标签的数据分成若干个类,每一个类都是由相似的数据组成.这个类的个数一般是认为给定的. 2. 原理 假设给定一个数据集$\mathbf{X} = \{\mathbf{x}_1, \mathbf{x}_2,...,\mathbf{x}_N \}$, 和类的个数K.我们的每个类都用一个中心点$

学习笔记:聚类算法Kmeans

前记 Kmeans是最简单的聚类算法之一,但是运用十分广泛,最近看到别人找实习笔试时有考到Kmeans,故复习一下顺手整理成一篇笔记.Kmeans的目标是:把n 个样本点划分到k 个类簇中,使得每个点都属于离它最近的质心对应的类簇,以之作为聚类的标准.质心,是指一个类簇内部所有样本点的均值. 算法描述 Step 1. 从数据集中随机选取K个点作为初始质心         将每个点指派到最近的质心,形成k个类簇 Step 2. repeat             重新计算各个类簇的质心(即类内部

K-Means聚类

聚类(clustering) 用于找出不带标签数据的相似性的算法 K-Means聚类算法简介 与广义线性模型和决策树类似,K-Means参 数的最优解也是以成本函数最小化为目标.K-Means成本函数公式如下: 成本函数是各个类畸变程度(distortions)之和.每个类的畸变程度等于 该类重心与其内部成员位置距离的平方和.若类内部的成员彼此间越紧凑则类的畸变程度越小,反 之,若类内部的成员彼此间越分散则类的畸变程度越大.求解成本函数最小化的参数就是一个重复配 置每个类包含的观测值,并不断移动

机器学习文本挖掘之spherical k-means algorithm初识

Spherical K-Means 法によるクラスタ分析の実験検証 1.1研究背景.目的: インターネットの普及などにより.膨大なデータの中からデータ間の関係を見つけ出したり.有用な情報をを取り出すためにクラスタリングを行われている. { 本研究では.データマイニングの手法の一つであるクラスタリングに関して研究を行う.ク ラスタリングとは.様々な数値解析手法の総称であり.それらの目的は多変量データを解析 し.観測データを同一のクラスタごとに分類し.それぞれのクラスタの区別を明確化あるいは 発見す

[数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现

聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记录)的集合,将这些对象划分为多个组或者“聚簇”,从而使同组内的对象间比较相似而不同组对象间差异比较大:换言之,聚类算法就是将相似的对象放到同一个聚簇中,而将不相似的对象放到不同的聚簇中.由于在聚类过程中不使用到类别标签,所以相似性的概念要基于对象的属性进行定义.应用不同则相似性规则和聚类算法一般不太

Python—kmeans算法学习笔记

一.   什么是聚类 聚类简单的说就是要把一个文档集合根据文档的相似性把文档分成若干类,但是究竟分成多少类,这个要取决于文档集合里文档自身的性质.下面这个图就是一个简单的例子,我们可以把不同的文档聚合为3类.另外聚类是典型的无指导学习,所谓无指导学习是指不需要有人干预,无须人为文档进行标注. 二.聚类算法:from sklearn.cluster import KMeans def __init__(self, n_clusters=8, init='k-means++', n_init=10,

一种压缩图片的方法---Machine learning 之 K-Means

背景描述: RGB编码:对于一个直接用24bit表示每一个而像素的图像来说,每一个pixel使用8-bit无符号整数(0-255)来表示红or绿or蓝. 压缩目的: 将128x128大小的图片由原来的24bit表示-压缩成->16bit表示每一个像素的图像. 压缩方法: 对于每一个pixel, 使用 K-Means选择16bits来表示原来的24bits.当然,具体是通过计算每一个像素空间的16bits大小的聚类来表示原来的24bits. 实现步骤: 1.将原来的128x128大小的图片读入到一