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 base64 decode incorrect padding错误解决方法
Jan 08 Python
Python工程师面试题 与Python基础语法相关
Jan 14 Python
利用 python 对目录下的文件进行过滤删除
Dec 27 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
Django forms表单 select下拉框的传值实例
Jul 19 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 Python
Django返回HTML文件的实现方法
Sep 17 Python
pycharm永久激活超详细教程
Oct 29 Python
Python机器学习工具scikit-learn的使用笔记
Jan 28 Python
python保存图片的四个常用方法
Feb 28 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 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
一个改进的UBB类
2006/10/09 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
PHP在linux上执行外部命令的方法
2017/02/06 PHP
解析javascript 浏览器关闭事件
2013/07/08 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
js日期联动示例
2014/05/02 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
大白话讲解JavaScript的Promise
2017/04/06 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
Python httplib,smtplib使用方法
2008/09/06 Python
python根据经纬度计算距离示例
2014/02/16 Python
详解python单例模式与metaclass
2016/01/15 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python批量修改文件编码格式的方法
2018/05/31 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
详解Python流程控制语句
2020/10/28 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
日本乐天德国站:Rakuten.de
2019/05/16 全球购物
毕业研究生的自我鉴定
2013/11/30 职场文书
勾股定理课后反思
2014/04/26 职场文书
2019军训心得体会
2019/06/27 职场文书
餐厅开业活动方案
2019/07/08 职场文书