010-基于Sklearn的机器学习入门:聚类(上)

本节及后续章节将介绍深度学习中的几种聚类算法,所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇,将介绍几种相对基础的聚类算法,包括K-均值算法和均值漂移算法。

目录

10.1 聚类概述

10.1.1 聚类的种类

10.1.2  Sklearn聚类子模块

10.2  K均值聚类

10.2.1 原理

10.2.2 算法流程

10.2.3 Sklearn库函数说明

10.2.4 实例

10.2.5 讨论


10.1 聚类概述

聚类(Clustering)是机器学习中的一类无监督学习方法。它是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇(cluster),使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。

10.1.1 聚类的种类

按照策略不同,传统的聚类方法主要可以分为三类:划分式聚类方法(Partition-based Methods)、基于密度的聚类方法(Density-based methods)和层次化聚类方法(Hierarchical Methods)等。

  • 划分式聚类方法:该类方法需要事先指定簇类的数目或者聚类中心,通过反复迭代,直至最后达到"簇内的点足够近,簇间的点足够远"的目标。经典的划分式聚类方法有K-means(K-均值)等。
  • 基于密度的聚类方法:基于密度的聚类方法可以在有噪音的数据中发现各种形状和各种大小的簇。其核心思想就是先发现密度较高的点,然后把相近的高密度点逐步都连成一片,进而生成各种簇。经典的基于密度的聚类方法有mean-shift(均值漂移)、DBSCAN算法等。
  • 层次化聚类方法: 层次聚类算法(Hierarchical clustering)将数据集划分为一层一层的 clusters,后面一层生成的 clusters 基于前面一层的结果。层次聚类算法一般分为两类:Agglomerative 层次聚类:又称自底向上(bottom-up)的层次聚类,以及Divisive 层次聚类: 又称自顶向下(top-down)的层次聚类。经典的基于密度的聚类方法有BIRCH算法等。

除此之外,还有一些高级的方法,如谱聚类(Spectral Clustering ):其主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。

10.1.2  Sklearn聚类子模块

在Sklearn的cluster(聚类)子模块中,提供了上述几种典型的聚类算法,具体函数名称见下表:

Sklearn中聚类模块主要算法一览表

上表列出的是Sklearn实现的几种主要聚类算法,在sklearn_cluster子库中,一共实现了12种聚类方法,官网用表格的形式列出了方法对比。下图是官网给出的使用不同算法对不同种类分别的数据进行聚类的结果对比图,每种算法的性能特点可见一斑。

Sklearn提供的聚类算法性能对比图(来自官网)

10.2  K均值聚类

10.2.1 原理

K均值是一种非常基础的划分式聚类算法,它的主要思想是:在给定K值(与类的数目对应)和K个初始类簇中心点的前提下,把每个样本点分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点,然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数

10.2.2 算法流程

参考周志华老师的《机器学习》一书中有关K均值的算法流程。如下图所示:

K-mean算法流程(《机器学习》周志华)

从流程来看K均值算法计算步骤包括两个核心步骤:一是计算每一个样本点到类簇中心的距离;二是根据类簇内的各点计算新的簇类中心。简单而言,就是如何计算各样本点与类心的距离,以及如何根据分类结果更新类心。

10.2.3 Sklearn库函数说明

在SKlearn中,使用sklearn.cluster.KMeans函数,实现K均值算法。

以下是该函数的声明:

看一下histogram函数的声明:

class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init='auto', max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='lloyd')

部分参数说明

  • image:输入图像。
  • nbins:用于计算直方图的bin的数目。
  • source_range:待补充。
  • normalize:待补充 。
  • channel_axis:待补充。

返回值

  • hist:灰度直方图的数值,数组类型。如果通道数不止一个,则hist是二维数组。
  • cluster_centers:Coordinates of cluster centers. If the algorithm stops before fully converging (see tol and max_iter), these will not be consistent with labels_.
  • labels:Labels of each point
  • inertia:Sum of squared distances of samples to their closest cluster center, weighted by the sample weights if provided.
  • n_iter:Number of iterations run.
  • n_features_in:Number of features seen during fit.
  • feature_names_in_:Names of features seen during fit. Defined only when X has feature names that are all strings.

10.2.4 实例

本节将介绍如何使用Kmean函数实现对IRIS数据集的聚类。

import matplotlib.pyplot as plt

import mpl_toolkits.mplot3d  # noqa: F401
import numpy as np

