转自:http://blog.csdn.net/lc013/article/details/56283261
参考自:
简介
K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据集聚类成不同的组。
K-均值是一个迭代算法,假设我们想要将数据聚类成n个组,其方法为:
- 首先选择K个随机的点,称其为聚类中心
- 对于数据集中的每一个数据,按照距离K个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一个类
- 计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置
- 重复步骤2-3,直到中心点不再变化
这个过程中分两个主要步骤,第一个就是第二步,将训练集中的样本点根据其与聚类中心的距离,分配到距离最近的聚类中心处,接着第二个就是第三步,更新类中心,做法是计算每个类的所有样本的平均值,然后将这个平均值作为新的类中心值,接着继续这两个步骤,直到达到终止条件,一般是指达到设定好的迭代次数。
当然在这个过程中可能遇到有聚类中心是没有分配数据点给它的,通常的一个做法是删除这种聚类中心,或者是重新选择聚类中心,保证聚类中心数还是初始设定的K个。
优化目标
K-均值最小化问题,就是最小化所有的数据点与其所关联的聚类中心之间的距离之和,因此K-均值的代价函数(又称为畸变函数)为:
其中 μc(i) 代表与 x(i) 最近的聚类中心点。
所以我们的优化目标是找出是的代价函数最小的
和c(1),c(2),…,c(m)和μ1,μ2,…,μm
:
回顾K-均值迭代算法的过程可知,第一个循环就是用于减小 c(i) 引起的代价,而第二个循环则是用于减小 μi 引起的代价,因此, 迭代的过程一定会是每一次迭代都在减小代价函数,不然便是出现了错误。
随机初始化
在运行K-均值算法之前,首先需要随机初始化所有的聚类中心点,做法如下:
- 首先应该选择 K<m ,即聚类中心点的个数要小于所有训练集实例的数量
- 随机选择 K 个训练实例,然后令 K 个聚类中心分别于这K个训练实例相等
K-均值的一个问题在于,它有可能会停留在一个局部最小值处,而这取决于初始化的情况。
为了解决这个问题,通常需要多次运行K-均值算法,每一次都重新进行随机初始化,最后再比较多次运行K-均值的结果,选择代价函数最小的结果。这种方法在K较小(2-10)的时候还是可行的,但是如果K较大,这种做法可能不会有明显地改善。
优缺点
优点
- k-means算法是解决聚类问题的一种经典算法,算法简单、快速。
- 对处理大数据集,该算法是相对可伸缩的和高效率的,因为它的复杂度大约是 O(nkt) ,其中 n 是所有对象的数目, k 是簇的数目, t 是迭代的次数。通常 k<<n 。这个算法通常局部收敛。
- 算法尝试找出使平方误差函数值最小的k个划分。当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好。
缺点
- k-平均方法只有在簇的平均值被定义的情况下才能使用,且对有些分类属性的数据不适合。
- 要求用户必须事先给出要生成的簇的数目 k 。
- 对初值敏感,对于不同的初始值,可能会导致不同的聚类结果。
- 不适合于发现非凸面形状的簇,或者大小差别很大的簇。
- 对于“噪声”和孤立点数据敏感,少量的该类数据能够对平均值产生极大影响。
代码实现
代码参考自K-Means Clustering。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
完整代码例子和数据可以查看Kmeans练习代码。