掘金 人工智能 08月01日
开发也能看懂的大模型:聚类
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

聚类作为一种无监督学习方法,旨在将数据划分为具有高内相似性、低外差异性的簇。本文深入介绍了聚类的基本原理,包括簇内紧凑性和簇间分离性目标,以及常用的距离度量。文章详细阐述了K-Means、层次聚类、DBSCAN、高斯混合模型和Mean-Shift等多种常见聚类算法的原理、特点与适用场景。此外,还探讨了聚类评估指标,如轮廓系数和簇内方差,并提供了客户细分、图像分割等实际应用案例。最后,通过K-Means的Python示例,直观展示了聚类过程,并介绍了使用肘部法则和Silhouette分数确定最优簇数的方法,为理解和应用聚类技术提供了全面指导。

🎯 **聚类的核心目标与度量**:聚类的根本在于将数据集划分为若干组(簇),其核心目标是最大化同一簇内样本的相似性(高簇内紧凑性)并最小化不同簇之间样本的差异性(强簇间分离性)。为实现此目标,需要借助多种距离度量方法,如欧几里得距离、曼哈顿距离、余弦相似度以及Jaccard相似系数,以量化样本间的相似或差异程度。

💡 **主流聚类算法及其特性**:文章介绍了多种主流聚类算法,如K-Means(简单高效,但对初始点和噪声敏感,适合球形簇)、层次聚类(无需预设簇数,生成树状结构,但计算复杂度高)、DBSCAN(基于密度,能自动确定簇数,对非球形簇和噪声处理优秀)、高斯混合模型(支持软聚类,适合复杂分布簇)以及Mean-Shift(无需指定簇数,对非球形簇效果好,计算复杂度较高)。每种算法都有其独特的原理和适用场景。

📊 **聚类效果的评估体系**:由于聚类是无监督学习,其效果评估至关重要。文章介绍了内在评估指标,如轮廓系数(衡量样本在自身簇内的紧密度与到最近簇的疏离度)和簇内方差(衡量簇内样本与簇中心的平均距离)。若有已知标签,则可使用外在评估指标,如纯度(衡量聚类结果中主要类别的占比)和调整兰德指数(度量聚类结果与真实标签的相似度)。

🚀 **聚类的广泛应用与实践**:聚类技术在多个领域有着广泛的应用,包括电商和银行中的客户细分、图像处理中的图像分割、文本分析中的文档分类、推荐系统中用户偏好分组以及生物信息学中的基因表达模式发现等。文章通过K-Means算法的Python示例,展示了如何生成数据、进行聚类并可视化结果,同时介绍了使用肘部法则和Silhouette分数来辅助确定最佳簇数,为实际应用提供了操作指南。

聚类(Clustering)简介

聚类是一种 无监督学习方法,用于将数据集划分为多个 组(簇,Clusters) ,使得组内样本之间的相似性尽可能高,组间样本的差异性尽可能大。它常用于数据探索、模式发现和降维。


1. 聚类的基本原理


2. 常见的聚类算法

(1)K-Means


(2)层次聚类(Hierarchical Clustering)


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


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


(5)Mean-Shift


3. 聚类评估指标

由于聚类是无监督学习,评估其效果需要特定的指标:

内在评估

外在评估

如果有已知标签,可以用分类指标评估聚类效果:


4. 实际应用

    客户细分:在电商、银行中根据用户行为特征划分客户群体。图像分割:通过像素特征对图像区域进行聚类。文档分类:根据文本相似性将文档聚类。推荐系统:基于用户偏好分组,为组内成员推荐类似的产品。生物信息学:基因表达聚类,发现生物学模式。

5. 使用示例:K-Means 聚类

1. 问题背景

假设我们有一组二维数据点,需要将这些点分成几个簇。每个簇代表一类相似的数据。

目标:利用 K-Means 算法对数据点进行聚类,并直观展示其聚类结果和算法步骤。


2. 数据生成与预处理

