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一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
django_orm查询性能优化方法
Aug 20 Python
详解Numpy中的广播原则/机制
Sep 20 Python
用pycharm开发django项目示例代码
Oct 24 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
对python 调用类属性的方法详解
Jul 02 Python
python中property和setter装饰器用法
Dec 19 Python
python unichr函数知识点总结
Dec 16 Python
termux中matplotlib无法显示中文问题的解决方法
Jan 11 Python
PyQt QMainWindow的使用示例
Mar 24 Python
python中的装饰器该如何使用
Jun 18 Python
python字典进行运算原理及实例分享
Aug 02 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
js将控件隐藏及display属性的使用介绍
2013/12/30 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
python WindowsError的错误代码详解
2017/07/23 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
python之生成多层json结构的实现
2020/02/27 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
人事部主管岗位职责
2013/12/26 职场文书
工业学校毕业生自荐信范文
2014/01/03 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
电子装配专业毕业生求职信
2014/04/23 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
老干部工作汇报材料
2014/10/28 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
学困生转化工作总结
2015/08/13 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书