公号:码农充电站pro
主页:https://codeshellme.github.io

目录

  • 1,K 均值算法
  • 2,K 均值算法聚类过程
  • 3,K 均值算法的实现
  • 4,准备数据点
  • 5,对数据聚类
  • 6,总结

之前介绍到的一些机器学习算法都是监督学习算法。所谓监督学习,就是既有特征数据,又有目标数据

而本篇文章要介绍的K 均值算法是一种无监督学习

与分类算法相比,无监督学习算法又叫聚类算法,就是只有特征数据,没有目标数据,让算法自动从数据中“学习知识”,将不同类别的数据聚集到相应的类别中。

1,K 均值算法

K 均值的英文为K-Means,其含义是:

  • K:表示该算法可以将数据划分到K 个不同的组中。
  • 均值:表示每个组的中心点是组内所有值的平均值

K 均值算法可以将一个没有被分类的数据集,划分到K 个类中。某个数据应该被划分到哪个类,是通过该数据与群组中心点相似度决定的,也就是该数据与哪个类的中心点最相似,则该数据就应该被划分到哪个类中。

关于如何计算事物之间的相似度,可以参考文章《计算机如何理解事物的相关性》。

使用K 均值算法的一般步骤是:

  1. 确定K 值是多少:

    • 对于K 值的选择,可以通过分析数据,估算数据应该分为几个类。
    • 如果无法估计确切值,可以多试几个K 值,最终将划分效果最好的K 值作为最终选择。
  2. 选择K 个中心点:一般最开始的K 个中心点随机选择的。
  3. 将数据集中的所有数据,通过与中心点的相似度划分到不同的类别中。
  4. 根据类别中的数据平均值,重新计算每个类别中心点的位置。
  5. 循环迭代第3,4步,直到中心点的位置几乎不再改变,分类过程就算完毕。

2,K 均值算法聚类过程

下面以一个二维数据点的聚类过程,来看下K 均值算法如何聚类。

首先,这里有一些离散的数据点,如下图:


我们使用K 均值算法对这些数据点进行聚类。随机选择两个点作为两个类的中心点,分别是红色x蓝色x

计算所有数据点到这两个中心点的距离,距离红色x 近的点标红色,距离蓝色x 近的点标蓝色:


重新计算两个中心点的位置,两个中心点分别移动到新的位置:

重新计算所有数据点分别到红色x蓝色x的距离,距离红色x 近的点标红色,距离蓝色x 近的点标蓝色:

再次计算两个中心点的位置,两个中心点分别移动到新的位置:

直到中心点的位置几乎不再变化,聚类结束。

以上过程就是K 均值算法的聚类过程。

3,K 均值算法的实现

K 均值算法是一个聚类算法,sklearn 库中的 cluster 模块实现了一系列的聚类算法,其中就包括K 均值算法。

来看下KMeans 类的原型:

KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto')

可以看KMeans 类有很多参数,这里介绍几个比较重要的参数:

  • n_clusters: 即 K 值,可以随机设置一些 K 值,选择聚类效果最好的作为最终的 K 值。
  • init:选择初始中心点的方式:
    • init=‘k-means++’:可加快收敛速度,是默认方式,也是比较好的方式。
    • init='random ':随机选择中心点。
    • 也可以自定义方式,这里不多介绍。
  • n_init:初始化中心点的运算次数,默认是 10。如果 K 值比较大,可以适当增大 n_init 的值。
  • algorithmk-means 的实现算法,有autofullelkan三种。
    • 默认是auto,根据数据的特点自动选择用full或者elkan
  • max_iter:算法的最大迭代次数,默认是300。
    • 如果聚类很难收敛,设置最大迭代次数可以让算法尽快结束。

下面对一些二维坐标中的点进行聚类,看下如何使用K 均值算法。

4,准备数据点

下面是随机生成的三类坐标点,每类有20 个点,不同类的点的坐标在不同的范围内:

  • A 类点:Ax 表示A 类点的横坐标,Ay 表示A 类点的纵坐标。横纵坐标范围都是 (0, 20]
  • B 类点:Bx 表示B 类点的横坐标,By 表示B 类点的纵坐标。横纵坐标范围都是 (40, 60]
  • C 类点:Cx 表示C 类点的横坐标,Cy 表示C 类点的纵坐标。横纵坐标范围都是 (70, 90]
