机器学习之聚类

1.kmeans聚类算法

传统的kmeans思路分析:

根据经验确定应该把数据聚类的类的个数N,随机的从数据集中选取N个点作为初始质心,遍历数据集中的每个点,把各个点归为与其距离最近的质心那一类(这里样本的各个特征应该同等重要,所以应该把数据标准化)。把所有数据聚为N类之后,选取每一类各个样本特征的平均值作为新的质心。注意这里的质心的选择是随机的,会导致聚类的效果不太好且运行时间也会过长。

2.k-medoids算法

它和kmeans聚类算法的区别在于最后质心的更新上,聚类好之后质心不是像kmeans那样更新为各个点的均值,而是遍历该类别中的每一个点计算离其它点的距离之和,选取值最小的那个作为质心。

3.kmeans++

总体思路与kmeans相同只不过对于质心的选择方法进行了优化。对于质心不再是全部都随机进行选择。确定思路如下:第一、先从样本集中随机的选取一个样本点作为质心。第二、对于数据集中的每一个数据,计算它与已选择的所有质心离其最近的质心之间的距离组成集合D。第三、从D中选择最大的值作为新增的质心。第四、重复第二第三步骤N-1次直到选择出N个所有质心。

4.elkan K-Means

它是从距离计算的角度进行优化。

在传统的K-Means算法中,我们在每轮迭代时,要计算所有的样本点到所有的质心的距离,这样会比较的耗时。那么,对于距离的计算有没有能够简化的地方呢?elkan K-Means算法就是从这块入手加以改进。它的目标是减少不必要的距离的计算。那么哪些距离不需要计算呢?elkan K-Means利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算

第一种规律是对于一个样本点x和两个质心j1,j2。如果我们预先计算出了这两个质心之间的距离D(j1,j2),则如果计算发现2D(x,j1)≤D(j1,j2),我们立即就可以知道D(x,j1)≤D(x,j2)。此时我们不需要再计算D(x,j2),也就是说省了一步距离计算。

第二种规律是对于一个样本点x和两个质心j1,j2。我们可以得到D(x,j2)≥max{0,D(x,j1)−D(j1,j2)}。这个从三角形的性质也很容易得到。

5.二分kmeans聚类算法

Kmeans算法中质心的选择至关重要,但是算法中质心却是随机选择的,这难免会使得模型的准确度下降。为了弱化初始质心对模型的影响,出现了二分kmeans聚类算法。

思路:首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大程度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目k为止

伪代码如下:

将所有数据点看成一个簇 
当簇数目小于k时 
对每一个簇 
计算总误差 
在给定的簇上面进行k-均值聚类(k=2) 
计算将该簇一分为二后的总误差 
选择使得误差最小的那个簇进行划分操作

6.谱聚类聚类算法

它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。

sklearn中的应用见:http://www.cnblogs.com/pinard/p/6235920.html

7.BIRCH聚类算法(层次聚类)

BIRCH算法比较适合于数据量大,类别数K也比较多的情况。它运行速度很快,只需要单遍扫描数据集就能进行聚类,具体在sklearn中的使用见:http://www.cnblogs.com/pinard/p/6200579.html

posted @ 2019-07-05 22:29  喂你在哪  阅读(195)  评论(0编辑  收藏  举报