不足 20 行 Python 代码,高效实现 k-means 均值聚类算法!
作者 | 许文武
责编 | 郭芮
出品 | CSDN 博客
1import numpy as np23def kmeans_xufive(ds, k):4 """k-means聚类算法56 k - 指定分簇数量7 ds - ndarray(m, n),m个样本的数据集,每个样本n个属性值8 """9
10 m, n = ds.shape # m:样本数量,n:每个样本的属性值个数
11 result = np.empty(m, dtype=np.int) # m个样本的聚类结果
12 cores = np.empty((k, n)) # k个质心
13 cores = ds[np.random.choice(np.arange(m), k, replace=False)] # 从m个数据样本中不重复地随机选择k个样本作为质心
14
15 while True: # 迭代计算
16 d = np.square(np.repeat(ds, k, axis=0).reshape(m, k, n) - cores)
17 distance = np.sqrt(np.sum(d, axis=2)) # ndarray(m, k),每个样本距离k个质心的距离,共有m行
18 index_min = np.argmin(distance, axis=1) # 每个样本距离最近的质心索引序号
19
20 if (index_min == result).all(): # 如果样本聚类没有改变
21 return result, cores # 则返回聚类结果和质心数据
22
23 result[:] = index_min # 重新分类
24 for i in range(k): # 遍历质心集
25 items = ds[result==i] # 找出对应当前质心的子样本集
26 cores[i] = np.mean(items, axis=0) # 以子样本集的均值作为当前质心的位置
1import numpy as np23# 加载数据4def loadDataSet(fileName):5 data = np.loadtxt(fileName,delimiter='\t')6 return data78# 欧氏距离计算9def distEclud(x,y):
10 return np.sqrt(np.sum((x-y)**2)) # 计算欧氏距离
11
12# 为给定数据集构建一个包含K个随机质心的集合
13def randCent(dataSet,k):
14 m,n = dataSet.shape
15 centroids = np.zeros((k,n))
16 for i in range(k):
17 index = int(np.random.uniform(0,m)) #
18 centroids[i,:] = dataSet[index,:]
19 return centroids
20
21# k均值聚类
22def kmeans_open(dataSet,k):
23
24 m = np.shape(dataSet)[0] #行的数目
25 # 第一列存样本属于哪一簇
26 # 第二列存样本的到簇的中心点的误差
27 clusterAssment = np.mat(np.zeros((m,2)))
28 clusterChange = True
29
30 # 第1步 初始化centroids
31 centroids = randCent(dataSet,k)
32 while clusterChange:
33 clusterChange = False
34
35 # 遍历所有的样本(行数)
36 for i in range(m):
37 minDist = 100000.0
38 minIndex = -1
39
40 # 遍历所有的质心
41 #第2步 找出最近的质心
42 for j in range(k):
43 # 计算该样本到质心的欧式距离
44 distance = distEclud(centroids[j,:],dataSet[i,:])
45 if distance < minDist:
46 minDist = distance
47 minIndex = j
48 # 第 3 步:更新每一行样本所属的簇
49 if clusterAssment[i,0] != minIndex:
50 clusterChange = True
51 clusterAssment[i,:] = minIndex,minDist**2
52 #第 4 步:更新质心
53 for j in range(k):
54 pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0].A == j)[0]] # 获取簇类所有的点
55 centroids[j,:] = np.mean(pointsInCluster,axis=0) # 对矩阵的行求均值
56
57 return clusterAssment.A[:,0], centroids
1def create_data_set(*cores):2 """生成k-means聚类测试用数据集"""34 ds = list()5 for x0, y0, z0 in cores:6 x = np.random.normal(x0, 0.1+np.random.random()/3, z0)7 y = np.random.normal(y0, 0.1+np.random.random()/3, z0)8 ds.append(np.stack((x,y), axis=1))9
10 return np.vstack(ds)
1import time2import matplotlib.pyplot as plt34k = 45ds = create_data_set((0,0,2500), (0,2,2500), (2,0,2500), (2,2,2500))67t0 = time.time()8result, cores = kmeans_xufive(ds, k)9t = time.time() - t0
10
11plt.scatter(ds[:,0], ds[:,1], s=1, c=result.astype(np.int))
12plt.scatter(cores[:,0], cores[:,1], marker='x', c=np.arange(k))
13plt.show()
14
15print(u'使用kmeans_xufive算法,1万个样本点,耗时%f0.3秒'%t)
16
17t0 = time.time()
18result, cores = kmeans_open(ds, k)
19t = time.time() - t0
20
21plt.scatter(ds[:,0], ds[:,1], s=1, c=result.astype(np.int))
22plt.scatter(cores[:,0], cores[:,1], marker='x', c=np.arange(k))
23plt.show()
24
25print(u'使用kmeans_open算法,1万个样本点,耗时%f0.3秒'%t)
测试结果如下:
1PS D:\XufiveGit\CSDN\code> py -3 .\k-means.py
2使用kmeans_xufive算法,1万个样本点,耗时0.0156550.3秒
3使用kmeans_open算法,1万个样本点,耗时3.9990890.3秒
2019程序员转型学什么?
https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
CSDN 博客诚邀入驻啦!
本着共享、协作、开源、技术之路我们共同进步的准则,
只要你技术够干货,内容够扎实,分享够积极,
欢迎加入 CSDN 大家庭!
扫描下方二维码,即刻加入吧!
热 文 推 荐
不足 20 行 Python 代码,高效实现 k-means 均值聚类算法!相关推荐
- 聚类 python 代码_不足 20 行 Python 代码,高效实现 k-means 均值聚类算法
下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 不足 20 行 Python 代码,高效实现 k-means 均值聚类算法-1.jpg (143.81 KB, ...
- 20行 Python 代码爬取王者荣耀全英雄皮肤 | 原力计划
作者 | wangweijun 责编 | Elle 出品 | CSDN 博客 引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王 ...
- python视频压缩算法_Python入门到精通视频,阿里巴巴大力推荐,20行Python代码,无损压缩千百张图片!...
阿里巴巴推荐,Python基础入门,Python小白书籍,Python学习路线,Python进阶,Python高级,Python爬虫等等一系列关于Python的文档和视频(包括hadoop,fink, ...
- 如何运用python爬游戏皮肤_Python爬虫练习:20行Python代码爬取王者荣耀全英雄皮肤...
引言王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工作 ...
- python爬虫脚本 初级入门爬虫英雄联盟所有皮肤_Python爬虫练习:20行Python代码爬取王者荣耀全英雄皮肤...
引言王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工作 ...
- 20行Python代码,无损压缩千百张图片!
前言 每个设计师.摄影师或有图片处理需求小编,都会面临批量高清大图的困扰. 因为高清大图放到网站上会严重拖慢加载速度,或是有的地方明确限制了图片大小,因此,为了完成工作,他们总是需要先把图片压缩,再上 ...
- 项目分享丨20行Python代码,无损压缩千百张图片!
前言 每个设计师.摄影师或有图片处理需求小编,都会面临批量高清大图的困扰. 因为高清大图放到网站上会严重拖慢加载速度,或是有的地方明确限制了图片大小,因此,为了完成工作,他们总是需要先把图片压缩,再上 ...
- python小游戏代码大全-20行python代码的入门级小游戏的详解
背景: 作为一个python小白,今天从菜鸟教程上看了一些python的教程,看到了python的一些语法,对比起来(有其他语言功底),感觉还是非常有趣,就随手添了一点内容,改了一个小例程,当着练练手 ...
- 20行Python代码爬取王者荣耀全英雄皮肤改进版
0 写在前面 看了大神的这篇CSDN:20行Python代码爬取王者荣耀全英雄皮肤访问量那么高,忍不住想要蹭一下热点,但是蹭归蹭,总得有点货才行,于是我品我细品,发现其代码总体有三点我觉得值得改进的地 ...
- [转载]20行Python代码爬取王者荣耀全英雄皮肤
20行Python代码爬取王者荣耀全英雄皮肤,这是高手.原文链接: https://blog.csdn.net/qq_42453117/article/details/103190981 除了语言学习 ...
最新文章
- 加固前奏2-替换application
- java web中验证码的实现
- 神奇的计算器dc和bc
- php ziparchive自带吗,PHP自带的ZipArchive压缩文件并下载打包好的文件(重要)
- 基础数学落后与高端人才流失
- python视频人脸检测_Python基于OpenCV实现视频的人脸检测
- SLAM GMapping(6)扫描匹配器
- uploadify 初始化的时候会请求当前页面地址
- 通信网中的数据报子网和虚电路子网
- vscode中微信小程序的代码智能提示
- MIT 18.02 多变量微积分笔记总目录
- 云服务器网站logo,云服务器 logo
- 利用mail 发送163 邮件
- Java实现格式化打印慢SQL日志
- 代码本色 processing编程练习
- 查看Linux发行版名称及版本号
- 让最小化安装的CentOS 6.8能够浏览网页
- STM32之SPI和W25Q128
- echarts中如何配置图例形状、图标宽高、图标和文字间距、图例位置、文字颜色、字体大小
- Android 模拟游戏手柄按键(跨进程 KeyEvent 事件)实践方案