简述

K-means Algorithm(s)

  • Assumes Euclidean space/distance 假设是在欧式空间下的。因为means本身是需要在欧式空间下才可以计算。但K-means有很多的推广版本,将欧式空间中所提到的Centroid转成Clustroid,是一种比较常见的推广方式。
  • 算法先取k个类: Initialization 的时候需要避免ill-initialization 这里考虑到病态的初始化。最为经典的是使用 Rival penalized competitive learning1

总之,通过一定的方式,可以实现初始化的K个类中心的选取。

算法流程

  • For each point, place it in the cluster whose current centroid it is nearest.对于每个点,将其放在那个类中心离它最近的那个类中。
  • After all points are assigned, update the locations of centroids of the K clusters. 每个点都被分配完之后,更新每个类的中心位置。
  • Reassign all points to their closet centroid. 再分配每个点(方法类似)直到整个分配没什么变化。(直到收敛)

收敛性证明

这里我只给出不是很严谨的证明~ 至于详细的可以看60年前的那篇论文。

我们认为K-means一定会收敛。
下面使用反证法:
假设该算法不收敛。

那么根据假设就存在有这样的一个点。在添加它之后,即类中心发生移动后,就该删除掉它。
而这是不合理的。添加上该点之后,该类中心会向该点的发生移动。即距离比之前更近了。而根据算法,我们知道这样的点是不会被抛弃的。所以,这样的点不存在。即该算法会收敛。

证明不是很严谨,但是却可以拿来做对于算法收敛的直观认知~
欢迎大家在评论区补充~

Python实现

  • 注意,这里采用的是完全随机初始化,这样的效果不是很好。因为可能会存在有病态的初始化结果。
def k_means(X, k=3):index_list = np.arange(len(X))np.random.shuffle(index_list)centroids_index = index_list[:k]centroids = X[centroids_index]y = np.arange(len(X))while True:y_new = np.arange(len(X))for i, xi in enumerate(X):y_new[i] = np.argmin([np.linalg.norm(xi - cj) for cj in centroids])if sum(y != y_new) == 0:breakfor j in range(k):centroids[j] = np.mean(X[np.where(y_new == j)], axis=0)y = y_new.copy()return y
  • 直接用PCA截取部分特征,主要是为了画图
from sklearn import datasets
iris = datasets.load_iris()
from sklearn.decomposition import PCA
X_reduced = PCA(n_components=2).fit_transform(iris.data)
import matplotlib.pyplot as plt
plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap=plt.cm.Set1)

原图:

K-means:

  • 直接选用前两个特征
plt.scatter(iris.data[:, 0], iris.data[:, 1], c=y, cmap=plt.cm.Set1)
y_test_2 = k_means(iris.data)
plt.scatter(iris.data[:, 0], iris.data[:, 1], c=y_test, cmap=plt.cm.Set1)

原图:

K-means:


  1. https://ieeexplore.ieee.org/abstract/document/238318) ↩︎

K-Means算法理论及Python实现相关推荐

  1. 时间序列 预处理 python_时间序列算法理论及python实现(1-算法理论部分)

    如果你在寻找时间序列是什么?如何实现时间序列?那么请看这篇博客,将以通俗易懂的语言,全面的阐述时间序列及其python实现. 就餐饮企业而言,经常会碰到如下问题. 由于餐饮行业是胜场和销售同时进行的, ...

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

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

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

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

  4. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  5. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  6. 文献记录(part89)--I-k-means-+:An iterative clustering algorithm based on an enhanced k -means

    学习笔记,仅供参考,有错必究 关键词:k均值:解决方案改进:准确的k均值:迭代改进 I-k-means-+:An iterative clustering algorithm based on an ...

  7. 强化学习的学习之路(十)_2021-01-10:K臂老虎机介绍及其Python实现

    作为一个新手,写这个强化学习-基础知识专栏是想和大家分享一下自己学习强化学习的学习历程,希望对大家能有所帮助.这个系列后面会不断更新,希望自己在2021年能保证平均每日一更的更新速度,主要是介绍强化学 ...

  8. 详解 Benders 分解与一个算例的 python 代码

    听说过 benders 分解几年了,在生产管理.路径规划与选址问题中经常应用,一直没有细看,最近论文里面也见到,还是有必要了解一下它的基本思想与用法的. 目录 1. 基本思想 2. 线性规划模型与对偶 ...

  9. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

最新文章

  1. Error:The SDK Build Tools revision (23.0.3) is too low for project ':app'. Minimum required is 25.0.
  2. NHibernate之旅(8):巧用组件之依赖对象
  3. 露天下的云端信标组比赛
  4. python实验过程心得体会_20192416 实验四《Python程序设计》综合实践报告
  5. [云炬创业基础笔记]第四章测试24
  6. 通讯录的初步了解与使用
  7. 关于navicat提权的方法
  8. ensp安装包_教你如何安装华为模拟器Ensp,另分享全套安装包
  9. 「拥抱开源, 又见 .NET」系列第三次线下活动简报
  10. .NET 中创建支持集合初始化器的类型
  11. linux ace platform_linux.gnu,Linux下配置和使用ACE笔记
  12. 数据结构和算法(03)---栈和队列(c++)
  13. java中 set集合_第8篇 Java中的集合(Set)
  14. 关于Intel IPP的基本使用方法——参照可设置ipl库
  15. Scrapy Crawl 运行出错 AttributeError: 'xxxSpider' object has no attribute '_rules' 的问题解决...
  16. Python中pass是什么?
  17. php判断移动端和pc端访问_PHP函数判断移动端和PC端
  18. java批量添加注解到所有业务接口
  19. 如何使用EasyNVR+CDN突破萤石云在直播客户端数量上的限制,做到低成本高性价比的直播...
  20. BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化)

热门文章

  1. html 鼠标单击单元格,vue-easytable点击表格中某个单元格操作
  2. 《深入理解C++11:C++ 11新特性解析与应用》——3.2 委派构造函数
  3. Image转Base64镶嵌网页中
  4. 【BZOJ3262】 陌上花开
  5. websphere变成英文了
  6. Ubuntu下安装配置Hadoop独立模式和伪分布式
  7. Class Activation Mapping (CNN可视化) Python示例
  8. 【数据平台】pandas按条件去重
  9. Leetcode 100. 相同的树 解题思路及C++实现
  10. html中选择收货地址时候,收货地址.html