【python】Sklearn—Cluster

在这里插入图片描述

参考学习来自 10种聚类算法的完整python操作示例

文章目录

  • 聚类数据集
  • 亲和力传播——AffinityPropagation
  • 聚合聚类——AgglomerationClustering
  • BIRCH——Birch(✔)
  • DBSCAN——DBSCAN
  • K均值——KMeans
  • Mini-Batch K-均值——MiniBatchKMeans
  • 均值漂移聚类—— MeanShift
  • OPTICS——OPTICS
  • 光谱聚类——SpectralClustering
  • 高斯混合模型——GaussianMixture(✔)

聚类数据集

sklearn.datasets.make_classification 是 Scikit-Learn 库中的一个函数,用于生成随机的多类分类问题数据集。以下是该函数的中文文档说明,包括参数和用法:

一、函数签名

sklearn.datasets.make_classification(  n_samples=100, n_features=20, n_informative=2, n_redundant=2,  n_repeated=0, n_classes=2, n_clusters_per_class=2,  weights=None, flip_y=0.01, class_sep=1.0, hypercube=True,  shift=0.0, scale=1.0, shuffle=True, random_state=None  
)

二、参数说明

  • n_samples (int, 可选, 默认值=100): 要生成的样本数量。

  • n_features (int, 可选, 默认值=20): 要生成的特征数量。

  • n_informative (int, 可选, 默认值=2): 信息特征的数量,即实际影响目标变量的特征数量。

  • n_redundant (int, 可选, 默认值=2): 冗余特征的数量。这些特征是信息特征的随机线性组合。

  • n_repeated (int, 可选, 默认值=0): 从信息特征和冗余特征中随机抽取的重复特征的数量。

  • n_classes (int, 可选, 默认值=2): 分类问题的类别(或标签)数量。

  • n_clusters_per_class (int, 可选, 默认值=2): 每个类别的集群数量。

  • weights (list of floats or None, 可选, 默认值=None): 每个类别的样本权重。

  • flip_y (float, 可选, 默认值=0.01): 随机翻转目标变量y的比例。

  • class_sep (float, 可选, 默认值=1.0): 类别之间的分离程度。

  • hypercube (bool, 可选, 默认值=True): 如果为True,则数据从超立方体的顶点中抽取。

  • shift (float, 可选, 默认值=0.0): 特征值的范围移动量。

  • scale (float, 可选, 默认值=1.0): 特征值的缩放比例。

  • shuffle (bool, 可选, 默认值=True): 是否打乱样本和特征。

  • random_state (int, RandomState instance or None, 可选, 默认值=None): 控制随机性的种子或RandomState实例。

三、返回值

X (array of shape [n_samples, n_features]): 生成的样本数据。

y (array of shape [n_samples]): 每个样本的类别标签。

# 综合分类数据集
from numpy import where
from sklearn.datasets import make_classification
from matplotlib import pyplot
# 定义数据集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 为每个类的样本创建散点图
for class_value in range(2):# 获取此类的示例的行索引row_ix = where(y == class_value)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 绘制散点图
pyplot.show()

在这里插入图片描述

亲和力传播——AffinityPropagation

sklearn.cluster.AffinityPropagation 是 Scikit-Learn 库中的一个聚类算法,它基于亲和传播(Affinity Propagation)进行聚类。以下是该算法的中文文档说明,包括参数、属性和用法:

一、参数(Parameters)

  • damping:float 类型,默认值为 0.5。阻尼系数,在 0.5 到 1 之间。这个参数决定了当前值相对于传入值(加权 1-阻尼)的保持程度,用于避免数值振荡。

  • max_iter:int 类型,默认值为 200。最大迭代次数。

  • convergence_iter:int 类型,默认值为 15。当估计的聚类数目连续 convergence_iter 次迭代都不再改变时,停止迭代。

  • copy:bool 类型,默认值为 True。是否对输入数据进行复制操作,以避免修改原始数据。

  • preference:array-like of shape (n_samples,) 或 float 类型,默认值为 None。每个点的偏好值。偏好值越大,该点越有可能被选作聚类中心。如果不指定偏好值,它们将被设置为输入相似性的中位数。

  • affinity:string 类型,默认值为 ‘euclidean’。用于计算数据点之间亲和度的度量方式。目前支持 ‘precomputed’ 和 ‘euclidean’。如果选择 ‘euclidean’,则使用点之间的负平方欧几里德距离作为亲和度。

  • verbose:bool 类型,默认值为 False。是否输出日志信息。

  • random_state:int 或 np.random.RandomStateInstance 类型,默认值为 None。用于控制随机性的种子或 RandomState 实例。