Ax = [20, 6, 14, 13, 8, 19, 20, 14, 2, 11, 2, 15, 19, 4, 4, 11, 13, 4, 15, 11]
Ay = [14, 19, 17, 16, 3, 7, 9, 18, 20, 3, 4, 12, 9, 17, 14, 1, 18, 17, 3, 5]Bx = [53, 50, 46, 52, 57, 42, 47, 55, 56, 57, 56, 50, 46, 46, 44, 44, 58, 54, 47, 57]
By = [60, 57, 57, 53, 54, 45, 54, 57, 49, 53, 42, 59, 54, 53, 50, 50, 58, 58, 58, 51]Cx = [77, 75, 71, 87, 74, 70, 74, 85, 71, 75, 72, 82, 81, 70, 72, 71, 88, 71, 72, 80]
Cy = [85, 77, 82, 87, 71, 71, 77, 88, 81, 73, 80, 72, 90, 77, 89, 88, 83, 77, 90, 72]

我们可以用 Matplotlib 将这些点画在二维坐标中,代码如下:

import matplotlib.pyplot as pltplt.scatter(Ax + Bx + Cx, Ay + By + Cy, marker='o')
plt.show()

画出来的图如下,可看到这三类点的分布范围还是一目了然的。

关于如何使用 Matplotlib 绘图,可以参考文章《如何使用Python 进行数据可视化》。

5,对数据聚类

下面使用K 均值算法对数据点进行聚类。

创建K 均值模型对象:

from sklearn.cluster import KMeans# 设置 K 值为 3,其它参数使用默认值
kmeans = KMeans(n_clusters=3)

准备数据,共三大类,60 个坐标点:

train_data = [# 前20 个为 A 类点[20, 14], [6, 19], [14, 17], [13, 16], [8, 3], [19, 7], [20, 9], [14, 18], [2, 20], [11, 3], [2, 4], [15, 12], [19, 9], [4, 17], [4, 14], [11, 1], [13, 18], [4, 17], [15, 3], [11, 5],# 中间20 个为B 类点[53, 60], [50, 57], [46, 57], [52, 53], [57, 54], [42, 45], [47, 54], [55, 57], [56, 49], [57, 53], [56, 42], [50, 59], [46, 54], [46, 53], [44, 50], [44, 50], [58, 58], [54, 58], [47, 58], [57, 51],# 最后20 个为C 类点[77, 85], [75, 77], [71, 82], [87, 87], [74, 71], [70, 71], [74, 77], [85, 88], [71, 81], [75, 73], [72, 80], [82, 72], [81, 90], [70, 77], [72, 89], [71, 88], [88, 83], [71, 77], [72, 90], [80, 72],
]

拟合模型:

kmeans.fit(train_data)

对数据进行聚类:

predict_data = kmeans.predict(train_data)

查看聚类结果,其中的0,1,2 分别代表不同的类别:

>>> print(predict_data)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

通过观察最终的聚类结果predict_data,可以看到,前,中,后20 个数据分别被分到了不同的类中,也非常符合我们的预期,说明K 均值算法的聚类结果还是很不错的 。

因为本例中的二维坐标点的分布界限非常明显,所以最终的聚类结果非常不错。

我们可以通过 n_iter_ 属性来查看迭代的次数:

>>> kmeans.n_iter_
2

通过 cluster_centers_ 属性查看每个类的中心点坐标:

>>> kmeans.cluster_centers_
array([[11.25, 11.3 ],[75.9 , 80.5 ],[50.85, 53.6 ]])

将这三个中心点画在坐标轴中,如下:

6,总结

本篇文章主要介绍了K 均值算法的原理,及sklearn 库对它的实现,并且演示了如何使用K 均值算法对二维数据点进行聚类。

(本节完。)


推荐阅读:

如何使用Python 进行数据可视化

计算机如何理解事物的相关性-文档的相似度判断

决策树算法-实战篇-鸢尾花及波士顿房价预测

朴素贝叶斯分类-实战篇-如何进行文本分类


欢迎关注作者公众号,获取更多技术干货。