我们使用 make_blobs 方法生成二维数据,其中每个簇具有高斯分布,易于观察和分析。

import numpy as npfrom sklearn.datasets import make_blobsimport matplotlib.pyplot as plt# 生成示例数据X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)# 可视化数据点plt.scatter(X[:, 0], X[:, 1], s=50, cmap='viridis')plt.title("Generated Data")plt.xlabel("Feature 1")plt.ylabel("Feature 2")plt.show()

运行后,我们会看到一个随机分布的二维数据集,其中点主要集中在 4 个簇附近。


3. K-Means 聚类

接下来使用 KMeans 进行聚类,分析其关键流程:

from sklearn.cluster import KMeans# K-Means 聚类kmeans = KMeans(n_clusters=4, random_state=42)y_pred = kmeans.fit_predict(X)# 聚类中心centers = kmeans.cluster_centers_# 可视化结果plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', s=50)plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')plt.title('K-Means Clustering')plt.xlabel("Feature 1")plt.ylabel("Feature 2")plt.show()

4. 代码解析

    初始化

    kmeans = KMeans(n_clusters=4, random_state=42)
      n_clusters=4:指定聚类的簇数为 4。random_state=42:设置随机种子,保证实验结果的可重复性。

    拟合与预测

    y_pred = kmeans.fit_predict(X)

      fit_predict 方法会执行两个任务:

        拟合:根据数据找到最佳的簇中心。预测:为每个数据点分配所属簇的标签。

    聚类中心

    centers = kmeans.cluster_centers_
      返回聚类后每个簇的中心坐标。在结果中标记为红色 "X"。

K-Means 的聚类过程分为以下几步:

    初始化: 随机选择 4 个点作为初始聚类中心。点分配: 计算每个点到各聚类中心的距离,将点分配到最近的簇。中心更新: 对每个簇,重新计算其中心点(即簇内所有点的均值)。迭代: 重复步骤 2 和 3,直到聚类中心收敛或达到最大迭代次数。

可视化结果


完整代码:

import numpy as npfrom sklearn.datasets import make_blobsimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeans# 生成示例数据X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)# 可视化数据点plt.scatter(X[:, 0], X[:, 1], s=50, cmap='viridis')plt.title("Generated Data")plt.xlabel("Feature 1")plt.ylabel("Feature 2")plt.savefig('output.png')# K-Means 聚类kmeans = KMeans(n_clusters=4, random_state=42)y_pred = kmeans.fit_predict(X)# 聚类中心centers = kmeans.cluster_centers_# 可视化结果plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', s=50)plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')plt.title('K-Means Clustering')plt.xlabel("Feature 1")plt.ylabel("Feature 2")plt.savefig('output1.png')

5. 扩展:使用肘部法则确定簇数

KMeans中n_clusters参数的选择非常重要,过大或过小都会影响聚类效果。可以用肘部法则寻找最优值。

from sklearn.cluster import KMeansfrom sklearn.metrics import silhouette_scoreimport matplotlib.pyplot as pltfrom sklearn.datasets import make_blobs# 生成示例数据X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)# 使用肘部法则和 Silhouette 分数确定最优 K 值distortions = []silhouette_scores = []K = range(2, 10)for k in K:    kmeans = KMeans(n_clusters=k, random_state=42)    y_pred = kmeans.fit_predict(X)    distortions.append(kmeans.inertia_)    silhouette_scores.append(silhouette_score(X, y_pred))# 绘制结果plt.figure(figsize=(12, 5))plt.subplot(1, 2, 1)plt.plot(K, distortions, marker='o')plt.title("Elbow Method")plt.xlabel("Number of Clusters")plt.ylabel("Distortion")plt.subplot(1, 2, 2)plt.plot(K, silhouette_scores, marker='o', color='green')plt.title("Silhouette Score")plt.xlabel("Number of Clusters")plt.ylabel("Silhouette Score")plt.tight_layout()plt.savefig('output3.png')


Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

聚类 无监督学习 K-Means 数据分析
相关文章