二、属性(Attributes)

  • cluster_centers_indices_:array-like of shape (n_clusters,)。聚类中心的索引。

  • labels_:array-like of shape (n_samples,)。每个样本的聚类标签。

  • n_iter_:int。实际迭代次数。

三、用法(Usage)

使用 AffinityPropagation 进行聚类时,首先需要创建一个 AffinityPropagation 的实例,并设置所需的参数。然后,使用 fit 方法对数据进行拟合,即可得到聚类结果。

# 亲和力传播聚类
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import AffinityPropagation
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = AffinityPropagation(damping=0.9)
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))
# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

output

25

在这里插入图片描述

聚合聚类——AgglomerationClustering

AgglomerativeClustering,又称为聚合聚类,是一种基于距离的层次聚类算法。它采用自底向上的方式构建聚类层次,从将每个数据点作为单个聚类开始,然后迭代合并最接近的聚类对,直到所有数据点合并为一个聚类,或达到指定的聚类数量。

一、参数(Parameters)

  • n_clusters:整数,指定最终聚类中心的数量。如果不指定,算法将继续合并聚类直到只剩下一个聚类。

  • affinity:字符串或可调用对象,默认为’euclidean’。用于计算数据点之间距离的度量方法。例如,'euclidean’表示使用欧氏距离。

  • memory:用于缓存计算的结果,以便在多次调用fit和predict时提高效率。

  • connectivity:数组或可调用对象,用于定义数据点之间的连接性。如果指定,则算法将仅合并具有连接性的聚类。

  • compute_full_tree:布尔值,默认为False。如果为True,则构建一个完整的树并保存为children_属性。否则,只保存n_clusters个聚类。

  • linkage:字符串,默认为’ward’。确定合并聚类时使用的距离度量。'ward’使用方差最小化,'average’使用平均距离,'complete’使用最大距离。

  • distance_threshold:非负浮点数,默认为None。如果指定,则算法将在距离小于此阈值的聚类之间停止合并。

二、属性(Attributes)

  • labels_:每个数据点的聚类标签。

  • n_clusters_:聚类中心的数量。

  • children_:如果compute_full_tree为True,则保存层次聚类的树状结构。

三、步骤(Steps)

  • 初始化:开始时,将每个数据点视为一个单独的聚类。

  • 相似性度量:选择一个度量标准来衡量聚类之间的距离(如欧氏距离)。

  • 连接准则:选择一个连接准则,这决定了作为观测对之间距离的函数的聚类集合之间的距离。常见的连接准则包括最短连接、最长连接和平均连接。

  • 迭代合并:在每一步中,根据所选的距离和连接准则,找到最接近的聚类对并将它们合并为一个单独的聚类。更新存储聚类之间距离的距离矩阵。

  • 终止:重复迭代合并,直到所有数据点合并为一个聚类或达到停止准则(例如,期望的聚类数量或距离阈值)。

四、优点与缺点

优点:

  • 聚合聚类在距离和连接准则的选择上具有多样性,适用于各种数据集。
  • 产生了一个层次结构,这对于不同规模的聚类数据结构是有信息量的。

缺点:

  • 对于大数据集来说,它可能计算成本高,因为它需要在每次迭代中计算和更新所有聚类对之间的距离。
  • 算法的结果可能对距离和连接准则的选择敏感。

五、应用

聚合聚类在多个领域都有广泛应用,包括生物学、文档和文本挖掘、图像分析以及客户细分等。

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import AgglomerativeClustering
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = AgglomerativeClustering(n_clusters=2)
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.fit_predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

output

2

在这里插入图片描述

BIRCH——Birch(✔)

sklearn.cluster.Birch 是 scikit-learn 库中的一个聚类算法,它实现了 Birch 聚类算法。Birch 是一种内存高效的在线学习算法,适用于大规模数据集。以下是关于 sklearn.cluster.Birch 的中文文档概述:

一、概述

Birch 聚类算法通过构建一个称为 CF 树(Clustering Feature Tree)的数据结构来进行聚类。CF 树由 CF(Clustering Feature)节点组成,每个 CF 节点是一个三元组,包含点的数量(N)、点的线性和(LS)以及 CF 各分量的平方和(SS)。Birch 算法能够识别数据集中数据分布的不均衡性,对稠密区域的数据进行更精细的聚类,同时能够处理稀疏区域的异常点。

