机器学习K-means算法在Python中的实现

作者: 佚名 2017-09-12 16:57:43

K-means算法简介

K-means是机器学习中一个比较常用的算法,属于无监督学习算法,其常被用于数据的聚类,只需为它指定簇的数量即可自动将数据聚合到多类中,相同簇中的数据相似度较高,不同簇中数据相似度较低。

K-menas的优缺点:

优点:

  • 原理简单
  • 速度快
  • 对大数据集有比较好的伸缩性

缺点:

  • 需要指定聚类 数量K
  • 对异常值敏感
  • 对初始值敏感

K-means的聚类过程

其聚类过程类似于梯度下降算法,建立代价函数并通过迭代使得代价函数值越来越小

  • 适当选择c个类的初始中心;
  • 在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类;
  • 利用均值等方法更新该类的中心值;
  • 对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。

该算法的最大优势在于简洁和快速。算法的关键在于初始中心的选择和距离公式。

K-means 实例展示

python中km的一些参数:

  1. sklearn.cluster.KMeans( 
  2.  
  3.     n_clusters=8, 
  4.  
  5.     init='k-means++'
  6.  
  7.     n_init=10, 
  8.  
  9.     max_iter=300, 
  10.  
  11.     tol=0.0001, 
  12.  
  13.     precompute_distances='auto'
  14.  
  15.     verbose=0, 
  16.  
  17.     random_state=None, 
  18.  
  19.     copy_x=True
  20.  
  21.     n_jobs=1, 
  22.  
  23.     algorithm='auto' 
  24.  
  25.     )  
  • 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. from sklearn.cluster import KMeans 
  2.  
  3. from sklearn.externals import joblib 
  4.  
  5. from sklearn import cluster 
  6.  
  7. import numpy as np  
  8.   
  9.  
  10. # 生成10*3的矩阵 
  11.  
  12. data = np.random.rand(10,3) 
  13.  
  14. print data 
  15.  
  16. # 聚类为4类 
  17.  
  18. estimator=KMeans(n_clusters=4) 
  19.  
  20. # fit_predict表示拟合+预测,也可以分开写 
  21.  
  22. res=estimator.fit_predict(data) 
  23.  
  24. # 预测类别标签结果 
  25.  
  26. lable_pred=estimator.labels_ 
  27.  
  28. # 各个类别的聚类中心值 
  29.  
  30. centroids=estimator.cluster_centers_ 
  31.  
  32. # 聚类中心均值向量的总和 
  33.  
  34. inertia=estimator.inertia_  
  35.   
  36.  
  37. print lable_pred 
  38.  
  39. print centroids 
  40.  
  41. print inertia  
  42.   
  43.  
  44. 代码执行结果 
  45.  
  46. [0 2 1 0 2 2 0 3 2 0]  
  47.   
  48.  
  49. [[ 0.3028348   0.25183096  0.62493622] 
  50.  
  51. [ 0.88481287  0.70891813  0.79463764] 
  52.  
  53. [ 0.66821961  0.54817207  0.30197415] 
  54.  
  55. [ 0.11629904  0.85684903  0.7088385 ]] 
  56.  
  57. 0.570794546829  

