机器学习-聚类算法

简介

本文主要内容:

聚类分析所涉及到的所有方面 和 经典划分聚类:K-means算法及其在python中的运用实例

补充介绍的内容包括:sklearn.datasets numpy.ndarray sklearn.cluster matplotlib.pyplot.scatter


聚类分析概述

聚类分析是无监督类的机器学习算法中最常用的一类,

聚类的目的是将数据划分成有意义或有用的组(也被称为簇)。组内的对象相互之间是相对相关的,而不同组中的对象是相对不相关的。组内的**相似性 (同质性)**越大,组间差别越大,聚类就越好。

聚类示意图

聚类和分类的区别

聚类和分类名字很像,当然也就存在关联,都涉及将数据划分为组。但它们的方法、目标和问题上下文是不同的。在聚类中,我们试图找到数据中的自然结构或模式,而在分类中,我们依赖已知的类别来预测新的数据点所属的类别。这也就是有标签和无标签的区别

区别总结

聚类的目的

现在应该明确了一点,聚类可以是平行于分类和回归的存在,那么我们聚类的目的也是多种多样的:

  • 基于划分的聚类,有k‐均值算法、k‐medoids算法、k‐prototype算法
  • 基于层次的聚类
  • 基于密度的聚类,有DBSCAN算法、OPTICS算法、DENCLUE算法
  • 基于网格的聚类
  • 基于模型的聚类,有模糊聚类、Kohonen神经网络聚类

我们将一组N个样本的特征矩阵X(N个特征就是N维,有M个数据集,则矩阵X为N*M的矩阵)划分为K个无交集的簇,直观上来看是簇是一个又一个聚集在一起的数据,在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。

将点聚类得到的簇可以用聚类中心、簇大小、簇密度和簇描述等来表示:

  • 聚类中心,簇中所有数据的均值u,通常被称为这个簇的“质心”(centroids)。

  • 簇大小表示簇中所含样本的数量

  • 簇密度表示簇中样本点的紧密程度

  • 簇描述是簇中样本的业务特征

良好的聚类和要求

要求

不同的聚类算法有不同的应用背景,有的适合于大数据集,可以发现任意形状的聚簇;有的算法思想简单,适用于小数据集。总的来说,数据挖掘中针对聚类的典型要求包括:

  • 可伸缩性:当数据量从几百上升到几百万时,聚类结果的准确度能一致。
  • 处理不同类型属性的能力:许多算法针对的数值类型的数据。但是在实际应用场景中,会遇到二元类型数据,分类-标称类型数据,序数型数据,键值对数据。
  • 发现任意形状的类簇:许多聚类算法基于距离(欧式距离或曼哈顿距离)来量化对象之间的相似度。基于这种方式,我们往往只能发现相似尺寸和密度的球状类簇或者凸型类簇。但是,实际中类簇的形状可能是任意的。
  • 初始化参数的需求最小化:很多算法需要用户提供一定个数的初始参数,比如期望的类簇个数,类簇初始中心点的设定。聚类的结果对这些参数十分敏感,调参数需要大量的人力负担,也非常影响聚类结果的准确性。
  • 处理噪声数据的能力:噪声数据通常可以理解为影响聚类结果的干扰数据,包含孤立点,错误数据等,一些算法对这些噪声数据非常敏感,会导致低质量的聚类。
  • 增量聚类和对输入次序的不敏感:一些算法不能将新加入的数据快速插入到已有的聚类结果中,还有一些算法针对不同次序的数据输入,产生的聚类结果差异很大。
  • 高维性:有些算法只能处理2到3维的低纬度数据,而处理高维数据的能力很弱,高维空间中的数据分布十分稀疏,且高度倾斜。
  • 可解释性和可用性:我们希望得到的聚类结果都能用特定的语义、知识进行解释,和实际的应用场景相联系。

良好的特性

  • 良好的可伸缩性
  • 处理不同类型数据的能力
  • 处理噪声数据的能力
  • 对样本顺序的不敏感性
  • 约束条件下的表现
  • 易解释性和易用性

结果评价

聚类分析的度量指标用于对聚类结果进行评判,分为内部指标和外部指标两大类:

外部指标指用事先指定的聚类模型作为参考来评判聚类结果的好坏,即我们实现认定优良的模型
内部指标是指不借助任何外部参考,只用参与聚类的样本评判聚类结果好坏

外部指标

外部指标

任意两点所对应的关系必定存在于四种关系中的一种,且仅能存在一种关系,那么我们就有相对应的评价指标:

评价指标

