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连接字符串的方法小结
Jul 13 Python
Python实现模拟登录及表单提交的方法
Jul 25 Python
谈谈Python进行验证码识别的一些想法
Jan 25 Python
Python用模块pytz来转换时区
Aug 19 Python
Python中强大的命令行库click入门教程
Dec 26 Python
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
Python FTP两个文件夹间的同步实例代码
May 25 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
Python的Tkinter点击按钮触发事件的例子
Jul 19 Python
python打印n位数“水仙花数”(实例代码)
Dec 25 Python
Pytest中conftest.py的用法
Jun 27 Python
Python开发简易五子棋小游戏
May 02 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
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
jquery获取tr中控件值并操作tr实现思路
2013/03/27 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
详解vue axios中文文档
2017/09/12 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
如何从头实现一个node.js的koa框架
2019/06/17 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
浅谈解除装饰器作用(python3新增)
2018/10/15 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
什么是Web Service?
2012/07/25 面试题
老师对学生的寄语
2014/04/09 职场文书
代理协议书
2014/04/22 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
家属答谢词
2015/01/05 职场文书
大学生学期个人总结
2015/02/12 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
盗窃案辩护词
2015/05/21 职场文书