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实现Linux下守护进程的编写方法
Aug 22 Python
python使用三角迭代计算圆周率PI的方法
Mar 20 Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 Python
R vs. Python 数据分析中谁与争锋?
Oct 18 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
NumPy中的维度Axis详解
Nov 26 Python
解决Jupyter无法导入已安装的 module问题
Apr 17 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 Python
python中温度单位转换的实例方法
Dec 27 Python
Django操作cookie的实现
May 26 Python
python实现双向链表原理
May 25 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 飞信好友免费短信API接口开源版
2010/07/22 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
Javascript this 的一些学习总结
2012/08/02 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
vue自定义底部导航栏Tabbar的实现代码
2018/09/03 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
python 不关闭控制台的实现方法
2011/10/23 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
Python的argparse库使用详解
2018/10/09 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
python 监控logcat关键字功能
2020/09/04 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
简历中个人自我评价分享
2014/03/15 职场文书
九华山导游词
2015/02/03 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书