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正则表达式匹配ip地址实例
Oct 09 Python
python多进程和多线程究竟谁更快(详解)
May 29 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
pandas实现将日期转换成timestamp
Dec 07 Python
python实现的Iou与Giou代码
Jan 18 Python
为什么黑客都用python(123个黑客必备的Python工具)
Jan 31 Python
Python类中self参数用法详解
Feb 13 Python
Python控制台实现交互式环境执行
Jun 09 Python
Pyqt5将多个类组合在一个界面显示的完整示例
Sep 04 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
星际原理概述
2020/03/04 星际争霸
PHP_Flame(Version:Progress)的原代码
2006/10/09 PHP
深入PHP5中的魔术方法详解
2013/06/17 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
python使用socket远程连接错误处理方法
2015/04/29 Python
学习python类方法与对象方法
2016/03/15 Python
Python匿名函数及应用示例
2019/04/09 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
Python远程linux执行命令实现
2020/11/11 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
关于.NET, HTML的五个问题
2012/08/29 面试题
Java程序员面试90题
2013/10/19 面试题
建筑专业毕业生推荐信
2013/11/21 职场文书
物业管理工作方案
2014/05/10 职场文书
设备管理实施方案
2014/05/31 职场文书
Python基础之条件语句详解
2021/06/16 Python
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电