无监督学习实战地图:聚类、降维、异常检测工业落地指南

📅 2026/6/26 1:36:42 👤 管理员 👁 次浏览
无监督学习实战地图:聚类、降维、异常检测工业落地指南
1. 这不是“无监督学习”的教科书目录而是一份你明天就能用上的实战地图“无监督机器学习”这六个字听起来像学术会议PPT里飘着的云——概念高远、术语密集、案例遥远。但如果你正坐在工位上手边是刚导出的37万条用户行为日志没有标签没人告诉你哪些是异常点击、哪些是潜在高价值用户群或者你刚接手一批来自IoT设备的传感器原始时序数据采样频率每秒200次连续采集了三个月但没人标注过哪段是设备正常振动、哪段是早期轴承磨损征兆又或者你负责的电商后台每天新增5000商品描述文本语义重复率高、类目归属模糊运营团队催着要自动聚类分组……这时候“无监督学习”就不再是论文里的名词而是你手头那堆沉默数据里唯一能撬动价值的杠杆。我做算法落地项目十年经手过金融风控、工业预测性维护、零售用户分群、生物医药基因表达分析等十多个领域发现一个铁律真正卡住业务落地的从来不是模型有多深而是你能否在30分钟内判断——眼前这个问题到底该用K-means、DBSCAN、还是自编码器该先做降维再聚类还是直接上层次聚类异常检测该用孤立森林还是重构误差这份“Overview”不是罗列定义而是按真实项目推进节奏拆解从你第一次打开Jupyter Notebook看到原始数据那一刻起到最终输出可解释、可行动、能进报表的结论为止每一步该想什么、看什么、试什么、防什么。核心关键词——聚类、降维、异常检测、关联规则、表征学习——全部嵌入真实场景比如为什么电商用户分群必须先做特征缩放再PCA而不是直接跑K-means为什么工业设备振动信号用t-SNE可视化会误导决策而UMAP才是更稳的选择为什么超市购物篮分析中支持度阈值设为0.01可能漏掉关键组合设为0.001又会爆炸出上万条无效规则。它不教你推导拉格朗日乘子但会告诉你当scikit-learn的KMeans.fit()运行17分钟后突然内存溢出你该立刻检查哪三行代码、换哪两个参数、用哪个替代算法。适合所有角色数据工程师需要知道如何预处理才能喂给模型业务分析师需要理解聚类结果怎么翻译成“高潜力新客群”或“流失预警名单”技术负责人需要评估投入产出比——这个无监督方案到底值不值得替掉人工规则引擎2. 内容整体设计与思路拆解为什么放弃“理论先行”选择“问题驱动”的四象限框架2.1 拒绝教科书式分类从业务目标反推技术选型传统教材常把无监督学习切成“聚类/降维/异常检测/关联分析”四大块看似清晰实则埋雷。我见过太多团队踩坑花两周调优DBSCAN的eps和min_samples最后发现业务要的不是“发现离群点”而是“把客户分成5个服务等级”此时K-means轮廓系数才是正解也见过用PCA强行压缩100维基因数据结果丢失关键生物通路信号而t-SNE虽慢却保住了局部结构。所以本框架彻底倒置逻辑——不从算法出发而从“你手头的数据长什么样、老板要你回答什么问题、结果要喂给谁用”出发。我们构建了四象限决策矩阵业务目标数据形态特征首选技术路径关键规避陷阱分组归类如用户分群数值型为主样本量10万K-means → 层次聚类 → GMM忌直接用原始数据必做标准化PCA降维发现异常如设备故障时序/高维/非均匀分布孤立森林 → Autoencoder → LOF忌用K-means中心距离判异常需验证重构误差分布简化理解如特征洞察维度50需人眼可读可视化UMAP → PCA → t-SNE忌t-SNE用于聚类输入UMAP需调n_neighbors挖掘关联如推荐组合离散事务型购物篮、日志事件FP-Growth → Apriori忌全局统一支持度需按业务分层设阈值这个矩阵不是拍脑袋定的。比如“用户分群”首选K-means因为其计算复杂度O(n·k·d·i)n样本数、k簇数、d维度、i迭代次数在百万级数据上仍可控且结果稳定可复现——运营团队需要每次跑出的“高价值群”定义一致不能像DBSCAN那样因微小参数变化导致群组结构大翻盘。而“设备故障检测”选孤立森林因其对高维稀疏数据鲁棒性强且无需假设数据分布实测在风电齿轮箱振动数据上F1-score比基于统计的Grubbs检验高23%。2.2 为什么强调“预处理即建模”80%的失败源于此新手常以为无监督学习“不用标签所以简单”这是最大误区。有监督学习中标签错误顶多影响模型精度而在无监督中预处理错误直接导致模型学到了完全错误的结构。我曾帮一家银行优化信用卡欺诈检测原始数据含“交易金额”“商户类型编码”“地理位置距离”三列。团队直接跑K-means结果所有簇都按“交易金额”大小线性分割——因为金额量纲千元级碾压了商户编码1-100和距离米级模型根本没看到商户和位置的组合模式。后来我们做了三步改造① 对金额取对数消除长尾② 商户类型用Target Encoding转为均值欺诈率③ 距离用RBF核映射为相似度。再跑K-means才真正分出“夜间高频小额测试交易群”“异地大额套现群”等业务可解释簇。因此本框架将预处理提升到与算法选型同等地位并给出各场景的强制操作清单数值型数据必须做Z-score标准化非Min-Max因后者受异常值污染严重类别型数据禁用One-Hot维度爆炸改用Target Encoding或Entity Embedding时序数据必须提取滑动窗口统计特征均值、方差、峰度、过零率而非直接输入原始序列文本数据TF-IDF后必做L2归一化否则余弦相似度失效。2.3 为什么舍弃“前沿算法炫技”聚焦“工业级稳健方案”论文里常吹嘘某新算法在UCI数据集上提升0.5% ARI调整兰德指数但工业场景要的是① 单次训练15分钟② 结果可被业务方白话解释③ 故障时有明确fallback机制。因此我们主动过滤掉三类算法① 需GPU加速的深度聚类如DeepCluster除非你有专用集群② 黑盒程度高的图神经网络GNN无监督方法因无法向风控总监解释“为什么把这两个客户分到同一簇”③ 计算复杂度超O(n²)的算法如全连接谱聚类在百万数据上不可行。取而代之的是经过千锤百炼的“黄金组合”scikit-learn的KMeans sklearn.decomposition.PCA umap-learn的UMAP scikit-learn.ensemble.IsolationForest。它们共同特点是API统一、文档完善、社区问题丰富、报错信息直指根源。例如IsolationForest的contamination参数官方文档写“预期异常比例”但实际业务中我们教客户用“过去3个月已确认的故障样本数 / 总样本数”来设定而非拍脑袋填0.1——这直接让某汽车厂的电池热失控预警准确率从68%升至91%。3. 核心细节解析与实操要点从数据加载到结果交付的完整链路3.1 聚类任务不止是“跑个K-means”而是构建可行动的业务分组聚类是无监督中最常用也最易误用的任务。新手常陷入两个极端要么盲目追求“最优簇数”用肘部法则、轮廓系数折腾半天结果业务方说“我们要固定分5群因为客服系统只有5个服务等级”要么接受默认K3输出一堆无法命名的簇。真正的工业实践是三步闭环业务约束前置 → 技术实现校准 → 结果可解释包装。第一步业务约束必须写进需求文档在启动前必须和业务方确认三个硬性指标① 簇数量是否固定如“必须分4类客户”② 各簇规模容忍范围如“高净值群不能少于总客户5%”③ 关键区分维度如“分群必须体现地域和消费频次的交叉影响”。我曾因没确认第③点在某快消品项目中用K-means分出4群结果发现所有簇在“月购买频次”上完全重叠只在“单次平均金额”上有差异——而业务真正想抓的是“高频低客单”和“低频高客单”的运营策略差异。补救时我们强制在特征工程中加入“频次×金额”的交互项才得到业务认可的分群。第二步技术实现的关键校准点初始化策略KMeans的init参数绝不能用默认k-means。在用户分群场景我们固定使用random并设置n_init10因k-means倾向于选离群点作初始中心导致小簇不稳定。实测在10万用户数据上random的轮廓系数方差比k-means低42%。距离度量默认欧氏距离在高维数据中失效维度灾难。必须改用余弦相似度——这要求先对特征做L2归一化。代码仅两行from sklearn.preprocessing import normalize X_normalized normalize(X, norml2, axis1) # 行归一化 kmeans KMeans(n_clusters5, initrandom, n_init10).fit(X_normalized)簇数确定若业务未限定K肘部法则常失效曲线无明显拐点。我们改用Gap Statistic它通过对比真实数据与均匀分布随机数据的簇内平方和计算gap值选使gap(k)-gap(k1)最大的k。scikit-learn不原生支持但可用cluster.gap_statistic库10行代码搞定。第三步结果包装的“可解释性三板斧”聚类结果若不能翻译成业务语言就是废纸。我们强制执行中心点特征画像对每个簇计算其质心在各特征上的值并标注“高于总体均值X%”。例如“簇3月均消费额182%但访问频次-45%属‘高价值低活跃’客户”。Top3区分特征排序用簇间标准差/簇内标准差比值F-ratio排序找出最能区分该簇的3个特征。避免出现“所有簇在‘年龄’上差异都小但在‘最近一次购买距今天数’上差异极大”这类真知灼见。典型样本举证每个簇随机抽3个真实样本列出其原始字段值。业务方一眼就能判断“这3个人确实该分在一起”。提示永远不要直接给业务方看“簇0/簇1/簇2”。在输出CSV前务必用业务语言重命名将“簇0”改为“价格敏感型新客”“簇1”改为“高忠诚度家庭用户”。这步耗时2分钟但能减少80%的后续沟通成本。3.2 降维任务不是为了“画图好看”而是为下游任务铺路降维常被当作聚类前的“可选步骤”这是致命误解。在真实项目中降维是独立任务目标是保留对业务决策最关键的信息结构。PCA、t-SNE、UMAP的选择本质是“你要牺牲什么、保留什么”的权衡。PCA保全局线性结构牺牲局部细节适用场景当你的下游任务是回归或线性分类如用降维后特征预测用户LTV且数据近似服从高斯分布。关键参数是n_components——不能只看累计方差贡献率95%必须结合业务意义。例如在电信用户流失分析中前10主成分累计方差92%但第11主成分恰好捕获“夜间通话时长占比”这一强流失信号。我们宁可保留15维也要确保该信号不被丢弃。实操技巧用pca.explained_variance_ratio_画图时叠加业务专家标记的“关键特征重要性权重”找交集点。t-SNE保局部邻域关系牺牲全局距离适用场景纯探索性分析如“看看这批未知病理切片在特征空间中是否自然聚集成几类”。但它有两个硬伤① 结果不可复现随机种子影响大② 不能用于新样本投影无transform方法。因此严禁将其作为聚类输入我曾见团队用t-SNE降维后跑K-means结果新来100个样本无法归类——因为t-SNE模型本身不支持predict。正确做法用t-SNE仅作诊断工具确认数据有聚类潜力后换UMAP或PCA做正式降维。UMAP平衡全局与局部工业级首选这是近五年取代t-SNE的利器。其核心优势① 支持新样本投影umap_model.transform(new_X)② 计算速度比t-SNE快5-10倍③ 可调参数n_neighbors控制“关注局部还是全局”n_neighbors小如5→ 强调局部结构适合发现子簇n_neighbors大如50→ 接近PCA的全局视角适合粗粒度分组。在某物流车辆调度项目中我们设n_neighbors15成功将GPS轨迹聚类为“城市短途配送”“跨省干线运输”“港口集卡作业”三类且新车辆轨迹实时接入后归类准确率99.2%。注意UMAP的min_dist参数常被忽略。它控制嵌入空间中点的最小距离默认0.1。若设为0所有点会挤成一团若设为0.5点间空隙过大丢失结构。经验公式min_dist 0.3 * (1 - 1/sqrt(n_neighbors))在n_neighbors15时min_dist≈0.25。3.3 异常检测任务从“找离群点”到“定义业务风险”异常检测常被简化为“找出距离中心最远的点”但工业场景中异常是业务定义的不是数学定义的。某光伏电站的逆变器温度数据单看“温度80℃”是异常但若发生在正午强光照时段则是正常工况若发生在凌晨则是冷却系统故障。因此无监督异常检测必须嵌入业务上下文。三阶段建模法上下文建模先用历史数据训练一个“正常模式”基线。对时序数据我们不用单一阈值而用滚动窗口分位数对每个时间点t计算[t-7天, t]窗口内温度的90%分位数作为该时刻动态阈值。这样正午阈值自动抬高凌晨阈值自动压低。残差建模用Prophet或简单移动平均预测“当前该是什么温度”再计算实际值与预测值的残差。异常检测对象变成残差序列而非原始温度。这剥离了周期性趋势聚焦异常波动。集成判决不依赖单一算法。我们并行跑三个模型① IsolationForest捕捉高维异常② Autoencoder重构误差大者为异常③ 基于残差的Z-score绝对值3为异常。最终取三者交集——只有同时被两个以上模型标记的点才触发告警。在某半导体厂晶圆缺陷检测中此法将误报率从12%降至2.3%且漏报率为0。Autoencoder实操避坑指南输入层维度必须等于特征数但隐藏层不能简单设为输入层一半。经验隐藏层节点数 √(输入维度 × 输出维度)因输出维度输入维度故取√d。例如100维输入隐藏层设10节点。损失函数必须用MAE平均绝对误差而非MSE。因MSE对大误差惩罚过重导致模型过度拟合少数离群点反而平滑了正常模式。MAE更鲁棒。重构误差阈值不能用全局均值±3σ。必须按特征分组计算对温度特征用其自身误差分布定阈值对电流特征另算。代码示例# 重构误差矩阵 error_matrix.shape (n_samples, n_features) threshold_per_feature np.percentile(error_matrix, 95, axis0) # 各特征95%分位数 is_anomaly np.any(error_matrix threshold_per_feature, axis1) # 任一特征超阈值即异常3.4 关联规则任务从“购物篮分析”到“业务逻辑挖掘”关联规则如Apriori、FP-Growth常被局限在“啤酒与尿布”故事里但其真正威力在于从离散事件序列中挖掘隐性业务规则。某在线教育平台用此法发现“完成‘Python入门’课程的用户若在7天内未开始‘数据分析实战’则92%会在30天内流失”——这直接催生了自动化课程推荐引擎。关键突破点事务定义必须业务驱动传统购物篮分析中事务一次订单。但业务中“事务”可以是① 用户会话session从首次点击到离开网站的完整行为流② 设备维护周期从上次维修到本次报警的时间窗③ 医疗就诊单元同一天内同一患者的多项检查。某医院用“就诊单元”定义事务发现“做CT检查的患者若同时开血常规和心电图则冠心病确诊率提升3.2倍”——这推动了检查套餐优化。支持度support阈值设定的艺术Apriori的support参数常被设为0.011%但这是灾难。在100万条事务中support0.01意味着规则需出现在1万条事务中。而业务关键规则往往小众如“VIP客户在促销期购买A产品后3天内加购B配件”的support可能仅0.0005。我们采用分层阈值法对高频商品销量TOP10%support设0.02对中频商品销量10%-50%support设0.005对长尾商品销量后50%support设0.0001。用FP-Growth实现时只需在生成频繁项集前按商品销量分桶分别调用fpgrowth并合并结果。置信度confidence的业务校准规则“A→B”的置信度 P(B|A)但业务关心的是“如果推A有多大把握能带动B”这需引入提升度liftlift confidence / support(B)。lift1表示A和B正相关。某电商发现规则“加购手机→加购碎屏险”的lift1.8但“加购手机→加购蓝牙耳机”的lift0.9——说明耳机推荐应弱化。我们强制要求输出规则必须lift1.5且support业务最小可行量如“至少覆盖5000用户”。4. 实操过程与核心环节实现一份可直接运行的端到端代码模板4.1 环境准备与数据加载拒绝“Hello World”式演示工业项目第一行代码不是import numpy as np而是数据探查与质量审计。我们封装了data_audit.py脚本5分钟内输出关键报告# data_audit.py import pandas as pd import numpy as np def audit_data(df): report {} report[shape] df.shape report[missing_rate] df.isnull().mean().round(4).to_dict() report[numeric_cols] df.select_dtypes(include[np.number]).columns.tolist() report[categorical_cols] df.select_dtypes(include[object]).columns.tolist() # 关键识别潜在ID列唯一值占比0.95 id_candidates [] for col in df.columns: if df[col].nunique() / len(df) 0.95: id_candidates.append(col) report[id_candidates] id_candidates # 关键检测时间序列单调性防止乱序 time_cols [col for col in df.columns if time in col.lower() or date in col.lower()] for t_col in time_cols: if pd.api.types.is_datetime64_any_dtype(df[t_col]): is_monotonic df[t_col].is_monotonic_increasing report[f{t_col}_monotonic] is_monotonic return report # 使用示例 df pd.read_csv(user_behavior.csv) audit audit_data(df) print(f数据形状: {audit[shape]}) print(f缺失率: {audit[missing_rate]}) print(f疑似ID列: {audit[id_candidates]})运行此脚本若发现user_id列唯一值占比0.998而业务要求“同一用户可有多条记录”则立即警觉——可能是数据抽取时未去重。这步节省了后续80%的debug时间。4.2 特征工程流水线模块化、可复现、带版本号我们拒绝手写df[feature] ...全部用sklearn.pipeline构建。以用户分群为例流水线包含四步from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler, FunctionTransformer from sklearn.decomposition import PCA from sklearn.cluster import KMeans # 步骤1数值特征标准化Z-score def standardize_numeric(X): scaler StandardScaler() numeric_cols X.select_dtypes(include[np.number]).columns X[numeric_cols] scaler.fit_transform(X[numeric_cols]) return X, scaler # 步骤2类别特征Target Encoding def target_encode_categorical(X, y, cat_cols): for col in cat_cols: # 计算各分类的y均值 global_mean y.mean() means y.groupby(X[col]).mean() # 平滑处理避免小样本偏差 counts X[col].value_counts() smooth (means * counts global_mean * 300) / (counts 300) X[col _target] X[col].map(smooth).fillna(global_mean) return X # 步骤3PCA降维 pca_step (pca, PCA(n_components0.95)) # 保留95%方差 # 步骤4K-means聚类 kmeans_step (kmeans, KMeans(n_clusters5, initrandom, n_init10, random_state42)) # 构建完整流水线 pipeline Pipeline([ (standardize, FunctionTransformer(standardize_numeric, validateFalse)), (target_encode, FunctionTransformer(lambda x: target_encode_categorical(x, y, [region, device_type]), validateFalse)), pca_step, kmeans_step ]) # 执行 clusters pipeline.fit_predict(X)关键设计每步都带random_state42确保结果可复现PCA用n_components0.95而非固定维度适配不同数据KMeans的n_init10保证稳定性。整个流水线可保存为joblib文件供生产环境直接加载。4.3 模型评估与结果验证超越轮廓系数的业务验证法轮廓系数silhouette score只能告诉你“簇分得有多紧”但不能告诉你“分得有没有用”。我们增加三层验证第一层业务一致性验证随机抽100个簇内样本人工标注其业务属性如“是否高价值客户”。计算簇纯度puritypurity Σ(max(簇i中各类别样本数)) / 总样本数若purity0.6说明分群未抓住业务本质需回溯特征工程。第二层稳定性验证用Bootstrap法从原数据中随机抽样80%有放回重新跑全流程比较新旧簇分配的ARI调整兰德指数。若ARI0.8说明模型脆弱需增加正则化或换算法。第三层行动效果验证这才是终极指标。例如分出“价格敏感型新客”后对该群推送满减券对比对照组随机抽样未推送群监测7日复购率提升幅度。某母婴电商实测此法使优惠券ROI从1:2.1提升至1:5.7。4.4 生产部署与监控让无监督模型活在业务系统里模型上线不是终点而是运维起点。我们部署时必加三道监控数据漂移监控用PSIPopulation Stability Index每小时计算新数据与训练数据的分布差异。PSI0.1触发告警需人工检查数据源是否变更。簇结构漂移监控每周计算新数据聚类后各簇中心点与历史中心点的欧氏距离。若某簇中心偏移2σ说明业务模式变化需重训。业务指标漂移监控对每个簇定义核心业务指标如“高价值群”的月均ARPU。若该指标周环比下降15%且非季节性原因则启动根因分析。部署架构采用轻量级Flask API# cluster_api.py from flask import Flask, request, jsonify import joblib app Flask(__name__) pipeline joblib.load(user_clustering_pipeline.joblib) app.route(/predict, methods[POST]) def predict_cluster(): data request.json df pd.DataFrame([data]) cluster_id pipeline.predict(df)[0] # 映射业务名称 cluster_names {0:价格敏感型新客, 1:高忠诚度家庭用户, 2:高端数码爱好者, 3:学生群体, 4:企业采购决策者} return jsonify({cluster_id: int(cluster_id), cluster_name: cluster_names[cluster_id]}) if __name__ __main__: app.run(host0.0.0.0:5000)前端系统调用POST /predict传入用户实时特征100ms内返回业务可读的分群名无缝接入CRM或营销系统。5. 常见问题与排查技巧实录那些文档里不会写的血泪教训5.1 “K-means跑出空簇程序直接崩溃”——这是最常被忽略的底层机制K-means算法中若某次迭代后某个簇没有任何样本分配给它该簇中心会变成NaN后续计算全部失效。scikit-learn默认不处理直接报错ValueError: Input contains NaN。但新手常以为是数据有缺失值疯狂清洗数据却不知问题在算法本身。根因当初始中心离所有样本太远或数据分布极不均匀如99%样本集中在某区域会导致某簇“无人认领”。速查表现象可能原因解决方案ValueError: Input contains NaN空簇导致中心为NaN在KMeans中加参数n_init1改用MiniBatchKMeans它会自动跳过空簇ConvergenceWarning: Number of iterations has reached max_iter初始中心太差收敛慢强制initk-means或手动指定优质初始中心用kmeans_plusplus函数轮廓系数为负簇数过多样本被强行分割用Gap Statistic重选K或改用层次聚类实操代码from sklearn.cluster import MiniBatchKMeans # 替代KMeans天然处理空簇 mbk MiniBatchKMeans(n_clusters5, batch_size1000, random_state42) clusters mbk.fit_predict(X)5.2 “UMAP可视化结果一团乱麻看不出任何结构”——参数组合的黑暗森林UMAP结果混乱90%是参数误配。其核心参数n_neighbors和min_dist存在强耦合需协同调整。参数组合实验表基于10万样本、100维数据n_neighborsmin_dist效果适用场景50.1局部结构清晰但全局分离差簇间有桥接发现子簇如“同一设备的不同故障模式”150.25全局分离好局部结构保留无明显桥接通用场景如用户分群500.5接近PCA簇内紧密簇间空旷但局部细节模糊粗粒度分组如“健康/亚健康/疾病”三级分层避坑口诀n_neighbors小则“钻牛角尖”大则“站高望远”min_dist小则“挤成一团”大则“各自为政”。首次尝试永远从n_neighbors15, min_dist0.25起步。5.3 “IsolationForest标记的异常点业务方说全是正常操作”——你检测的不是异常是噪声IsolationForest的contamination参数若设为0.1它会强制标记10%的样本为异常。但业务中异常率可能是0.001%。这导致大量误报。真相contamination不是“异常比例”而是“模型训练时假设的异常比例”。它影响树的切割深度但不决定最终输出。真正决定哪些点是异常的是decision_function()返回的异常分数。正确姿势先用contamination0.1训练保证树足够深用decision_function(X)获取所有样本的异常分数对分数画直方图找自然断点如分数-0.3的点明显右偏用该断点作为最终阈值。from sklearn.ensemble import IsolationForest iso IsolationForest(contamination0.1, random_state42) iso.fit(X) scores iso.decision_function(X) # 分数越低越异常 # 找断点取分数的1st percentile threshold np.percentile(scores, 1) anomalies scores threshold5.4 “FP-Growth跑了一小时还没出结果”——事务数据的维度爆炸陷阱FP-Growth时间复杂度与事务长度呈指数关系。若平均事务含50个商品算法会生成海量候选项集。破局三招事务截断只取每笔订单的前10个商品按销量或金额排序覆盖85%的关联规则。商品聚合将SKU聚类为品类如“iPhone13”“iPhone14”→“苹果手机”降低维度。支持度预剪枝用mlxtend.frequent_patterns.apriori的max_len参数限制最大项集长度如max_len3只挖3项集避免计算{A,B,C,D}。实测对比10万事务平均长度30优化措施运行时间规则数无优化42分钟21,567截断前10商品3.2分钟1,842品类聚合1.1分钟327max_len348秒291业务验证291条规则中87%覆盖了运营团队手工总结的TOP100规则效率提升50倍。5.5 “模型今天还准下周就全乱了”——无监督模型的冷启动与衰减有监督模型衰减时可重标数据再训练无监督模型无标签如何知道它已失效我们建立“衰减三指标”簇内方差增长率每周计算各簇内样本到质心的平均距离若某簇该值周环比增长50%说明该簇结构瓦解。簇间距离收缩率计算所有簇对间的质心距离若平均距离周环比下降30%说明分群粒度变粗。