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最长公共子串算法实例
Mar 07 Python
Python中字典创建、遍历、添加等实用操作技巧合集
Jun 02 Python
Python监控主机是否存活并以邮件报警
Sep 22 Python
Scrapy爬虫实例讲解_校花网
Oct 23 Python
Python读写docx文件的方法
May 08 Python
Numpy与Pytorch 矩阵操作方式
Dec 27 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
Python实现Word文档转换Markdown的示例
Dec 22 Python
用python 绘制茎叶图和复合饼图
Feb 26 Python
Python基于百度API识别并提取图片中文字
Jun 27 Python
python index() 与 rindex() 方法的使用示例详解
Dec 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的博客ping服务代码
2012/02/04 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
js直接编辑当前cookie的脚本
2008/09/14 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
微信公众平台开发教程(五)详解自定义菜单
2016/12/02 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
浅谈vuex中store的命名空间
2019/11/08 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
Django视图和URL配置详解
2018/01/31 Python
python 实现批量xls文件转csv文件的方法
2018/10/23 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
详解Python传入参数的几种方法
2019/05/16 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
使用python代码进行身份证号校验的实现示例
2019/11/21 Python
详解用Python调用百度地图正/逆地理编码API
2020/07/02 Python
浅谈python 类方法/静态方法
2020/09/18 Python
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
体育专业学生自我评价范文
2014/01/17 职场文书
公司授权委托书
2014/10/17 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
建议书格式
2015/02/04 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
浅谈redis整数集为什么不能降级
2021/07/25 Redis