K-means是机器学习中一个比较常用的算法,属于无监督学习算法,其常被用于数据的聚类,只需为它指定簇的数量即可自动将数据聚合到多类中,相同簇中的数据相似度较高,不同簇中数据相似度较低。
K-MEANS算法是输入聚类个数k,以及包含 n个数据对象的数据库,输出满足方差最小标准k个聚类的一种算法。k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
核心思想
通过迭代寻找k个类簇的一种划分方案,使得用这k个类簇的均值来代表相应各类样本时所得的总体误差最小。
k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。
k-means算法的基础是最小误差平方和准则,K-menas的优缺点:
优点:
原理简单
速度快
对大数据集有比较好的伸缩性
缺点:
需要指定聚类 数量K
对异常值敏感
对初始值敏感
K-means的聚类过程
其聚类过程类似于梯度下降算法,建立代价函数并通过迭代使得代价函数值越来越小
适当选择c个类的初始中心;
在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类;
利用均值等方法更新该类的中心值;
对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。
该算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式。
K-means 实例展示
python中km的一些参数:
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
|
sklearn.cluster.KMeans( n_clusters = 8 , init = 'k-means++' , n_init = 10 , max_iter = 300 , tol = 0.0001 , precompute_distances = 'auto' , verbose = 0 , random_state = None , copy_x = True , n_jobs = 1 , algorithm = 'auto' ) n_clusters: 簇的个数,即你想聚成几类 init: 初始簇中心的获取方法 n_init: 获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始 10 个质心,实现算法,然后返回最好的结果。 max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代) tol: 容忍度,即kmeans运行准则收敛的条件 precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是 True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs * samples 的数量大于 12e6 的时候 False , False 时核心实现的方法是利用Cpython 来实现的 verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值) random_state: 随机生成簇中心的状态条件。 copy_x: 对是否修改数据的一个标记,如果 True ,即复制了就不会修改数据。 bool 在scikit - learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。 n_jobs: 并行设置 algorithm: kmeans的实现算法,有: 'auto' , ‘full ', ‘elkan' , 其中 ‘full'表示用EM方式实现 虽然有很多参数,但是都已经给出了默认值。所以我们一般不需要去传入这些参数,参数的。可以根据实际需要来调用。 |
下面展示一个代码例子
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
|
from sklearn.cluster import KMeans from sklearn.externals import joblib from sklearn import cluster import numpy as np # 生成10*3的矩阵 data = np.random.rand( 10 , 3 ) print data # 聚类为4类 estimator = KMeans(n_clusters = 4 ) # fit_predict表示拟合+预测,也可以分开写 res = estimator.fit_predict(data) # 预测类别标签结果 lable_pred = estimator.labels_ # 各个类别的聚类中心值 centroids = estimator.cluster_centers_ # 聚类中心均值向量的总和 inertia = estimator.inertia_ print lable_pred print centroids print inertia 代码执行结果 [ 0 2 1 0 2 2 0 3 2 0 ] [[ 0.3028348 0.25183096 0.62493622 ] [ 0.88481287 0.70891813 0.79463764 ] [ 0.66821961 0.54817207 0.30197415 ] [ 0.11629904 0.85684903 0.7088385 ]] 0.570794546829 |
为了更直观的描述,这次在图上做一个展示,由于图像上绘制二维比较直观,所以数据调整到了二维,选取100个点绘制,聚类类别为3类
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
|
from sklearn.cluster import KMeans from sklearn.externals import joblib from sklearn import cluster import numpy as np import matplotlib.pyplot as plt data = np.random.rand( 100 , 2 ) estimator = KMeans(n_clusters = 3 ) res = estimator.fit_predict(data) lable_pred = estimator.labels_ centroids = estimator.cluster_centers_ inertia = estimator.inertia_ #print res print lable_pred print centroids print inertia for i in range ( len (data)): if int (lable_pred[i]) = = 0 : plt.scatter(data[i][ 0 ],data[i][ 1 ],color = 'red' ) if int (lable_pred[i]) = = 1 : plt.scatter(data[i][ 0 ],data[i][ 1 ],color = 'black' ) if int (lable_pred[i]) = = 2 : plt.scatter(data[i][ 0 ],data[i][ 1 ],color = 'blue' ) plt.show() |
可以看到聚类效果还是不错的,对k-means的聚类效率进行了一个测试,将维度扩宽到50维
数据规模 | 消耗时间 | 数据维度 |
---|---|---|
10000条 | 4s | 50维 |
100000条 | 30s | 50维 |
1000000条 | 4'13s | 50维 |
对于百万级的数据,拟合时间还是能够接受的,可见效率还是不错,对模型的保存与其它的机器学习算法模型保存类似
1
2
|
from sklearn.externals import joblib joblib.dump(km, "model/km_model.m" ) |
总结
以上就是本文关于详解K-means算法在Python中的实现的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:https://segmentfault.com/a/1190000010863236