首页 > 编程语言 >机器学习_聚类算法详解

机器学习_聚类算法详解

时间:2024-06-03 17:31:40浏览次数:23  
标签:8.0 1.0 import labels 算法 详解 聚类 质心

聚类算法是无监督学习的一种,主要用于将数据集中的样本划分为若干个簇,使得同一簇内的样本具有较高的相似度,而不同簇之间的样本差异较大。以下是几种常见的聚类算法及其详细讲解:

1. K-means 聚类

原理

K-means 是一种迭代优化算法,目标是将数据集分成 K 个簇,每个簇由一个中心点(质心)表示。算法通过最小化样本到质心的距离平方和(即簇内平方误差)来确定最佳簇划分。

步骤:

  1. 随机选择 K 个初始质心。
  2. 分配每个样本到最近的质心,形成 K 个簇。
  3. 计算每个簇的质心(均值)。
  4. 重复步骤 2 和 3,直到质心不再变化或达到最大迭代次数。

损失函数
J = ∑ i = 1 K ∑ x ∈ C i ∥ x − μ i ∥ 2 J = \sum_{i=1}^{K} \sum_{x \in C_i} \|x - \mu_i\|^2 J=i=1∑K​x∈Ci​∑​∥x−μi​∥2
其中,( C_i ) 是第 i 个簇,( mu_i ) 是第 i 个簇的质心。

使用场景

适用于样本数量大、簇数已知的数据集,如图像压缩、市场细分。

优缺点

优点:

  • 简单易实现
  • 计算速度快

缺点:

  • 对初始质心敏感
  • 需要预定义簇数 K
  • 不适合非凸形状的簇
代码实例
from sklearn.cluster import KMeans
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)

# 预测簇标签
labels = kmeans.predict(X)
print(labels)

# 输出簇中心
centers = kmeans.cluster_centers_
print(centers)

2. 层次聚类(Hierarchical Clustering)

原理

层次聚类通过构建层次树(dendrogram)来实现对数据的逐层聚类。主要有两种方法:

  • 自底向上(凝聚法,agglomerative):每个样本开始作为一个簇,逐渐合并最近的簇,直到所有样本合并成一个簇。
  • 自顶向下(分裂法,divisive):从一个整体簇开始,逐步分裂成更小的簇,直到每个样本单独成为一个簇。

合并准则(凝聚法常用的距离度量):

  • 最短距离(单链接)
  • 最长距离(完全链接)
  • 平均距离
使用场景

适用于层次结构明显的数据,如基因表达数据、社会网络分析。

优缺点

优点:

  • 不需要预定义簇数
  • 能够发现层次关系

缺点:

  • 计算复杂度高
  • 对噪声和异常值敏感
代码实例
from sklearn.cluster import AgglomerativeClustering
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
agg_clustering = AgglomerativeClustering(n_clusters=2).fit(X)

# 预测簇标签
labels = agg_clustering.labels_
print(labels)

3. DBSCAN(Density-Based Spatial Clustering of Applications with Noise)

原理

DBSCAN 是一种基于密度的聚类算法,通过高密度区域形成簇。它能够发现任意形状的簇,并自动识别噪声点。

步骤:

  1. 对于数据集中的每个点,计算其ε-邻域内的点数。
  2. 如果某点的ε-邻域内的点数大于等于最小样本数(minPts),则认为该点是核心点,形成一个簇。
  3. 扩展簇:对每个核心点的ε-邻域内的点重复上述步骤,直到簇不再增长。
  4. 标记所有未分配到任何簇的点为噪声点。
使用场景

适用于噪声较多、簇形状复杂的数据,如地理空间数据、市场分析。

优缺点

优点:

  • 能发现任意形状的簇
  • 自动识别噪声

缺点:

  • 需要预定义参数 ε 和 minPts
  • 对参数敏感
代码实例
from sklearn.cluster import DBSCAN
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
dbscan = DBSCAN(eps=1.5, min_samples=2).fit(X)

# 预测簇标签
labels = dbscan.labels_
print(labels)

4. 高斯混合模型(Gaussian Mixture Model, GMM)

原理

GMM 假设数据是由多个高斯分布组成的混合模型,通过期望最大化(EM)算法估计每个高斯分布的参数,并计算每个样本属于各个高斯分布的概率。

步骤:

  1. 初始化高斯分布的参数(均值、方差、混合系数)。
  2. E步:计算每个样本属于各个高斯分布的后验概率。
  3. M步:根据后验概率更新高斯分布的参数。
  4. 重复 E 步和 M 步,直到参数收敛。
使用场景

适用于数据分布接近高斯分布的情况,如金融数据分析、图像处理。

优缺点

优点:

  • 能处理不同形状和大小的簇
  • 提供概率输出