为了更直观的描述,这次在图上做一个展示,由于图像上绘制二维比较直观,所以数据调整到了二维,选取100个点绘制,聚类类别为3类

  1. from sklearn.cluster import KMeans 
  2.  
  3. from sklearn.externals import joblib 
  4.  
  5. from sklearn import cluster 
  6.  
  7. import numpy as np 
  8.  
  9. import matplotlib.pyplot as plt  
  10.   
  11.  
  12. data = np.random.rand(100,2) 
  13.  
  14. estimator=KMeans(n_clusters=3) 
  15.  
  16. res=estimator.fit_predict(data) 
  17.  
  18. lable_pred=estimator.labels_ 
  19.  
  20. centroids=estimator.cluster_centers_ 
  21.  
  22. inertia=estimator.inertia_ 
  23.  
  24. #print res 
  25.  
  26. print lable_pred 
  27.  
  28. print centroids 
  29.  
  30. print inertia  
  31.   
  32.  
  33. for i in range(len(data)): 
  34.  
  35.     if int(lable_pred[i])==0: 
  36.  
  37.         plt.scatter(data[i][0],data[i][1],color='red'
  38.  
  39.     if int(lable_pred[i])==1: 
  40.  
  41.         plt.scatter(data[i][0],data[i][1],color='black'
  42.  
  43.     if int(lable_pred[i])==2: 
  44.  
  45.         plt.scatter(data[i][0],data[i][1],color='blue'
  46.  
  47. plt.show() 

可以看到聚类效果还是不错的,对k-means的聚类效率进行了一个测试,将维度扩宽到50维

对于百万级的数据,拟合时间还是能够接受的,可见效率还是不错,对模型的保存与其它的机器学习算法模型保存类似

  1. from sklearn.externals import joblib  
  2. joblib.dump(km,"model/km_model.m")   
机器学习 K-means算法 Python
上一篇:TensorFlow产品经理:机器学习如何改变未来十年的软硬件? 下一篇:这里有全球首个游戏克隆AI技术,两分钟打造一个超级玛丽
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

机器学习转化为生产力,警惕这4个常见陷阱!

几乎每个人都想在他们的业务中引入机器学习,但是这些人也遇到了一个大问题:让模型可持续发展十分困难,尤其是在云架构的基础上。medium上一位博主也指出了这个问题,并提出了将机器学习模型投入生产的4个常见陷阱。

大数据文摘 ·  18h前
500亿参数,支持103种语言:谷歌推出「全球文字翻译」模型

由于缺乏平行数据,小语种的翻译一直是一大难题。来自谷歌的研究者提出了一种能够翻译 103 种语言的大规模多语言神经机器翻译模型,在数据丰富和匮乏的语种翻译中都实现了显著的性能提升。

机器之心 ·  1天前
机器学习免费跑分神器:集成各大数据集,连接GitHub就能用

搞机器学习的小伙伴们,免不了要在各种数据集上,给AI模型跑分。现在,Papers with Code (那个以论文搜代码的神器) 团队,推出了自动跑分服务,名叫sotabench,以跑遍所有开源模型为己任。

栗子 鱼羊 ·  1天前
大数据为什么不够聪明?机器要如何走向强人工智能

大数据为什么不够聪明?比概率语言更强大的思考工具是什么?科幻电影中的强人工智能到底怎样实现?如何让智能机器像人一样思考?搞清楚因果关系才能拨云见日。

明日情报 ·  2天前
2019机器学习框架之争:与Tensorflow竞争白热化,进击的PyTorch赢在哪里?

2019年,机器学习框架之争进入了新阶段:PyTorch与TensorFlow成为最后两大玩家,PyTorch占据学术界领军地位,TensorFlow在工业界力量依然强大,两个框架都在向对方借鉴,但是都不太理想。

大数据文摘 ·  2天前
机器学习帮你预测电池寿命:精确了解电池还能充几次

电池寿命的确定,是移动硬件发展的重要一环,但是由于电池电化学反应的不确定性以及不同的使用环境和习惯,电池寿命变成了一门玄学。不过柏林的三位小伙伴,利用Tensorflow,在原有的预测体系基础上。更近一步,完成了电池的全寿命预测。

靓科技解读 ·  2天前
PyTorch横扫顶会,TensorFlow退守业界:机器学习框架一年变天

机器学习框架的世界,局势变化过于迅猛,稍不注意就会被抢了地盘。一年前,TensorFlow还是各大顶会论文选择的主流框架,如今顶会几乎成了PyTorch的天下。

鱼羊 栗子 ·  2天前
Nature发文:深度学习系统为什么这么好骗?

今天的人工智能系统经常会出现莫名其妙的 bug。最新一期《自然》杂志上的这篇文章向我们介绍了深度学习为什么如此容易出错,以及解决这些问题的研究方向。

机器之心 ·  3天前
Copyright©2005-2019 51CTO.COM 版权所有 未经许可 请勿转载