python中实现k-means聚类算法详解


Posted in Python onNovember 11, 2017

算法优缺点:

优点:容易实现
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢
使用数据类型:数值型数据

算法思想

k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去。

1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的选择方法有两种一种是elbow method,简单的说就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好。另一种则是根据具体的需求确定,比如说进行衬衫尺寸的聚类你可能就会考虑分成三类(L,M,S)等

2.然后我们需要选择最初的聚类点(或者叫质心),这里的选择一般是随机选择的,代码中的是在数据范围内随机选择,另一种是随机选择数据中的点。这些点的选择会很大程度上影响到最终的结果,也就是说运气不好的话就到局部最小值去了。这里有两种处理方法,一种是多次取均值,另一种则是后面的改进算法(bisecting K-means)

3.终于我们开始进入正题了,接下来我们会把数据集中所有的点都计算下与这些质心的距离,把它们分到离它们质心最近的那一类中去。完成后我们则需要将每个簇算出平均值,用这个点作为新的质心。反复重复这两步,直到收敛我们就得到了最终的结果。

函数

loadDataSet(fileName)

从文件中读取数据集

distEclud(vecA, vecB)

计算距离,这里用的是欧氏距离,当然其他合理的距离都是可以的

randCent(dataSet, k)

随机生成初始的质心,这里是虽具选取数据范围内的点

kMeans(dataSet, k, distMeas=distEclud, createCent=randCent)

kmeans算法,输入数据和k值。后面两个事可选的距离计算方式和初始质心的选择方式

show(dataSet, k, centroids, clusterAssment)

可视化结果

#coding=utf-8
from numpy import *
def loadDataSet(fileName):
 dataMat = []
 fr = open(fileName)
 for line in fr.readlines():
 curLine = line.strip().split('\t')
 fltLine = map(float, curLine)
 dataMat.append(fltLine)
 return dataMat
#计算两个向量的距离,用的是欧几里得距离
def distEclud(vecA, vecB):
 return sqrt(sum(power(vecA - vecB, 2)))
#随机生成初始的质心(ng的课说的初始方式是随机选K个点) 
def randCent(dataSet, k):
 n = shape(dataSet)[1]
 centroids = mat(zeros((k,n)))
 for j in range(n):
 minJ = min(dataSet[:,j])
 rangeJ = float(max(array(dataSet)[:,j]) - minJ)
 centroids[:,j] = minJ + rangeJ * random.rand(k,1)
 return centroids
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
 m = shape(dataSet)[0]
 clusterAssment = mat(zeros((m,2)))#create mat to assign data points 
     #to a centroid, also holds SE of each point
 centroids = createCent(dataSet, k)
 clusterChanged = True
 while clusterChanged:
 clusterChanged = False
 for i in range(m):#for each data point assign it to the closest centroid
  minDist = inf
  minIndex = -1
  for j in range(k):
  distJI = distMeas(centroids[j,:],dataSet[i,:])
  if distJI < minDist:
   minDist = distJI; minIndex = j
  if clusterAssment[i,0] != minIndex: 
  clusterChanged = True
  clusterAssment[i,:] = minIndex,minDist**2
 print centroids
 for cent in range(k):#recalculate centroids
  ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this cluster
  centroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean 
 return centroids, clusterAssment
def show(dataSet, k, centroids, clusterAssment):
 from matplotlib import pyplot as plt 
 numSamples, dim = dataSet.shape 
 mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr'] 
 for i in xrange(numSamples): 
 markIndex = int(clusterAssment[i, 0]) 
 plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex]) 
 mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb'] 
 for i in range(k): 
 plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize = 12) 
 plt.show()
def main():
 dataMat = mat(loadDataSet('testSet.txt'))
 myCentroids, clustAssing= kMeans(dataMat,4)
 print myCentroids
 show(dataMat, 4, myCentroids, clustAssing) 
 
if __name__ == '__main__':
 main()

这里是聚类结果,还是很不错的啦

python中实现k-means聚类算法详解

但是有时候也会收敛到局部最小值,就像下面这样,就是不幸收敛到局部最优了

python中实现k-means聚类算法详解

总结

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

有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

Python 相关文章推荐
python定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
python中import reload __import__的区别详解
Oct 16 Python
python脚本作为Windows服务启动代码详解
Feb 11 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
python 3.6.4 安装配置方法图文教程
Sep 18 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
python/golang实现循环链表的示例代码
Sep 14 Python
用Python远程登陆服务器的步骤
Apr 16 Python
Django drf请求模块源码解析
Jun 08 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
Nov 11 #Python
Python内存管理方式和垃圾回收算法解析
Nov 11 #Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 #Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 #Python
python基础练习之几个简单的游戏
Nov 10 #Python
Python实现购物车功能的方法分析
Nov 10 #Python
Python实现的单向循环链表功能示例
Nov 10 #Python
You might like
十天学会php之第九天
2006/10/09 PHP
一个显示天气预报的程序
2006/10/09 PHP
BBS(php &amp; mysql)完整版(二)
2006/10/09 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
js实现文字滚动效果
2016/03/03 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
python合并多个excel文件的示例
2020/09/23 Python
Ibatis如何调用存储过程
2015/05/15 面试题
什么是唯一索引
2015/07/05 面试题
数控技术专业推荐信
2013/11/01 职场文书
初中生期末考试的自我评价
2013/12/17 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
八项规定自查自纠报告及整改措施
2014/10/26 职场文书
校运会广播稿
2015/08/19 职场文书
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android