以上四个度量指标是常见的度量标准,值越大表明聚类结果和参考模型直接的划分结果越吻合,聚类结果就越好

内部指标

距离

在聚类分析中,对于两个݉m维样本**(m维指的是有m个特征)**,常用的距离度量有欧式距离、曼哈顿距离、切比雪夫距离和明可夫斯基距离等:

距离

明可夫斯基距离

有了距离的刻画,我们就可以提出以下评价标准:

评价标准


K-means聚类分析法

基于划分的方法是简单、常用的一种聚类方法,它通过将对象划分为互斥的簇进行聚类, 每个对象属于且仅属于一个簇;划分结果旨在使簇之间的相似性低,簇内部的相似度高;基于划分的方法常用算法有k-means、k‐medoids、k‐prototype等

K-means聚类,也称为K均值聚类,它试图发现k(用户指定个数)个不同的簇 ,并且每个簇的中心采用簇中所含值的均值计算而成。

K-means基本步骤

在K-Means算法中,簇的个数K是一个超参数,需要我们人为输入来确定,也就是k是一个输入值。K-Means的核心任务就是根据我们设定好的K,找出K个最优的质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中去。具体过程可以总结如下:

在这里插入图片描述

在这里插入图片描述

K-means优缺点

优点

  • 原理简单,容易实现,且运行效率比较高
  • 聚类结果容易解释,适用于高维数据的聚类

缺点

  • 采用贪心策略,导致容易局部收敛,在大规模数据集上求解较慢

  • 对离群点和噪声点非常敏感,少量的离群点和噪声点可能对算法求平均值产生极大影响,从而影响聚类结果

  • 初始聚类中心的选取也对算法结果影响很大,不同的初始中心可能会导致不同的聚类结果。

    对此,学者提出K-mean许多优化算法,其思想解决上述问题,本篇就不过多介绍。


Scikit-Learn进行K均值聚类示例

导入相关库

#导入相关的库和数据集
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs 

sklearn.datasets

sklearn.datasets是scikit-learn库中的一个模块,它提供了多种方式来获取流行的数据集。这些数据集可用于机器学习算法的实验和测试。

该模块包含三类数据集:

  1. 内置小型数据集(Toy datasets):这些是小型数据集,已经包含在scikit-learn包内,可以直接使用,无需从外部下载。
  2. 可下载的大型数据集(Real world datasets):这些是较大的数据集,通常需要从互联网上下载。
  3. 生成数据集的函数:这组函数允许用户根据自己的需要生成合成(模拟)数据集。

make_blobs

make_blobs是sklearn.datasets模块中的一个函数,其主要用途是生成聚类算法的测试数据。通过这个函数,可以快速构建一个包含多个高斯分布簇的随机点集,非常适合用来评估和演示聚类算法的效果

主要参数:

  • n_samples:要生成的总样本数。
  • n_features:每个样本的特征数。
  • centers:要生成的中心点(即簇)数,或者指定具体的中心点位置。
  • cluster_std:簇的标准差,用于控制簇的紧密程度。
  • shuffle:是否打乱样本顺序。
  • random_state:随机数种子,保证结果的可复现性。

这个函数会返回两个数组:

  1. 第一个是形状为 [n_samples, n_features] 的数组,包含生成的样本点。
  2. 第二个是形状为 [n_samples]的数组,表示各个样本点对应的簇标签。

处理数据及特征

# 生成Blobs数据集
data, _ = make_blobs(n_samples=1000, centers=6, random_state=0)  
#2个特征,1000个数据集
print(type(data))                  #检查data的类型,结果应该为numpy.ndarry
print(data[:5])
'''''
展示前五个样本
array([[ 2.63378902,  1.24731812],[ 4.35918422, -0.16235216],[ 1.0220286 ,  4.11660348],[-0.17991235,  5.08498543],[ 0.74874067,  2.55579434]])
'''''

numpy.ndarray

numpy.ndarray 是NumPy包中定义的核心数据结构,表示一个N维数组对象。“ndarray"全称即为"N-dimensional array”(N维数组)。NumPy是Python的一个扩展库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供了大量的数学函数库。

ndarray的主要属性:
  • ndarray.ndim:数组的维数,或称为轴的数量(rank)。
  • ndarray.shape:数组的形状,是一个表示数组在每个维度大小的整数元组。
  • ndarray.size:数组中所有元素的总数量。
  • ndarray.dtype:描述数组中元素类型的对象。
  • ndarray.itemsize:数组中每个元素的字节大小。
  • ndarray.data:包含实际数组元素的缓冲区。
