K-Means算法理论及Python实现
简述
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:
https://ieeexplore.ieee.org/abstract/document/238318) ↩︎
K-Means算法理论及Python实现相关推荐
- 时间序列 预处理 python_时间序列算法理论及python实现(1-算法理论部分)
如果你在寻找时间序列是什么?如何实现时间序列?那么请看这篇博客,将以通俗易懂的语言,全面的阐述时间序列及其python实现. 就餐饮企业而言,经常会碰到如下问题. 由于餐饮行业是胜场和销售同时进行的, ...
- k均值聚类算法(K Means)及其实战案例
算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...
- kmeans改进 matlab,基于距离函数的改进k―means 算法
摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...
- OpenCV的k - means聚类 -对图片进行颜色量化
OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...
- OpenCV官方文档 理解k - means聚类
理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...
- 文献记录(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 ...
- 强化学习的学习之路(十)_2021-01-10:K臂老虎机介绍及其Python实现
作为一个新手,写这个强化学习-基础知识专栏是想和大家分享一下自己学习强化学习的学习历程,希望对大家能有所帮助.这个系列后面会不断更新,希望自己在2021年能保证平均每日一更的更新速度,主要是介绍强化学 ...
- 详解 Benders 分解与一个算例的 python 代码
听说过 benders 分解几年了,在生产管理.路径规划与选址问题中经常应用,一直没有细看,最近论文里面也见到,还是有必要了解一下它的基本思想与用法的. 目录 1. 基本思想 2. 线性规划模型与对偶 ...
- K means 图片压缩
k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...
最新文章
- Error:The SDK Build Tools revision (23.0.3) is too low for project ':app'. Minimum required is 25.0.
- NHibernate之旅(8):巧用组件之依赖对象
- 露天下的云端信标组比赛
- python实验过程心得体会_20192416 实验四《Python程序设计》综合实践报告
- [云炬创业基础笔记]第四章测试24
- 通讯录的初步了解与使用
- 关于navicat提权的方法
- ensp安装包_教你如何安装华为模拟器Ensp,另分享全套安装包
- 「拥抱开源, 又见 .NET」系列第三次线下活动简报
- .NET 中创建支持集合初始化器的类型
- linux ace platform_linux.gnu,Linux下配置和使用ACE笔记
- 数据结构和算法(03)---栈和队列(c++)
- java中 set集合_第8篇 Java中的集合(Set)
- 关于Intel IPP的基本使用方法——参照可设置ipl库
- Scrapy Crawl 运行出错 AttributeError: 'xxxSpider' object has no attribute '_rules' 的问题解决...
- Python中pass是什么?
- php判断移动端和pc端访问_PHP函数判断移动端和PC端
- java批量添加注解到所有业务接口
- 如何使用EasyNVR+CDN突破萤石云在直播客户端数量上的限制,做到低成本高性价比的直播...
- BT源代码学习心得(六):跟踪服务器(Tracker)的代码分析(初始化)
热门文章
- html 鼠标单击单元格,vue-easytable点击表格中某个单元格操作
- 《深入理解C++11:C++ 11新特性解析与应用》——3.2 委派构造函数
- Image转Base64镶嵌网页中
- 【BZOJ3262】 陌上花开
- websphere变成英文了
- Ubuntu下安装配置Hadoop独立模式和伪分布式
- Class Activation Mapping (CNN可视化) Python示例
- 【数据平台】pandas按条件去重
- Leetcode 100. 相同的树 解题思路及C++实现
- html中选择收货地址时候,收货地址.html