详解K-means算法在Python中的实现


Posted in Python onDecember 05, 2017

K-means算法简介

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中的实现

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

K-means 实例展示

python中km的一些参数:

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方式实现
虽然有很多参数,但是都已经给出了默认值。所以我们一般不需要去传入这些参数,参数的。可以根据实际需要来调用。

下面展示一个代码例子

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类

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算法在Python中的实现

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

数据规模 消耗时间 数据维度
10000条 4s 50维
100000条 30s 50维
1000000条 4'13s 50维

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

from sklearn.externals import joblib
joblib.dump(km,"model/km_model.m")

总结

以上就是本文关于详解K-means算法在Python中的实现的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Python实现调度算法代码详解

Python算法输出1-9数组形成的结果为100的所有运算式

Python编程实现蚁群算法详解

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python中编写ORM框架的入门指引
Apr 29 Python
Djang中静态文件配置方法
Jul 30 Python
用生成器来改写直接返回列表的函数方法
May 25 Python
在Python web中实现验证码图片代码分享
Nov 09 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
Jun 27 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
django框架创建应用操作示例
Sep 26 Python
Python中的四种交换数值的方法解析
Nov 18 Python
Python使用进程Process模块管理资源
Mar 05 Python
Python基于yaml文件配置logging日志过程解析
Jun 23 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 Python
Python实现字符串匹配算法代码示例
Dec 05 #Python
Django实现简单分页功能的方法详解
Dec 05 #Python
Python生成8位随机字符串的方法分析
Dec 05 #Python
在Python程序员面试中被问的最多的10道题
Dec 05 #Python
Python对列表去重的多种方法(四种方法)
Dec 05 #Python
详解Python在七牛云平台的应用(一)
Dec 05 #Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 #Python
You might like
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
如何在php中正确的使用json
2013/08/06 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
jquery下实现overlay遮罩层代码
2010/08/25 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
微信小程序自定义tabBar在uni-app的适配详解
2019/09/30 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
python 模拟登陆github的示例
2020/12/04 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
巾帼文明岗申报材料
2014/05/01 职场文书
公益广告标语
2014/06/19 职场文书
励志演讲稿大全
2014/08/21 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
资料员岗位职责范本
2015/04/13 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
高二语文教学反思
2016/02/16 职场文书
你喜欢篮球吗?Python实现篮球游戏
2021/06/11 Python