ndarray的特点:
  1. 元素同质性:ndarray的所有元素类型必须是相同的,由 dtype 属性指定。
  2. 固定大小:ndarray创建后其大小是固定的,不能改变其形状(shape)和大小(size)。
  3. 支持向量化操作:ndarray支持数据的批处理操作,无需显式编写循环即可进行操作。
创建ndarray:

可以通过不同的方法创建 ndarray对象,例如使用 np.array()、np.zeros()、np.ones()、np.empty()、np.arange() 等。

示例代码:
import numpy as np# 使用列表创建一维数组
array_1d = np.array([1, 2, 3, 4])# 使用列表嵌套列表创建二维数组
array_2d = np.array([[1, 2, 3], [4, 5, 6]])# 打印数组的一些属性
print("Array 1D:")
print(array_1d)
print("Dimensions:", array_1d.ndim)          # 1
print("Shape:", array_1d.shape)              # (4,)
print("Size:", array_1d.size)                # 4
print("Data type:", array_1d.dtype)          # intXX (platform dependent)print("\nArray 2D:")
print(array_2d)
print("Dimensions:", array_2d.ndim)          # 2
print("Shape:", array_2d.shape)              # (2, 3)
print("Size:", array_2d.size)                # 6
print("Data type:", array_2d.dtype)          # intXX (platform dependent)

模型拟合

# 创建K均值模型
kmeans = KMeans(n_clusters=6)         #聚类数量为6类
# 拟合模型
kmeans.fit(data)
# 获取簇中心和簇标签
cluster_centers = kmeans.cluster_centers_
cluster_labels = kmeans.labels_

sklearn.cluster

sklearn.cluster是scikit-learn库中负责聚类算法的模块。sklearn.cluster中包含了多种流行的聚类算法,如K-Means、层次聚类(Agglomerative Clustering)、DBSCAN、Mean Shift等。

KMeans

KMeans算法是sklearn.cluster模块中实现的最著名和最常用的聚类算法之一。K-Means 是一种划分型聚类算法,它的目标是将n个样本划分到k个簇中,每个样本归属于离它最近的均值(即簇中心)对应的簇,以此来最小化所有簇内样本点到其簇中心的距离平方和。

KMeans的关键参数:

  • n_clusters:要形成的簇的数量及生成的中心数。
  • init:初始化方法。可以是’k-means++'、'random’或传入一个ndarray。
  • n_init:运行带有不同质心初始化的算法次数。
  • max_iter:算法为单次运行所执行的最大迭代次数。
  • tol:收敛阈值。

示例代码:

from sklearn.cluster import KMeans# 假设X是一个(样本数量, 特征数量)的2D数组
# 创建一个KMeans实例,用来将数据分为3个簇
kmeans = KMeans(n_clusters=3)# 拟合模型
kmeans.fit(X)# 预测每个样本的簇标签
labels = kmeans.predict(X)# 获取簇中心
centers = kmeans.cluster_centers_

