Kmeans聚类

简介

之前提到的算法大多数都是监督学习算法,主要代表是分类和回归问题,但是很多时候想要从数据中发现一些潜在的规律,而数据是没有指标驱动的,即没有标签,这种自学习算法称为非监督学习(Unsupervised Learning)。非监督学习算法的典型代表是聚类(Clustering),分类问题是给定x和y,要求找到一种假设拟合数据的分布,将不同的类别区分开,而聚类问题则是只有x,从中发现一些规律将样本分成区别较大的多个簇。聚类的应用较分类在业界更为广泛,因为标注成本大且易错,最为典型的聚类算法是Kmeans算法。

原理

K-means是一种给定聚类数目k的聚类算法,它通过迭代不断调整聚类中心达到聚类的目的,由于聚类中心的调整是基于当前簇的均值决定的,故叫做k均值聚类算法。下面以样本都是二维特征的数据为例(方便可视化),详述算法思路。

  1. 随机初始化K个聚类中心。
  2. 计算每个样本点到聚类中心的距离(一般欧式距离),样本点离哪个聚类中心最近则将该样本划分到对应簇中;
  3. 计算每个簇的各特征均值(本例即x和y坐标的均值),将该簇的聚类中心调整为均值位置;
  4. 重复上述2和3步,直到聚类中心稳定不变动。

上述的Kmeans算法存在一些问题,如k个聚类中心的初始化,一旦出现极端情况将很难更新(所有样本离某个中心都是最近,其他中心无法形成簇)。

首先来看Kmeans的优化目标,记c(i)c^{(i)}c(i)为第i个样本的所属簇(类别)的编号,μk\mu_kμk​表示第k个簇的聚类中心。那么优化的目标函数就如下式所示。

J(c(1),…,c(m),μ1,…,μK)=1m∑i=1m∥x(i)−μc(i)∥2J\left(c^{(1)}, \ldots, c^{(m)}, \mu_{1}, \ldots, \mu_{K}\right)=\frac{1}{m} \sum_{i=1}^{m}\left\|x^{(i)}-\mu_{c^{(i)}}\right\|^{2} J(c(1),…,c(m),μ1​,…,μK​)=m1​i=1∑m​∥∥∥​x(i)−μc(i)​∥∥∥​2

优化函数即为如下,只要找到使得J最小的ccc和μ\muμ即找到了最优解。

min⁡c(1),…,c(m)μ(1),…,μ(m)J(c(1),…,c(m),μ1,…,μK)\min _{c^{(1)}, \ldots, c^{(m)} \\ \mu^{(1)}, \ldots, \mu^{(m)}} J\left(c^{(1)}, \ldots, c^{(m)}, \mu_{1}, \ldots, \mu_{K}\right) c(1),…,c(m)μ(1),…,μ(m)min​J(c(1),…,c(m),μ1​,…,μK​)

算法优化

上述的算法原理其实并不是很复杂,但是该算法的应用会出现很多问题,如之前提到的聚类中心初始化,不合适的初始化很容易使得算法收敛到局部最优解,这不是我们希望看到的。
比较常用且有效的聚类中心初始化方法是随机挑选k个训练样本作为聚类初始中心,这种方法叫做随机初始化(random initialization)。

当然,即使随机初始化也可能陷入局部最优,因此多次尝试随机初始化,综合多次聚类结果会是不错的选择,综合的方法一般是选择使得代价函数J最小的聚类参数。

还有一个比较值得研究的问题就是如何确定聚类的簇数目K,这引起了较多的研究也产生了一些方法,但是最实用的其实还是人工选择。这是因为,当数据的特征维度较大时,一方面可视化困难,另一方面不同的人对数据的理解不同,所以设计一个自动选择k值的算法是非常困难的。

曾今,肘部法则被使用过,它的思路是绘制代价函数值J关于K的函数,会出现一个明显的拐点,这个点对应的K值就是选择的K值(下图左)。但是,很多时候并不会出现这个拐点,因此难以选出合适的K。所以更加常用的实际上是任务驱动的选择,怎样的K对Kmeans下游任务更加有效,就选这个K。

聚类实战

实战基于鸢尾花数据集,其中的标签列不作为训练数据,且选择两列作为特征,方便二维可视化。

数据集的真实分布如下图,可以感受到,由于数据的确实,二维特征区分度不明显,聚类还是比较难的。

实战的源码如下。

"""
Author: Zhou Chen
Date: 2019/12/9
Desc: 简单实现Kmeans聚类算法
"""
import numpy as np
from matplotlib import pyplot as plt
import random
from sklearn.datasets import load_iris
plt.style.use('fivethirtyeight')def load_data():data, target = load_iris()['data'], load_iris()['target']# 选取前两列特征,方便可视化return data[:, :2], targetdef plot_data(x, y):plt.scatter(x[:, 0], x[:, 1], c=y)plt.savefig('rst.png')plt.show()def rand_centroids(data, k):m = data.shape[0]# 随机选择k个样本作为初始化的聚类中心sample_index = random.sample(list(range(m)), k)centroids = data[sample_index]# 循环遍历特征值return centroidsdef compute_dist(vecA, vecB):return np.linalg.norm(vecA - vecB)def kMeans(data, k):m, n = np.shape(data)  # 样本量和特征量labels = np.array(np.zeros((m, 2)))centroids = rand_centroids(data, k)cluster_changed = True  # 是否已经收敛while cluster_changed:cluster_changed = Falsefor i in range(m):min_dist = np.infmin_index = -1for j in range(k):distJI = compute_dist(centroids[j, :], data[i, :])if distJI < min_dist:min_dist = distJImin_index = jif labels[i, 0] != min_index:cluster_changed = Truelabels[i, :] = min_index, min_dist ** 2for cent in range(k):ptsInClust = data[np.nonzero(labels[:, 0] == cent)[0]]centroids[cent, :] = np.mean(ptsInClust, axis=0)# 返回所有的类质心与点分配结果即类别return centroids, labelsif __name__ == '__main__':data, target = load_data()# plot_data(data, target)_, label = kMeans(data, 3)plot_data(data, label[:, 0])

