聚类算法属于无监督学习,其中最常见的是均值聚类scikit-learn中,有两种常用的均值聚类算法:
一种是有名的K-means(也就是K-均值)聚类算法,这个算法几乎是学习聚类必会提到的算法;
另一个是均值偏移聚类,它与K-means各有千秋,只是针对的应用场景不太一样,但是知名度远不如K-Means

本篇介绍如何在scikit-learn中使用这两种算法。

1. 算法概述

1.1. K-Means

K-means算法起源于1967年,由James MacQueen和J. B. Hartigan提出。
它的基本原理是是将n个点划分为K个集群,使得每个点都属于离其最近的均值(中心点)对应的集群。

K-Means算法主要包含2个部分:

  1. 距离公式:通常采用欧几里得距离来计算数据点与质心之间的距离

\(d(X_i, C_j) = ||X_i - C_j||^2\) 其中,\(X_i\)是数据点,\(C_j\)是质心。

  1. 目标函数:目标是最小化所有数据点与所属簇的质心之间的距离平方和

\(J = \sum_{j=1}^k \sum_{i=1}^{N_j} ||X_i - C_j||^2\) 其中,\(N_j\)表示第\(j\)个簇中的样本数量。

1.2. 均值漂移

均值漂移算法最早是由Fukunaga等人在1975年提出的。
它的基本原理是对每一个数据点,算法都会估算其周围点的密度梯度,然后沿着密度上升的方向移动该点,直至达到密度峰值。

均值漂移算法主要有3个步骤:

  1. 核函数估计数据点的密度:常用的核函数比如高斯核,

\(K(x) = \exp(-||x||^2 / (2h^2))\) 其中,\(h\)为带宽参数,控制核的宽度。

  1. 均值漂移向量:也就是对于每个数据点,计算其周围点的密度梯度
  2. 迭代更新:根据均值漂移向量,每个数据点会沿着密度上升的方向移动,更新自己的位置

2. 创建样本数据

利用scikit-learn中的样本生成器,创建一些用于聚类的数据。

  1. import matplotlib.pyplot as plt
  2. from sklearn.datasets import make_blobs
  3. X, y = make_blobs(n_samples=1000, centers=5)
  4. plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25)
  5. plt.show()


生成了包含5个类别的1000条样本数据。

3. 模型训练

首先,划分训练集和测试集。

  1. from sklearn.model_selection import train_test_split
  2. # 分割训练集和测试集
  3. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

按照8:2的比例划分了训练集测试集

3.1. K-Means

对于K-Means算法来说,需要指定聚类的数目,通过观察数据,我们指定聚类的数目5
这里的样本数据比较简单,能够一下看出来,实际情况下并不会如此容易的知道道聚类的数目是多少,
常常需要多次的尝试,才能得到一个比较好的聚类数目,也就是K的值。

基于上面的数据,我们设置5个簇,看看聚类之后的质心在训练集和测试集上的表现。

  1. from sklearn.cluster import KMeans
  2. # 定义
  3. reg = KMeans(n_clusters=5, n_init="auto")
  4. # 训练模型
  5. reg.fit(X_train, y_train)
  6. # 绘制质心
  7. _, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))
  8. markers = ["x", "o", "^", "s", "*"]
  9. centers = reg.cluster_centers_
  10. axes[0].scatter(X_train[:, 0], X_train[:, 1], marker="o", c=y_train, s=25)
  11. axes[0].set_title("【训练集】的质心位置")
  12. axes[1].scatter(X_test[:, 0], X_test[:, 1], marker="o", c=y_test, s=25)
  13. axes[1].set_title("【测试集】的质心位置")
  14. for idx, c in enumerate(centers):
  15. axes[0].plot(c[0], c[1], markers[idx], markersize=10)
  16. axes[1].plot(c[0], c[1], markers[idx], markersize=10)
  17. plt.show()

3.2. 均值漂移

均值漂移聚类,事先是不用指定聚类的数目的,通过调整它的bandwidth参数,
可以训练出拥有不同数目质心的模型。

下面,设置了bandwidth=5,训练之后得到了拥有3个质心的模型。

  1. from sklearn.cluster import MeanShift
  2. # 定义
  3. reg = MeanShift(cluster_all=False, bandwidth=5)
  4. # 训练模型
  5. reg.fit(X, y)
  6. # 绘制质心
  7. _, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))
  8. markers = ["x", "o", "^", "s", "*"]
  9. centers = reg.cluster_centers_
  10. print(len(centers))
  11. axes[0].scatter(X_train[:, 0], X_train[:, 1], marker="o", c=y_train, s=25)
  12. axes[0].set_title("【训练集】的质心位置")
  13. axes[1].scatter(X_test[:, 0], X_test[:, 1], marker="o", c=y_test, s=25)
  14. axes[1].set_title("【测试集】的质心位置")
  15. for idx, c in enumerate(centers):
  16. axes[0].plot(c[0], c[1], markers[idx], markersize=10)
  17. axes[1].plot(c[0], c[1], markers[idx], markersize=10)
  18. plt.show()


