【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.rhkb.cn/news/355211.html

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

相关文章

MySQL之复制(七)

复制 定制的复制方案 分离功能 许多应用都混合了在线事务处理(OLTP)和在线数据分析(OLAP)的查询。OLTP查询比较短并且是事务型的。OLAP查询则通常很大,也很慢,并且不要求绝对最新的数据。这两种查询给服务器带来的负担完全不同,因此它们需…

Linux系统部署Samba服务,共享文件夹给Windows

Samba服务是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。 Samba服务是连接Linux与Windows的桥梁,它通过实现SMB(Server Message Block)协议来允许跨平台的文件和打印机共享。该服务不仅支持Linux和…

用React编写一个密码组件表单

theme: condensed-night-purple highlight: atelier-cave-light 背景介绍 我们在使用网站或者应用程序的登录界面或创建帐户界面时,往往避免不了需要用户输入密码这一步骤,而用户是否可以选择看见他们输入的密码是十分重要的一项功能。尤其是在当输入的…

20240620每日后端---------Spring Boot中的 5 大设计模式最佳实践和示例 这些是我经常使用的设计模式并且非常喜欢

在本文中,我们将深入探讨五种基本设计模式,并探讨在 Spring Boot 项目中有效应用它们的最佳实践。每个模式都将附有一个实际示例来演示其实现。 单例模式 Singleton 模式确保一个类只有一个实例,并提供对它的全局访问点。这对于管理资源&am…

【车载开发系列】CAN通信总线再理解(中篇)

【车载开发系列】CAN通信总线再理解(中篇) 九. CAN总线标准十. CAN物理层十一. CAN数据链路层1)CAN的通信帧类型2)CAN的标准帧格式1. CAN ID2. 数据场 3)CAN总线仲裁 十二. CAN应用层1)CANopen2&#xff09…

linux如何部署前端项目和安装nginx

要在Linux上部署前端项目并安装Nginx,你可以按照以下步骤操作: 安装Nginx: sudo apt update sudo apt install nginx 启动Nginx服务: sudo systemctl start nginx 确保Nginx服务开机自启: sudo systemctl enable nginx 部署前端项目,假设前…

Ruby on Rails Post项目设置网站初始界面

在构建了Ruby的Web服务器后,第三步就可以去掉框架的官方页面,设置自己的网页初始页了。 Linux系统安装Ruby语言-CSDN博客 、在Ubuntu中创建Ruby on Rails项目并搭建数据库-CSDN博客、 Ruby语言建立Web服务器-CSDN博客 了解Ruby onRails项目中的主要文件…

Srouce Insight 4出现乱码

今天用SI4打开一个工程文件,一打开发现注释全是乱码。中文全部看不出来,英文和数字可以看得出来。 那是因为中文的编码格式不算特别兼容。所以需要调整编码格式。 于是我在这里调整了编码格式: 找到菜单的Options-Preferences里面的Files 调…

《计算机英语》Unit1 计算机概述

期末试卷组成 1、选择20道 2、判断20道 3、词汇翻译(单词词组,参照课后习题) 4、翻译2道(一道原题,参照作业) Unit One Computer Overview 单元1 计算机概述 algorithm n. 算法 operate …

k8s之kubelet证书时间过期升级

1.查看当前证书时间 # kubeadm alpha certs renew kubelet Kubeadm experimental sub-commands kubeadm是一个用于引导Kubernetes集群的工具,它提供了许多命令和子命令来管理集群的一生周期。过去,某些功能被标记为实验性的,并通过kubeadm a…

CVPR 2024揭幕,清华大学论文接收量霸榜,轻松碾压斯坦福、麻省理工

CVPR2024 会议之眼 快讯 会议介绍 2024 年 CVPR (Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议,于6月17日至21日正在美国西雅图召开。CVPR是计算机视觉和模式识别领域的顶级会议之一。与ICCV和ECCV并称为计算…

Java基础 - 练习(四)打印九九乘法表

Java基础练习 打印九九乘法表&#xff0c;先上代码&#xff1a; public static void multiplicationTable() {for (int i 1; i < 9; i) {for (int j 1; j < i; j) {// \t 跳到下一个TAB位置System.out.print(j "" i "" i * j "\t"…

【全网最全最详细】RabbitMQ面试题

一、说下RabbitMQ的架构大致是什么样的&#xff1f; RabbitMQ是一个开源的消息中间件&#xff0c;用于在应用程序之间传递消息。它实现了AMQP&#xff08;高级消息队列协议&#xff09;并支持其它消息传递协议&#xff0c;例如STOMP&#xff08;简单文本定向消息协议&#xff…

【QT5】<重点> QT多线程

文章目录 前言 一、QThread创建多线程 二、QMutex基于互斥量的同步 三、QReadWriteLock线程同步 四、QWaitCondition线程同步 五、QSemaphore基于信号量的同步 前言 本篇记录学习QT多线程的知识&#xff0c;参考视频13.1QThread创建多线程程序_哔哩哔哩。若涉及版权问题…

LeetCode 338.比特位计数

各位朋友们&#xff0c;大家好啊&#xff0c;今天此题我用的方法比较好理解&#xff0c;但时间复杂度比较高如果大家觉得可以的话&#xff0c;不妨给个免费的赞吧&#xff0c;谢谢了^ _ ^ 1.题目要求如图所示: 2.做题步骤: 1.先计算总共多少个数: int count 0;int number 0;…

基于C#开发web网页管理系统模板流程-主界面密码维护功能完善

点击返回目录-> 基于C#开发web网页管理系统模板流程-总集篇-CSDN博客 前言 紧接上篇->基于C#开发web网页管理系统模板流程-主界面统计功能完善-CSDN博客 一个合格的管理系统&#xff0c;至少一定存在一个功能——用户能够自己修改密码&#xff0c;理论上来说密码只能有用…

嵌入式实验---实验四 DMA传输实验

一、实验目的 1、掌握STM32F103DMA传输程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、利用外部按键KEY1来控制DMA的传送&#xff0c;每按一次KEY1&#xff0c;DMA就传送一次数据到USART1&#xff08;串口1&#xff09;&#xff1b; 2、该串口…

网络编程(二)TCP编程 TCP粘包问题

文章目录 一、TCP网络编程&#xff08;一&#xff09;流程&#xff08;二&#xff09;相关函数1. socket2. bind3. listen4. accept5. connect 二、收发函数&#xff08;一&#xff09;send函数&#xff08;二&#xff09;recv函数 三、TCP粘包问题&#xff08;一&#xff09;将…

Linux:文件描述符

文件描述符实际上就是一个小整数 0 & 1 & 2 Linux进程默认情况下会有3个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c; 标准输出1&#xff0c; 标准错误2. 0,1,2对应的物理设备一般是&#xff1a;键盘&#xff0c;显示器&#xff0c;显示器 所以输入输…

【因果推断python】46_估计量2

目录 连续型干预变量案例 非线性处理效果 关键思想 连续型干预变量案例 目标转换方法的另一个明显缺点是它仅适用于离散或二元处理。这是你在因果推理文献中经常看到的东西。大多数研究都是针对二元干预案例进行的&#xff0c;但您找不到很多关于连续干预的研究。这让我很困…