|
|
★ 小木虫: 金币+0.5, 给个红包,谢谢回帖
借着楼主的这个话题,最近做的项目中用到了这几个算法(实际上是调用了大数据机器学习算法的开源接口spark的ml库)我也总结一番。
先说说聚类相关的内容。
(一)k-means算法
首先是k-means算法,k-means算法是聚类分析中使用最广泛的算法之一。它把n个样本根据它们的属性特征分为k个聚类,也常被称作k个簇,以便使得所获得的聚类满足:同一聚类(同一个簇)中的样本相似度较高;而不同聚类(不同簇)中的样本相似度较小。
1、k-means算法的基本过程如下所示:
(1)任意选择k个初始中心c_{1},c_{2},...,c_{k} 。
(2)计算X中的每个样本与这些中心的距离;并根据最小距离重新对相应样本进行划分;
(3)重新计算每个中心对象 C_{i} 的值
(4)计算标准测度函数,当满足一定条件,如函数收敛时,则算法终止;如果条件不满足则重复步骤(2),(3)。
2、k-means算法的缺点,k-means算法虽然简单快速,但是存在下面的缺点:
聚类中心的个数K需要事先给定,但在实际中K值的选定是非常困难的,很多时候我们并不知道给定的数据集应该分成多少个类别才最合适。
k-means算法需要随机地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果。
第一个缺陷我们很难在k-means算法以及其改进算法中解决,但是我们可以通过k-means++算法来解决第二个缺陷。
(二)k-means++算法
1、k-means++算法选择初始聚类中心的基本原则是:初始的聚类中心之间的相互距离要尽可能的远。它选择初始聚类中心的步骤是:
(1)从输入的数据点集合中随机选择一个点作为第一个聚类中心 c_{1} ;
(2)对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x),并根据概率选择新的聚类中心 c_{i} 。
(3)重复过程(2)直到找到k个聚类中心。
2、第(2)步中,依次计算每个数据点与最近的种子点(聚类中心)的距离,依次得到D(1)、D(2)、...、D(n)构成的集合D,其中n表示数据集的大小。在D中,为了避免噪声,不能直接选取值最大的元素,应该选择值较大的元素,然后将其对应的数据点作为种子点(聚类中心)。
3、那么如何选择值较大的元素呢,下面是spark中实现的思路:
求所有的距离和Sum(D(x))
取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先用Sum(D(x))乘以随机值Random得到值r,然后用currSum += D(x),直到其currSum > r,此时的点就是下一个“种子点”。
为什么用这样的方式呢?我们换一种比较好理解的方式来说明。把集合D中的每个元素D(x)想象为一根线L(x),线的长度就是元素的值。将这些线依次按照L(1)、L(2)、...、L(n)的顺序连接起来,组成长线L。L(1)、L(2)、…、L(n)称为L的子线。 根据概率的相关知识,如果我们在L上随机选择一个点,那么这个点所在的子线很有可能是比较长的子线,而这个子线对应的数据点就可以作为种子点。
(三)二分k-means算法
1、二分k-means算法是分层聚类(Hierarchical clustering)的一种,分层聚类是聚类分析中常用的方法。 分层聚类的策略一般有两种:
聚合。这是一种自底向上的方法,每一个观察者初始化本身为一类,然后两两结合
分裂。这是一种自顶向下的方法,所有观察者初始化为一类,然后递归地分裂它们
二分k-means算法是分裂法的一种。
2、二分k-means算法是k-means算法的改进算法,相比k-means算法,它有如下优点:
二分k-means算法可以加速k-means算法的执行速度,因为它的相似度计算少了
能够克服k-means收敛于局部最小的缺点
二分k-means算法的一般流程如下所示:
(1)把所有数据初始化为一个簇,将这个簇分为两个簇。
(2)选择满足条件的可以分解的簇。选择条件综合考虑簇的元素个数以及聚类代价(也就是误差平方和SSE)
(3)使用k-means算法将可分裂的簇分为两簇。
(4)一直重复(2)(3)步,直到满足迭代结束条件。
以上过程隐含着一个原则是:因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于它们的质心,聚类效果就越好。 所以我们就需要对误差平方和最大的簇进行再一次的划分,因为误差平方和越大,表示该簇聚类越不好,越有可能是多个簇被当成一个簇了,所以我们首先需要对这个簇进行划分。
(三)高斯混合模型
顾名思义,就是数据可以看作是从多个高斯分布中生成出来的。从中心极限定理可以看出,高斯分布这个假设其实是比较合理的。 为什么我们要假设数据是由若干个高斯分布组合而成的,而不假设是其他分布呢?实际上不管是什么分布,只K取得足够大,这个XX Mixture Model就会变得足够复杂,就可以用来逼近任意连续的概率密度分布。只是因为高斯函数具有良好的计算性能,所GMM被广泛地应用。
每个GMM由K个高斯分布组成,每个高斯分布称为一个组件(Component),这些组件线性加成在一起就组成了GMM的概率密度函数。如果我们要从GMM分布中随机地取一个点,需要两步:
随机地在这K个组件之中选一个,每个组件被选中的概率实际上就是它的系数pi_k;
选中了组件之后,再单独地考虑从这个组件的分布中选取一个点。
怎样用GMM来做聚类呢?其实很简单,现在我们有了数据,假定它们是由GMM生成出来的,那么我们只要根据数据推出GMM的概率分布来就可以了,然后GMM的K个组件实际上就对应了K个聚类了。
再说说PCA算法:
(四)在机器学习领域中,我们对原始数据进行特征提取,有时会得到比较高维的特征向量。在这些向量所处的高维空间中,包含很多的冗余和噪声。我们希望通过降维的方式来寻找数据内部的特性,从而提升特征表达能力,降低训练复杂度CA(principal components analysis), 即主成分分析,旨在找到数据中的主成分,并利用这些主成分表征原始数据,从而达到降维的目的。
PCA的求解方法:
对样本进行中心化处理
求样本的协方差矩阵
对协方差矩阵进行特征值分解,将特征值从大到小排列
取前k大的特征值对应的特征向量
最后通过向量内积映射将n维样本向量映射到k维
就先总结这么多吧,回复不能编辑公式,有些总结的比较含糊。。 |
|