它把左下角的3类比较接近的样本数据点算作一类。
通过调整 bandwidth参数,也可以得到和 K-Means 一样的结果,
有兴趣的话可以试试,大概设置 bandwidth=2 左右的时候,可以得到5个质心,与上面的K-Means算法的结果类似。

4. 总结

K-Means均值漂移聚类都是强大的聚类工具,各有其优缺点。

K-Means 的优势是简单、快速且易于实现,当数据集是密集的,且类别之间有明显的分离时,效果非常好;
不过,它需要预先设定簇的数量k,且对初始质心的选择敏感,所以,对于不是凸形状或者大小差别很大的簇,效果并不好。

均值漂移聚类的优势在于不需要预先知道簇的数量,可以自适应地找到数据的“模式”,对噪声和异常值也有很好的鲁棒性。
不过,与K-Means相比,它需要选择合适的带宽参数,对高维数据可能不太有效,且计算复杂度较高。

最后,对于这两种均值聚类算法来说,选择哪种取决于数据的性质和应用的需求。

【scikit-learn基础】--『监督学习』之 均值聚类的更多相关文章

  1. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  2. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  3. K均值聚类算法

    k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个 ...

  4. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  5. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  6. 『TensorFlow』批处理类

    『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...

  7. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  8. (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探

    一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...

  9. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  10. 『TensorFlow』梯度优化相关

    tf.trainable_variables可以得到整个模型中所有trainable=True的Variable,也是自由处理梯度的基础 基础梯度操作方法: tf.gradients 用来计算导数.该 ...

随机推荐

  1. ModuleNotFoundError: No module named 'qrcode'

    W File "/usr/lib/python3/dist-packages/pip/_internal/resolution/resolvelib/candidates.py", ...

  2. android 反编译 apk 分享 smali2java 1.0.0.558

    smali2java 1.0.0.558 smali2java是一个将smali代码反编译成java代码的工具. 什么是smali?smali是将Android字节码用可阅读的字符串形式表现出来的一种 ...

  3. SpringBoot整合XXLJob

    目录 XXLJob简介 特性 模块 安装调度中心 初始化数据库 配置 启动 整合执行器 pom yml XxlJobConfig 启动执行器 实践 简单的定时任务 在执行器创建任务 在调度中心创建执行 ...

  4. Fox and Minimal path 题解

    Fox and Minimal path 题目大意 构造一张无向图,使得从 \(1\) 到 \(2\) 的最短路数量为 \(k\). 思路分析 我们首先可以发现当 \(k = 2^t\) 时的构造方式 ...

  5. 从零用VitePress搭建博客教程(6) -– 第三方组件库的使用和VitePress搭建组件库文档

    接上一节:从零用VitePress搭建博客教程(5) - 如何自定义页面模板.给页面添加独有的className和使页面标题变成侧边目录? 九.第三方组件库的使用 我们经常看见UI组件库的文档,这里我 ...

  6. angular,vue,react三大框架选型

    三大框架,本质都是基于js的web应用(前端做的都是web应用包括移动)框架,他们都是帮助我们解决问题的工具,具体用哪个,要结合具体场景. 这三者中,Angular的适用领域相对窄一些,React可以 ...

  7. 2021北京智源大会SNN部分

    神经形态视觉计算 当前问题: spikes vs bits (脉冲 vs 位) meurons vs memory (神经元 vs 计算单元)(真空管vacuum tube,晶体管transistor ...

  8. AdaBoost算法解密:从基础到应用的全面解析

    本文全面而深入地探讨了AdaBoost算法,从其基础概念和原理到Python实战应用.文章不仅详细解析了AdaBoost的优缺点,还通过实例展示了如何在Python中实现该算法. 关注TechLead ...

  9. MongoDB 中的事务

    MongoDB 事务 前言 如何使用 事务的原理 事务和复复制集以及存储引擎之间的关系 WiredTiger 中的事务隔离级别 WiredTiger 事务过程 事务开启 事务执行 事务提交 事务回滚 ...

  10. .NET中有多少种定时器

    .NET中至少有6种定时器,每一种定时器都有它的用途和特点.根据定时器的应用场景,可以分为UI相关的定时器和UI无关的定时器.本文将简单介绍这6种定时器的基本用法和特点. UI定时器 .NET中的UI ...