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利用lxml读写xml格式的文件
Aug 10 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
使用python获取csv文本的某行或某列数据的实例
Apr 03 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
django1.11.1 models 数据库同步方法
May 30 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
python如何获取当前文件夹下所有文件名详解
Jan 25 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
详解基于python-django框架的支付宝支付案例
Sep 23 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
通过案例解析python鸭子类型相关原理
Oct 10 Python
如何利用Python 进行边缘检测
Oct 14 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版本实现代码
2012/09/15 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
python快速排序代码实例
2013/11/21 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
详解python3中tkinter知识点
2018/06/21 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python 对xml解析的示例
2021/02/27 Python
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
教育科研先进个人材料
2014/01/26 职场文书
物理力学求职信
2014/02/18 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
市场营销专业求职信
2014/06/17 职场文书
医德医魂心得体会
2014/09/11 职场文书
个性与发展自我评价
2015/03/06 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js