python大数据:聚类分析

目录

一、前言

二、聚类分析的定义与意义

三、聚类算法的分类

1、基于划分的聚类方法

1.1 K-means算法

1.1.1  K-means算法概述

1.1.2 参数说明

1.1.3  K-means算法实现

​编辑

1.2 K-medoids算法

1.2.1 K-medoids算法概述

1.2.2 参数说明

1.3 K-prototype算法

1.3.1 K-prototype算法概述

1.3.2 参数说明

2、基于层次的聚类方法

2.1 BIRCH算法

2.1.1 BIRCH算法概述

2.1.2 参数说明

2.1.3 BIRCH算法实现

​编辑

2.2 CURE算法

2.2.1 CURE算法概述

2.2.2 参数说明

3、基于密度的聚类方法

3.1 DBSCAN算法

3.1.1 DBSCAN算法概述

3.1.2 参数说明

3.1.2 DBSCAN算法实现

3.2 OPTICS算法

3.2.1 OPTICS算法概述

3.2.2 参数说明

3.3 DENCLUE算法

3.3.1 DENCLUE算法概述

3.3.2 参数说明

4、基于网格的聚类方法

4.1 STING算法

4.1.1 STING算法概述

4.1.2 参数说明

4.2 CLIQUE算法

4.2.1 CLIQUE概述

4.2.2 参数说明

四、结语


一、前言

在数据科学的浩瀚宇宙中,聚类分析如同一颗璀璨的星辰,以其独特的魅力照亮了我们探索数据内在结构的道路。作为一种无监督学习方法,聚类分析不依赖于事先定义的标签或类别,而是通过对数据本身的特性进行分析,自动地将相似的数据点归为同一组,不同的组之间则尽可能保持差异。今天,就让我们一起踏上这段数据探索的无监督学习之旅,深入了解聚类分析的奥秘,并通过具体的代码案例来实践。

二、聚类分析的定义与意义

聚类分析,简而言之,就是将数据集划分为若干个组(或称为簇)的过程,使得同一簇内的数据点彼此相似,而不同簇之间的数据点差异较大。这种相似性通常基于距离度量(如欧氏距离、曼哈顿距离)或相似度系数(如余弦相似度)来衡量。聚类分析在市场营销、生物信息学、图像处理、社交网络分析等多个领域有着广泛的应用,它能够帮助我们发现数据中的隐藏模式、客户群体、基因表达模式等,为决策制定提供有力支持。

三、聚类算法的分类

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 参数说明
  1. k:要形成的簇的数量。这是聚类算法中的一个核心参数,决定了最终将数据集划分为多少个簇。
  2. max_iter:最大迭代次数。算法会进行迭代以优化簇中心(medoids)的选择,直到medoids不再发生变化或达到预设的最大迭代次数。

1.3 K-prototype算法

1.3.1 K-prototype算法概述

K-prototype算法是一种聚类算法,它结合了K-means和K-modes算法的优点,能够同时处理数值型和离散型(或称为分类型)数据。