缺点:

  • 需要预定义簇数
  • 对初始参数敏感
代码实例
from sklearn.mixture import GaussianMixture
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
gmm = GaussianMixture(n_components=2, random_state=0).fit(X)

# 预测簇标签
labels = gmm.predict(X)
print(labels)

# 输出高斯分布的参数
print(gmm.means_)
print(gmm.covariances_)

5. Mean Shift 聚类

原理

Mean Shift 是一种基于密度的聚类算法,通过不断移动每个点到其局部密度最大的位置来找到簇的中心。算法通过密度梯度上升(Mean Shift)迭代移动质心,直到收敛。

步骤:

  1. 初始化每个点为质心。
  2. 对每个质心,计算其窗口内的密度中心,并将质心移动到该位置。
  3. 重复步骤 2,直到质心收敛。
使用场景

适用于簇数量未知、密度分布明显的数据,如图像分割、模式识别。

优缺点

优点:

  • 不需要预定义簇数
  • 能发现任意形状的簇

缺点:

  • 计算复杂度高
  • 对带宽参数敏感
代码实例
from sklearn.cluster import MeanShift
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
mean_shift = MeanShift().fit(X)

# 预测簇标签
labels = mean_shift.labels_
print(labels)

# 输出簇中心
centers = mean_shift.cluster_centers_
print(centers)

总结
不同的聚类算法有各自的特点和适用场景。在实际应用中,选择适合的聚类算法需要根据数据的特点和具体需求进行权衡,并且可以通过实验和调参来优化聚类效果。

标签:8.0,1.0,import,labels,算法,详解,聚类,质心
From: https://blog.csdn.net/a6181816/article/details/139326568

相关文章

  • Python数据分析【Numpy系列】np.linspace()用法详解
    np.linspace()是NumPy库中一个非常有用的函数,它用于在指定的区间内生成等间距的样本值。这个函数非常适合在数值分析、数据可视化和信号处理等领域生成数据点。函数语法numpy.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None,axis=0)......
  • 文心一言 VS 讯飞星火 VS chatgpt (273)-- 算法导论20.2 8题
    八、假设设计了这样一个proto-vEB结构,其中每个簇数组仅有u14u^\frac{1}{......
  • C++实现线程池详解
    在现代软件开发中,高效地管理和利用计算资源是一项关键任务。线程池(ThreadPool)是一种非常有效的并发编程技术,它允许我们管理和重用一组线程,从而避免频繁创建和销毁线程带来的性能开销。1.线程池的基本概念线程池是一组预先创建的线程,这些线程等待并执行任务。当任务到达时,它......
  • 基于粒子群算法优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)
     ......
  • 【图像去噪】基于原始对偶算法优化的TV-L1模型进行图像去噪研究(Matlab代码实现)
    ......
  • 模式匹配---kmp算法
    模式匹配--Kmp算法暴力匹配暴力匹配,既普通模式匹配,主串一个一个地与子串进行比对,一旦匹配失败就跳回主串原指针的下一个重新回溯,子串跳回第一个,重新开始匹配。主串BABCBFDAB下标012345678子串BCB主串原指针指向下标为......
  • DevOps生命周期的8个阶段和DevOps pipeline 详解
    您可能也在探索DevOpspipeline或工作流的概念,这些术语可能会根据不同的解释者而有所交替使用。尽管如此,DevOps生命周期和DevOpspipeline这两个术语更常被提及。本文将首先阐述DevOps生命周期的概念,然后深入介绍DevOpspipeline。DevOps生命周期和DevOpspipeline的概述DevOps......
  • 求一个算法思路,类似一维装箱?
    有很多小矩形(膜材料和长度可能不一样,但是高度是统一的):a120,a250,b12,b200,c300,c450,…字母表示膜的材料,数值表示长度。要将这些矩形进行分类,变成更大的矩形(水平平铺,不同的膜材料可以放在一起,但是不同材质的矩形之间要留10毫米间距,相同材质的可以紧密接触)。比如:(a120,a250,c30......
  • 寻路算法---基于AutoCAD二次开发
    在CAD中绘制首尾相连的直线,并据此构件点与点之间的连接关系,考虑到可能会有线连接的地方有一定的距离delta 点的信息,用于最开始情况下的点的信息集合///<summary>///点对应的信息///</summary>publicclassQjPointInfo{///<summary>......
  • dotnet/.NET EF(Entity Framework)详解
    原文链接:https://upimg.baike.so.com/doc/6061191-6274247.html         https://blog.csdn.net/u013733643/article/details/123473628DOTNET就是.NET,严格说是:.NETFramework框架。但为什么叫DOTNET(.NET)呢?在计算机行业DOT是DistributedObjectTechnolo......