ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

无监督学习核心原理与实战:从聚类降维到大模型预训练

无监督学习核心原理与实战:从聚类降维到大模型预训练 1. 从“有监督”到“无监督”AI学习的范式跃迁最近在整理自己的AI学习笔记翻到了“无监督学习”这个章节发现很多刚入门的朋友对这个概念的理解还停留在“没有标签的数据”这个层面。这其实有点可惜因为无监督学习远不止于此它更像是一种让机器自己去“发现”世界规律的能力而不是被动地“记住”我们告诉它的答案。想想看我们人类认识世界最开始不也是通过观察、摸索、归纳而不是靠别人给每样东西都贴上标签吗无监督学习就是试图让AI也拥有这种“自驱式”探索的能力。在当前的AI热潮里无论是大模型预训练、智能体AI Agent的涌现还是各种AI应用开发无监督学习的影子无处不在。比如一个AI聊天助手能理解你模糊的意图一个推荐系统能挖掘你潜在的兴趣背后都离不开无监督学习对海量无标签数据的“消化”和“理解”。它解决的恰恰是“数据标注成本高昂”和“世界知识无穷无尽”这对核心矛盾。所以无论你是想深入理解大模型的工作原理还是想自己动手开发一个能“自主进化”的AI应用无监督学习都是必须啃下来的硬骨头。这篇内容我就结合自己的实践和踩过的坑来聊聊无监督学习的核心门道。2. 无监督学习的三大核心任务聚类、降维与关联无监督学习的目标很明确从没有标签的数据中找出内在的结构或规律。这听起来有点玄乎但落实到具体任务上主要可以归结为三大类聚类、降维和关联分析。理解这三者的区别和联系是上手实操的第一步。2.1 聚类物以类聚人以群分聚类的目标是把相似的数据点自动分到同一个组簇里。这是最直观的无监督任务。比如你有一堆用户的行为数据浏览时长、点击品类、购买频率但不知道他们具体属于哪类用户。通过聚类算法机器可以自动把“高频购买母婴用品”的用户归为一类把“只浏览不购买”的用户归为另一类。核心算法与实践选择K-Means这是最经典、最常用的聚类算法思想简单粗暴先随机指定K个中心点然后把每个点分配给最近的中心点再根据分配结果更新中心点位置如此迭代直到稳定。它的优点是速度快适合处理大规模数据。但缺点也很明显你需要预先指定K聚类的数量而且它对初始中心点的选择敏感对非球形分布的数据效果不好。实操心得如何确定K值除了业务经验可以用“肘部法则”。计算不同K值下的聚类误差如所有点到其所属中心点的距离平方和画成折线图。误差下降速度由快变慢的那个“拐点”往往就是合适的K值。另外跑K-Means前一定要对数据做标准化如Z-Score否则量纲大的特征会主导距离计算。DBSCAN这个算法我特别喜欢因为它不需要预先指定簇的数量而且能发现任意形状的簇还能识别出噪声点离群点。它的核心思想是基于密度一个簇是由密度相连的点的最大集合构成。实操心得DBSCAN有两个关键参数eps邻域半径和min_samples核心点所需的最小邻居数。调参时我常用K距离图来辅助确定eps计算每个点到其第min_samples个最近邻的距离并排序绘图。距离的突变点可以作为eps的参考。DBSCAN对参数非常敏感需要结合业务理解反复调试。层次聚类它通过计算数据点间的相似度构建一个树状的聚类层次结构树状图。你可以从上往下切割分裂或从下往上合并凝聚。好处是可以通过树状图直观地看到不同层次的聚类结果无需预先指定簇数。实操心得凝聚式层次聚类更常用。关键在选择“连接方式”计算簇间距离的方法单连接最近点距离容易形成链状簇完全连接最远点距离倾向于形成紧凑的球状簇平均连接是折中选择。计算开销大不适合大数据集。注意聚类结果没有绝对的对错只有业务上是否合理。一定要把聚类结果拿回业务场景中验证看看每个簇的用户画像、商品特征是否符合常识。聚类常常是探索性数据分析的第一步为后续的精细化运营提供方向。2.2 降维化繁为简抓住本质当数据特征成百上千时比如一张图片的像素我们就会面临“维度灾难”计算复杂度剧增且很多特征可能是冗余或噪声。降维的目标就是在尽可能保留原始数据重要信息的前提下将高维数据映射到低维空间。主成分分析PCA这是线性降维的绝对主力。PCA寻找数据方差最大的方向主成分作为新的坐标轴。第一个主成分保留最大方差第二个与第一个正交且保留次大方差以此类推。原理拆解假设数据点像一团椭球形的云。PCA做的就是找到这团云最“长”的方向第一主成分然后找到与它垂直的第二“长”的方向第二主成分。在新的坐标系由主成分构成下描述数据就能用更少的维度抓住其最主要的形态。实操步骤与坑点中心化必须先将每个特征减去其均值使数据均值为0。计算协方差矩阵表征特征之间的线性关系。特征值分解对协方差矩阵进行分解得到特征值和特征向量。特征向量就是主成分方向对应的特征值大小表示该方向上方差的大小。选择主成分按特征值从大到小排序选择前k个特征值对应的特征向量构成投影矩阵。降维将原始数据乘以投影矩阵得到降维后的数据。常见误区PCA是线性方法它只能捕捉线性关系。对于螺旋形、流形等非线性结构的数据PCA会失效。此时需要考虑t-SNE、UMAP等非线性降维方法。另外PCA前务必做标准化否则量纲会影响方差计算导致结果被大数值特征主导。t-SNE非常适合高维数据的可视化比如降到2维或3维画图。它的目标是让高维空间中相似的点在低维空间中靠近不相似的点远离。画出来的图通常聚类效果非常直观。重要提醒t-SNE不适合作为特征提取器用于后续的机器学习任务因为它侧重于局部结构保持且每次运行结果可能略有不同。它就是一个强大的“可视化显微镜”帮你看看数据大概长什么样。2.3 关联分析发现“啤酒与尿布”关联分析旨在发现数据集中项与项之间的有趣联系最著名的例子就是“买啤酒的人常常也买尿布”。它常用于购物篮分析、推荐系统。Apriori算法经典算法核心思想是“频繁项集的所有子集也一定是频繁的”。它通过逐层搜索来发现频繁项集。过程示例假设最小支持度为2。扫描所有交易计算单个商品1项集的出现次数。假设{啤酒}出现4次{尿布}出现4次{牛奶}出现3次{面包}出现1次。剔除支持度2的{面包}。由频繁1项集生成候选2项集{啤酒尿布}{啤酒牛奶}{尿布牛奶}。扫描交易计算候选集出现次数。假设{啤酒尿布}出现3次{啤酒牛奶}出现1次{尿布牛奶}出现2次。剔除{啤酒牛奶}。生成候选3项集只能由频繁2项集{啤酒尿布}和{尿布牛奶}生成{啤酒尿布牛奶}但它的子集{啤酒牛奶}不是频繁的所以剪枝掉。最终得到频繁项集再计算关联规则如啤酒-尿布的置信度、提升度等指标。缺点需要多次扫描数据库I/O开销大效率较低。FP-Growth算法改进算法它构建一个称为FP树的数据结构将数据库压缩到一棵树上然后通过递归查找条件模式基来挖掘频繁项集通常比Apriori快一个数量级。关联规则的评价指标支持度Support规则中所有项同时出现的概率。Support(A-B) P(A∩B)。过滤掉出现太少的组合。置信度Confidence在A出现的情况下B也出现的概率。Confidence(A-B) P(B|A) Support(A∩B) / Support(A)。衡量规则的可靠性。提升度Lift规则的有效性。Lift(A-B) Confidence(A-B) / Support(B) P(B|A) / P(B)。Lift 1A的出现对B的出现有提升作用规则有效。Lift 1A和B独立规则无意义。Lift 1A的出现反而抑制B的出现。注意高置信度的规则不一定有意义。如果B本身就很常见支持度高那么即使A和B独立P(B|A)也会很高。因此一定要结合提升度Lift来看它衡量了规则是否真的超越了随机猜测。3. 无监督学习在现代AI中的核心应用场景理解了基础任务我们再来看看无监督学习在当今AI前沿领域是如何大放异彩的。这能帮你更好地理解为什么需要学习它。3.1 大语言模型LLM的预训练基石像GPT、LLaMA这样的大模型在“学会”回答问题、写代码之前都经历了一个至关重要的阶段无监督预训练。这个阶段模型的任务通常被称为“自回归语言建模”或“掩码语言建模”本质上都是无监督学习。自回归如GPT系列给定一段文本的前面部分让模型预测下一个词是什么。这不需要人工标注文本数据本身就是训练信号。模型通过海量文本如整个互联网的公开文本进行这种预测训练逐渐学会了语言的语法、语义、事实知识甚至逻辑推理能力。这个过程就是让模型在无标签的文本序列中学习数据的内在分布和结构。掩码语言建模如BERT系列随机遮盖输入句子中的一些词让模型根据上下文来预测被遮盖的词。这同样是无监督任务。通过这种方式模型能更好地理解词语在上下文中的双向含义。为什么有效互联网上的文本数据是海量且廉价的无标签但人工标注高质量的数据集如问答对、指令数据成本极高。无监督预训练利用海量无标签数据让模型先建立一个强大的“语言世界模型”掌握了通用的语言表征能力。之后的指令微调、人类反馈强化学习等有监督步骤则是在这个强大的通用底座上进行“精雕细琢”和“对齐”使其遵循人类指令。可以说没有无监督预训练就没有今天的大模型。3.2 AI Agent与多智能体系统的环境理解AI Agent智能体是当前另一个火热的方向无论是AutoGPT、BabyAGI这样的自主智能体还是像AI Town一个开源的多智能体模拟环境这样的项目无监督学习都扮演着关键角色。在一个模拟环境中比如AI Town多个AI智能体需要生活、社交、完成任务。开发者不会、也不可能为智能体在环境中的每一个状态、每一个可能的交互都预先设定好标签和奖励。智能体如何理解这个环境世界模型学习智能体可以通过无监督的方式观察环境状态的变化序列例如看到其他智能体的移动、对话气泡的出现和消失学习预测环境的动态。这本质上是一个时间序列的无监督学习问题让智能体建立起对“世界如何运转”的内部模型。有了这个模型智能体才能进行规划、推理。技能发现在探索环境的过程中智能体可能会无意中组合出一系列动作达成了某个有趣的结果比如走到某个地点触发了事件。通过无监督的聚类或表征学习系统可以自动发现这些重复出现的、有意义的动作模式并将其抽象为可复用的“技能”。这减少了手工设计技能树的工作量。社会性表征学习在多智能体环境中智能体之间的交互模式谁常和谁交谈形成了哪些小团体可以通过图神经网络GNN或无监督的社区发现算法来学习从而让智能体具备更复杂的社会性行为。3.3 异常检测与数据清洗这是无监督学习在工业界非常实用且高价值的应用。很多情况下我们不知道“异常”长什么样或者异常的模式千变万化无法穷举标注。基于聚类的方法正常数据点应该形成密集的簇而异常点则远离任何簇中心或者属于非常小而稀疏的簇。我们可以计算每个点到其最近簇中心的距离距离超过阈值的判为异常。基于降维的方法在低维投影空间如PCA的前两个主成分可视化数据异常点通常会游离在主要数据云团之外。也可以计算原始数据重建的误差用PCA降维后再重构回高维重构误差大的点可能是异常因为模型无法用主流模式来很好地表示它。孤立森林Isolation Forest一个特别高效的异常检测算法。它的思想很巧妙异常点由于“少且不同”更容易被随机划分的决策树快速隔离出来。通过构建多棵随机树计算每个点被隔离所需的平均路径长度路径越短越可能是异常。在数据清洗中我们可以先用这些无监督方法自动筛选出一批“疑似异常”样本再由人工进行复核效率远高于人工逐条检查海量数据。4. 实战演练用Python实现客户细分聚类光说不练假把式。我们用一个完整的、贴近业务的例子把聚类、降维、可视化串起来。假设我们有一份电商平台的客户消费行为数据集目标是进行客户细分以支持精准营销。4.1 数据理解与预处理假设我们的数据集customers.csv包含以下字段CustomerID,AnnualIncome(k$),SpendingScore(1-100)。我们使用后两个特征进行聚类。import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans, DBSCAN from sklearn.decomposition import PCA from sklearn.metrics import silhouette_score import warnings warnings.filterwarnings(ignore) # 1. 加载数据 df pd.read_csv(customers.csv) print(df.head()) print(df.info()) # 2. 选择特征 X df[[AnnualIncome(k$), SpendingScore(1-100)]].values # 3. 数据可视化聚类前 plt.figure(figsize(10, 6)) plt.scatter(X[:, 0], X[:, 1], s50, alpha0.7) plt.xlabel(Annual Income (k$)) plt.ylabel(Spending Score (1-100)) plt.title(Customer Data - Before Clustering) plt.grid(True) plt.show()首先看看数据分布心里有个底。4.2 特征标准化这是聚类前至关重要的一步。年收入的范围可能是[15, 200]而消费得分是[1, 100]。如果不标准化K-Means中距离的计算将被年收入完全主导。# 4. 特征标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) print(前5个标准化后的样本\n, X_scaled[:5])4.3 使用肘部法则和轮廓系数确定最佳K值对于K-Means我们需要找到最佳的簇数K。# 5. 肘部法则 inertia [] K_range range(1, 11) for k in K_range: kmeans KMeans(n_clustersk, random_state42, n_initauto) kmeans.fit(X_scaled) inertia.append(kmeans.inertia_) # 惯性即样本到其最近中心点的距离平方和 plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.plot(K_range, inertia, bo-) plt.xlabel(Number of clusters (K)) plt.ylabel(Inertia) plt.title(Elbow Method For Optimal K) plt.grid(True) # 6. 轮廓系数Silhouette Score silhouette_scores [] for k in K_range[1:]: # 轮廓系数要求k2 kmeans KMeans(n_clustersk, random_state42, n_initauto) cluster_labels kmeans.fit_predict(X_scaled) silhouette_avg silhouette_score(X_scaled, cluster_labels) silhouette_scores.append(silhouette_avg) plt.subplot(1, 2, 2) plt.plot(range(2, 11), silhouette_scores, ro-) plt.xlabel(Number of clusters (K)) plt.ylabel(Silhouette Score) plt.title(Silhouette Score For Optimal K) plt.grid(True) plt.tight_layout() plt.show()结果分析左图肘部法则可能在K3, 4, 5处都有“肘部”迹象不是很明显。右图轮廓系数则更清晰轮廓系数越高表示聚类效果越好样本与自身簇内样本相似度高与其他簇样本相似度低。我们选择轮廓系数最高的K值。4.4 应用K-Means聚类并可视化假设我们根据轮廓系数确定K5。# 7. 应用K-Means (K5) optimal_k 5 kmeans KMeans(n_clustersoptimal_k, random_state42, n_initauto) cluster_labels kmeans.fit_predict(X_scaled) df[Cluster_KMeans] cluster_labels # 8. 可视化聚类结果原始特征空间 plt.figure(figsize(10, 6)) colors [red, blue, green, cyan, magenta] for i in range(optimal_k): plt.scatter(X[cluster_labels i, 0], X[cluster_labels i, 1], s50, ccolors[i], labelfCluster {i}, alpha0.7) # 绘制中心点注意中心点是标准化后的需要逆变换回原始尺度 centers_original scaler.inverse_transform(kmeans.cluster_centers_) plt.scatter(centers_original[:, 0], centers_original[:, 1], s200, cyellow, marker*, edgecolorsblack, labelCentroids) plt.xlabel(Annual Income (k$)) plt.ylabel(Spending Score (1-100)) plt.title(fCustomer Segments - K-Means (K{optimal_k})) plt.legend() plt.grid(True) plt.show() # 9. 查看各簇的统计信息 cluster_profile df.groupby(Cluster_KMeans)[[AnnualIncome(k$), SpendingScore(1-100)]].mean() print(cluster_profile)现在我们可以给每个簇起个业务名字簇0高收入-低消费谨慎型高净值客户。收入高但花钱保守可能需要推广高端、保值、有投资属性的产品。簇1中等收入-中等消费普通大众客户。是基本盘适合常规促销和会员活动。簇2高收入-高消费理想VIP客户。收入高且热衷消费是重点维护和交叉销售的对象。簇3低收入-高消费冲动型年轻客户。可能更看重体验和潮流对价格敏感度低适合推广新品和时尚单品。簇4低收入-低消费价格敏感型客户。需要高性价比产品和优惠券刺激。4.5 尝试DBSCAN进行对比我们看看基于密度的算法会给出什么结果。# 10. 尝试DBSCAN # 首先尝试用K距离图寻找eps from sklearn.neighbors import NearestNeighbors neighbors NearestNeighbors(n_neighbors5) # min_samples通常设为2*dim这里dim2设为4或5 neighbors_fit neighbors.fit(X_scaled) distances, indices neighbors_fit.kneighbors(X_scaled) distances np.sort(distances[:, -1], axis0) # 取第5近邻的距离 plt.figure(figsize(8, 5)) plt.plot(distances) plt.xlabel(Points sorted by distance) plt.ylabel(5th Nearest Neighbor Distance) plt.title(K-Distance Graph for DBSCAN eps estimation) plt.grid(True) plt.show()在K距离图上我们寻找曲线“拐弯”或开始快速上升的点对应的Y轴距离可以作为eps的参考。假设我们观察后选择eps0.5min_samples5。# 11. 应用DBSCAN dbscan DBSCAN(eps0.5, min_samples5) dbscan_labels dbscan.fit_predict(X_scaled) df[Cluster_DBSCAN] dbscan_labels # 查看DBSCAN发现的簇数和噪声点标签为-1 n_clusters_dbscan len(set(dbscan_labels)) - (1 if -1 in dbscan_labels else 0) n_noise list(dbscan_labels).count(-1) print(fDBSCAN发现的簇数{n_clusters_dbscan}) print(f噪声点数量{n_noise}) # 12. 可视化DBSCAN结果 unique_labels set(dbscan_labels) colors_dbscan [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))] plt.figure(figsize(10, 6)) for k, col in zip(unique_labels, colors_dbscan): if k -1: col [black] # 噪声点为黑色 label Noise else: label fCluster {k} class_member_mask (dbscan_labels k) xy X[class_member_mask] plt.scatter(xy[:, 0], xy[:, 1], s50, c[col], labellabel, alpha0.7) plt.xlabel(Annual Income (k$)) plt.ylabel(Spending Score (1-100)) plt.title(fCustomer Segments - DBSCAN (Clusters: {n_clusters_dbscan}, Noise: {n_noise})) plt.legend() plt.grid(True) plt.show()DBSCAN可能会识别出不同形状的簇并将一些边缘点标记为噪声。这提供了另一个视角K-Means强制将所有点分到某个簇而DBSCAN承认有些点可能就是“离群”的不属于任何主流群体。4.6 使用PCA降维并可视化高维聚类思想虽然我们这个例子只有两个特征但为了演示流程我们假设有更多特征比如年龄、交易次数、退货率等。在真正的高维数据中我们无法直接画图这时可以先用PCA降到2维进行可视化辅助判断聚类效果。# 13. PCA降维可视化假设X_scaled是多维的 # 这里我们仍然用两个特征但演示流程 pca PCA(n_components2) X_pca pca.fit_transform(X_scaled) # 如果特征多这里就是真正的降维 print(fPCA解释方差比{pca.explained_variance_ratio_}) print(f累计解释方差比{np.cumsum(pca.explained_variance_ratio_)}) plt.figure(figsize(10, 6)) scatter plt.scatter(X_pca[:, 0], X_pca[:, 1], ccluster_labels, s50, cmapviridis, alpha0.7) plt.xlabel(fPrincipal Component 1 ({pca.explained_variance_ratio_[0]:.2%})) plt.ylabel(fPrincipal Component 2 ({pca.explained_variance_ratio_[1]:.2%})) plt.title(Customer Segments Visualized in PCA Space) plt.colorbar(scatter, labelCluster Label) plt.grid(True) plt.show()如果原始特征有多个PCA图能让我们在损失最少信息的前提下直观看到数据在主要方向上的分布和聚类情况。如果在这个二维图上聚类依然分明说明你的聚类结果可能比较稳健。5. 无监督学习中的常见陷阱与调优心得在实际项目中应用无监督学习会遇到很多坑。这里分享几个我印象深刻的教训。5.1 数据预处理是成败的关键无监督学习对数据质量异常敏感因为没有标签作为“正确答案”来纠正模型的偏差。标准化/归一化是必须的如前所述像K-Means这类基于距离的算法必须进行标准化如Z-Score或归一化缩放到[0,1]否则量纲影响巨大。树模型可以不做但聚类、降维基本都需要。异常值处理需谨慎异常值会严重扭曲聚类中心在K-Means中或主成分方向在PCA中。一种做法是先做简单的异常值检测如3σ原则并剔除或缩尾处理。但要注意如果你的目标就是发现异常如异常检测任务则不能剔除。缺失值处理简单的删除或均值填充可能会引入偏差。对于聚类可以考虑使用对缺失值不敏感的算法如某些基于模型的聚类或者先用其他无监督方法如矩阵分解来估算缺失值。5.2 算法选择没有银弹评估指标是相对的K-Means vs DBSCAN vs 层次聚类没有最好的算法只有最适合数据分布和业务目标的算法。如果数据呈球形分布且簇大小相近K-Means很高效。如果簇形状不规则、密度不均或者你想发现噪声点DBSCAN是更好的选择。如果你需要可解释的层次结构或者不知道簇数层次聚类值得一试。评估指标的使用无监督学习的评估比有监督学习困难。内部指标如轮廓系数、戴维森堡丁指数基于数据本身的紧凑性和分离性但可能和业务上的好聚类不一致。最终一定要结合业务验证。把聚类结果给业务方看问他们“这样分群对你们的运营有帮助吗每个群的特征符合你们的认知吗”5.3 维度灾难与降维的平衡“维度灾难”的诅咒当特征维度极高时所有数据点在高维空间中都会变得稀疏且距离趋同这使得基于距离的聚类算法失效。这也是为什么在做文本聚类词向量维度可能成百上千或图像聚类前通常需要先进行降维如PCA、UMAP。降维会损失信息PCA是线性降维会损失非线性结构。t-SNE、UMAP能保持非线性结构但可能扭曲全局距离t-SNE或结果不稳定。我的经验是先用线性方法PCA快速看个大概如果发现明显的非线性模式如流形再尝试非线性方法。永远记住降维是为了可视化或简化后续计算如果后续任务如聚类性能在降维后严重下降就要考虑是否降维过度或者换用能处理高维数据的算法如基于密度的算法。5.4 无监督学习中的“AI幻觉”问题在大模型语境中“幻觉”指模型生成不真实或无关的内容。在无监督学习中也存在类似问题模型可能发现一些在数学上显著、但在现实世界中毫无意义甚至误导性的“模式”或“结构”。示例在客户聚类中算法可能根据一个无关紧要的、数据收集时产生的系统噪声比如所有在周二下午注册的用户都有一个微小的、无意义的特征偏移硬生生分出一个簇。这个簇在统计上可能很“纯净”但业务上完全无法解释。如何应对因果思考而非仅仅相关始终追问“为什么”。这个簇为什么存在背后的业务逻辑是什么是真实客户行为还是数据 artifact多数据源交叉验证如果在一个数据集上发现了一个有趣的模式尝试在另一个独立但相似的数据集上复现。与领域专家协作这是最重要的。把无监督学习发现的结果交给业务专家用他们的领域知识来过滤和解释。无监督学习应该是增强人类洞察的工具而不是替代人类判断的黑箱。无监督学习是一片充满机遇和挑战的领域。它要求从业者不仅有扎实的算法功底更要有对数据的深刻理解、对业务的敏锐洞察以及一份敢于探索未知的耐心。从理解基础原理开始在一个个小项目上动手实践不断反思结果、调整方法你会逐渐体会到让机器从数据中“自己发现知识”的巨大魅力。这不仅是构建智能系统的基石也是通向更高级AI形态的必经之路。
返回列表