K均值聚类算法(Kmeans)讲解及源码实现


算法核心

K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点。算法的具体步骤描述如下。

  1. 数据预处理,如归一化、离群点处理等。
  2. 随机选取K个簇中心,记为μ1(0),μ2(0),...,μk(0)\mu_1^{(0)},\mu_2^{(0)},...,\mu_k^{(0)}μ1(0)​,μ2(0)​,...,μk(0)​。
  3. 定义代价函数:J(c,μ)=minμmincΣi=1M∣∣xi−μci∣∣2J(c,\mu)=min_{\mu}min_{c}\Sigma_{i=1}^M||x_i-\mu_{c_i}||^2J(c,μ)=minμ​minc​Σi=1M​∣∣xi​−μci​​∣∣2。
  4. 令t=0,1,2,...t=0,1,2,...t=0,1,2,...为迭代步数,重复下面过程直到JJJ收敛
  • 对于每一个样本xix_ixi​,将其分配到距离最近的簇ci(t)←argmink∣∣xi−μk(t)∣∣2c_i^{(t)}\leftarrow argmin_k ||x_i-\mu_k^{(t)}||^2ci(t)​←argmink​∣∣xi​−μk(t)​∣∣2
  • 对于每一个类簇kkk,重新计算该类中心μk(t+1)←argminμΣi:xi(t)=k∣∣xi−μ∣∣2\mu_k^{(t+1)}\leftarrow argmin_{\mu}\Sigma_{i:x_i^{(t)}=k}||x_i-\mu||^2μk(t+1)​←argminμ​Σi:xi(t)​=k​∣∣xi​−μ∣∣2

KKK均值算法在迭代时,假设当前损失函数JJJ没有达到最小值,那么首先固定簇中心{μk}\{\mu_k\}{μk​},调整每个样例xix_ixi​所属的类别cic_ici​来让JJJ函数减少;
然后固定{ci}\{c_i\}{ci​},调整簇中心{μk}\{\mu_k\}{μk​}使JJJ减少。
这两个过程交替循环,JJJ单调递减:当JJJ递减到最小值时,μk{\mu_k}μk​和ci{c_i}ci​也同时收敛。

源码实现(含可视化)

导入包

import numpy as np
import matplotlib.pyplot as plt

数据预处理

设置地图尺寸

# map 100*100
high = 100
width = 100

创建随机数据
每一条数据的格式为(x坐标,y坐标,类别)(x坐标,y坐标,类别)(x坐标,y坐标,类别),列表初始化为0,类别序数间隔1递增

data = np.random.rand(100, 2)
data = data * [high, width]
data = np.hstack((data, np.zeros([100, 1])))

定义簇数目

# count of classes
classes = 5

定义距离函数,此处我们使用欧氏距离

def distance(point1, center):return np.sqrt((point1[0] - center[0]) ** 2 + (point1[1] - center[1]) ** 2)

定义从类别到颜色的映射函数,即
类别∗255/总类别数类别*255/总类别数类别∗255/总类别数

def color(i):global classesreturn i * 255. / classes

定义主函数

先将plt设置为连续作图模式
然后随机挑选簇中心点,并加入到中心点数组centers_datacenters\_datacenters_data中

if __name__ == '__main__':plt.ion()# select center randomlycenters = np.random.randint(0, 100, [classes])centers_data = []for i in range(classes):data[i][2] = icenters_data.append(data[i])

先画散点图,且暂停0.5秒以显示迭代中的聚类情况。

    while True:colors = [color(x) for x in data[:, 2]]plt.scatter(data[:, 0], data[:, 1], c=colors)plt.pause(0.5)

先后依次迭代更新每个点所对应的簇,和每个簇的中心点。

        # caculate nearest centerfor i in range(100):distances = np.array([distance(data[i], center_data) for center_data in centers_data])i_class = np.argmin(distances)data[i][2] = i_class# caculate new centernew_centers_data = np.zeros([classes, 2])new_centers_count = np.zeros([classes])for j in range(5):for i in range(100):if data[i][2] == j:new_centers_count[j] += 1new_centers_data[j] += data[i][0:2]

计算五个簇的中心点位置先后变化的最大值,其值小于1e-4(可自定义)时,跳出循环,停止迭代。

     new_centers_data /= np.array([new_centers_count]).Tdist = np.max([distance(new_centers_data[i], centers_data[i]) for i in range(classes)])print('max distance ', dist)if dist < 1e-4:break

在每次迭代的最后更新中心点数据

     centers_data = new_centers_data

最后关闭连续作图模式,并展示最后的图画,打印结束。

 plt.ioff()plt.show()print('kmeans completed.')

效果

命令行

max distance  28.36595846126929
max distance  7.136259328045152
max distance  3.533885366585787
max distance  2.153654229308223
max distance  0.0
kmeans completed.

可视化过程

第1次迭代

第2次迭代

第3次迭代

第4次迭代

全部代码

