聚类是无监督学习框架中的核心任务之一,目标是发现数据中的隐含结构,将样本自动分组为若干簇。通过计算样本之间的相似性或距离,同一簇内的样本尽可能相似,不同簇之间的差异尽可能大。
在Python生态中,常用的聚类指标包括轮廓系数、CH 指数等,用于衡量簇的紧凑度和分离度。它们帮助我们在没有标签的场景下理解数据结构。
基于距离的聚类,如K-Means及其变体,通常假设簇形状接近球状并对异常值敏感。K-Means通过最小化平方误差来迭代分配与更新,适合大规模数据。
基于密度的聚类,如DBSCAN和OPTICS,能够发现任意形状的簇并对噪声鲁棒,但对参数较敏感。层次聚类通过逐步合并或分裂簇,提供树状结构的簇层级,便于多尺度分析。
在scikit-learn中,KMeans是最常用的聚类实现之一,提供了简单直观的接口和周边的评估工具。对于大规模数据,MiniBatchKMeans通过分批更新实现更高的吞吐量。
使用要点包括选择簇个数、随机种子、以及初始化方法。下面给出一个简单示例,演示如何从原始数据拟合一个 KMeans 模型并获取簇标签。
from sklearn.cluster import KMeans import numpy as np# 假设 X 是 n_samples x n_features 的数值矩阵 X = np.random.rand(100, 4)kmeans = KMeans(n_clusters=3, random_state=42).fit(X) labels = kmeans.labels_ centroids = kmeans.cluster_centers_
如果数据规模较大,MiniBatchKMeans提供了更快的训练时间,并能在内存受限环境中工作。下面是一个对比示例。
from sklearn.cluster import MiniBatchKMeans mbk = MiniBatchKMeans(n_clusters=3, batch_size=100, random_state=42) mbk.fit(X) labels = mbk.labels_
DBSCAN通过距离阈值和最小样本数来定义簇,能有效处理噪声数据。AgglomerativeClustering 等层次聚类实现,允许通过不同距离度量和链接策略探索簇的层级结构。
在 sklearn 中,常用的距离度量包括欧氏距离、曼哈顿距离等;链接策略有单链接、完全链接、平均链接等。下面给出一个 DBSCAN 的简单示例。
from sklearn.cluster import DBSCAN # 假设 X 为数值型数据矩阵 db = DBSCAN(eps=0.5, min_samples=5).fit(X) labels = db.labels_ # -1 表示噪声点
在聚类任务中,数据预处理与特征工程决定了模型的可分离性。常用步骤包括清洗缺失值、标准化/归一化、以及对定性特征的编码。标准化使不同特征拥有相似的尺度,避免对聚类结果产生偏置。
特征工程的关键在于提取对聚类有辨识度的信号,例如对时间序列数据进行滚动统计、对文本数据进行向量化等。通过这些操作,可以提升簇的紧凑度与分离度。
在无标签数据场景下,我们常用的评估指标包括轮廓系数、Davies-Bouldin 指数和Calinski-Harabasz 指数等。它们从不同维度衡量簇的质量,帮助选择合适的簇数和算法。
评估时要注意数据分布对指标的影响,例如高维数据可能需要先进行降维或使用对高维鲁棒的指标。综合多种指标的结果,通常能更稳健地指导模型选择。
实战中,常从原始数据进入,先进行清洗与整型/数值化处理,再进行缩放与降维。使用 pandas 读取数据,结合 StandardScaler 实现标准化。
下面给出一个简化的数据准备与缩放流程的代码片段,用于后续聚类分析的输入。
import pandas as pd from sklearn.preprocessing import StandardScalerdf = pd.read_csv('data.csv') X = df.drop(columns=['id', 'label'], errors='ignore').valuesscaler = StandardScaler() X_scaled = scaler.fit_transform(X)
此外,训练数据与评估数据分离原则在无监督学习中也需要考虑,确保模型对真实数据的泛化能力。这样可以在后续的生产环境中保持稳定的聚类结构。
将训练得到的簇标签映射回业务字段时,结果解释是关键。通过对每个簇的中心特征进行描述、以及对簇内分布的统计,可以实现对业务用户的直观解释。
import numpy as np import pandas as pd# 假设 X_scaled 是已处理好的特征矩阵,labels 是聚类结果 df = pd.DataFrame(X_scaled, columns=['f1','f2','f3','f4']) df['cluster'] = labels# 计算每个簇的均值 centroid_summary = df.groupby('cluster').mean() print(centroid_summary)
最后,部署与监控阶段需要将聚类分析嵌入工作流,确保数据输入的持续一致性,及对模型偏离的及时发现。
在高维场景下,直接聚类往往效率低下且易受“距离俗化”影响。常用策略包括在PCA、UMAP等降维后再进行聚类,或结合特征选择保留最具判别力的特征。
如果降维后的表示仍然保留了簇结构,可以通过可视化来辅助结果解读,例如投影到二维后的结构图。降维的方法选择应结合数据性质与任务需求。
from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans# 假设 X 是高维数据 scaler = StandardScaler() X_scaled = scaler.fit_transform(X)# 先降维到 2 维 pca = PCA(n_components=2) X_pca = pca.fit_transform(X_scaled)kmeans = KMeans(n_clusters=4, random_state=0).fit(Xpca) labels = kmeans.labels
不同的聚类指标对不同簇结构的偏好不同。例如 轮廓系数 是基于簇内相似度与簇间相似度综合评估的一个常用指标。对于非球状簇,DBSCAN 与 OPTICS 的参数选择尤为重要。
此外,Calinski-Harabasz 指数 与 Davies-Bouldin 指数 提供了对簇分离与紧凑度的额外视角。在高维场景中,多指标并行评估通常能减少对单一指标的过拟合。
from sklearn.metrics import silhouette_score
X_pca 是降维后的特征矩阵,labels 是聚类结果
score = silhouette_score(X_pca, labels) print(“Silhouette Score:”, score)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/249811.html