python中kmeans聚类实现代码


Posted in Python onFebruary 23, 2018

k-means算法思想较简单,说的通俗易懂点就是物以类聚,花了一点时间在python中实现k-means算法,k-means算法有本身的缺点,比如说k初始位置的选择,针对这个有不少人提出k-means++算法进行改进;另外一种是要对k大小的选择也没有很完善的理论,针对这个比较经典的理论是轮廓系数,二分聚类的算法确定k的大小,在最后还写了二分聚类算法的实现,代码主要参考机器学习实战那本书:

#encoding:utf-8 
''''' 
Created on 2015年9月21日 
@author: ZHOUMEIXU204 
''' 
 
 
path=u"D:\\Users\\zhoumeixu204\\Desktop\\python语言机器学习\\机器学习实战代码  python\\机器学习实战代码\\machinelearninginaction\\Ch10\\" 
import numpy as np 
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 np.sqrt(np.sum(np.power(vecA-vecB,2))) 
def randCent(dataSet,k):   #构建镞质心 
  n=np.shape(dataSet)[1] 
  centroids=np.mat(np.zeros((k,n))) 
  for j in range(n): 
    minJ=np.min(dataSet[:,j]) 
    rangeJ=float(np.max(dataSet[:,j])-minJ) 
    centroids[:,j]=minJ+rangeJ*np.random.rand(k,1) 
  return centroids 
dataMat=np.mat(loadDataSet(path+'testSet.txt')) 
print(dataMat[:,0]) 
 
 
# 所有数都比-inf大 
# 所有数都比+inf小 
def kMeans(dataSet,k,distMeas=distEclud,createCent=randCent): 
  m=np.shape(dataSet)[0] 
  clusterAssment=np.mat(np.zeros((m,2))) 
  centroids=createCent(dataSet,k) 
  clusterChanged=True 
  while clusterChanged: 
    clusterChanged=False 
    for i in range(m): 
      minDist=np.inf;minIndex=-1 #np.inf表示无穷大 
      for j in range(k): 
        distJI=distMeas(centroids[j,:],dataSet[i,:]) 
        if distJI 
          minDist=distJI;minIndex=j 
      if clusterAssment[i,0]!=minIndex:clusterChanged=True 
      clusterAssment[i,:]=minIndex,minDist**2 
    print centroids 
    for cent in range(k): 
      ptsInClust=dataSet[np.nonzero(clusterAssment[:,0].A==cent)[0]] #[0]这里取0是指去除坐标索引值,结果会有两个 
      #np.nonzero函数,寻找非0元素的下标 nz=np.nonzero([1,2,3,0,0,4,0])结果为0,1,2 
      centroids[cent,:]=np.mean(ptsInClust,axis=0) 
     
  return centroids,clusterAssment 
myCentroids,clustAssing=kMeans(dataMat,4)  
print(myCentroids,clustAssing)  
   
#二分均值聚类(bisecting k-means) 
def  biKmeans(dataSet,k,distMeas=distEclud): 
  m=np.shape(dataSet)[0] 
  clusterAssment=np.mat(np.zeros((m,2))) 
  centroid0=np.mean(dataSet,axis=0).tolist()[0] 
  centList=[centroid0] 
  for j in range(m): 
    clusterAssment[j,1]=distMeas(np.mat(centroid0),dataSet[j,:])**2 
  while (len(centList) 
    lowestSSE=np.Inf 
    for i in range(len(centList)): 
      ptsInCurrCluster=dataSet[np.nonzero(clusterAssment[:,0].A==i)[0],:] 
      centroidMat,splitClusAss=kMeans(ptsInCurrCluster,2,distMeas) 
      sseSplit=np.sum(splitClusAss[:,1]) 
      sseNotSplit=np.sum(clusterAssment[np.nonzero(clusterAssment[:,0].A!=i)[0],1]) 
      print "sseSplit, and notSplit:",sseSplit,sseNotSplit 
      if (sseSplit+sseNotSplit) 
        bestCenToSplit=i 
        bestNewCents=centroidMat 
        bestClustAss=splitClusAss.copy() 
        lowestSSE=sseSplit+sseNotSplit 
    bestClustAss[np.nonzero(bestClustAss[:,0].A==1)[0],0]=len(centList) 
    bestClustAss[np.nonzero(bestClustAss[:,0].A==0)[0],0]=bestCenToSplit 
    print "the bestCentToSplit is:",bestCenToSplit 
    print 'the len of bestClustAss is:',len(bestClustAss) 
    centList[bestCenToSplit]=bestNewCents[0,:] 
    centList.append(bestNewCents[1,:]) 
    clusterAssment[np.nonzero(clusterAssment[:,0].A==bestCenToSplit)[0],:]=bestClustAss 
  return centList,clusterAssment 
print(u"二分聚类分析结果开始") 
dataMat3=np.mat(loadDataSet(path+'testSet2.txt')) 
centList,myNewAssments=biKmeans(dataMat3, 3) 
print(centList)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中多层嵌套列表的拆分方法
Jul 02 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
Jul 11 Python
Python实现Event回调机制的方法
Feb 13 Python
python控制nao机器人身体动作实例详解
Apr 29 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
Jun 11 Python
Python中利用LSTM模型进行时间序列预测分析的实现
Jul 26 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Pandas读取csv时如何设置列名
Jun 02 Python
Numpy 多维数据数组的实现
Jun 18 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
使用Python爬取Json数据的示例代码
Dec 07 Python
python实现SOM算法
Feb 23 #Python
python实现k-means聚类算法
Feb 23 #Python
python写一个md5解密器示例
Feb 23 #Python
Python机器学习之K-Means聚类实现详解
Feb 22 #Python
python实现远程通过网络邮件控制计算机重启或关机
Feb 22 #Python
python实现微信发送邮件关闭电脑功能
Feb 22 #Python
python使用itchat实现手机控制电脑
Feb 22 #Python
You might like
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
Yii清理缓存的方法
2016/01/06 PHP
php封装的验证码类分享
2017/02/26 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
简单谈谈React中的路由系统
2017/07/25 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
Python列表推导式的使用方法
2013/11/21 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
管理信息系学生的自我评价
2014/01/11 职场文书
疾病防治方案
2014/05/31 职场文书
嘉宾邀请函
2015/01/31 职场文书
优秀大学生自荐信
2015/03/26 职场文书
出纳岗位职责范本
2015/03/31 职场文书
2015夏季作息时间调整通知
2015/04/24 职场文书
独生子女证明范本
2015/06/19 职场文书
python函数的两种嵌套方法使用
2022/04/02 Python