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 使用get_argument获取url query参数
Apr 28 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
Apr 27 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
May 05 Python
python实现本地图片转存并重命名的示例代码
Oct 27 Python
python学生管理系统
Jan 30 Python
详解Python locals()的陷阱
Mar 26 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
Python中Unittest框架的具体使用
Aug 27 Python
基于Python获取城市近7天天气预报
Nov 26 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
Jul 14 Python
python实现取余操作的简单实例
Aug 16 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
Destoon模板制作简明教程
2014/06/20 PHP
PHP类的反射用法实例
2014/11/03 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
表单内同名元素的控制
2006/11/22 Javascript
javascript一点特殊用法
2008/05/28 Javascript
防止jQuery ajax Load使用缓存的方法小结
2014/02/22 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
继续学习javascript闭包
2015/12/03 Javascript
简单理解vue中el、template、replace元素
2016/10/27 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
Python3处理文件中每个词的方法
2015/05/22 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
Python中最大递归深度值的探讨
2019/03/05 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
Python xmltodict模块安装及代码实例
2020/10/05 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
html5跨域通讯之postMessage的用法总结
2013/11/07 HTML / CSS
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
给国外客户的邀请函
2014/01/30 职场文书
大学生未来职业生涯规划书
2014/02/15 职场文书
合伙经营协议书范本
2014/09/13 职场文书
公司搬迁通知
2015/04/20 职场文书
拉贝日记观后感
2015/06/05 职场文书
Oracle 死锁的检测查询及处理
2021/09/25 Oracle
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