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 29 Python
python数据结构之链表详解
Sep 12 Python
Python使用pandas处理CSV文件的实例讲解
Jun 22 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
python中的协程深入理解
Jun 10 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
python xlsxwriter模块的使用
Dec 24 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 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与SQL注入攻击[三]
2007/04/17 PHP
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
JavaScript类和继承 constructor属性
2010/03/04 Javascript
js读写(删除)Cookie实例详解
2013/04/17 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
2017/03/15 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
Python的函数嵌套的使用方法
2014/01/24 Python
Unicode和Python的中文处理
2017/03/19 Python
PyQt5实现下载进度条效果
2018/04/19 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
python 批量将中文名转换为拼音
2021/02/07 Python
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
教学器材管理制度
2014/01/26 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
2014教师研修学习体会
2014/07/08 职场文书
群众路线自查自纠工作情况报告
2014/10/28 职场文书
入党转正申请报告
2015/05/15 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis