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 k-近邻算法实例分享
Jun 11 Python
跟老齐学Python之Python安装
Sep 12 Python
python基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
Python while 循环使用的简单实例
Jun 08 Python
python获取list下标及其值的简单方法
Sep 12 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
python编程嵌套函数实例代码
Feb 11 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 Python
Python3监控疫情的完整代码
Feb 20 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 Python
pycharm 的Structure界面设置操作
Feb 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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
2011/11/10 PHP
php关联数组快速排序的方法
2015/04/17 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
JQuery从头学起第一讲
2010/07/04 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
django中模板的html自动转意方法
2018/05/27 Python
python实现Windows电脑定时关机
2018/06/20 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
python中实现词云图的示例
2020/12/19 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
小学语文教学经验交流材料
2014/06/02 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript