K-Means是一种无监督学习方法,用于将无标签的数据集进行聚类。其中K指集群的数量,Means表示寻找集群中心点的手段。

一、 无监督学习 K-Means

贴标签是需要花钱的。
所以人们研究处理无标签数据集的方法。(笔者狭隘了)
面对无标签的数据集,我们期望从数据中找出一定的规律。一种最简单也最快速的聚类算法应运而生---K-Means。
它的核心思想很简单:物以类聚。

用直白的话简单解释它的算法执行过程如下:

  1. 随便选择K个中心点(大哥)。

  2. 把距离它足够近的数据(小弟)吸纳为成员,聚成K个集群(组织)。

  3. 各集群(组织)内部重新选择中心点(大哥),选择标准是按照距离取均值作为中心点(大哥)。

  4. 重复2、3步骤直到收敛(组织成员相对稳定)。

这就是黑涩会形成聚类的过程。

二、 K-Means代码实践

2.1 鸢尾花数据集

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt# 大家不用在意这个域名
df = pd.read_csv('https://blog.caiyongji.com/assets/iris.csv')
sns.scatterplot(x='petal_length',y='petal_width',data=df,hue='species')

我们得到带标签的数据如下:

2.2 K-Means训练数据

我们移除数据标签,仅使用花瓣长、宽作为数据输入,并使用无监督学习方法K-Means进行训练。

X = df[['petal_length','petal_width']].to_numpy() from sklearn.cluster import KMeans
k = 2
kmeans = KMeans(n_clusters=k, random_state=42)
y_pred = kmeans.fit_predict(X)
plt.plot(X[y_pred==1, 0], X[y_pred==1, 1], "ro", label="group 1")
plt.plot(X[y_pred==0, 0], X[y_pred==0, 1], "bo", label="group 0")
# plt.legend(loc=2)
plt.show()

得到分类数据如下,我们并不知道下方数据类别分别代表什么意义。

我们将K分别取1-6的值,可得到如下图所示分类结果:

那么K值的选择有什么意义呢?我们如何选择?

三、K的选择

3.1 惯性指标(inertia)

K-Means的惯性计算方式是,每个样本与最接近的集群中心点的均方距离的总和

kmeans_per_k = [KMeans(n_clusters=k, random_state=42).fit(X)for k in range(1, 10)]inertias = [model.inertia_ for model in kmeans_per_k]
plt.figure(figsize=(8, 3.5))
plt.plot(range(1, 10), inertias, "bo-")
plt.xlabel("$k$", fontsize=14)
plt.ylabel("Inertia", fontsize=14)
plt.annotate('Elbow',xy=(2, inertias[2]),xytext=(0.55, 0.55),textcoords='figure fraction',fontsize=16,arrowprops=dict(facecolor='black', shrink=0.1))
plt.axis([1, 8.5, 0, 1300])
plt.show()

以上代码中model.inertia_即K-Means方法中的惯性指标。
一般地,惯性越小模型越好,但伴随K值的增大,惯性下降的速度变的很慢,因此我们选择“肘部”的K值,作为最优的K值选择。

3.2 轮廓系数指标(silhouette)

K-Means的轮廓系数计算方式是,与集群内其他样本的平均距离记为a,与外部集群样本的平均距离记为b,轮廓系数(b-a)/max(a,b)

from sklearn.metrics import silhouette_score
silhouette_scores = [silhouette_score(X, model.labels_)for model in kmeans_per_k[1:]]
plt.figure(figsize=(8, 3))
plt.plot(range(2, 10), silhouette_scores, "bo-")
plt.xlabel("$k$", fontsize=14)
plt.ylabel("Silhouette score", fontsize=14)
plt.axis([1.8, 8.5, 0.55, 0.8])
plt.show()

以上代码中silhouette_score方法可取得K-Means的轮廓系数值。
一般地,轮廓系数指标越大越好,我们可以看到当K为2、3时均可取得不错的聚类效果。

四、自动选择K值(拓展)

4.1 简单理解贝叶斯定理

白话解释贝叶斯:当有新的证据出现时,不确定的事情更加确信了。 这里的“确信”是指对不确定的事情的信心程度。

公式(可忽略):

其中,P(A) 表示事件A发生的概率,P(A|B)表示事件B发生时事件A发生的概率。上面的公式中B就是所谓的证据。这里要注意的是,P(B)的出现让P(A|B)变的更确定了,并不是说概率变高了或者变低了。概率的高或者低都是一种确定。它是一种信心程度的体现。

4.2 贝叶斯高斯混合模型

我们使用BayesianGaussianMixture方法,而无需指定明确的K值。

from sklearn.mixture import BayesianGaussianMixture
bgm = BayesianGaussianMixture(n_components=10, n_init=10, random_state=42)
y_pred = bgm.fit_predict(X)
np.round(bgm.weights_, 2)

输出: array([0.4 , 0.33, 0.27, 0. , 0. , 0. , 0. , 0. , 0. , 0. ])

以上代码的执行逻辑是,初始化10个集群,不断调整有关集群数贝叶斯先验知识,来将不必要的集群权重设为0(或接近0),来确定最终K值。

五、总结(系列完结)

5.1 机器学习系列完结

我相信,截至到目前,大家对机器学习已经有了一个基本的认识。最重要的是,大家亲手实践了机器学习的代码。无论你对机器学习有多么模糊的认识,都能近距离的接触到机器学习,这一点很重要

当初,我发现市面上大部分的教程都对数学有强依赖,让很多人敬而远之。我觉得,无论顶尖的科学研究还是普罗大众的教育科普都有其不可替代的巨大价值。流于表面的广泛未必没有其意义,因此我选择了舍弃严谨,贴近通俗

当然,想要深耕于AI领域,数学是充分且必要的条件。如果付得起时间和机会成本,请认真且努力,绝不会辜负你。

5.2 深度学习系列开始

深度学习是一台结构复杂的机器,但它的操作却相对简单。甚至,会给你比传统机器学习算法更简单的感受。
我们拭目以待!感谢大家!

往期文章:

  • 机器学习(五):通俗易懂决策树与随机森林及代码实践

  • 机器学习(四):通俗理解支持向量机SVM及代码实践

  • 机器学习(三):理解逻辑回归及二分类、多分类代码实践

  • 机器学习(二):理解线性回归与梯度下降并做简单预测

  • 机器学习(一):5分钟理解机器学习并上手实践

  • 前置机器学习(五):30分钟掌握常用Matplotlib用法

  • 前置机器学习(四):一文掌握Pandas用法

  • 前置机器学习(三):30分钟掌握常用NumPy用法

  • 前置机器学习(二):30分钟掌握常用Jupyter Notebook用法

  • 前置机器学习(一):数学符号及希腊字母


往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑温州大学《机器学习课程》视频
本站qq群851320808,加入微信群请扫码:

【机器学习基础】(六):通俗易懂无监督学习K-Means聚类算法及代码实践相关推荐

  1. 机器学习之无监督学习-K均值聚类算法

    机器学习之无监督学习-K均值聚类算法 对于无监督学习,有两类重要的应用,一个是聚类,一个是降维.我们今天主要学习聚类中的K均值聚类. 我们先看看下图,图a为原始的数据点,我们想要对图a的数据点进行分类 ...

  2. 【机器学习基础】通俗易懂无监督学习K-Means聚类算法及代码实践

    K-Means是一种无监督学习方法,用于将无标签的数据集进行聚类.其中K指集群的数量,Means表示寻找集群中心点的手段. 一. 无监督学习 K-Means 贴标签是需要花钱的. 所以人们研究处理无标 ...

  3. 无监督学习——K均值聚类的Python实现

    目录 概要 一.K均值算法 二.K值的选取:手肘法 三.用聚类实现鸢尾花数据分类 四.应用案例 1. 读取数据 2. 绘制手肘图 3. 找到最佳K值 4. 分类结果可视化 机器学习类型和算法的分类 无 ...

  4. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  5. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  6. 机器学习第六回-无监督学习—— K-均值算法

    K-Means算法过程 K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组. K-均值是一个迭代算法,假设我们想要将数据聚类成 n 个组,其流程为: 选择

  7. 无监督学习之层次聚类算法

    层次聚类算法 1.定义 2. 自底向上的合并算法 2.1 计算过程 2.2.两个组合数据点间的距离 2.3实例 1.定义 层次聚类(Hierarchical Clustering)属于聚类算法,通过计 ...

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

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

  9. 李弘毅机器学习笔记:第十六章—无监督学习

    李弘毅机器学习笔记:第十六章-无监督学习 1-of-N Encoding 词嵌入 基于计数的词嵌入 基于预测的词嵌入 具体步骤 共享参数 训练 Various Architectures 多语言嵌入 ...

最新文章

  1. Android自定义View —— TypedArray
  2. 如何脱颖而出?成为优秀的人
  3. linux 路由器去广告,linux – 如何正确发送路由器广告?
  4. 深入剖析 iOS 编译 Clang LLVM(编译流程)
  5. CATALAN数 学习
  6. presentViewController和pushViewController
  7. Linux使用vi/vim打开文档/文件报错E325:ATTENTION Found a swap file by the name
  8. http代理的脚本http_proxy.py
  9. matlab中 s 函数简记
  10. Oracle IMP数据时报20001错误
  11. C++_类和对象_C++多态_多态的原理剖析---C++语言工作笔记070
  12. CodeSmith 创建Ado.Net自定义模版(一)
  13. 定时器name冲突会报错吗_部落冲突:冬季版本即将更新,多个超级兵种被曝光,会上线吗?...
  14. 《算法》第四版入门准备
  15. centos8.0配置静态IP详解
  16. html5电路模拟器,仿真电路模拟器
  17. Html中跳转到其他页面
  18. linux同花顺乱码,打开同花顺软件全是问号
  19. 股市风起云涌,我用Python分析周期之道
  20. Android攻城狮认识ContextMenu

热门文章

  1. 用JQUERY实现给当前页面导航一个CSS
  2. 重构机房VB.NET机房收费系统个人重构版你都学会了什么(之一)
  3. SuperSocket 1.5 Documentation译文 ------- 目录索引
  4. httpModule过滤无后缀名的文件夹路径请求,iis6和iis7的设置
  5. JavaScript页面校验
  6. 一次难忘的产品发布经历
  7. 10 行 Java 代码实现 LRU 缓存
  8. HTML 5.2 新特性介绍
  9. c3p0获取连接Connection后的Close()---释疑
  10. c++ builder xe2 (Embarcadero rad studio) 远程调试 同样适用于 delphi 远程调试 教程