1.3.2 参数说明
  1. n_clusters
    • 类型:int
    • 默认值:通常为8,但可以根据具体数据集和需求进行调整。
    • 说明:该参数指定了要形成的类的数量以及要产生的质心的数量。
  2. max_iter
    • 类型:int
    • 默认值:根据具体实现可能有所不同,但通常会有一个默认值。
    • 说明:该参数指定了算法单次运行的最大迭代次数。在达到最大迭代次数或算法收敛(即质心不再发生变化)之前,算法会一直运行。
  3. n_init
    • 类型:int
    • 默认值:通常为10,但可以根据具体实现和需求进行调整。
    • 说明:该参数指定了K-prototype算法将使用不同的质心种子运行多少次。最终的结果将是这n_init次连续运行中成本(cost)最低的输出。
  4. num_dissim(或类似名称):
    • 类型:func
    • 默认值:通常为欧几里得距离函数(euclidean_dissim)。
    • 说明:该参数指定了数值变量算法所采用的相似度函数。它用于计算数值属性之间的距离。
  5. cat_dissim(或类似名称):
    • 类型:func
    • 默认值:通常为匹配不相似度函数(matching_dissim)。
    • 说明:该参数指定了分类变量的K-prototype算法使用的相似度函数。它用于计算分类属性之间的不相似度。
  6. init
    • 类型:{‘Huang’, ‘Cao’, ‘random’或ndarray列表}
    • 默认值:通常为‘Cao’。
    • 说明:该参数指定了初始化方法。不同的方法(如Huang、Cao或随机)会使用不同的策略来选择初始质心。如果传递了一个ndarray列表,则应该包含两个长度为n_clusters的数组,分别用于数值和分类数据的初始质心。
  7. gamma
    • 类型:float
    • 默认值:通常为None,表示自动从数据中计算。
    • 说明:该参数是一个加权因子,用于确定数值属性和分类属性的相对重要性。如果提供了具体的值,则会使用该值作为加权因子;否则,算法会自动从数据中计算出一个合适的加权因子。
  8. verbose
    • 类型:integer
    • 默认值:根据具体实现可能有所不同。
    • 说明:该参数用于控制算法的详细输出。较高的值会输出更多的信息,有助于了解算法的运行过程和状态。
  9. random_state
    • 类型:int、RandomState实例或None
    • 默认值:通常为None。
    • 说明:该参数用于控制随机数生成器的种子。如果提供了具体的int值,则会使用该值作为种子;如果提供了RandomState实例,则会使用该实例作为随机数生成器;如果为None,则会使用默认的随机数生成器。
  10. 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 参数说明
  1. 分支因子(branchingFactor)
    • 定义:CF树中每个非叶子节点上子节点的最大数量。
    • 影响:较大的分支因子将导致更宽而浅的聚类树,可能提高性能但影响聚类准确性;较小的分支因子将导致更深而窄的树,可能增加计算成本但提高聚类准确性。
    • 类型:正整数。
  2. 阈值(threshold)
    • 定义:用于控制当一个新的数据点到达时,是否创建新的聚类中心或将其分配到现有的聚类中心。它决定了子树中的节点何时会被合并或分裂。
    • 影响:较大的阈值会导致更多的数据点被分配到同一个聚类中心,产生更大的聚类,降低聚类精确度;较小的阈值会导致更多的新聚类中心的创建,增加聚类准确性但可能增加计算成本。
    • 类型:非负实数。
  3. 叶节点容量(leafNodeCapacity 或 entryCapacity)
    • 定义:每个叶节点所能容纳的最大数据点数量。
    • 影响:较大的叶节点容量可以提高算法的执行效率,但可能导致聚类的准确性下降;较小的叶节点容量将增加聚类的准确性但可能增加计算成本。
    • 类型:正整数。
  4. 全局聚类数量(n_clusters)
    • 定义:在BIRCH算法的全局聚类阶段,指定的最终聚类数量。
    • 影响:该参数直接影响了最终聚类的粒度和数量。如果不指定或设置为None,则不执行最终的聚类步骤,子聚类原样返回。
    • 类型:整数或None。
  5. 其他可选参数
    • 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 参数说明
  1. 代表点数量

    • 从每个簇中选择的代表点数量,这个数量可以自定义,但通常选择足够分散且能覆盖整个簇的点。
  2. 收缩因子(α)

    • 将代表点向簇质心移动的比例,取值范围为0到1之间。
      • 当α趋于0时,所有的“代表点”都汇聚到质心,算法退化为基于“质心”的聚类。
      • 当α趋于1时,“代表点”完全没有收缩,算法退化为基于“全连接”的聚类。
      • 收缩因子的使用可以减少噪音对聚类的影响,并适应非球形的几何形状。
  3. 距离度量

    • 用于计算点之间的距离,通常使用欧氏距离。
  4. 合并阈值

    • 用于判断两个簇是否足够接近以进行合并的阈值,这个值可以根据数据特征进行自定义。
  5. 采样大小

    • 当处理大规模数据集时,通常会对数据进行采样以提高效率。采样大小可以根据数据集的规模和特征进行自定义。

3、基于密度的聚类方法

3.1 DBSCAN算法

3.1.1 DBSCAN算法概述

DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种典型的基于密度的空间聚类算法。

