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批量导出导入MySQL用户的方法
Nov 15 Python
python使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
Python字典操作简明总结
Apr 13 Python
Python中的localtime()方法使用详解
May 22 Python
Python入门之三角函数sin()函数实例详解
Nov 08 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
python 调用有道api接口的方法
Jan 03 Python
Python networkx包的实现
Feb 14 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
Apr 02 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
无线电的诞生过程
2021/03/01 无线电
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
js获取url参数的使用扩展实例
2007/12/29 Javascript
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python中列表元素连接方法join用法实例
2015/04/07 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
Python爬取梨视频的示例
2021/01/29 Python
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
毕业生自荐书
2013/12/18 职场文书
反对邪教标语
2014/06/30 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
2014年政工师工作总结
2014/12/18 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
新生开学寄语大全
2015/05/28 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
win10下go mod配置方式
2021/04/25 Golang
利用Python实时获取steam特惠游戏数据
2022/06/25 Python