一、前言
在数据科学的浩瀚宇宙中,聚类分析如同一颗璀璨的星辰,以其独特的魅力照亮了我们探索数据内在结构的道路。作为一种无监督学习方法,聚类分析不依赖于事先定义的标签或类别,而是通过对数据本身的特性进行分析,自动地将相似的数据点归为同一组,不同的组之间则尽可能保持差异。今天,就让我们一起踏上这段数据探索的无监督学习之旅,深入了解聚类分析的奥秘,并通过具体的代码案例来实践。
二、聚类分析的定义与意义
聚类分析,简而言之,就是将数据集划分为若干个组(或称为簇)的过程,使得同一簇内的数据点彼此相似,而不同簇之间的数据点差异较大。这种相似性通常基于距离度量(如欧氏距离、曼哈顿距离)或相似度系数(如余弦相似度)来衡量。聚类分析在市场营销、生物信息学、图像处理、社交网络分析等多个领域有着广泛的应用,它能够帮助我们发现数据中的隐藏模式、客户群体、基因表达模式等,为决策制定提供有力支持。
三、聚类算法的分类
1、基于划分的聚类方法
1.1 K-means算法
1.1.1 K-means算法概述
K-means算法是一种广泛使用的聚类算法,它基于将数据点划分到K个簇的思想,其中K是用户指定的参数,表示希望得到的簇的数量。以下是对K-means算法的详细概述:
1.1.2 参数说明
n_clusters
:指定要分成的簇的数量K。init
:指定初始化聚类中心的方法。n_init
:指定K-means算法运行的次数,每次运行会选择不同的初始中心点,选择最优的一次作为最终结果。这有助于减少算法对初始簇中心的敏感性。max_iter
:指定算法的最大迭代次数。random_state
:控制随机数种子,确保每次运行结果一致。这对于实验的可重复性非常重要。
1.1.3 K-means算法实现
字段名类型含义sepal.length数值花萼长度sepal.width数值花萼宽度petal.length数值花瓣长度petal.width数值花瓣宽度
下面是一个简单的示例代码,演示如何使用KMeans函数对数据进行聚类:
#引入模块
import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
from sklearn. cluster import KMeans
from sklearn. metrics import calinski_harabasz_score
#读取数据集
dataset = pd. read_csv("file/iris.csv" )
#特征数据
x =dataset[[ "Sepal.Length","Sepal.Width","Petal.Length","Petal.Width"]]. values
#构建模型
model =KMeans(n_clusters =3)
#通过训练样本训练模型
model. fit(x)
#绘制聚类结果
label_pred = model.labels_
x0 = x[label_pred == 0]
x1= x[label_pred==1]
x2=x[label_pred==2]
plt. scatter( x0[ :, 0], x0[ :,1], c="red" , marker='o',label='Cluster 1')
plt. scatter(x1[ :, 0], x1[ :, 1], c="green" , marker='*', label='Cluster 2' )
plt. scatter(x2[ :, 0], x2[ :, 1], c="blue" , marker='+' , label='Cluster 3' )
plt. xlabel( 'k-means cluster' )
plt. legend(loc=1)
plt. show()
1.2 K-medoids算法
1.2.1 K-medoids算法概述
K-medoids算法是一种基于划分的聚类算法,也被称为PAM(Partitioning Around Medoids)算法。该算法的目标是将数据集划分为K个簇,并找到每个簇的代表点(medoid),使得簇内的点到代表点的距离之和最小。
1.2.2 参数说明
- k:要形成的簇的数量。这是聚类算法中的一个核心参数,决定了最终将数据集划分为多少个簇。
- max_iter:最大迭代次数。算法会进行迭代以优化簇中心(medoids)的选择,直到medoids不再发生变化或达到预设的最大迭代次数。
1.3 K-prototype算法
1.3.1 K-prototype算法概述
K-prototype算法是一种聚类算法,它结合了K-means和K-modes算法的优点,能够同时处理数值型和离散型(或称为分类型)数据。
1.3.2 参数说明
- n_clusters:- 类型:int- 默认值:通常为8,但可以根据具体数据集和需求进行调整。- 说明:该参数指定了要形成的类的数量以及要产生的质心的数量。
- max_iter:- 类型:int- 默认值:根据具体实现可能有所不同,但通常会有一个默认值。- 说明:该参数指定了算法单次运行的最大迭代次数。在达到最大迭代次数或算法收敛(即质心不再发生变化)之前,算法会一直运行。
- n_init:- 类型:int- 默认值:通常为10,但可以根据具体实现和需求进行调整。- 说明:该参数指定了K-prototype算法将使用不同的质心种子运行多少次。最终的结果将是这n_init次连续运行中成本(cost)最低的输出。
- num_dissim(或类似名称):- 类型:func- 默认值:通常为欧几里得距离函数(euclidean_dissim)。- 说明:该参数指定了数值变量算法所采用的相似度函数。它用于计算数值属性之间的距离。
- cat_dissim(或类似名称):- 类型:func- 默认值:通常为匹配不相似度函数(matching_dissim)。- 说明:该参数指定了分类变量的K-prototype算法使用的相似度函数。它用于计算分类属性之间的不相似度。
- init:- 类型:{‘Huang’, ‘Cao’, ‘random’或ndarray列表}- 默认值:通常为‘Cao’。- 说明:该参数指定了初始化方法。不同的方法(如Huang、Cao或随机)会使用不同的策略来选择初始质心。如果传递了一个ndarray列表,则应该包含两个长度为n_clusters的数组,分别用于数值和分类数据的初始质心。
- gamma:- 类型:float- 默认值:通常为None,表示自动从数据中计算。- 说明:该参数是一个加权因子,用于确定数值属性和分类属性的相对重要性。如果提供了具体的值,则会使用该值作为加权因子;否则,算法会自动从数据中计算出一个合适的加权因子。
- verbose:- 类型:integer- 默认值:根据具体实现可能有所不同。- 说明:该参数用于控制算法的详细输出。较高的值会输出更多的信息,有助于了解算法的运行过程和状态。
- random_state:- 类型:int、RandomState实例或None- 默认值:通常为None。- 说明:该参数用于控制随机数生成器的种子。如果提供了具体的int值,则会使用该值作为种子;如果提供了RandomState实例,则会使用该实例作为随机数生成器;如果为None,则会使用默认的随机数生成器。
- n_jobs:- 类型:int- 默认值:通常为1。- 说明:该参数指定了用于计算的任务数量。如果设置为-1,则使用所有CPU。如果设置为1,则不使用并行计算代码,这有助于调试。对于n_jobs小于-1的情况,会使用(n_cpus + 1 + n_jobs)个CPU。
2、基于层次的聚类方法
2.1 BIRCH算法
2.1.1 BIRCH算法概述
BIRCH(Balanced Iterative Reducing and Clustering Using Hierarchies)算法是一种用于大规模数据集的聚类算法。
2.1.2 参数说明
- 分支因子(branchingFactor):- 定义:CF树中每个非叶子节点上子节点的最大数量。- 影响:较大的分支因子将导致更宽而浅的聚类树,可能提高性能但影响聚类准确性;较小的分支因子将导致更深而窄的树,可能增加计算成本但提高聚类准确性。- 类型:正整数。
- 阈值(threshold):- 定义:用于控制当一个新的数据点到达时,是否创建新的聚类中心或将其分配到现有的聚类中心。它决定了子树中的节点何时会被合并或分裂。- 影响:较大的阈值会导致更多的数据点被分配到同一个聚类中心,产生更大的聚类,降低聚类精确度;较小的阈值会导致更多的新聚类中心的创建,增加聚类准确性但可能增加计算成本。- 类型:非负实数。
- 叶节点容量(leafNodeCapacity 或 entryCapacity):- 定义:每个叶节点所能容纳的最大数据点数量。- 影响:较大的叶节点容量可以提高算法的执行效率,但可能导致聚类的准确性下降;较小的叶节点容量将增加聚类的准确性但可能增加计算成本。- 类型:正整数。
- 全局聚类数量(n_clusters):- 定义:在BIRCH算法的全局聚类阶段,指定的最终聚类数量。- 影响:该参数直接影响了最终聚类的粒度和数量。如果不指定或设置为None,则不执行最终的聚类步骤,子聚类原样返回。- 类型:整数或None。
- 其他可选参数:- compute_labels:每次拟合时是否计算标签值,默认为True。- copy:是否复制获得的数据,如果设置为False,初始化数据将被重写,默认为True。
2.1.3 BIRCH算法实现
#引入模块
import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
from sklearn.cluster import Birch
from sklearn.metrics import calinski_harabasz_score
#读取数据集
dataset = pd. read_csv("file/iris.csv" )
#特征数据
x =dataset[[ "Sepal.Length","Sepal.Width","Petal.Length","Petal.Width"]]. values
#构建模型
model =Birch(n_clusters =3)
#通过训练样本训练模型
model.fit(x)
#绘制聚类结果
label_pred = model.labels_
x0 = x[label_pred == 0]
x1= x[label_pred==1]
x2=x[label_pred==2]
plt. scatter( x0[ :, 0], x0[ :,1], c="red" , marker='o',label='Cluster 1')
plt. scatter(x1[ :, 0], x1[ :, 1], c="green" , marker='*', label='Cluster 2' )
plt. scatter(x2[ :, 0], x2[ :, 1], c="blue" , marker='+' , label='Cluster 3' )
plt. xlabel( 'k-means cluster' )
plt. legend(loc=1)
plt. show()
2.2 CURE算法
2.2.1 CURE算法概述
CURE(Clustering Using Representatives)算法是一种可伸缩的层次聚类算法,特别适用于处理大型数据集、离群点和非球形簇
2.2.2 参数说明
- 代表点数量:- 从每个簇中选择的代表点数量,这个数量可以自定义,但通常选择足够分散且能覆盖整个簇的点。
- 收缩因子(α):- 将代表点向簇质心移动的比例,取值范围为0到1之间。- 当α趋于0时,所有的“代表点”都汇聚到质心,算法退化为基于“质心”的聚类。- 当α趋于1时,“代表点”完全没有收缩,算法退化为基于“全连接”的聚类。- 收缩因子的使用可以减少噪音对聚类的影响,并适应非球形的几何形状。
- 距离度量:- 用于计算点之间的距离,通常使用欧氏距离。
- 合并阈值:- 用于判断两个簇是否足够接近以进行合并的阈值,这个值可以根据数据特征进行自定义。
- 采样大小:- 当处理大规模数据集时,通常会对数据进行采样以提高效率。采样大小可以根据数据集的规模和特征进行自定义。
3、基于密度的聚类方法
3.1 DBSCAN算法
3.1.1 DBSCAN算法概述
DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种典型的基于密度的空间聚类算法。
3.1.2 参数说明
- 邻域半径(epsilon):- 用于确定两个点是否在同一邻域内,即如果两点之间的距离小于或等于epsilon,则它们被视为在同一邻域。- epsilon的大小直接影响聚类的结果。较小的epsilon值会使得簇的边界更明确,但可能导致过多的簇和离群点;较大的epsilon值可能会将不同的簇连接在一起,形成较大的簇。
- 最少点数目(MinPts):- 定义了一个核心点所需的邻域内最小样本点数。- 如果一个点的epsilon邻域内包含的样本点数大于或等于MinPts,则该点被视为核心点。- MinPts的值也会影响聚类的结果。较小的MinPts值会使得更多的点成为核心点,从而产生更多的簇;较大的MinPts值会使得只有密集区域的点才能成为核心点,形成较少但更健壮的簇。
3.1.2 DBSCAN算法实现
① 通过 sklear 生成非凸数据。
#引入模块
import numpy as np
import matplotlib. pyplot as plt
from sklearn import datasets
#生成数据
x1,yl=datasets.make_circles(n_samples=1000,factor=0.2,noise=.05)
x2,y2=datasets.make_blobs(n_samples= 200,n_features = 2,centers=[[-1,1.2]],cluster_std=[[.1]], random_state=5)
x3,y3= datasets.make_blobs(n_samples=300,n_features=2,centers=[[-0.8,-1.2]],cluster_std=[[.1]],random_state=5)
x=np.concatenate((x1,x2,x3))
plt.scatter(x[:,0],x[:,1], marker='*',color='gray')
plt.show( )
运行结果:
② 使用K-means算法进行分类,类别个数设置为4。
from sklearn.cluster import KMeans
model=KMeans(n_clusters=4,random_state=9).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=model)
plt.show()
运行结果:
③使用 DBSCAN算法进行分类,DBSCAN的关键的参数设置为eps=0.1和min_samples=10。
from sklearn.cluster import DBSCAN
model2=DBSCAN(eps=0.1,min_samples=10).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=model2)
plt.show( )
运行结果:
3.2 OPTICS算法
3.2.1 OPTICS算法概述
OPTICS(Ordering Points To Identify the Clustering Structure)算法是一种基于密度的空间聚类算法,由Martin Ester等人在1996年提出。该算法的核心思想是通过计算每个点的可达距离(Reachability Distance)和核心距离(Core Distance)来确定数据点之间的密度关系,从而自动发现数据中的层次结构,而无需预先设定簇的数量。
3.2.2 参数说明
- min_samples:- 定义:一个点要成为核心点,其ε-邻域内至少需要包含的点数。- 影响:此参数影响聚类的密度阈值。如果设置得过低,算法可能会将噪声点视为核心点;如果设置得过高,则可能无法识别出数据集中的聚类结构。- 默认值:根据具体实现和库的不同,默认值可能有所不同。
3.3 DENCLUE算法
3.3.1 DENCLUE算法概述
DENCLUE(DENsity-based CLUstEring)算法是一种基于密度的聚类算法,其核心思想是利用数据点周围的局部密度来识别聚类结构。
3.3.2 参数说明
- 核函数(Kernel Function):- 定义:用于计算数据点周围局部密度的函数。- 常用类型:高斯核函数(Gaussian Kernel)和Epanechnikov核函数等。高斯核函数因其平滑性和易于计算的特点而被广泛使用。- 影响:核函数的选择和参数设置会影响密度估计的准确性和聚类结果。
- 带宽参数(Bandwidth Parameter, h):- 定义:核函数中的一个重要参数,决定了核函数的平滑程度或影响范围。- 影响:带宽参数的大小直接影响密度估计的精度和聚类中心的识别。带宽过大可能导致聚类中心过于模糊,带宽过小则可能无法捕捉到数据集中的真实聚类结构。
- 收敛阈值(Convergence Threshold):- 定义:用于判断迭代过程是否收敛的阈值。- 影响:收敛阈值的设置会影响算法的迭代次数和最终聚类结果的稳定性。如果设置得过低,算法可能需要更多的迭代次数才能收敛;如果设置得过高,则可能导致算法过早停止迭代,无法得到最优的聚类结果。
- 迭代次数限制(Iteration Limit):- 定义:算法允许的最大迭代次数。- 影响:迭代次数限制的设置可以防止算法陷入无限循环。如果设置得过低,算法可能无法在有限的迭代次数内找到最优的聚类结果;如果设置得过高,则可能增加算法的计算时间和复杂度。
4、基于网格的聚类方法
4.1 STING算法
4.1.1 STING算法概述
STING(Statistical Information Grid-based Method)算法是一种基于网格的多分辨率聚类技术。
4.1.2 参数说明
- 网格步长- 定义:确定空间网格划分的基本单位大小。- 影响:网格步长直接影响网格单元的粒度。较细的网格步长可以捕获更精细的聚类结构,但计算复杂度较高;较粗的网格步长计算复杂度较低,但可能无法准确反映数据的聚类特性。
- 密度阈值- 定义:网格中对象数量大于等于该阈值表示该网格为稠密网格。- 影响:密度阈值用于判断网格单元是否为稠密网格,从而影响聚类的形成。较低的密度阈值可能导致更多的网格单元被视为稠密网格,形成较多的聚类;较高的密度阈值则可能使较少的网格单元被视为稠密网格,形成较少的聚类。
4.2 CLIQUE算法
4.2.1 CLIQUE概述
CLIQUE(Clustering In QUEst)是一种基于网格的聚类方法,它特别适用于子空间聚类任务,能够自动在子空间中识别出聚类结构。
4.2.2 参数说明
- 网格步长(或区间数)- 定义:每个维度上划分成不重叠的区间数或步长,决定了网格的大小和数量。- 影响:网格步长的大小直接影响到数据空间的划分精度和聚类的粒度。步长过大可能导致聚类结果过于粗糙,步长过小则可能增加计算复杂度和噪声干扰。
- 密度阈值- 定义:用于区分稠密单元和稀疏单元的阈值。如果一个单元内映射的对象数超过该密度阈值,则该单元被认为是稠密的。- 影响:密度阈值是算法的一个关键参数,它决定了哪些区域被视为聚类中心或簇的一部分。阈值的选择直接影响到聚类结果的质量和数量。如果设置得过低,可能会导致过多的噪声点被包含在内;如果设置得过高,则可能遗漏一些真正的聚类结构。
四、结语
聚类分析作为无监督学习的核心技术之一,为我们揭示数据背后的隐藏模式提供了强有力的工具。从K-means到DBSCAN,从市场细分到基因表达分析,聚类分析的应用场景日益广泛,同时也面临着算法选择、参数调优、高维数据处理等挑战。未来,随着技术的不断进步和算法的不断创新,聚类分析将在更多领域发挥更大的作用,助力我们更深入地理解数据的奥秘。
版权归原作者 toufaduoduo369 所有, 如有侵权,请联系我们删除。