二、参数(Parameters)

  • threshold:float 类型,默认值为 0.5。该参数定义了合并新样本和最近的子簇获得的子簇的半径阈值。如果合并后的子簇半径大于该阈值,则会启动一个新的子聚类。较小的值会促进子簇的分裂,而较大的值则会减少分裂。

  • branching_factor:int 类型,默认值为 50。该参数定义了每个节点中 CF 子聚类的最大数目。如果新的样本进入导致子簇数目超过该值,则节点会被分裂成两个节点,每个子簇重新分布。

  • n_clusters:int 或 sklearn.cluster 模型的实例,默认值为 3。该参数定义了最终聚类步骤后的簇数。如果设置为 None,则不执行最后的聚类步骤,子聚类按原样返回。如果提供一个 sklearn.cluster 估计器,则该模型将子聚类作为新样本处理进行拟合,并将初始数据映射到最近的子聚类的标签上。如果设置为整数,则使用 AgglomerativeClustering 模型进行最后的聚类。

  • compute_labels:bool 类型,默认值为 True。该参数决定是否为每次拟合计算标签。

  • copy:bool 类型,默认值为 True。如果设置为 False,则原始数据可能会被覆盖。

三、属性(Attributes)

  • root_:CF 树的根节点。

  • dummy_leaf_:指向所有叶子的指针(如果存在)。

  • subcluster_centers_:所有子簇的质心数组。

四、注意事项

Birch 算法是一种增量聚类方法,它基于已经处理过的数据点进行聚类决策,而不是全局的数据点。

Birch 算法适用于大规模数据集,因为它是一种内存高效的在线学习算法。

在使用 Birch 算法时,需要注意选择合适的 threshold 和 branching_factor 参数,这些参数会影响聚类的结果。

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import Birch
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = Birch(threshold=0.01, n_clusters=2)
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

在这里插入图片描述

已经比较逼近真实的标签了

DBSCAN——DBSCAN

sklearn.cluster.DBSCAN 是 scikit-learn 库中的一个聚类算法,该算法基于密度的空间聚类,并能够在包含噪声的数据集中发现任意形状的簇。以下是对 sklearn.cluster.DBSCAN 的中文文档概述,按照要求以清晰的格式进行分点表示和归纳:

一、概述

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法。它通过将具有足够高密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇。该算法是一种非监督式学习方法,不需要事先知道要聚成几类。

