共计 1515 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
聚类算法在实际应用中常常面临几个典型问题:

- 噪声敏感 :传统算法如 K -Means 对异常值非常敏感,容易导致质心偏移
- 维度灾难 :当特征维度超过几十维时,距离计算失效(所有点都趋于等距离)
- 评估困难 :无监督学习缺乏明确标签,需要依赖轮廓系数等间接指标
技术方案
数据预处理
- RobustScaler 标准化 :用中位数和四分位数缩放,比 StandardScaler 更能抵抗异常值
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler(quantile_range=(25, 75))
- PCA 降维 :保留 95% 方差的同时压缩维度
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95, svd_solver='full')
模型选型
- K-Means:适合球形分布、簇大小均匀的场景
- DBSCAN:适合不规则形状、能自动发现噪声点
- GMM:适合概率密度分布不同的重叠集群
调优方法
- 网格搜索模板 :
from sklearn.model_selection import GridSearchCV
param_grid = {'n_clusters': range(3,8),
'init': ['k-means++', 'random']
}
grid = GridSearchCV(KMeans(), param_grid, cv=3)
- 双指标验证 :同时计算轮廓系数和 Calinski-Harabasz 指数
from sklearn.metrics import silhouette_score, calinski_harabasz_score
silhouette = silhouette_score(X, labels)
ch_score = calinski_harabasz_score(X, labels)
完整代码示例
# 构建完整 Pipeline
from sklearn.pipeline import make_pipeline
cluster_pipe = make_pipeline(RobustScaler(),
PCA(),
KMeans(n_init='auto')
)
# 可视化函数
import matplotlib.pyplot as plt
def plot_clusters(X_2d, labels):
plt.scatter(X_2d[:,0], X_2d[:,1], c=labels, cmap='viridis')
plt.colorbar()
plt.show()
生产环境建议
- 大数据处理 :
from sklearn.cluster import MiniBatchKMeans
mbk = MiniBatchKMeans(batch_size=1024)
- 类别平衡 :在聚类前使用 SMOTE 过采样少数类
- 分布式计算 :推荐使用 Spark MLlib 的 BisectingKMeans
性能优化
- 时间复杂度对比 :
- K-Means: O(nkI*d)
- DBSCAN: O(n log n)(使用 KDTree 时)
- 替代 Elbow 法 :建议使用 Gap Statistic 方法
from gap_statistic import OptimalK
optimalk = OptimalK()
n_clusters = optimalk(X, cluster_array=range(1, 10))
延伸思考
- 如何处理实时流入的动态数据?
- 当特征包含分类变量时如何改进距离度量?
- 怎样将聚类结果转化为监督学习的特征?
通过这套方案,我们在电商用户分群项目中将轮廓系数从 0.3 提升到 0.52。关键点在于:先用 RobustScaler+PCA 构建稳定特征空间,再通过网格搜索找到最优参数组合。
正文完