3.1.2 参数说明
  1. 邻域半径(epsilon)

    • 用于确定两个点是否在同一邻域内,即如果两点之间的距离小于或等于epsilon,则它们被视为在同一邻域。
    • epsilon的大小直接影响聚类的结果。较小的epsilon值会使得簇的边界更明确,但可能导致过多的簇和离群点;较大的epsilon值可能会将不同的簇连接在一起,形成较大的簇。
  2. 最少点数目(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 参数说明
  1. min_samples
    • 定义:一个点要成为核心点,其ε-邻域内至少需要包含的点数。
    • 影响:此参数影响聚类的密度阈值。如果设置得过低,算法可能会将噪声点视为核心点;如果设置得过高,则可能无法识别出数据集中的聚类结构。
    • 默认值:根据具体实现和库的不同,默认值可能有所不同。

3.3 DENCLUE算法

3.3.1 DENCLUE算法概述

DENCLUE(DENsity-based CLUstEring)算法是一种基于密度的聚类算法,其核心思想是利用数据点周围的局部密度来识别聚类结构。

3.3.2 参数说明
  1. 核函数(Kernel Function)
    • 定义:用于计算数据点周围局部密度的函数。
    • 常用类型:高斯核函数(Gaussian Kernel)和Epanechnikov核函数等。高斯核函数因其平滑性和易于计算的特点而被广泛使用。
    • 影响:核函数的选择和参数设置会影响密度估计的准确性和聚类结果。
  2. 带宽参数(Bandwidth Parameter, h)
    • 定义:核函数中的一个重要参数,决定了核函数的平滑程度或影响范围。
    • 影响:带宽参数的大小直接影响密度估计的精度和聚类中心的识别。带宽过大可能导致聚类中心过于模糊,带宽过小则可能无法捕捉到数据集中的真实聚类结构。
  3. 收敛阈值(Convergence Threshold)
    • 定义:用于判断迭代过程是否收敛的阈值。
    • 影响:收敛阈值的设置会影响算法的迭代次数和最终聚类结果的稳定性。如果设置得过低,算法可能需要更多的迭代次数才能收敛;如果设置得过高,则可能导致算法过早停止迭代,无法得到最优的聚类结果。
  4. 迭代次数限制(Iteration Limit)
    • 定义:算法允许的最大迭代次数。
    • 影响:迭代次数限制的设置可以防止算法陷入无限循环。如果设置得过低,算法可能无法在有限的迭代次数内找到最优的聚类结果;如果设置得过高,则可能增加算法的计算时间和复杂度。

4、基于网格的聚类方法

4.1 STING算法

4.1.1 STING算法概述

STING(Statistical Information Grid-based Method)算法是一种基于网格的多分辨率聚类技术。

4.1.2 参数说明
  1. 网格步长

    • 定义:确定空间网格划分的基本单位大小。
    • 影响:网格步长直接影响网格单元的粒度。较细的网格步长可以捕获更精细的聚类结构,但计算复杂度较高;较粗的网格步长计算复杂度较低,但可能无法准确反映数据的聚类特性。
  2. 密度阈值

    • 定义:网格中对象数量大于等于该阈值表示该网格为稠密网格。
    • 影响:密度阈值用于判断网格单元是否为稠密网格,从而影响聚类的形成。较低的密度阈值可能导致更多的网格单元被视为稠密网格,形成较多的聚类;较高的密度阈值则可能使较少的网格单元被视为稠密网格,形成较少的聚类。

4.2 CLIQUE算法

4.2.1 CLIQUE概述

CLIQUE(Clustering In QUEst)是一种基于网格的聚类方法,它特别适用于子空间聚类任务,能够自动在子空间中识别出聚类结构。

4.2.2 参数说明
  1. 网格步长(或区间数)

    • 定义:每个维度上划分成不重叠的区间数或步长,决定了网格的大小和数量。
    • 影响:网格步长的大小直接影响到数据空间的划分精度和聚类的粒度。步长过大可能导致聚类结果过于粗糙,步长过小则可能增加计算复杂度和噪声干扰。
  2. 密度阈值

    • 定义:用于区分稠密单元和稀疏单元的阈值。如果一个单元内映射的对象数超过该密度阈值,则该单元被认为是稠密的。
    • 影响:密度阈值是算法的一个关键参数,它决定了哪些区域被视为聚类中心或簇的一部分。阈值的选择直接影响到聚类结果的质量和数量。如果设置得过低,可能会导致过多的噪声点被包含在内;如果设置得过高,则可能遗漏一些真正的聚类结构。

四、结语

聚类分析作为无监督学习的核心技术之一,为我们揭示数据背后的隐藏模式提供了强有力的工具。从K-means到DBSCAN,从市场细分到基因表达分析,聚类分析的应用场景日益广泛,同时也面临着算法选择、参数调优、高维数据处理等挑战。未来,随着技术的不断进步和算法的不断创新,聚类分析将在更多领域发挥更大的作用,助力我们更深入地理解数据的奥秘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值