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下载指定页面上图片的方法
May 12 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
python3实现域名查询和whois查询功能
Jun 21 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
May 06 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jan 21 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
django queryset相加和筛选教程
May 18 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 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
几个学习PHP的网址
2006/11/25 PHP
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
php 字符串替换的方法
2012/01/10 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
Vuex简单入门
2017/04/19 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
python自动化生成IOS的图标
2018/11/13 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
python时间日期操作方法实例小结
2020/02/06 Python
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
上级检查欢迎词
2014/01/18 职场文书
大专毕业自我鉴定
2014/02/04 职场文书
模范教师事迹材料
2014/02/10 职场文书
入党推优材料
2014/06/02 职场文书
2014中考励志标语
2014/06/05 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
2014年测量员工作总结
2014/12/12 职场文书
工资证明格式模板
2015/06/12 职场文书
丧事主持词
2015/07/02 职场文书