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中的__init__ 、__new__、__call__小结
Apr 25 Python
处理Python中的URLError异常的方法
Apr 30 Python
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 Python
使用Python保存网页上的图片或者保存页面为截图
Mar 05 Python
python爬虫获取多页天涯帖子
Feb 23 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
python脚本开机自启的实现方法
Jun 28 Python
Python操作MongoDb数据库流程详解
Mar 05 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
python调用摄像头的示例代码
Sep 28 Python
python 模块重载的五种方法
Apr 24 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中多线程的两个实现方法
2016/10/14 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
js实现文字滚动效果
2016/03/03 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
express启用https使用小记
2019/05/21 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
JS实现分页导航效果
2020/02/19 Javascript
js实现九宫格抽奖
2020/03/19 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
python创建关联数组(字典)的方法
2015/05/04 Python
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
python对execl 处理操作代码
2020/06/22 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
大学生应聘推荐信范文
2013/11/19 职场文书
人民教师的自我评价分享
2014/02/21 职场文书
物业接待员岗位职责
2015/04/15 职场文书
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android
PostgreSQL逻辑复制解密原理解析
2022/09/23 PostgreSQL