标签:
首先先说一下聚类的概念:
聚类就是现在有m个元素,每个元素都有n个可以观察到的特征属性,可以使用算法把这m个元素划分为k个子集,使得每个子集内部元素之间的相异度尽可能小,不同子集之间元素的相异度尽可能大。其中每一个子集叫做簇。
与分类不同,分类是有监督学习,要求分类前明确类别,并断言每一个元素属于哪一个类别。聚类是无监督学习,不需要指明类别甚至不给出类别数量。
在聚类的概念中还有一个相异度的概念:
一个人和章鱼的相异度肯定大于一个人和猩猩的相异度,这是我们的直观感觉,但是计算机如何知道这些相异度呢?我们必须对相异度在数学上进行定量的定义。比如X,Y是两个元素,各自有n个特征属性,我们可以用两者之间的欧氏距离表示相异度。对于不同类型的变量,相异度的计算方法也不相同,这里不再赘述。
下面开始介绍k-means聚类算法,该算法是最简单简单的聚类算法,算法过程如下:
1,首先根据给定的k值,随机选出k个点作为k个簇各自的中心。
2,分别计算剩余元素与k个簇中心的距离,将这些元素分别划分到相异度最小的簇。
3,根据聚类结果,重新计算k个簇的中心(只需简单求取每个特征属性的均值即可)
4,根据新的中心重新聚类
5,重复该过程,直到中心不变或者达到设定的迭代次数。
6,将结果输出
k-means算法的优点:k-means算法在簇与簇之间的特征区别比较明显时效果比较好。并且还算法简单容易理解,时间复杂度趋于线性,适合于挖掘大规模数据集,时间复杂度为O(nkt),n为数据量,k为簇的个数,t为迭代次数。
缺点如下:
1,需要用户事先给出k值:在很多时候,在聚类之前用户是不知道需要分为几类的,其实这也正是需要聚类解决的问题,因此用户一般很难给出准确的k值。
2,对初始中心点的选择有很大的依赖性,容易陷入局部最优,造成聚类结果不稳定和不准确。
3,对噪声和孤立点抗干扰能力差,针对大数据量开销大。
针对这些,我们可以采用一个简单实用的解决方法,结合canopy算法先进性预处理。
与传统的聚类算法不同(k-means算法),canopy算法不需要事先指定k值。canopy算法虽然精度上比较低,但是速度上有很大优势,可以作为数据预处理。
canopy算法的过程如下:
1,将数据放在list中,设定两个距离阈值T1>T2,T1,T2可以通过交叉验证获得。
2,选取list中的一个元素p,计算p与所有canopy的距离(如果不存在canopy),则把该点作为一个新的canopy,如果p与canopy的距离在T1以内,则该点加入canopy内
3,如果距离在T2以内,则该点从list中删除,认为该点与某个canopy已经足够近,不会再成为其他canopy的中心。
4,重复2,3,直到list为空。
标签:
原文地址:http://www.cnblogs.com/xtsylc/p/4806650.html