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 greenlet实现原理和使用示例
Sep 24 Python
python如何在终端里面显示一张图片
Aug 17 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
May 24 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
django静态文件加载的方法
May 20 Python
对python中Librosa的mfcc步骤详解
Jan 09 Python
如何在Cloud Studio上执行Python代码?
Aug 09 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
解决jupyter notebook启动后没有token的坑
Apr 24 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 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-MySQL教程归纳总结
2008/06/07 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
php服务器的系统详解
2019/10/12 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
tangram框架响应式加载图片方法
2013/11/21 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
Python读取图片为16进制表示简单代码
2018/01/19 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
Python threading的使用方法解析
2019/08/28 Python
浅谈keras 模型用于预测时的注意事项
2020/06/27 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
美国网上书店:Barnes & Noble
2018/08/15 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
应聘医学检验人员自荐信
2013/09/27 职场文书
工程监理应届生求职信
2013/11/09 职场文书
先进人物事迹材料
2014/12/29 职场文书
员工考勤管理制度
2015/08/06 职场文书
pytorch通过训练结果的复现设置随机种子
2021/06/01 Python
python实现剪贴板的操作
2021/07/01 Python
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python
Java 异步任务计算FutureTask
2022/04/28 Java/Android