在这段示例代码中,我们首先从sklearn.cluster中导入KMeans。然后创建了一个KMeans实例,指定将数据集分为3个簇,并使用.fit()方法拟合输入数据X。接着,我们通过调用.predict()方法为每个样本预测其簇标签。最后,我们可以通过.cluster_centers_`属性来获取每个簇的中心点。

输出结果

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']  
#这行代码是为了在绘制图表的时候能够显示中文字体。plt.rcParams允许你自定义Matplotlib的一些属性,例如字体、线条宽度、颜色等等。'font.sans-serif'指定非衬线字体的列表。在此处将其设置为包含“Microsoft YaHei”的列表,使得后续图表可以正常显示中文标签。# 绘制数据点和簇中心
plt.scatter(data[:, 0], data[:, 1], c=cluster_labels, cmap='viridis', s=50)
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='red', marker='x', s=200)
plt.xlabel('特征1 ')                 #设置X轴和Y轴的标签为"特征1"和"特征2"
plt.ylabel('特征2')
plt.title('K均值聚类结果')            #设置整个图表的标题为"K均值聚类结果"。
plt.show()

使用matplotlib.pyplot.scatter函数绘制聚类算法数据

  • data[:, 0]data[:, 1] 分别指数据集中所有点的第一特征和第二特征。

  • c=cluster_labels 表示点的颜色以聚类标签(簇标签)来区分,每个簇的数据点颜色相同。

  • cmap=‘viridis’ 是一个颜色映射方案,用于将标量数据映射到颜色。

  • s=50设定了绘制的点的大小为50。

    本例中第二次使用plt.scatter函数,是为了绘制各个簇的中心点。

  • cluster_centers[:, 0]和cluster_centers[:, 1] 表示中心点的两个坐标特征。

  • c=‘red’ 指定中心点的颜色为红色。

  • marker=‘x’ 指定使用“x”标记来表示这些中心点。

  • s=200 设置中心点的大小为200,比数据点更明显。

matplotlib.pyplot

matplotlib.pyplot 是 Matplotlib库中的一个模块,它提供了一个类似于MATLAB的绘图框架。pyplot是用于创建图表和可视化的最常用模块之一,因为它简单易用,同时能够方便地进行绘图和自定义样式。

主要功能
  • 绘图:pyplot 提供了多种函数来创建各种类型的图表,包括线图、散点图、条形图、直方图、饼图等。
  • 图表修饰:可以设置图表的标题、图例、坐标轴标签以及注解等。
  • 布局调整:能够控制图表的大小、比例、子图排列等。
  • 风格定制:可以自定义图表的颜色、线型、字体、标记样式等。
  • 文件输出:支持将图表保存到各种文件格式,如PNG、PDF、SVG等。
使用方法

matplotlib.pyplot 的使用通常遵循以下步骤:

  1. 准备数据:在绘制任何图表之前,首先需要准备好数据。
  2. 创建图表:使用不同的pyplot函数根据数据创建图表。
  3. 自定义图表:通过添加标题、标签或自定义风格来自定义图表。
  4. 显示/保存图表:最后使用 plt.show() 显示图表或者使用 plt.savefig() 保存图表到文件。
示例代码
import matplotlib.pyplot as plt# 准备数据
x = [1, 2, 3, 4]
y = [10, 20, 25, 30]# 创建图表
plt.figure(figsize=(8, 6))
plt.plot(x, y, color='blue', linestyle='-', marker='o', label='Line Plot') # 绘制线图
plt.scatter(x, y, color='red', label='Scatter Plot') # 添加散点图# 自定义图表
plt.title('Simple Plot') # 添加标题
plt.xlabel('X Axis') # 添加X轴标签
plt.ylabel('Y Axis') # 添加Y轴标签
plt.legend() # 显示图例
plt.grid(True) # 显示网格# 显示图表
plt.show()

在这个示例中,我们首先导入 matplotlib.pyplot 模块,并准备了一些数据。然后,我们使用 plt.figure() 来创建一个新的图表并设置其大小。接着,我们分别使用 plt.plot() 和 plt.scatter() 来绘制线图和散点图,并通过其他函数给图表添加标题、标签和图例。最后,使用 plt.show()显示图表。

结果示范

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第23天:安全开发-PHP应用后台模块SessionCookieToken身份验证唯一性

第二十三天 一、PHP后台身份验证模块实现 二、Cookie&Session技术&差异 1.生成cookie的原理图过程:见上图 客户端向服务器发送HTTP请求。服务器检查请求头中是否包含cookie信息。如果请求头中包含cookie信息,则服务器使用该cookie来识别客户端…

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架

ICLR 2024 | FTS-Diffusion: 用于合成具有不规则和尺度不变模式的金融时间序列的生成框架 原创 QuantML QuantML 2024-04-17 09:53 上海 Content 本文提出了一个名为FTS-Diffusion的新颖生成框架,用于模拟金融时间序列中的不规则和尺度不变模式。这些模式由于其独…

C++三大特性之一:继承

文章目录 前言一、继承方式二、继承类型继承中构造和析构的顺序继承中的内存分配多继承语法(非重点)继承中同名静态成员的处理继承一般在哪里用到进阶:菱形继承和虚拟继承 总结 前言 C三大特性:继承、多态和封装。继承是面向对象编程的一个核心概念&…

Elastic 网络爬虫:为你的网站添加搜索功能

作者:来自 Elastic Lionel Palacin 为了演示如何使用 Elastic 网络爬虫,我们将以一个具体的网站为例,讲解如何在该网站上添加搜索功能。我们将探讨发现网站的方法,并利用 Elastic 网络爬虫提供的功能,以最佳方式准备待…

HTML、CSS常用的vscode插件 +Css reset 和Normalize.css

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍HTML、CSS常用的vscode插件🍎1 HTML 标签同步重命名 – Auto Re…

【Java网络编程】网络编程中的基本概念及实现UDP、TCP客户端服务器程序

目录 一、什么是网络编程? 二、网络编程中的基本概念 1. 客户端和服务器 2. 请求和响应 三、Socket套接字 UDP数据报套接字编程 1. DatagramSocket 2. DatagramPacket 3. UDP回显客户端服务器程序 4. UDP字典客户端服务器程序 TCP流套接字编程 1. Serve…

SpringBoot 3.x + Swagger3 踩坑实录

问题描述 维护的SpringBoot版本是3.0版本,翻教程的时候发现很多SpringBoot2.x版本用的都是springfox,但问题是在SpringBoot3.x版本后,逐渐不支持springfox,强行启动会导致异常,现阶段使用的Springdoc进行替换。 参考…

Java多线程-API

常见API一览 Thread t1 new Thread(() -> {System.out.println("我是线程t1");System.out.println("Hello, World!"); }); t1.start(); // 获取线程名称 getName() // 线程名称默认是Thread-0, Thread-1, ... System.out.println(t1.getName());// 通过…

JVM类加载基本流程及双亲委派模型

1.JVM内存区域划分 一个运行起来的Java进程就是一个JVM虚拟机,这就需要从操作系统中申请一片内存区域。JVM申请到内存之后,会把这个内存划分为几个区域,每个区域都有各自的作用。 一般会把内存划分为四个区域:方法区(也称 "…

【网站项目】党员之家服务系统小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(二)、需求分析和系统设计

本次实验(一)见博客:【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(一)、实验指导书 说明:本次实验的代码使用verilog编写,文章中为阅读方便&#xff0c…

指针的使用以及运算、二级指针、造成野指针的原因以及解决方法、指针和数组相互使用

第七章,指针的学习 目录 前言 一、指针的概念 二、指针的类型 三、野指针 四、指针的运算 五、指针和数组的关系以及使用 六、指针数组 七、二级指针 总结 前言 这章主要学习的是指针方面的知识,这节只是简单了解一下指针,并不会深…

uniapp H5项目 获取接口的二进制流转化成图片url(base64)

如果你使用的是uniapp, 并且你从接口获取下来的数据长这样: 想要把取到的数据展示成图片,那么你可以这样做: // 这是我们的项目封装的请求方法const res await this.$api.getKaptcha({originResponse: true, // 这样写是为了在request那边特…

路由器热备份

HSRP HSRP(Hot Standby Routing Protocol)热备份路由选择协议 HSRP是思科私有的协议,HSRP起到一个双网关热备份的一个目的,不考虑线路问题针对设备而言,一个设备挂了还有另外一台设备,所以双网关也叫双机…

stl_set

文章目录 set1.关联式容器2.键值对3. set3.1 set介绍3.2 set的使用3.2.1 pair3.2.2 find3.2.3 lower_bound 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用3.3.3 find3.3.4 equal_range3.3.5 erase set 1.关联式容器 在初阶阶段,我们已经接触过STL中的部分…

嵌入式物联网实战开发笔记-乐鑫ESP32芯片功能对比以及功能选型【doc.yotill.com】

乐鑫ESP32入门到精通项目开发参考百例下载: 链接:https://pan.baidu.com/s/1ATvRnAZvxkev-PJfd3EAPg?pwd4e33 提取码:4e33 2.1 初识 ESP32 ESP32-S3 是一款低功耗的 MCU 系统级芯片 (SoC),支持 2.4 GHz Wi-Fi 和低功耗蓝牙 (…

强固型国产化工业电脑,在电子看板行业应用,机器视觉在汽车产线行业应用

电子看板行业应用 智能电子看板的核心是通过实现工厂的全面可视化、自动化管理,最终达到提高效率、降低成本及提高产品质量的目标。电子看板硬件主要有两部分组成:微型工业计算机,显示终端(平板电视、LCD) 方案需求 …

在Java中使用XxlCrawler时防止被反爬的几种方式

目录 前言 一、常见的反爬措施 1、User-Agent识别 2、Referer识别 3、频率限制 4、IP限制 二、XxlCrawer的应对之道 1、User-Agent应对 2、频率限制 3、IP限制 三、XxlCrawler执行解析 1、XxlCrawler对象 2、启动对象 3、信息爬取线程 总结 前言 众所周知&#x…

【c++】vector的使用

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,我们本篇来到一个新的容器,vector的讲解和使用 目录 1.vector简单介绍2.vector的使用2.1构造函数2.2遍历vector2.3对容量操作2.4vector的增删查改 1.v…

Java测试编程题

题目1 1.创建5个线程对象 线程名设置为(Thread01,Thread02,Thread03,Thread04,Thread05)使用 代码实现5个线程有序的循环打印,效果如下: Thread01正在打印1 Thread02正在打印2 Threa…