二、主要参数

  • eps(float, default=0.5):两个样本之间的最大距离,即扫描半径。一个点被视为另一个点的邻域内,当且仅当这两个点之间的距离小于或等于 eps。

  • min_samples(int, default=5):一个点被视为核心点的邻域内的样本数(或总权重)。这包括点本身。

  • metric(string, or callable, default=’euclidean’):用于计算特征数组中实例之间距离的度量。

  • algorithm({‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’):用于计算点态距离和寻找最近邻的算法。

三、主要属性

  • core_sample_indices_:核心样本的索引数组。
  • labels_:每个点的聚类标签。噪声点标记为-1。

四、算法步骤

  • 遍历所有点:寻找核心点,即邻域内至少有 min_samples 个样本(包括自己)的点。

  • 扩展聚类:从一个核心点出发,不断查找其邻域内的核心点,并将其加入当前聚类。

  • 重复这个过程,直到当前聚类的边界无法再扩展。

  • 标记噪声点:不属于任何聚类的点被标记为噪声点。

五、注意事项

  • eps 的选择:eps 是 DBSCAN 算法中一个非常重要的参数,它决定了聚类的密度。eps 过大,则可能导致原本不应该聚在一起的点被聚为一类;eps 过小,则可能导致原本应该聚在一起的点被拆散。

  • min_samples 的选择:min_samples 决定了核心点的定义。min_samples 过小,则可能导致过多的点被识别为核心点,从而导致聚类结果过于细碎;min_samples 过大,则可能导致过少的点被识别为核心点,从而导致聚类结果过于粗糙。

  • 度量方式:根据数据的特性选择合适的度量方式,如欧氏距离、曼哈顿距离等。

六、总结

DBSCAN 是一种基于密度的聚类算法,适用于任意形状的聚类,并能有效处理噪声数据。通过调整 eps 和 min_samples 参数,可以控制聚类的密度和大小。

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import DBSCAN
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = DBSCAN(eps=0.30, min_samples=9)
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.fit_predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

output

3

在这里插入图片描述

K均值——KMeans

sklearn.cluster.KMeans

一、概述
KMeans算法是一种无监督学习方法,用于将数据点划分为K个聚类(或簇)。每个聚类的中心(或称为质心)是由该聚类中所有数据点的均值计算得出的。KMeans算法通过迭代的方式将数据点分配给最近的聚类中心,并重新计算聚类中心,直到聚类中心不再显著变化或达到预设的迭代次数。

二、主要参数

  • n_clusters: int类型,默认值为8。表示要生成的聚类数(即K值)。

  • init: 字符串或ndarray,默认值为’k-means++'。用于初始化聚类中心的方法。
    ‘k-means++’: 一种选择初始聚类中心的方法,可以加速收敛。
    ‘random’: 随机选择K个中心。
    也可以传入一个形状为(n_clusters, n_features)的ndarray来指定初始聚类中心。

  • n_init: int类型,默认值为10。表示在不同初始中心上运行KMeans算法的次数,最终选择最优解(即最小惯性值或平方误差)对应的聚类结果。
    max_iter: int类型,默认值为300。表示KMeans算法单次运行中的最大迭代次数。

  • tol: float类型,默认值为1e-4。表示容忍的最小优化值,即当聚类中心的变化小于该值时,算法会停止迭代。

三、其他参数

除了上述主要参数外,KMeans类还提供了其他一些参数,如:

  • precompute_distances: {‘auto’, True, False},预计算距离(可以加速计算,但占用更多内存)。

  • verbose: int类型,控制日志输出。

  • random_state: 控制随机种子,以确保结果的可重复性。

  • copy_x: bool类型,默认为True,表示是否对数据进行拷贝。如果为False,则直接在原始数据上进行操作,这可能会导致数据被修改。

四、注意事项

  • KMeans算法对初始中心的选择和K值的选择较为敏感,不同的初始中心和K值可能会导致不同的聚类结果。

  • 在大规模数据集上,KMeans算法可能收敛较慢,可以通过增加max_iter或调整其他参数来优化性能。

  • KMeans算法只能找到凸形的聚类,对于非凸形的聚类或具有复杂形状的聚类可能效果不佳。

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import KMeans
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = KMeans(n_clusters=2)
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.fit_predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

output

2

在这里插入图片描述

Mini-Batch K-均值——MiniBatchKMeans

sklearn.cluster.MiniBatchKMeans 是 scikit-learn 库中用于小批量 K-Means 聚类的一个类。以下是对其用法的中文文档概述:

一、简介

MiniBatchKMeans 是 K-Means 聚类的一个变体,它使用小批量样本来更新质心,从而降低了计算成本。这使得 MiniBatchKMeans 在处理大型数据集时更加高效,尤其是当数据集不适合一次性加载到内存中时。

二、参数

  • n_clusters (int, default=8): 要形成的簇数以及要生成的质心数。

  • init ({‘k-means++’, ‘random’ 或一个 ndarray, 或一个可调用的}, default=‘k-means++’): 初始化质心的方法。
    ‘k-means++’: 以智能方式为 K-Means 聚类选择初始聚类中心以加速收敛。
    ‘random’: 从数据中随机选择 n_clusters 个观测值作为初始质心。

  • max_iter (int, default=100): 在任何早期停止标准启发式停止之前,对完整数据集的最大迭代次数。

  • batch_size (int, default=1024): 小批量的大小。

  • verbose (int, default=0): 详细模式。

  • compute_labels (bool, default=True): 一旦小批量优化收敛到合适的位置,计算整个数据集的标签分配和惯性。

  • random_state (int, RandomState instance, 或 None, default=None): 确定质心初始化和随机重新分配的随机数生成。

  • tol (float, default=0.0): 两次连续迭代之间的相对容差,以判断收敛性。

  • max_no_improvement (int, default=10): 连续多少次迭代没有改善时停止。

  • init_size (int 或 None, default=None): 用于“k-means++”初始化的样本数。

  • n_init (int, default=3): 用不同的质心种子运行算法的次数,并选择最佳初始化。

  • reassignment_ratio (float, default=0.01): 用于“k-means++”初始化的重分配阈值。

三、属性

  • cluster_centers_ (array-like, shape (n_clusters, n_features)): 簇的质心。

  • labels_ (array-like, shape (n_samples,)): 每个样本的标签。

  • inertia_ (float): 簇内平方和,即每个样本到其所属簇的质心的距离的平方和。

四、注意事项

  • 由于 MiniBatchKMeans 使用小批量数据来更新质心,因此它的结果可能略不同于标准的 K-Means 算法。

  • 如果你的数据集适合一次性加载到内存中,并且计算资源足够,那么标准的 KMeans 可能更准确。

  • 在使用 MiniBatchKMeans 时,可能需要调整 batch_size 以获得最佳的性能和准确性之间的权衡

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import MiniBatchKMeans
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = MiniBatchKMeans(n_clusters=2)
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.fit_predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

output

2

请添加图片描述

均值漂移聚类—— MeanShift

sklearn.cluster.MeanShift 是 scikit-learn 库中的一个聚类算法,它基于非参数密度估计进行聚类。以下是对 MeanShift 的中文文档概述:

一、算法介绍

MeanShift 是一种基于质心的算法,它尝试找到数据分布中的密集区域。它的工作原理是通过不断更新候选质心,使其成为给定区域内点的均值。这个过程类似于“梯度上升”,即寻找数据分布中概率密度的局部最大值。

二、参数说明

  • bandwidth (float, optional):定义用于核函数估计的窗口大小,也称为“带宽”。较大的带宽意味着更大的平滑度,可能导致更多的点被归类到同一个簇中。默认值为 None,通常需要根据数据集进行调整。

  • seeds (array-like, shape=[n_seeds, n_features], optional):指定用于初始化质心的种子点。如果为 None,则使用数据集中的点作为种子。默认值为 None。

  • bin_seeding (boolean, optional):如果设置为 True,则使用二进制方法进行质心初始化,这可能会加速算法但可能影响结果的质量。默认值为 False。

  • min_bin_freq (int, optional):在二进制种子初始化中使用的最小箱频率。这决定了在初始化质心时,至少需要多少个点落入同一个箱中。默认值为 1。

其他参数还包括 cluster_all、n_jobs 和 max_iter 等,但它们在大多数情况下不是必需的。

三、主要属性

  • cluster_centers_ (array-like, shape=[n_clusters, n_features]):每个簇的质心。
  • labels_ (array-like, shape=[n_samples]):每个样本的簇标签。

四、工作流程

  • 初始化:随机选择数据集中的点或使用提供的种子点作为初始质心。
  • 迭代过程:
    对于每个质心,计算其周围区域(由 bandwidth 定义)内所有点的均值。
    将质心移动到计算出的均值位置。
    重复此过程,直到质心的移动小于某个阈值或达到最大迭代次数。
  • 合并簇:如果两个质心的距离小于某个阈值,则将它们合并为一个簇。
  • 分配标签:对于新样本,找到其最近的质心,并将其分配给相应的簇。

五、注意事项

  • MeanShift 算法对 bandwidth 参数非常敏感,不同的值可能会导致截然不同的聚类结果。

  • 由于 MeanShift 算法需要计算每个质心周围区域内所有点的均值,因此它在大型数据集上可能会变得非常慢

  • MeanShift 可以发现任意形状的簇,但可能会受到噪声和异常值的影响

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import MeanShift
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = MeanShift()
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.fit_predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

output

3

在这里插入图片描述

OPTICS——OPTICS

需要 scikit-learn 0.24 以上

sklearn中的OPTICS(Ordering Points To Identify the Clustering Structure)算法是一种基于密度的聚类算法,它是DBSCAN算法的一种改进。以下是sklearn OPTICS的中文文档概述,结合相关数字和信息进行了详细解释:

一、算法介绍

OPTICS算法是一种基于密度的聚类算法,它旨在通过发现数据集中样本的可达性(reachability)来识别出不同的聚类结构。OPTICS算法可以看作是DBSCAN算法的扩展,它克服了DBSCAN算法对邻域参数ε(epsilon)的敏感性,并允许用户通过可达性图(reachability plot)来灵活选择不同密度的聚类。

二、主要参数

  • min_samples (int > 1 或 float between 0 and 1, default=5):一个点被视为核心点的邻域样本数。如果设置为浮点数,则表示为样本数的小数部分(至少四舍五入为2)。
  • max_eps (float, optional, default=inf):两个样本之间的最大距离,其中一个被视为另一个样本的邻域。较大的值会识别出更大规模的聚类;减小该值可以缩短运行时间。
  • metric (str 或 callable, optional, default=‘minkowski’):用于距离计算的度量标准。
  • p (int, optional, default=2):当使用Minkowski距离时,该参数指定了距离的幂次。
  • metric_params (dict, optional):用于距离计算的额外关键字参数。
  • cluster_method (str, optional, default=‘xi’):用于从可达性图中提取簇的方法。'xi’表示使用Xi方法;'dbscan’表示使用类似于DBSCAN的方法。
  • eps (float, optional):在cluster_method='dbscan’时使用的邻域参数。注意,当使用OPTICS时,eps参数被忽略。
  • xi (float, optional, default=0.05):在cluster_method='xi’时使用的参数,用于确定哪些点被视为簇的一部分。
  • predecessor_correction (bool, optional, default=True):是否对可达性图中的前驱节点进行校正。
  • min_cluster_size (float or None, optional):作为簇一部分所需的最小样本数比例。如果为None,则不应用此限制。

三、主要属性

  • labels_ (array-like, shape=(n_samples,)): 每个样本的簇标签。未分配到任何簇的样本将被标记为-1。
  • cluster_hierarchy_ (array-like, shape=(n_samples, 2)):每个样本的可达性和其前驱节点的索引。这是算法生成的可达性图的表示。

四、工作流程

  • 初始化:设置参数,包括邻域样本数、最大距离等。

  • 计算可达性:对于数据集中的每个样本,计算其与其他样本的可达性,并记录其前驱节点。

  • 提取簇:根据选择的cluster_method(‘xi’或’dbscan’),从可达性图中提取出不同密度的簇。

  • 分配标签:为数据集中的每个样本分配簇标签。

五、注意事项

  • OPTICS算法对min_samples参数的选择较为敏感,需要根据数据集的特性进行调整。

  • 与DBSCAN相比,OPTICS算法提供了更多的灵活性,允许用户通过可达性图来观察不同密度的聚类结构。

  • 在处理大型数据集时,OPTICS算法可能会比DBSCAN更加耗时,因为它需要计算每个样本的可达性。

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import OPTICS
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = OPTICS(eps=0.8, min_samples=10)
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.fit_predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

output

17

在这里插入图片描述

光谱聚类——SpectralClustering

sklearn.cluster.SpectralClustering 是 scikit-learn 库中提供的一个谱聚类算法的实现。以下是对 SpectralClustering 的中文文档概述:

一、算法介绍

SpectralClustering 是一种基于图论的聚类方法,它将数据样本视为图上的节点,并通过节点之间的相似度(或称为边)来构建图。然后,算法利用图的拉普拉斯矩阵(Laplacian matrix)的特征值和特征向量来进行聚类。谱聚类特别适用于处理非凸形状的簇或当传统的距离度量无法很好描述数据分布时。

二、主要参数

  • n_clusters (int, optional, default=8):需要形成的簇的个数。
  • affinity (str or callable, default=‘rbf’):
    ‘nearest_neighbors’:使用最近邻方法构建相似度矩阵。
    ‘rbf’:使用径向基函数(Radial basis function)作为核函数来计算相似度矩阵。
    其他选项包括 ‘precomputed’(预计算的相似度矩阵)、‘linear’(线性核)等。
  • gamma (float, default=1.0):当使用 ‘rbf’、‘poly’ 或 ‘sigmoid’ 作为 affinity 参数时,该参数为核函数的系数。对于 ‘rbf’,它决定了函数宽度。
  • n_neighbors (int, default=10):当 affinity 设置为 ‘nearest_neighbors’ 时,用于确定每个点的邻居数量。
  • eigen_solver ({‘auto’, ‘arpack’, ‘lobpcg’, ‘amg’}, default=‘auto’):用于计算拉普拉斯矩阵特征值的求解器。
  • assign_labels ({‘kmeans’, ‘discretize’}, default=‘kmeans’):用于将特征向量转换为聚类标签的方法。
  • random_state (int, RandomState instance, default=None):随机数生成器的种子或实例,用于可复现的结果。

三、主要属性

  • labels_ (array-like, shape (n_samples,)):每个样本的簇标签。
  • affinity_matrix_ (array-like, shape (n_samples, n_samples)):用于聚类的相似度矩阵(如果 affinity 参数设置为 ‘precomputed’ 除外)。

四、工作流程

  • 构建相似度矩阵:根据选定的 affinity 参数,计算数据点之间的相似度矩阵。
  • 计算拉普拉斯矩阵:基于相似度矩阵,计算归一化的拉普拉斯矩阵。
  • 求解特征值和特征向量:使用指定的 eigen_solver 求解拉普拉斯矩阵的特征值和特征向量。
  • 分配簇标签:根据选定的 assign_labels 方法,将特征向量转换为簇标签。

五、注意事项

  • 参数选择:谱聚类的效果对参数的选择(特别是 n_clusters、affinity 和 gamma)非常敏感。因此,可能需要通过实验来确定最佳的参数设置。
  • 计算复杂度:谱聚类算法的计算复杂度通常较高,特别是在处理大型数据集时。因此,在选择算法时需要考虑到计算资源和时间成本。
  • 数据预处理:在使用谱聚类之前,通常需要对数据进行适当的预处理,如缩放或归一化,以确保算法的有效性。
from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import SpectralClustering
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = SpectralClustering(n_clusters=2)
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.fit_predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

在这里插入图片描述

高斯混合模型——GaussianMixture(✔)

一、算法介绍

GaussianMixture 类实现了高斯混合模型(GMM),这是一种概率模型,表示数据点是由未知参数的有限数量的高斯分布混合生成的。GMM 是一种无监督学习算法,常用于聚类分析、概率密度估计等领域。

二、主要参数

  • n_components (int, default=1):混合模型中高斯分布的数量,即聚类的数量。
  • covariance_type ({‘full’, ‘tied’, ‘diag’, ‘spherical’}, default=‘full’):
    ‘full’:每个组件都有自己的协方差矩阵。
    ‘tied’:所有组件共享同一个协方差矩阵。
    ‘diag’:每个组件都有自己的对角协方差矩阵。
  • ‘spherical’:每个组件的协方差矩阵都是球面协方差矩阵,即对角线元素相同,非对角线元素为零。
  • tol (float, default=1e-3):EM(期望最大化)算法的收敛阈值。
  • reg_covar (float, default=1e-6):协方差矩阵对角线上的正则化项。
  • max_iter (int, default=100):EM 算法的最大迭代次数。
  • n_init (int, default=1):初始化EM算法的次数,用于找到最佳参数。
  • init_params ({‘kmeans’, ‘random’}, default=‘kmeans’):初始化方法,可以是 ‘kmeans’ 或 ‘random’。
  • weights_init (array-like of shape (n_components,), default=None):各个高斯分布的初始权重。
  • means_init (array-like of shape (n_components, n_features), default=None):各个高斯分布的初始均值。
  • precisions_init (array-like of shape (n_components, n_features, n_features), default=None):各个高斯分布的初始精度矩阵(协方差矩阵的逆)。

三、主要属性

weights_ (array-like of shape (n_components,)):每个高斯分布的权重。
means_ (array-like of shape (n_components, n_features)):每个高斯分布的均值。
covariances_ (list of array-like):每个高斯分布的协方差矩阵。其形状取决于 covariance_type 参数。
precisions_ (list of array-like):每个高斯分布的精度矩阵(协方差矩阵的逆)。
precisions_cholesky_ (list of array-like):每个高斯分布的精度矩阵的Cholesky分解。

四、主要方法

  • fit(X):从数据 X 中学习高斯混合模型。

  • predict(X):预测每个样本 X 属于哪个高斯分布(即哪个聚类)。

  • predict_proba(X):预测每个样本 X 属于各个高斯分布的概率。

  • score(X):返回给定数据 X 下模型的平均对数似然值。

  • sample(n_samples=1):从模型中生成新的样本。

五、注意事项

  • 选择合适的 n_components:n_components 参数的选择对模型性能至关重要,它决定了聚类的数量。可以使用如BIC(贝叶斯信息准则)等方法来选择合适的 n_components 值。

  • 正则化:当数据点不足或协方差矩阵难以估计时,可以通过设置 reg_covar 参数来避免协方差矩阵的奇异性。

  • 初始化方法:init_params 参数可以选择 ‘kmeans’ 或 ‘random’ 初始化方法。‘kmeans’ 方法通常更快且更稳定,但 ‘random’ 方法有时可能找到更好的局部最优解。

from numpy import unique
from numpy import where
from sklearn.datasets import make_classification
from sklearn.mixture import GaussianMixture
from matplotlib import pyplot
# 定义数据集
X, _ = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=4)
# 定义模型
model = GaussianMixture(n_components=2)
# 匹配模型
model.fit(X)
# 为每个示例分配一个集群
yhat = model.predict(X)
# 检索唯一群集
clusters = unique(yhat)
print(len(clusters))# 为每个群集的样本创建散点图
for cluster in clusters:
# 获取此群集的示例的行索引row_ix = where(yhat == cluster)# 创建这些样本的散布pyplot.scatter(X[row_ix, 0], X[row_ix, 1])# 绘制散点图
pyplot.show()

