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的Django框架可适配的各种数据库介绍
Jul 15 Python
在Django的form中使用CSS进行设计的方法
Jul 18 Python
Python实现二叉堆
Feb 03 Python
python3.5仿微软计算器程序
Mar 30 Python
浅谈python中的数字类型与处理工具
Aug 02 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
异步任务队列Celery在Django中的使用方法
Jun 07 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
Python 微信之获取好友昵称并制作wordcloud的实例
Feb 21 Python
python基于tkinter制作m3u8视频下载工具
Apr 24 Python
详解用Python把PDF转为Word方法总结
Apr 27 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
2016/11/30 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
PHP静态成员变量
2017/02/14 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
JavaScript的变量作用域深入理解
2009/10/25 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
JS获取时间的方法
2015/01/21 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
微信小程序实现九宫格抽奖
2020/04/15 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
Python lxml模块安装教程
2015/06/02 Python
说一说Python logging
2016/04/15 Python
python查看列的唯一值方法
2018/07/17 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
python之信息加密题目详解
2019/06/26 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
详解CSS3中使用gradient实现渐变效果的方法
2015/08/18 HTML / CSS
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
商务英语专业毕业生自荐信
2013/11/05 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
幸福家庭标语
2014/06/27 职场文书
2014年销售部工作总结
2014/12/01 职场文书
高一军训感想
2015/08/07 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android