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 文件和输入输出小结
Oct 09 Python
python将unicode转为str的方法
Jun 21 Python
django 常用orm操作详解
Sep 13 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
Django中的Model操作表的实现
Jul 24 Python
python绘制散点图并标记序号的方法
Dec 11 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
Python爬虫实现模拟点击动态页面
Mar 05 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
浅谈Python3多线程之间的执行顺序问题
May 02 Python
python实现过滤敏感词
May 08 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-fpm配置详解
2014/02/12 PHP
PHP微信分享开发详解
2017/01/14 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
python sys模块sys.path使用方法示例
2013/12/04 Python
Python的Django框架安装全攻略
2015/07/15 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
什么是View State?
2013/01/27 面试题
国际商务系学生个人的自我评价
2013/11/26 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
黄金搭档广告词
2014/03/21 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
一个独生女的故事观后感
2015/06/04 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript