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编程中的文件读写及相关的文件对象方法讲解
Jan 19 Python
python 上下文管理器使用方法小结
Oct 10 Python
详解用python实现简单的遗传算法
Jan 02 Python
Python语言的变量认识及操作方法
Feb 11 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
pygame实现简易飞机大战
Sep 11 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
Pycharm 字体大小调整设置的方法实现
Sep 27 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 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
PHP调用C#开发的dll类库方法
2014/07/28 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
基于javascript实现仿百度输入框自动匹配功能
2016/01/03 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
微信小程序侧边栏滑动特效(左右滑动)
2017/01/23 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
基于layui实现高级搜索(筛选)功能
2019/07/26 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
python 测试实现方法
2008/12/24 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
《青蛙看海》教学反思
2014/04/23 职场文书
客运企业隐患排查工作方案
2014/06/06 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
领导班子整改方案
2014/10/25 职场文书
保证书格式
2015/01/16 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
2015年小学生暑假总结
2015/07/13 职场文书
关于分班的感言
2015/08/04 职场文书
检讨书格式
2019/04/25 职场文书