from sklearn import datasets
from sklearn.cluster import KMeans

np.random.seed(5)

iris = datasets.load_iris()
X = iris.data
y = iris.target

estimators = [
    ("k_means_iris_8", KMeans(n_clusters=8)),
    ("k_means_iris_3", KMeans(n_clusters=3)),
    ("k_means_iris_bad_init", KMeans(n_clusters=3, n_init=1, init="random")),
]

fig = plt.figure(figsize=(10, 8))
titles = ["8 clusters", "3 clusters", "3 clusters, bad initialization"]
for idx, ((name, est), title) in enumerate(zip(estimators, titles)):
    ax = fig.add_subplot(2, 2, idx + 1, projection="3d", elev=48, azim=134)
    est.fit(X)
    labels = est.labels_

    ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=labels.astype(float), edgecolor="k")

    ax.xaxis.set_ticklabels([])
    ax.yaxis.set_ticklabels([])
    ax.zaxis.set_ticklabels([])
    ax.set_xlabel("Petal width")
    ax.set_ylabel("Sepal length")
    ax.set_zlabel("Petal length")
    ax.set_title(title)

# Plot the ground truth
ax = fig.add_subplot(2, 2, 4, projection="3d", elev=48, azim=134)

for name, label in [("Setosa", 0), ("Versicolour", 1), ("Virginica", 2)]:
    ax.text3D(
        X[y == label, 3].mean(),
        X[y == label, 0].mean(),
        X[y == label, 2].mean() + 2,
        name,
        horizontalalignment="center",
        bbox=dict(alpha=0.2, edgecolor="w", facecolor="w"),
    )

ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y, edgecolor="k")

ax.xaxis.set_ticklabels([])
ax.yaxis.set_ticklabels([])
ax.zaxis.set_ticklabels([])
ax.set_xlabel("Petal width")
ax.set_ylabel("Sepal length")
ax.set_zlabel("Petal length")
ax.set_title("Ground Truth")

plt.subplots_adjust(wspace=0.25, hspace=0.25)
plt.show()

K-means Clustering — scikit-learn 1.5.0 documentation

10.2.5 讨论

K均值算法比较简单,但有几个方面需要注意。

  1. 必须提前确定K的取值
  2. 必须实现确定K个初始类簇中心点初始值。目前最常用的方法是随机产生数据大小范围内的K个点作为初始的簇类中心点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/739649.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前年升2区,去年升TOP,目前扩刊中,投稿难度较小,这本SSCI可纳入考虑~

【SciencePub学术】今天给大家推荐的是一本经济管理领域的SSCI,大家都称之为TOP刊中的易中“水刊”。据说很多人已经靠信息差吃上了这本TOP刊的红利,接下来给大家解析一下这本期刊。 《Socio-Economic Planning Sciences》是一本国际性的学术期刊&#x…

数据分析:微生物组差异丰度方法汇总

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 微生物数据具有一下的特点,这使得在做差异分析的时候需要考虑到更多的问题&…

文本批量高效编辑神器:空格秒变分隔符,提升工作效率

在信息爆炸的时代,文本处理已成为我们日常工作中不可或缺的一部分。然而,面对海量的文本数据,如何高效、准确地进行编辑和整理,成为了我们面临的难题。今天,我要向大家介绍一款文本批量高效编辑神器——首助编辑高手&a…

员工不会写OKR,有没有好的方法可以帮助他们?

在做 OKR 辅导的过程中,我发现很多公司在 OKR 制定的环节出现了问题,比如目标的方向不清晰、关键结果不如何 SMART 原则、描述冗长复杂、不够聚焦等。他们可能会认为刚刚开始推行,制定上出现一些问题无伤大雅,但这会对之后的 OKR …

材料科学SCI期刊,中科院2区,影响因子4.7

一、期刊名称 Progress in Natural Science-Materials International 二、期刊简介概况 期刊类型:SCI 学科领域:材料科学 影响因子:4.7 中科院分区:2区 三、期刊征稿范围 由中国材料研究会负责的同行评议 由中国材料研究会&…

设计模式原则——里氏替换原则

设计模式原则 设计模式示例代码库地址: https://gitee.com/Jasonpupil/designPatterns 里氏替换原则 继承必须确保父类所拥有的性质在子类中依然成立 与开闭原则不同的是开闭原则可以改变父类原有的功能,里氏替换原则不能修改父类的原有的性质&#…

