码迷,mamicode.com
首页 > 编程语言 > 详细

k-means聚类算法

时间:2015-09-14 12:01:37      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

首先先说一下聚类的概念:

聚类就是现在有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为空。

k-means聚类算法

标签:

原文地址:http://www.cnblogs.com/xtsylc/p/4806650.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!