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使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
Mar 31 Python
在Python中使用列表生成式的教程
Apr 27 Python
python网络编程之数据传输UDP实例分析
May 20 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
django定期执行任务(实例讲解)
Nov 03 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
wxpython绘制圆角窗体
Nov 18 Python
详解pandas赋值失败问题解决
Nov 29 Python
python数据库批量插入数据的实现(executemany的使用)
Apr 30 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
php5 图片验证码实现代码
2009/12/11 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
python检测lvs real server状态
2014/01/22 Python
python制作最美应用的爬虫
2015/10/28 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
UNIX文件系统常用命令
2012/05/25 面试题
文艺演出策划方案
2014/06/07 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
外出学习心得体会范文
2016/01/18 职场文书