关于电机的线性思考

当大多数工程师听到电机这个词时,他们自然地想到旋转装置,例如有刷直流、无刷直流、步进电机或变频原动机。但是电机不一定是旋转的,很多时候设计需要直线运动。一种解决方案是添加某种齿轮或皮带装置来转换旋转运动,这种解决方案…

GPU技术全景:推动未来计算的新动力-1

1、概述 主流GPU技术方向在近年来持续快速发展,聚焦于提升性能、能效、灵活性以及适应不断增长的计算需求,尤其是在人工智能、高性能计算、图形渲染、数据分析以及虚拟现实等领域。以下是几个关键的发展趋势和方向: 1. 并行计算优化&…

基于Java校园短期闲置资源置换平台设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

计算机方向国际学术会议推荐

【JPCS独立出版 | EI核心、Scopus】第四届计算机、遥感与航空航天国际学术会议(CRSA 2024) 大会官网:www.iccrsa.org 时间地点:2024年7月5-7日,日本-大阪(线上召开) 征稿主题:计算…

Oracle数据库的安装

1.下载压缩包 2.双击setup.exe

数字化时代的网站优化利器:三大API服务深度解析

数字化时代的网站优化利器:三大API服务深度解析 在当今数字化飞速发展的时代,网站的优化与监控对于企业和个人的在线业务至关重要。2024 年 06 月 24 日 15 点 11 分 05 秒,星期一,我们正处在一个竞争激烈的网络环境中&#xff0…

营销复盘秘籍,6步法让你的活动效果翻倍

在营销的世界中,每一次活动都是一次探险,而复盘就是探险后的宝藏图,指引我们发现问题、提炼经验、优化策略。 想要学习如何复盘,只要了解以下复盘六大步骤,即可不断总结,逐渐走向卓越。 第一步&#xff1…

Qt项目天气预报(6) - 引入QMap: debug+更新天气图片

QMAP 解决bug () bug描述 由于json文件中有的地方不带市,有的地方带县,有的地方是区,我们匹配不上这个地方,我们可以使用QString进行字符串拼接来实现。 另外,我们之前的 getCityCodeFromName()函数写得…

Screw - 数据库表结构文档生成器

Screw-自动化程度高&#xff0c;能快速生成文档&#xff0c;减少手动编写的工作量 支持多种数据库生成HTML、Word、MarkDown 三种格式的文档 快速上手&#xff0c;以Oracle方式为例 第一种方式&#xff1a;Maven 插件 1、引入 <build><plugins><plugin>&…

vue中图谱关系插件relation-graph

vue中图谱关系插件relation-graph 一、效果图二、安装下载&#xff08;vue2.0版本的&#xff09;三、直接上代码 一、效果图 二、安装下载&#xff08;vue2.0版本的&#xff09; npm install --save relation-graph var foo bar;三、直接上代码 <template><div cla…

LeetCode 热题100 --双指针

双指针 b站UP主蜜糖&#xff1a;由于数据特征的有序性&#xff08;大小或者正负&#xff09;&#xff0c;所以可以证明当前节点一定是优于过往节点&#xff0c;从而可以通过数据的维度数量的指针&#xff0c;逐步的迭代收敛最终找到最优解。 283.移动零 相关标签 &#xff1a;…

TypeScript(笔记版)

简介&#xff1a; nvm安装必须先把自己的node卸了&#xff0c;再去安装nvm TS就是js的超集 对js进行了扩展 浏览器不支持ts&#xff0c;要转换为js才可以。 ts是用来编程人员爽的 js的写法拿到ts也可以&#xff0c;ts代码量更大&#xff0c;但ts代码更加清晰 可以在playg…

数显胎压计方案采用SIC8632主控芯片

汽车作为现代出行的重要工具&#xff0c;极大地提升了人们的出行效率。随着生活品质的提升&#xff0c;越来越多的家庭拥有了私家车。然而&#xff0c;对于车主而言&#xff0c;掌握驾驶技巧只是基础&#xff0c;了解如何正确检测汽车胎压同样至关重要。胎压计&#xff0c;即气…

年化16.6%,全球大类资产使用lightGBM预测轮动——数据缓存提升效率

原创文章第568篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 Dataloader缓存 加载160个因子&#xff0c;10几支大类资产&#xff0c;这个计算还是需要一点时间&#xff0c;尤其在我们频繁运行的时候&#xff0c;需要等待&#xff0c;这里我们…