python实现k-means聚类算法


Posted in Python onFebruary 23, 2018

k-means聚类算法

k-means是发现给定数据集的k个簇的算法,也就是将数据集聚合为k类的算法。

算法过程如下:
1)从N个文档随机选取K个文档作为质心
2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类,我们一般取欧几里得距离
3)重新计算已经得到的各个类的质心
4)迭代步骤(2)、(3)直至新的质心与原质心相等或迭代次数大于指定阈值,算法结束

算法实现

随机初始化k个质心,用dict保存质心的值以及被聚类到该簇中的所有data。

def initCent(dataSet , k):
 N = shape(dataSet)[1]
 cents = {}
 randIndex=[]
 #随机生成k个不重复的索引
 for i in range(k): 
 rand = random.randint(0,N)
 while rand in randIndex:
  rand = random.randint(0, N)
 randIndex.append(rand)
 #按索引取dataSet中的data作为质心
 for i in range(k):
 templist = []
 templist.append(dataSet[randIndex[i]])
 templist.append([dataSet[randIndex[i]]])
 cents[i] = templist
 return cents

对dataSet中的所有数据进行一次聚类。返回值cents为dict类型的数据,int类型的key,list类型的value。其中cents[i][0]为质心位置,cents[i][1]为存储该簇中所有data的列表。

#计算两个向量的欧氏距离
def calDist(X1 , X2):
 sum = 0
 for x1 , x2 in zip(X1 , X2):
 sum += (x1 - x2) ** 2
 return sum ** 0.5

#聚类
def doKmeans(dataSet , k , cents):
 #清空上一次迭代后的簇中元素,只记录质心
 for i in range(k):
 cents[i][1] = []
 for data in dataSet:
 no = 0#初始化簇标号
 minDist = sys.maxint#初始化data与k个质心的最短距离
 for i in range(k):
  dist = calDist(data , cents[i][0])
  if dist < minDist:
  minDist = dist
  no = i
 #找到距离最近的质心
 cents[no][1].append(data)
 #更新质心
 for i in range(k):
 for j in range(shape(dataSet)[0]):
  cents[i][0] = mean(cents[i][1],axis=0).tolist()
 return cents

k-means主方法

#判断两次聚类的结果是否相同
def isEqual(old , new):
 for i in range(len(old)):
 if(old[i] != new[i][0]):
  return 0
 return 1

#主方法
def kmeans_main(dataSet,k):
 cents = initCent(dataSet, k)
 for x in range(1000):
 oldcents = []
 #拷贝上一次迭代的结果
 for i in cents.keys():
  oldcents.append(cents[i][0])
 newcents = doKmeans(dataSet, k , cents)
 #若相邻两次迭代结果相同,算法结束
 if isEqual(oldcents , newcents)>0:
  break
 cents = newcents
 return cents

结果测试

数据集(虚构)

2 3 2.54
2 1 0.72
3 5 3.66
4 3 1.71
3.11 5.29 4.13
4.15 2 3.1
3.12 3.33 3.72
1.49 5 2.6
3 5 2.88
3.9 1.78 2.56
-2 3 5
3 1 0.4
-2 1 2.2
-3 0 1.7
-4 1 2
8 -1 0
2 3.2 7.1
1 3 5
2 4 3
0.1 2 5.4
2 0 5.54
2 1 1.72
3 5 2.66
1 8 1.71
5.11 1.29 4.13
7.15 2 7.1
1.12 5.33 4.72
6.49 4 3.6
4 8 6.88
1.9 5.78 6.56
-2 -3 2.5
1 -1 2.4
-2 1 3.2
-1 0 5.7
-2 3 2
1 -1 4
3 4.2 6.1
5 2 5
3 5.7 13
0.9 2.9 1.4

画图方法

def draw(cents):
 color = [ 'y', 'g', 'b']
 X = []
 Y = []
 Z = []
 fig = plt.figure()
 ax = Axes3D(fig)
 for i in cents.keys():
 X.append(cents[i][0][0])
 Y.append(cents[i][0][1])
 Z.append(cents[i][0][2])
 ax.scatter(X, Y, Z,alpha=0.4,marker='o',color='r', label=str(i))
 for i in cents.keys():
 X = []
 Y = []
 Z = []
 data = cents[i][1]
 for vec in data:
  X.append(vec[0])
  Y.append(vec[1])
  Z.append(vec[2])
 ax.scatter(X, Y, Z, alpha=0.4,marker='o', color=color[i], label=str(i),)
 plt.show()

测试及结果展示(红点表示质心)

dataSet = loadDataSet("dataSet.txt")
cents = kmeans_main(dataSet , 3)
draw(cents)

python实现k-means聚类算法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
Python元字符的用法实例解析
Jan 17 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
django基于restframework的CBV封装详解
Aug 08 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
TensorFlow实现checkpoint文件转换为pb文件
Feb 10 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
python中安装django模块的方法
Mar 12 Python
Python错误的处理方法
Jun 23 Python
python自动化测试通过日志3分钟定位bug
Nov 20 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
Python实现利用163邮箱远程关电脑脚本
Feb 22 #Python
Python3.4实现远程控制电脑开关机
Feb 22 #Python
You might like
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
php检测文本的编码
2015/07/26 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
限制文本框输入N个字符的js代码
2010/05/13 Javascript
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
python二叉树的实现实例
2013/11/21 Python
python支持断点续传的多线程下载示例
2014/01/16 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
大学生求职简历的自我评价
2013/10/21 职场文书
外贸销售员求职的自我评价
2013/11/23 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
大二学生自我检讨书
2014/10/23 职场文书
导游词300字
2015/02/13 职场文书
优秀团员个人总结
2015/02/26 职场文书
2015年度女工工作总结
2015/10/22 职场文书
Java如何实现树的同构?
2021/06/22 Java/Android