简介
本文主要内容:
聚类分析所涉及到的所有方面 和 经典划分聚类: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库中的一个模块,它提供了多种方式来获取流行的数据集。这些数据集可用于机器学习算法的实验和测试。
该模块包含三类数据集:
- 内置小型数据集(Toy datasets):这些是小型数据集,已经包含在scikit-learn包内,可以直接使用,无需从外部下载。
- 可下载的大型数据集(Real world datasets):这些是较大的数据集,通常需要从互联网上下载。
- 生成数据集的函数:这组函数允许用户根据自己的需要生成合成(模拟)数据集。
make_blobs
make_blobs是sklearn.datasets模块中的一个函数,其主要用途是生成聚类算法的测试数据。通过这个函数,可以快速构建一个包含多个高斯分布簇的随机点集,非常适合用来评估和演示聚类算法的效果。
主要参数:
- n_samples:要生成的总样本数。
- n_features:每个样本的特征数。
- centers:要生成的中心点(即簇)数,或者指定具体的中心点位置。
- cluster_std:簇的标准差,用于控制簇的紧密程度。
- shuffle:是否打乱样本顺序。
- random_state:随机数种子,保证结果的可复现性。
这个函数会返回两个数组:
- 第一个是形状为 [n_samples, n_features] 的数组,包含生成的样本点。
- 第二个是形状为 [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的特点:
- 元素同质性:ndarray的所有元素类型必须是相同的,由 dtype 属性指定。
- 固定大小:ndarray创建后其大小是固定的,不能改变其形状(shape)和大小(size)。
- 支持向量化操作: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 的使用通常遵循以下步骤:
- 准备数据:在绘制任何图表之前,首先需要准备好数据。
- 创建图表:使用不同的
pyplot
函数根据数据创建图表。 - 自定义图表:通过添加标题、标签或自定义风格来自定义图表。
- 显示/保存图表:最后使用
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()显示图表。