最终的聚类效果如下图,可以看出,和原来的类别比较,聚类效果较为不错。

补充说明

本文简单叙述了Kmeans这一聚类模型的简单思想,思路参照吴恩达的机器学习课程(Coursera),除此以外后来产生了很多更为优秀的聚类算法,后续会介绍。

  • 本系列相关的博文和代码开放于Github,欢迎访问项目。同时博客也同步在我的个人博客网站,欢迎访问查看其他文章。
  • 由于能力和时间有限,如有错误,欢迎评论指正。

机器学习-Kmeans聚类相关推荐

  1. 基于经典的机器学习k-means聚类算法实现对三通道图片的压缩操作

    https://www.toutiao.com/a6573221465104056846/ 压缩图片的原理 k-means算法实现图像的压缩是k-means聚类算法的一个经典的应用,它把一个彩色图压缩 ...

  2. 机器学习(K-means聚类原理以及用法)

    k-means 属于非监督学习(unsupervised learning) 聚类:把数据分成多少个类别 1.聚类的过程 例如:    k等于几就相当于分几类 1.随机设置K个特征空间内的点作为初始的 ...

  3. 机器学习——K-Means聚类算法及其应用

    概括 首先说一下聚类,多用于机器学习中的无监督学习,通俗来说是将具有相似性的数据分为多类(在相似的基础上收集数据来分类).由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其 ...

  4. kmeans python自定义初始聚类中心_机器学习-KMeans聚类 K值以及初始类簇中心点的选取...

    本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法, ...

  5. 机器学习-KMeans聚类 K值以及初始类簇中心点的选取

    本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法, ...

  6. 机器学习——KMeans聚类

    KMeans 是最常用的聚类算法. 数据任然使用iris.arff数据,不使用最后一项属性. getRandomIndices() 和 kMeans 的完全相同, 拷贝过来. distance() 和 ...

  7. 机器学习——Kmeans聚类算法

    目录 简介 手肘法 手肘法核心思想 轮廓系数 代码举例1 代码举例2 实例 简介 K均值聚类算法是先随机选取K个对象作为初始的聚类中心.然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距 ...

  8. 数据挖掘十大算法(二):K-means聚类算法原理与实现

    参考: 1.机器学习-KMeans聚类 K值以及初始类簇中心点的选取 2.K-Means算法的研究分析及改进 一.K-means算法原理 K-means算法是最常用的一种聚类算法.算法的输入为一个样本 ...

  9. 离线轻量级大数据平台Spark之MLib机器学习库聚类算法KMeans实例

    1.KMeans算法 所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高.其 ...

最新文章

  1. 行人姿态估计--Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
  2. 15.4 xshell使用xftp传输文件;15.5 使用pure-ftpd搭建ftp服务
  3. Flask入门 表单Flask-wtf form原生与Bootstrap渲染(七)
  4. pytorch torch.nn.Sequential(* args)(嘎哈用的?构建神经网络用的?)
  5. wxWidgets:wxDataViewTreeCtrl类用法
  6. python模块--BeautifulSoup4 和 lxml
  7. python让函数抛出异常,是否有任何对象可以使str()函数在python中抛出错误或异常?...
  8. 100*100的 canvas 占多少内存?
  9. html5中将doctype分为几种,html5与html 4.01的区别 doctype几种分类及其不同
  10. OpenCV3学习(4.1)——图像阈值操作(Threshold,AdaptiveThreshold)
  11. DEA模型中的CCR模型
  12. android不同sdk版本控制,闲谈Android SDK开发
  13. 微信公众平台针对iBeacon 增加摇一摇周边功能
  14. 设计一个圆形的类即Circle类。
  15. 如何将乱码转化为UTF-8
  16. 阿里云改名并下载文件,乱码问题解决
  17. 【HarmonyOS HiSpark AI Camera试用连载 】AI_Camera_Hi3516DV300开发套件非专业开箱
  18. CTR---DIN原理,及deepctr组网实现DIN
  19. C++实现找100(任意)以内的质数--非常好的算法
  20. Windows-DB2 9.7安装图解

热门文章

  1. LocalDateTime - Java处理日期和时间
  2. 图的最短路径(一级)
  3. php自定义框架,「php 框架」自定义php框架(篇一) - seo实验室
  4. hadoop读取mysql数据_Pyspark连接mysql、hive、hdfs 实例展示
  5. dbeaver导出建表语句_细致入微:如何使用数据泵导出表的部分列数据
  6. python爬虫贴吧_Python爬虫如何爬取贴吧内容
  7. python导出数据找不到csv_找不到Python/CSV文件
  8. java11开源中国,Java 11 正式发布!
  9. No module named ‘XX‘
  10. ubuntu nano的使用 nano的关闭快捷键