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实现 (包括绘图)相关推荐

  1. k均值算法python实现(吴恩达机器学习作业)

    k均值算法python实现(吴恩达机器学习作业) 题目要求 数据集 读取mat文件 K-means 实现 结果 问题 题目要求 采用K均值算法对样本进行聚类. 编写K均值算法源代码,对ex7data2 ...

  2. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  3. python实现k均值算法_python实现kMeans算法

    聚类是一种无监督的学习,将相似的对象放到同一簇中,有点像是全自动分类,簇内的对象越相似,簇间的对象差别越大,则聚类效果越好. 1.k均值聚类算法 k均值聚类将数据分为k个簇,每个簇通过其质心,即簇中所 ...

  4. python图片压缩算法_使用K均值算法进行图片压缩

    K均值算法 上一期介绍了机器学习中的监督式学习,并用了离散回归与神经网络模型算法来解决手写数字的识别问题.今天我们介绍一种机器学习中的非监督式学习算法--K均值算法. 所谓非监督式学习,是一种与监督式 ...

  5. k均值算法 二分k均值算法_如何获得K均值算法面试问题

    k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...

  6. k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类

    k均值算法 二分k均值算法 Have you ever seen a Caribbean reef? Well if you haven't, prepare yourself. 您见过加勒比礁吗? ...

  7. K 均值算法-如何让数据自动分组

    公号:码农充电站pro 主页:https://codeshellme.github.io 目录 1,K 均值算法 2,K 均值算法聚类过程 3,K 均值算法的实现 4,准备数据点 5,对数据聚类 6, ...

  8. 距离产生美?k近邻算法python实现

    https://blog.csdn.net/red_stone1/article/details/80607960 1. 什么是k近邻算法? k最近邻(k-Nearest Neighbor,kNN)分 ...

  9. k-modes算法mysql_第十一章 K-Means(K均值)算法模型实现(中)

    python2 代码实现: from numpy import * import numpy def loadDataSet(fileName): #general function to parse ...

  10. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

最新文章

  1. pass4side IBM 000-M15
  2. 2019年,被高估的AI与数据科学该如何发展?
  3. 四十六、微信小程序快速开发入门
  4. 1356. Sort Integers by The Number of 1 Bits 根据数字二进制下 1 的数目排序
  5. 解决执行 df -h 卡住,yum和rpm都无法安装软件问题
  6. NOIP2011 选择客栈(洛谷P1311)
  7. 良好的Makefile实践
  8. localStorage存储数组以及取数组方法。
  9. Jquery 实现动态加入table tr 和删除tr 以及checkbox的全选 和 获取加入TR删除TR后的数据...
  10. javascript:void(0)的作用示例
  11. 2.Prometheus 监控技术与实践 --- Prometheus基本概念及部署
  12. 如何在doc下运行java程序及打包成.jar格式的Java程序
  13. DH算法图解+数学证明
  14. 【Zigbee】基础篇(4) Zigbee无线通信过程、无线发送温湿度信息
  15. HDU 2415 Bribing FIPA(树形背包)
  16. 微信小程序报错unshift is not a function
  17. IT男人:四十岁是一枝花吗?
  18. SolidWorks 如何制作装配体
  19. 使用SQL和Pandas计算累计百分比
  20. GitHub是什么?GitHub如何使用?

热门文章

  1. 【个人积累】轨道根数六要素中第4、5项的理解与STK仿真演示
  2. 想做产品经理,产品经理培训靠谱吗?
  3. pycharm社区免费版如何创建Django项目
  4. xcode打包IPA(完整详细图文)
  5. Excel对比数据差异方法总结
  6. day19 .NET项目DLL反编译未授权访问配置调试报错
  7. audio接线图解_拒绝做小白 你应该知道的常见音频接口
  8. 最全PR曲线、ROC曲线以及AUC计算公式详解
  9. PID参数自整定库之一:继电反馈整定算法
  10. 一个简单易用的m3u8下载器,支持下载m3u8链接或文件为mp4或ts格式