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处理圆角图片、圆形图片的例子
Apr 25 Python
pymongo实现多结果进行多列排序的方法
May 16 Python
详解Python中的元组与逻辑运算符
Oct 13 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
python pandas修改列属性的方法详解
Jun 09 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
Python - 10行代码集2000张美女图
May 23 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数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
php中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
PHP APC配置文件2套和参数详解
2014/06/11 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
微信支付开发告警通知实例
2016/07/12 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
jQuery实现自动调用和触发某个事件的方法
2016/11/18 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
谈谈React中的Render Props模式
2018/12/06 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
使用python实现扫描端口示例
2014/03/29 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
历史专业个人求职信分享
2013/12/20 职场文书
建设工地安全标语
2014/06/07 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书