K 均值算法-如何让数据自动分组相关推荐

  1. 百面机器学习—7.K均值算法、EM算法与高斯混合模型要点总结

    文章目录 一.总结K均值算法步骤 二.如何合理选择K值? 三.K均值算法的优缺点是什么? 四.如何对K均值算法进行调优? 五.EM算法解决什么问题? 六.EM算法流程是什么? 六.EM算法能保证收敛嘛 ...

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

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

  3. LBG算法、Lloyd算法和K均值算法

    ---------------------------------LBG算法.Lloyd算法和K-Means算法--------------------------------- LBG算法是一种矢量 ...

  4. 数据挖掘--“聚类”详解、K-means、K-平均值算法、K均值算法

    一. 什么是聚类 二. 聚类步骤 三. 聚类算法有哪些 1 层次聚类算法 2 划分聚类算法 3 基于密度的聚类算法 4 基于网格的聚类算法 5 基于模型的聚类算法 一. 什么是聚类? 物以类聚,人以群 ...

  5. R实现K均值算法,层次聚类算法与DBSCAN算法

    1.聚类的基本概念 聚类分析(cluster analysis)仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组.其目标是,组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不 ...

  6. spark Bisecting k-means(二分K均值算法)

    Bisecting k-means(二分K均值算法) 二分k均值(bisecting k-means)是一种层次聚类方法,算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二.之后选择能最大程 ...

  7. k均值算法原理详细讲解以及matlab代码实现

    有研究生物电信号处理和机器学习的欢迎加我qq429500506共同交流学习进步. 最近更新文章的频率太低了,主要原因是不想为了发文章而发文章,想潜心研究,写好文章,顺便想说一句开源万岁,最近一个月虽然 ...

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

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

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

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

最新文章

  1. Phpcms V9手机门户设置教程:怎么用PC V9做手机网站
  2. 用koa mongodb 做了个简单的博客系统
  3. ​​清华大学举办疫情防控期间首场在线学位论文答辩
  4. 如何改进YOLOv3使其更好应用到小目标检测(比YOLO V4高出4%)
  5. java queue 线程安全_java并发编程之线程安全方法
  6. ICLR 2022 | 在注意力中重新思考Softmax,商汤提出cosFormer实现多项SOTA
  7. 单片机按键控制数码管c语言程序,基于单片机的按键控制LED数码管共阴极动态显示电路设计报告(毕业论文).doc...
  8. 根据IDC的数据,全球融合系统市场在2019年第四季度同比增长1.1%
  9. Nginx学习总结(5)——Nginx基本配置备忘
  10. 在Silverlight中进行图片下载
  11. Android服务显式启动、隐式启动、绑定服务、本地客户端调用远程服务器音乐文件
  12. 使用 Keras搭建一个深度卷积神经网络来识别 c验证码
  13. 手机上将png转pdf_如何在Windows 10上将Android智能手机用作网络摄像头
  14. 5.1 Lilypond五线谱
  15. NB-IOT(BC95模组)对接华为中国电信物联网平台上行数据与下行数据总流程
  16. 在 mac 上用海盗船键盘
  17. U盘写保护,不能被格式化
  18. 北洋 BTP-R150 打印机驱动
  19. 纯Web前端打造的元宇宙展厅——开箱即用的Lingo3D游戏引擎 支持原生、React、Vue
  20. 如何判断一个技术(中间件/库/工具)的靠谱程度?

热门文章

  1. 实现开启和关闭Android移动网络(做AppWidget开发的收获)
  2. css borderradius ie8,border-radius IE8兼容处理方法介绍
  3. 1223 -- 德玛西亚正义
  4. Qt MetaObject 介绍
  5. OSChina 周四乱弹 ——我也得了晚上睡不着白天睡不醒症!
  6. 全景VR制作教程,全景图拼接软件如何使用?
  7. 扫码点餐在线买单/结账接口
  8. 大话西游2服务器维护多长时间,《大话西游2》的一个服务器能待多久?待的最长时间又是多久呢?...
  9. 计算机组装从光盘启动,电脑设置光盘启动的方法(图文详解)
  10. pve远程连接 spcie_用Proxmox搞定gpu穿透