从K-means到DBSCAN:六种聚类算法实战场景与Python代码解析
1. 聚类算法入门从超市货架到数据分群第一次接触聚类算法时我正站在超市的饮料区发呆。货架上的饮料被分门别类摆放碳酸饮料、果汁、矿泉水、功能饮料...这其实就是最直观的聚类场景。在数据科学中聚类算法就是帮我们完成类似工作的智能工具只不过处理的对象变成了数据点。与监督学习不同聚类属于非监督学习的范畴。想象你有一堆未贴标签的客户数据既不知道他们的消费等级也不清楚他们的兴趣偏好。这时候聚类算法就能帮你发现数据中自然形成的分组就像超市理货员根据饮料特性进行分类一样。常见的应用场景包括电商用户分群高价值客户识别异常检测信用卡欺诈识别图像分割医学影像分析文档归类新闻话题聚类在Python生态中scikit-learn提供了完整的聚类算法实现。下面这段代码展示了如何快速加载一个包含连续型和分类型特征的混合数据集import pandas as pd from sklearn.datasets import make_blobs # 生成模拟数据 X, y make_blobs(n_samples500, n_features2, centers4, cluster_std1.2, random_state42) # 添加分类特征 data pd.DataFrame(X, columns[feature1, feature2]) data[category] pd.cut(data[feature1], bins4, labels[A, B, C, D]) print(data.head())2. K-means最经典的球形聚类2.1 算法原理与实现K-means可能是最广为人知的聚类算法其核心思想简单到可以用幼儿园分糖果来解释老师要把糖果分给K个小朋友先随机选K个位置作为基地每个小朋友去最近的基地领取糖果然后根据已领取糖果重新计算基地位置重复这个过程直到基地不再移动。在数学上K-means通过最小化簇内平方和WCSS来实现这一过程from sklearn.cluster import KMeans import matplotlib.pyplot as plt # 肘部法则确定最佳K值 wcss [] for i in range(1, 11): kmeans KMeans(n_clustersi, initk-means, random_state42) kmeans.fit(X) wcss.append(kmeans.inertia_) plt.plot(range(1,11), wcss) plt.title(The Elbow Method) plt.xlabel(Number of clusters) plt.ylabel(WCSS) plt.show()2.2 实战陷阱与解决方案在实际项目中我发现K-means有几个常见坑点初始中心敏感随机初始可能导致次优解。解决方案是使用k-means初始化球形假设限制只适用于凸数据集。对于流形数据可以尝试谱聚类分类特征处理直接使用会扭曲距离计算。可以尝试独热编码或k-prototypes一个电商用户分群的完整案例# 数据预处理 from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_scaled scaler.fit_transform(X) # 最终聚类 optimal_k 4 final_kmeans KMeans(n_clustersoptimal_k, initk-means) clusters final_kmeans.fit_predict(X_scaled) # 结果可视化 plt.scatter(X[:,0], X[:,1], cclusters, cmapviridis) plt.scatter(final_kmeans.cluster_centers_[:,0], final_kmeans.cluster_centers_[:,1], s300, cred, markerX) plt.title(Customer Segmentation Results) plt.show()3. 处理分类数据k-modes与k-prototypes3.1 k-modes分类变量的专属方案当数据集全是分类变量时比如问卷调查的选项数据欧氏距离就失效了。这时需要改用汉明距离计算的k-modes算法。我在一个市场调研项目中用它成功划分了消费者生活方式from kmodes.kmodes import KModes # 模拟分类数据 categorical_data np.random.choice([A,B,C], size(500,3)) # k-modes聚类 km KModes(n_clusters3, initHuang, n_init5) clusters km.fit_predict(categorical_data) # 查看各簇模式 for i, mode in enumerate(km.cluster_centroids_): print(fCluster {i} mode: {mode})3.2 k-prototypes混合数据的最佳拍档现实中的数据往往是混合类型的。上周分析银行客户数据时就同时包含年龄连续、存款金额连续和职业分类等特征。k-prototypes完美解决了这个问题from kmodes.kprototypes import KPrototypes # 标记分类列索引 categorical_cols [2, 3] # 混合聚类 kproto KPrototypes(n_clusters3, initHuang, verbose2) clusters kproto.fit_predict(data, categoricalcategorical_cols) # 分析结果 pd.crosstab(clusters, data[职业])4. DBSCAN应对不规则形状的密度聚类4.1 算法核心参数解析DBSCAN是我处理异常检测的利器它不需要指定簇数量而是通过密度可达性来发现任意形状的簇。两个关键参数eps邻域半径min_samples核心点所需的最小邻居数在信用卡欺诈检测中我这样调参from sklearn.cluster import DBSCAN from sklearn.neighbors import NearestNeighbors # 寻找最佳eps nn NearestNeighbors(n_neighbors5).fit(X) distances, _ nn.kneighbors(X) distances np.sort(distances[:,4], axis0) plt.plot(distances) plt.xlabel(Points) plt.ylabel(5-NN Distance) plt.grid() plt.show() # 拐点处作为eps4.2 实战应用技巧DBSCAN处理噪声的能力令人印象深刻。在电商评论分析中我用它分离了正常评论和spam# 文本向量化 from sklearn.feature_extraction.text import TfidfVectorizer tfidf TfidfVectorizer(max_features1000) X tfidf.fit_transform(reviews) # DBSCAN聚类 db DBSCAN(eps0.5, min_samples5) clusters db.fit_predict(X.toarray()) # 噪声点分析 noise_reviews np.array(reviews)[clusters -1] print(Detected spam examples:, noise_reviews[:3])5. 高级聚类技术GMM与层次聚类5.1 高斯混合模型(GMM)当数据呈现椭圆形分布时GMM比K-means更合适。它假设数据由多个高斯分布混合而成通过EM算法估计参数from sklearn.mixture import GaussianMixture gmm GaussianMixture(n_components3, covariance_typefull) gmm.fit(X) probs gmm.predict_proba(X) # 概率聚类可视化 plt.scatter(X[:,0], X[:,1], cprobs.argmax(axis1), alpha0.4) plt.title(GMM Clustering with Probability) plt.show()5.2 层次聚类实战层次聚类特别适合需要簇层级关系的场景比如物种分类。我用它分析过植物特征数据from scipy.cluster.hierarchy import dendrogram, linkage from sklearn.preprocessing import normalize # 数据标准化 X_normalized normalize(X) # 绘制树状图 linked linkage(X_normalized, ward) plt.figure(figsize(12,6)) dendrogram(linked, orientationtop) plt.title(Hierarchical Clustering Dendrogram) plt.show()6. 算法选型指南与性能对比6.1 决策流程图根据我的经验算法选择可以遵循以下路径数据是否包含分类特征 → 是考虑k-modes/k-prototypes簇形状是否已知为球形 → 否尝试DBSCAN/GMM是否需要自动确定簇数 → 是DBSCAN/层次聚类数据量是否很大 → 是MiniBatchKMeans6.2 关键指标对比算法时间复杂度适用场景优点缺点K-meansO(n)球形簇简单快速需指定K值DBSCANO(nlogn)任意形状自动找簇参数敏感GMMO(n²)椭圆簇概率输出计算量大层次O(n³)小数据集可视化好不可逆7. 综合案例客户价值分析系统最近为零售企业搭建的客户分群系统整合了多种算法# 数据预处理管道 from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer preprocessor ColumnTransformer( transformers[ (num, StandardScaler(), numerical_cols), (cat, OneHotEncoder(), categorical_cols) ]) # 自动化聚类选择 from sklearn.base import BaseEstimator, ClusterMixin class AutoCluster(BaseEstimator, ClusterMixin): def __init__(self, algorithmauto): self.algorithm algorithm def fit(self, X, yNone): if self.algorithm auto: if X.shape[1] 10: # 高维数据 self.model DBSCAN() else: self.model KMeans() return self def predict(self, X): return self.model.fit_predict(X) # 完整流程 pipeline Pipeline([ (preprocess, preprocessor), (cluster, AutoCluster()) ])在真实业务场景中没有放之四海而皆准的最佳算法。我的经验是先用K-means基线测试再根据数据特性逐步优化。记得保存每次实验的轮廓系数和Calinski-Harabasz指数这些指标能帮你客观评估不同算法的表现。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2525459.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!