import numpy as np
import matplotlib.pyplot as plt# map 100*100
high = 100
width = 100
# create random data
data = np.random.rand(100, 2)
data = data * [high, width]
data = np.hstack((data, np.zeros([100, 1])))
# count of classes
classes = 5def distance(point1, center):return np.sqrt((point1[0] - center[0]) ** 2 + (point1[1] - center[1]) ** 2)def color(i):global classesreturn i * 255. / classesif __name__ == '__main__':plt.ion()# select center randomlycenters = np.random.randint(0, 100, [classes])centers_data = []for i in range(classes):data[i][2] = icenters_data.append(data[i])while True:colors = [color(x) for x in data[:, 2]]plt.scatter(data[:, 0], data[:, 1], c=colors)plt.pause(0.5)# caculate nearest centerfor i in range(100):distances = np.array([distance(data[i], center_data) for center_data in centers_data])i_class = np.argmin(distances)data[i][2] = i_class# caculate new centernew_centers_data = np.zeros([classes, 2])new_centers_count = np.zeros([classes])for j in range(5):for i in range(100):if data[i][2] == j:new_centers_count[j] += 1new_centers_data[j] += data[i][0:2]new_centers_data /= np.array([new_centers_count]).Tdist = np.max([distance(new_centers_data[i], centers_data[i]) for i in range(classes)])print('max distance ', dist)if dist < 1e-4:breakcenters_data = new_centers_dataplt.ioff()plt.show()print('kmeans completed.')

K均值聚类算法(Kmeans)讲解及源码实现相关推荐

  1. 机器学习实战-61:K均值聚类算法(K-Means)

    K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...

  2. 计算机视觉面试考点(14)K均值聚类算法(K-Means)

    计算机视觉工程师在面试过程中主要考察三个内容:图像处理.机器学习.深度学习.然而,各类资料纷繁复杂,或是简单的知识点罗列,或是有着详细数学推导令人望而生畏的大部头.为了督促自己学习,也为了方便后人,决 ...

  3. K-means(K均值聚类算法)算法笔记

    K-means(K均值聚类算法)算法笔记 K-means 算法,是比较简单的无监督的算法,通过设定好初始的类别k,然后不断循环迭代,将给定的数据自动分为K个类别.事实上,大家都知道K-means是怎么 ...

  4. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

  5. 聚类算法中 K均值聚类(KMeans)的python实现

    ** 聚类算法中 K均值聚类(KMeans)的python实现 ** import numpy as np import matplotlib.pyplot as plt from sklearn.d ...

  6. 机器学习算法与Python实践之k均值聚类(k-means)

    机器学习算法与Python实践之(五)k均值聚类(k-means) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是 ...

  7. 【ML算法学习】核K均值聚类Kernel K-Means Clustering(KKMC)

    核K均值聚类Kernel K-Means Clustering(KKMC) 1. 理论基础回顾 (1)核函数定义(统计学习方法定义7.6) 定义内容:假设有输入空间 X \mathcal{X} X( ...

  8. K均值聚类算法(HCM,K-Means)

    K均值聚类核心思想如下: 算法把n个向量分为个组,并求每组的聚类中心,使得非相似性(或距离)指标的价值函数(或目标函数)达到最小.当选择欧几里德距离为组j中向量与相应聚类中心间的非相似性指标时,价值函 ...

  9. K均值聚类(KMeans)、可视化选取最佳K值、通过TSNE进行结果可视化分析、抽取核心特征因子

    K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标. k ...

最新文章

  1. requests库怎么安装在python中-python安装requests库的实例代码
  2. Python:安装dlib库
  3. SpringBoot应用日志通过logstash远程上传到ES
  4. C语言程序练习-L1-030 一帮一 (15分)
  5. gin context和官方context_Go语言gin框架从入门到精通(3)
  6. 使用 jQuery Mobile 与 HTML5 开发 Web App (三) —— jQuery Mobile 按钮
  7. Python可视化数据------seaborn
  8. tornado的websocket处理
  9. oracle adjusting parallel,Oracle 并行相关的初始化参数
  10. [导入]polygraph3d三维运行时引擎为silverlight 1.0.zip(15.69 KB)
  11. 如何使用Python将Word转换为PDF文件?
  12. 温肯本科学习回忆录一:简述我的本科专业
  13. Oracle 12c:配置em,解决em登录问题
  14. 含绝对值函数的可导性
  15. OpenCV:二值化函数cv2.threshold
  16. 2016天善智能交流会第22场: R语言为量化而生
  17. JavaScript-歌词展示与音乐同步
  18. ChatGPT 账号被封?推荐 5 款国外网站,完美替代!
  19. C++项目实战-环境的搭建
  20. 【HTCVR】VRTK插件模块功能分析之传送移动(一)

热门文章

  1. linux生成随机数
  2. 区块链游戏公司 区块链游戏开发成本 区块链游戏开发时间
  3. 无人机动力系统测试的必要性
  4. 常见几种视频渲染模式介绍
  5. 信息安全等级保护措施之网络安全技术
  6. html5多首背景音乐,给视频添加背景音乐|多个视频按顺序合并,添加背景音乐,或者更换背景音乐...
  7. BIOS、UEFI、Boot Loader都是些什么
  8. 搜狗输入法截屏不能用了
  9. AATCC 174 新地毯的抗菌活性评估
  10. 安徽马鞍山郑蒲港地图编码