output

2

在这里插入图片描述

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

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

相关文章

【C#】字符串处理器

实现: 统计字符串中单词的数量。查找字符串中最长的单词,并显示其长度。将字符串中的所有单词首字母大写。将字符串中的所有单词反转。 要求: 使用面向对象的方式实现,包括至少一个类(例如 StringProcessor&#xf…

视频智能分析平台智能边缘分析一体机视频监控业务平台区域人数不足检测算法

智能边缘分析一体机区域人数不足检测算法是一种集成了先进图像处理、目标检测、跟踪和计数等功能的算法,专门用于实时监测和统计指定区域内的人数,并在人数不足时发出警报。以下是对该算法的详细介绍: 一、算法概述 智能边缘分析一体机区域…

怎么把pdf文件转cad图纸?方法分享!

怎么把pdf文件转cad图纸?在数字化时代,PDF和CAD作为两种常见的文件格式,各自在各自的领域发挥着重要作用。然而,当需要在两者之间进行转换时,许多人可能会感到困惑和无从下手。今天,我将为大家推荐三款强大…

【无标题】小红书618投放高效复盘|种草效果评估

618大促进入尾声,品牌投放是否达到预期目标?如何找准复盘重点?如何衡量种草效果?如何沉淀优质的策略? 基于这些问题,千瓜推出618小红书投放复盘攻略,帮助品牌厘清复盘思路,在大促后快…

数组和文本三剑客

数组: 数组的定义:在集合当中指定多个元素,元素的类型:整数,字符串,浮点数。 数组的作用:可以一次性的定义多个元素,可以为变量赋值提供便利。 数组的定义方法: 数组…

手机录屏声音怎么录?2个小妙招教会你

手机录制好的视频怎么没有声音?你是否也遇到了这个难题?在日常生活中,手机录屏功能已经成为我们生活和工作中的得力助手。而录屏的声音,作为录屏功能的重要组成部分,更是为我们的录制体验增添了不少色彩。那么&#xf…

SSA-CNN多输入时序|樽海鞘算法-卷积神经网络|Matlab

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&…

Termius for Mac/Win:跨平台多协议远程管理利器

Termius for Mac/Win是一款备受瞩目的跨平台多协议远程管理软件,以其卓越的性能、丰富的功能和便捷的操作体验,赢得了广大用户的青睐。无论是在企业IT管理、系统维护,还是个人远程连接、文件传输等方面,Termius都展现出了出色的实…

乾坤微服务的使用

前言: 在这里整理下用乾坤来开发微服务的一些资料。 使用好处: 使用乾坤可以实现什么效果呢?众所周知,前端的框架五花八门,react/vue/angular等各领风骚,那么如果我们有需要把不同技术栈的项目整合起来&…

Mysql启动报错:本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

某天开机,发现Mysql被异常关闭,并且启动不起来,出这篇文章也是为了下次遇到类似问题,迅速解决(请细读文章,因为第二个方案才是主要方案) 第一个解决方案 我采用的第一个方法查“端口占用“问题(因为这是一篇博客所以我写的操作比较详细为了方便后面看这篇博客的人,我自…

如何在前端项目中用字体图标替换图片,方便减小打包体积和统一切换颜色

1.进入阿里妈妈矢量图标图库 地址:阿里妈妈矢量图 2.搜索自己想要的图标 3.添加自己想要的图标 4.把刚才选的图标,添加到自己要下载的项目 5.把项目下载到本地 6.引入iconfont.css 在div上增加对应的类名就可以啦 下载的所有类名都在下面的demo_index…

MySQL从5.7升级到8.0步骤及其问题

MySQL从5.7升级到8.0步骤及其问题 前言 本文源自微博客,且以获得授权,请尊重版权。 一、需求背景 Docker环境下,MySQL5.7升级到8.0,数据迁移时使用的是mysqldump方式迁移。 二、迁移步骤 数据备份: docker exec -i 1…

python-画三角形

[题目描述] 输入一个正整数n,请使用大写字母拼成一个这样的三角形图案(参考样例输入输出):三角形图案的第1行有1个字母,第2行有2个字母,以此类推;在三角形图案中,由上至下、由左至右…

使用高德API计算两个地址的距离

要使用高德地图API来计算两个城市之间的距离,你需要首先在高德开放平台上注册并获取API密钥(AK)。以下是一个使用Java调用高德地图API来计算两个城市之间距离的示例代码。 步骤 1: 获取高德地图API密钥 访问高德开放平台(https:…

GIS设计与开发课程设计(三)

环境:Windows10专业版 ArcGIS10.2 ArcEngine10.2 Visual Studio 2019 因每个人电脑版本和软件版本不同,运行的结果可能不同 系列文章: GIS设计与开发课程设计(一) GIS设计与开发课程设计(二)…

Apple Watch开发入门知识,还是很有必要的

随着现在 Apple 生态圈的发展,越来越多的 App 会把自己的简化版从 iOS 迁移至 WatchOS(支付宝、微信、手Q、头条、QQ音乐、网易云音乐等等,都有Watch版App)。官方开发文档:Setting up a watchOS project | Apple Devel…

神经网络学习3-卷积层

膨胀卷积,也被称为空洞卷积或扩张卷积,是一种特殊的卷积运算,它在标准卷积的基础上引入了一个额外的超参数,即膨胀率(dilation rate)。这个超参数决定了在卷积核的元素之间插入多少额外的空间。通过这种方式…

04-对原生app应用中的元素进行定位

本文介绍对于安卓原生app应用中的元素如何进行定位。 一、uiautomatorviewer uiautomatorviewer是Android-SDK自带的一个元素定位工具,非常简单好用,可以使用该工具查看app应用中的元素属性,帮助我们在代码中进行元素定位。 1)使…

el-table 固定前n行 配合 max-height 生效

:row-class-name"TableRowClassName" 加上类名 <el-table:data"computedTableList"borderstyle"width: 100%":row-class-name"TableRowClassName"max-height"800"><el-table-column fixed prop"name"…

【OS基础】符合AUTOSAR标准的RTAOS-Alarms详解

目录 前言 正文 7.报警Alarms 7.1配置Alarms 7.1.1激活一个任务 7.1.2 设置一个事件 7.1.3报警回调Alarm Callback 7.1.4 增加计数器值 7.2设置Alarms 7.2.1 绝对Alarms 7.2.2 相对Alarm 7.3自启动Alarms 7.4 删除Alarms 7.5确认何时会发生Alarm 7.6非周期Alarm…