K-Means K均值算法python实现 (包括绘图)
K-Means K均值算法python实现 包括绘图
- 算法梗概
- 算法实现
- 直接上代码
- 代码分析:
- 计算两个点之间距离的代码:
- 计算中心点
- K-Means(X,n)
- 最后
算法梗概
K-Means算法(K均值)是一种基于姓心的无监督聚类算法,用于把样本集中的对象分配到n个簇中,该算法的基本步骤:
1:随机产生n个中心点(n需要事先给定,n是多少,最后产生的簇就是多少)
2:计算每个样本点与中心点的距离(该距离不一定是我们通常认为的欧式距离,但在本例中,我将用欧式距离来计算)
3:把每一个点分配给距离最近的中心点
4:重新计算每个簇的中心点,并重复第2步
算法实现
直接上代码
import random as rd
import numpy as np
import matplotlib.pyplot as pltX = np.array([[0, 0],[1, 1],[2, 1],[4, 3],[5, 3],[5, 4],[6, 5],[1, 4],[1, 5],[1, 6]])def K_Means(X, n):# 随机生成n个中心点(用数组储存)C_new = [] # 新的中心点C_old = [] # 旧的中心点style_color = ['r', 'y', 'b', 'c', 'm'] # 颜色类型style_symbol = ['o', '^', 'h', 'd', 'D'] # 点的图形current_color = [] # 每个点应该的颜色类型pause_time = 0.5 # 画完一个点之后的暂停时间for i in range(n):C_new.append(list(rd.choice(X)))print("随机生产的中心点有:", C_new)# while(新的中心点不全等于旧的中心点):while C_new != C_old:plt.xlim(-1, 9) # 初始化画布坐标轴范围plt.ylim(-1, 9)# 分别计算每个点到n个中心点的距离index = [] # 对应中心点在C_new中的下标'''========把X中的点(和中心点)依次画出来(只适用与2维数组)=========='''if not current_color:x = np.array(X).transpose().tolist()for i in range(X.shape[0]):plt.plot(x[0][i], x[1][i], 'go')plt.pause(pause_time)else:x = np.array(X).transpose().tolist()for i in range(X.shape[0]):plt.plot(x[0][i], x[1][i], 'o'+style_color[current_color[i]])plt.pause(pause_time)# 绘制中心点y = np.array(C_new).transpose().tolist()for i in range(len(C_new)):plt.plot(y[0][i], y[1][i], 'D'+style_color[i])plt.pause(pause_time)'''==============================================='''for i in range(X.shape[0]):dis = [dist(X[i], C_new[j]) for j in range(len(C_new))] # 因为C_new是列表类型,他没有shape方法,只能用len# 把最小距离的中心点的下标存入数组(一样大的话随便存)index.append(dis.index(min(dis)))print(index)'''==============把属于同一个中心点的点染色============='''current_color = index.copy() # 把索引复制给c_cx = np.array(X).transpose().tolist()for i in range(X.shape[0]):plt.plot(x[0][i], x[1][i], 'o' + style_color[current_color[i]])plt.pause(pause_time)del x'''==============================================='''# 把新中心点赋值(copy)给旧中心点C_old = C_new.copy()C_new = []# 分别取出相同下标的点集合,重新计算中心点并赋值给新的中心点index = np.array(index)for i in range(index.max() + 1):points = X[np.where(index == i)]C_new.append(list(center(points)))print("新的中心点:", C_new)'''===============判断是否应该结束绘图===================='''if C_new != C_old:plt.clf()'''================================================'''print('分类完毕')plt.show()# 计算距离
def dist(X1, X2): # X1 X2 必须都是数组类型X1 = np.array(X1)X2 = np.array(X2)s = sum((X1 - X2) ** 2) ** 0.5print(X1, "和", X2, "之间的距离为:", round(s, 2))return s# 计算中心点
def center(X):# 次优解决方案!Y = X[0]for i in range(1, X.shape[0]):Y = Y + X[i]return Y / len(X)K_Means(X, 3)
这段代码可以直接复制到自己的电脑里面跑一下,可能会出现一开始随机产生的中心点有两个相同的bug,我懒得debug了哈哈哈
被===== ====== 括起来的代码都是为了绘制出图写的,大家可以直接删掉,不影响代码的运行(如果要删的话不要忘记删掉前面的plt.xlim(),plt.ylim()和最后的plt.show()。
因为第一次使用matplotlib,对他的一些方法不太了解,所以写出来的代码非常冗长,如果不需要绘图的话,只需要大概40多行就可以完成任务。
代码分析:
计算两个点之间距离的代码:
def dist(X1, X2): # X1 X2 必须是数组类型X1 = np.array(X1) # 为了初始化点的类型X2 = np.array(X2)s = sum((X1 - X2) ** 2) ** 0.5print(X1, "和", X2, "之间的距离为:", round(s, 2))return s
如两个点:x1:[1,2],x2:[3,4]
先计算两个点各个分量之间的差
x1 - x2 = [-2,-2]
再计算两个差的平方和再开发
计算中心点
def center(X):Y = X[0]for i in range(1, X.shape[0]):Y = Y + X[i]return Y / len(X)
n个点的中心点,如点:[2,3][4,4][5,6]
它的中心点是:([2,3]+[4,4]+[6,8])/3 = [4,5]
其中上面的分母3是点的个数,如果有4个点那就应该除以4了。我认为K-均值算法的均值就体现在这里。
到这里两个最基本的方法已经写好了,接下来过一下这个算法
K-Means(X,n)
其中的X是样本点集,n是你需要的簇的量,值的注意的是,X是一个二维数组,他每一行代表一个点。
我认为这段代码唯一需要说明一下的就是 :
index = [] # 对应中心点在C_new中的下标
这一小段莫名其妙的代码了。其他的地方我都用注释的方式写出了用处。
这段代码是啥意思呢?或者说这个index[]有啥用呢?他其实就是每一个样本点的类标号集合。比如我的样本中心点C_new里面有x,y,z这三个中心点,那index[]里面第0个元素的值(假设它为1),那他的意思就是X里面的第0个点离样本中心点C_new内下标为1的中心点距离最近
这个非常有用,如果要绘图的话,这段代码也可以派上用场
最后
这是我写的第一个博客,我也是一个刚入门的程序猿,如果有什么地方不对的,或者有更好的实现方法,欢迎留言!
K-Means K均值算法python实现 (包括绘图)相关推荐
- k均值算法python实现(吴恩达机器学习作业)
k均值算法python实现(吴恩达机器学习作业) 题目要求 数据集 读取mat文件 K-means 实现 结果 问题 题目要求 采用K均值算法对样本进行聚类. 编写K均值算法源代码,对ex7data2 ...
- k均值聚类算法(K Means)及其实战案例
算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...
- python实现k均值算法_python实现kMeans算法
聚类是一种无监督的学习,将相似的对象放到同一簇中,有点像是全自动分类,簇内的对象越相似,簇间的对象差别越大,则聚类效果越好. 1.k均值聚类算法 k均值聚类将数据分为k个簇,每个簇通过其质心,即簇中所 ...
- python图片压缩算法_使用K均值算法进行图片压缩
K均值算法 上一期介绍了机器学习中的监督式学习,并用了离散回归与神经网络模型算法来解决手写数字的识别问题.今天我们介绍一种机器学习中的非监督式学习算法--K均值算法. 所谓非监督式学习,是一种与监督式 ...
- k均值算法 二分k均值算法_如何获得K均值算法面试问题
k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...
- k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类
k均值算法 二分k均值算法 Have you ever seen a Caribbean reef? Well if you haven't, prepare yourself. 您见过加勒比礁吗? ...
- K 均值算法-如何让数据自动分组
公号:码农充电站pro 主页:https://codeshellme.github.io 目录 1,K 均值算法 2,K 均值算法聚类过程 3,K 均值算法的实现 4,准备数据点 5,对数据聚类 6, ...
- 距离产生美?k近邻算法python实现
https://blog.csdn.net/red_stone1/article/details/80607960 1. 什么是k近邻算法? k最近邻(k-Nearest Neighbor,kNN)分 ...
- k-modes算法mysql_第十一章 K-Means(K均值)算法模型实现(中)
python2 代码实现: from numpy import * import numpy def loadDataSet(fileName): #general function to parse ...
- kmeans改进 matlab,基于距离函数的改进k―means 算法
摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...
最新文章
- pass4side IBM 000-M15
- 2019年,被高估的AI与数据科学该如何发展?
- 四十六、微信小程序快速开发入门
- 1356. Sort Integers by The Number of 1 Bits 根据数字二进制下 1 的数目排序
- 解决执行 df -h 卡住,yum和rpm都无法安装软件问题
- NOIP2011 选择客栈(洛谷P1311)
- 良好的Makefile实践
- localStorage存储数组以及取数组方法。
- Jquery 实现动态加入table tr 和删除tr 以及checkbox的全选 和 获取加入TR删除TR后的数据...
- javascript:void(0)的作用示例
- 2.Prometheus 监控技术与实践 --- Prometheus基本概念及部署
- 如何在doc下运行java程序及打包成.jar格式的Java程序
- DH算法图解+数学证明
- 【Zigbee】基础篇(4) Zigbee无线通信过程、无线发送温湿度信息
- HDU 2415 Bribing FIPA(树形背包)
- 微信小程序报错unshift is not a function
- IT男人:四十岁是一枝花吗?
- SolidWorks 如何制作装配体
- 使用SQL和Pandas计算累计百分比
- GitHub是什么?GitHub如何使用?