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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
python读取json文件并将数据插入到mongodb的方法
Mar 23 Python
python选择排序算法实例总结
Jul 01 Python
Python之ReportLab绘制条形码和二维码的实例
Jan 15 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
Python3 实现文件批量重命名示例代码
Jun 03 Python
Python中py文件转换成exe可执行文件的方法
Jun 14 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
python中列表的含义及用法
May 26 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生成图片验证码、点击切换实例
2014/06/25 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
Laravel 队列使用的实现
2019/01/08 PHP
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
解释&amp;&amp;和||在javascript中的另类用法
2014/07/28 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
跟老齐学Python之正规地说一句话
2014/09/28 Python
Python获取系统默认字符编码的方法
2015/06/04 Python
Python实现的使用telnet登陆聊天室实例
2015/06/17 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
python实现高斯投影正反算方式
2020/01/17 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
Python包和模块的分发详细介绍
2020/06/19 Python
Python 在函数上添加包装器
2020/07/28 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
农药学硕士毕业生自荐信
2013/09/25 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
颐和园导游词400字
2015/01/30 职场文书
MySQL开启事务的方式
2021/06/26 MySQL
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python