ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

线性与二次判别分析:从核心原理到实战调优

线性与二次判别分析:从核心原理到实战调优 1. 从“分类”到“判别”一个更聪明的建模视角在数据分析和预测的众多工具里分类问题一直是个核心议题。我们手头有一堆数据每个数据点都带着一堆特征并且已经被打上了类别标签。比如一堆鸢尾花我们测量了它们的花萼长度、宽度花瓣长度、宽度并且知道它们分别属于“山鸢尾”、“变色鸢尾”和“维吉尼亚鸢尾”。传统的思路是我们试图去“描述”每一类花找到它们的特征分布规律然后对于一个新来的、不知道类别的花我们看它的特征更符合哪一类的“描述”就把它归到哪一类。这个思路就是所谓的“生成模型”或者基于概率密度估计的分类方法。但判别分析走了一条看似更“功利”实则更高效的路径。它不关心每一类数据本身的完整分布是什么样的它只关心“边界”在哪里。想象一下你要在一片土地上划分两个国家的国界线判别分析不关心每个国家内部的山川河流如何分布它只关心那条最合理、最能把两国人民分开的线应该画在哪里。这条线就是“判别函数”。判别分析的核心目标就是直接寻找这个能最大限度区分不同类别的函数或规则。为什么这个视角更聪明因为在很多实际问题中我们最终需要的只是一个准确的分类决策而不是对每个类别内部结构的详尽了解。尤其是当各类别的数据分布比较复杂或者我们只对分类边界附近的数据敏感时直接建模判别边界往往能获得比先估计分布再分类更高的效率和更好的效果。这就好比招聘判别分析不关心“优秀员工”和“普通员工”各自完整的能力画像它只关心那几个关键能力指标如沟通能力、专业技能在哪个阈值上最能区分这两类人并据此制定录用规则。2. 线性判别分析寻找最优投影方向线性判别分析是判别分析中最经典、最直观的方法。它的目标非常明确找到一个投影方向使得当所有数据点都投影到这个方向上时类间的差异尽可能大而类内的差异尽可能小。这个思想是模式识别领域的一个基石。2.1 核心思想与数学直觉我们用一个二维的例子来理解。假设有两类数据在二维平面上像两团云。如果随便找一个方向投影两团云可能会重叠严重无法区分。LDA要做的就是找到一个方向一条直线当这两团云投影到这条直线上时变成一维上的两个分布这两个分布的中心距离很远类间散度大同时每个分布自身很“瘦”、很集中类内散度小。用数学语言量化这个目标就引出了著名的“费希尔准则”。定义类间散度矩阵 $S_b$ 和类内散度矩阵 $S_w$。类内散度矩阵 $S_w$衡量同一类别内部数据的离散程度。计算每个类别数据点与其类别均值的偏差然后对所有类别求和。$S_w$ 越小说明同类数据越聚集。类间散度矩阵 $S_b$衡量不同类别均值之间的离散程度。计算每个类别的均值与总体均值的偏差按类别样本量加权。$S_b$ 越大说明不同类别的中心离得越远。LDA的目标就是找到一个投影向量 $w$使得投影后的数据满足 $$ J(w) \frac{w^T S_b w}{w^T S_w w} $$ 这个比值最大化。直观理解分子是投影后的类间方差分母是投影后的类内方差。我们要找的 $w$就是让这个比值最大的方向被称为“费希尔判别方向”。注意这里有一个重要的隐含假设那就是不同类别的数据具有相同的协方差矩阵。这个假设是LDA称为“线性”的原因。如果协方差矩阵不同判别边界就会变成二次曲线这就是后面会提到的二次判别分析。2.2 计算步骤与一个简化实例理论上最优投影方向 $w$ 是广义特征值问题 $S_b w \lambda S_w w$ 的解对应最大特征值的特征向量。在实际计算中当 $S_w$ 可逆时等价于求解 $S_w^{-1} S_b$ 的最大特征值对应的特征向量。我们来设想一个极度简化的例子以便手算理解。假设有两个类别数据都是一维的。类别1: 两个样本值为 1 和 3。均值 $m_1 2$。类别2: 两个样本值为 4 和 6。均值 $m_2 5$。总体均值 $m (25)/2 3.5$假设样本量相等。计算 $S_w$这里是一维所以是标量 类内方差类别1方差 $[(1-2)^2 (3-2)^2] / (2-1) 2$。同理类别2方差 2。 $S_w 2 2 4$。注意严格来说是散度这里未除以自由度但不影响比例关系计算 $S_b$ $S_b n_1*(m_1 - m)^2 n_2*(m_2 - m)^2 2*(2-3.5)^2 2*(5-3.5)^2 22.25 22.25 9$。那么 $J(w) 9 / 4 2.25$。在这个一维例子中“投影方向”就是原始数据轴本身。我们可以看到两类均值差为3类内标准差约为 $\sqrt{2} \approx 1.414$区分度确实不错。在实际的多维问题中求解出 $w$ 后对于一个新样本 $x$我们计算其投影 $y w^T x$。然后通常我们会计算每个类别投影后的中心 $m_k w^T \mu_k$$\mu_k$是第k类的原始均值并将新样本 $y$ 归类到距离它投影后中心最近的类别。在满足同方差假设且先验概率相等的情况下这个决策规则等价于基于马氏距离的最近中心分类。2.3 实操中的关键点与陷阱1. 小样本问题与奇异矩阵这是LDA应用中最常见的坑。当样本特征维度 $d$ 很高而样本数量 $n$ 不足时类内散度矩阵 $S_w$ 会是奇异的不可逆。这是因为 $S_w$ 的秩最大为 $n - K$K为类别数当 $d n - K$ 时$S_w$ 必然是奇异的无法求逆。在高维数据如图像、基因数据中这几乎是必然遇到的问题。解决方案通常有几种正则化LDA给 $S_w$ 加上一个小的正则化项如 $S_w \lambda I$使其可逆。$\lambda$ 是一个需要调节的超参数。先降维使用主成分分析先对数据进行降维将维度降至 $n - K$ 以下然后再应用LDA。但要注意PCA是无监督降维可能会损失对分类有用的判别信息。使用伪逆直接计算 $S_w$ 的伪逆Moore-Penrose逆来代替逆矩阵。2. 同方差假设的检验LDA假设各类别协方差矩阵相等。这个假设是否成立会影响模型性能。可以通过Box‘s M检验来初步判断。如果假设明显不成立比如各类数据分布形状差异很大则应考虑使用二次判别分析或更灵活的方法。3. 投影方向的个数对于K个类别LDA最多可以找到 $K-1$ 个有效的判别方向因为 $S_b$ 的秩最大为 $K-1$。这意味着如果你要将数据可视化最多只能降到 $K-1$ 维。对于二分类问题你只能得到一条判别线一维投影。4. 代码实现注意在Python的scikit-learn库中LinearDiscriminantAnalysis类很好地实现了LDA。它自动处理了奇异矩阵问题使用SVD求解。使用时需要注意solver参数的选择‘svd’ 不计算 $S_w^{-1}$直接用SVD分解适用于任何情况推荐作为默认。‘lsqr’或‘eigen’ 适用于 $S_w$ 可逆的情况可能更高效。from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据 iris load_iris() X, y iris.data, iris.target X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 创建并训练LDA模型 lda LinearDiscriminantAnalysis(solversvd) # 使用SVD求解器更稳健 lda.fit(X_train, y_train) # 评估 accuracy lda.score(X_test, y_test) print(fLDA分类准确率 {accuracy:.3f}) # 查看找到了几个判别方向对于3类鸢尾花最多2个 print(f判别方向特征向量的形状 {lda.scalings_.shape}) # 应该是 (4, 2)3. 二次判别分析与灵活判别当边界不再平直LDA的强大在于其简洁和高效但它的核心假设——各类别协方差矩阵相同——在现实中常常被违背。当不同类别的数据不仅中心位置不同其离散程度方差和相关模式协方差也迥异时强行用一条直线或超平面作为边界就会显得力不从心。3.1 QDA释放协方差的差异二次判别分析松动了LDA最关键的假设。它允许每个类别 $k$ 都有自己的协方差矩阵 $\Sigma_k$。这样一来基于贝叶斯定理在假设数据服从多元正态分布且已知先验概率 $P(Yk)$ 的情况下将一个样本 $x$ 判给后验概率 $P(Yk|Xx)$ 最大的类别。这个决策函数在对数概率上会引入 $x$ 的二次项。决策规则简化为计算每个类别 $k$ 的判别函数 $\delta_k(x)$并将 $x$ 分配给使其最大的类别。 $$ \delta_k(x) -\frac{1}{2} \log|\Sigma_k| - \frac{1}{2} (x - \mu_k)^T \Sigma_k^{-1} (x - \mu_k) \log P(Yk) $$ 忽略常数项后可以看到其中包含一个二次型 $(x - \mu_k)^T \Sigma_k^{-1} (x - \mu_k)$这就是“二次”的由来。这个二次型定义了样本 $x$ 到类别 $k$ 中心 $\mu_k$ 的马氏距离而每个类别用自己的 $\Sigma_k$ 来定义这个距离的尺度。几何意义QDA的决策边界是二次曲面可以是椭圆、双曲线或抛物线等。这赋予了模型刻画更复杂边界的能力。例如一类数据是紧密的球状簇另一类是拉长的椭球簇QDA可以画出一个椭圆形的边界将其分开而LDA只能画一条直线效果必然打折。3.2 LDA vs. QDA偏差-方差权衡的经典案例选择LDA还是QDA是机器学习中偏差-方差权衡的一个绝佳范例。LDA线性假设强同方差模型参数少只需要估计一个共享的协方差矩阵和K个均值向量。高偏差低方差。当假设近似成立时它因为参数少、估计更稳定在小样本数据集上往往表现优于QDA。QDA二次假设弱异方差模型参数多需要估计K个不同的协方差矩阵。低偏差高方差。它能拟合更复杂的边界但需要更多的数据来准确估计每个协方差矩阵。在样本量不足时估计出的 $\Sigma_k$ 可能非常不稳定导致模型过拟合泛化能力差。经验法则如果样本量很大远大于特征维度的平方且你怀疑各类别协方差差异明显优先尝试QDA。如果样本量有限或者通过可视化、统计检验发现各类别协方差大致相似使用LDA更安全、更稳健。在训练集上QDA的训练误差几乎总是低于LDA但要看验证集/测试集误差才能判断谁更优。3.3 正则化判别分析一条中庸之道有没有折中的方案有的这就是正则化判别分析。它引入一个正则化参数 $\alpha$ 和一个收缩参数 $\gamma$将每个类别的协方差矩阵 $\Sigma_k$ 向一个共同的对角矩阵甚至单位矩阵进行收缩。估计的协方差矩阵 $\hat{\Sigma}_k(\alpha, \gamma)$ 形式如下首先向池化共享协方差矩阵收缩$\hat{\Sigma}_k(\alpha) (1-\alpha) \hat{\Sigma}k \alpha \hat{\Sigma}{pooled}$。然后再向一个对角矩阵或单位矩阵收缩$\hat{\Sigma}_k(\alpha, \gamma) (1-\gamma) \hat{\Sigma}_k(\alpha) \gamma \frac{tr(\hat{\Sigma}_k(\alpha))}{d} I$。其中$\alpha$ 控制个体协方差矩阵向共享矩阵的收缩程度。$\alpha0$ 就是QDA$\alpha1$ 就是LDA。$\gamma$ 控制向球形各向同性矩阵的收缩程度有助于处理特征间的多重共线性。通过交叉验证来选择合适的 $(\alpha, \gamma)$我们可以在LDA的稳定性和QDA的灵活性之间找到最佳平衡点。scikit-learn中的LinearDiscriminantAnalysis和QuadraticDiscriminantAnalysis都通过shrinkage参数支持了这种正则化。from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis from sklearn.model_selection import cross_val_score import numpy as np # 尝试QDA qda QuadraticDiscriminantAnalysis() qda_scores cross_val_score(qda, X_train, y_train, cv5) print(fQDA 5折交叉验证平均准确率 {np.mean(qda_scores):.3f}) # 尝试带收缩的LDA正则化判别分析 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis lda_reg LinearDiscriminantAnalysis(solverlsqr, shrinkageauto) # 自动选择收缩参数 lda_reg_scores cross_val_score(lda_reg, X_train, y_train, cv5) print(f正则化LDA 5折交叉验证平均准确率 {np.mean(lda_reg_scores):.3f})4. 从理论到实战判别分析的全流程应用与调优掌握了LDA和QDA的原理我们还需要将其嵌入到一个完整的建模流程中。判别分析不仅仅是一个模型更是一个包含数据预处理、模型选择、评估和解释的系统工程。4.1 数据预处理为判别分析铺平道路判别分析对数据有一定的要求预处理步骤至关重要。1. 特征缩放LDA/QDA基于距离马氏距离理论上它们对特征的尺度是不变的因为协方差矩阵的估计已经包含了尺度信息。然而在实际数值计算中尤其是当特征量纲差异巨大如年龄和收入时进行标准化零均值、单位方差或归一化可以提高数值稳定性避免计算中的舍入误差并使得正则化参数的选择更有意义。这通常是一个好习惯。2. 类别不平衡处理判别分析天然地可以通过设置priors参数来融入类别的先验概率 $P(Yk)$。如果你知道真实世界中各类别的分布比例例如疾病诊断中健康人远多于病人就应该在模型中设置正确的先验概率。如果不设置scikit-learn默认使用训练集中的类别比例作为先验估计。在严重不平衡的数据中这会影响决策边界向大类偏移。除了设置先验也可以考虑对训练数据使用过采样/欠采样技术。3. 多重共线性与特征选择判别分析需要估计协方差矩阵的逆。如果特征之间存在高度相关性多重共线性协方差矩阵会接近奇异导致估计不稳定模型方差增大。虽然正则化收缩可以缓解但事前处理更好。可以计算特征间的相关系数矩阵手动剔除高度相关的特征之一。使用方差膨胀因子进行诊断。结合过滤法如基于F统计量的特征选择或嵌入法LDA本身也可以用于特征选择即选择在判别方向上权重大的特征来选择特征。4.2 模型评估与选择不止于准确率在鸢尾花这种清晰的数据集上准确率可能很高。但在更复杂的场景中我们需要更细致的评估。1. 交叉验证是必须的永远不要只依赖训练集上的准确率尤其是对于QDA这种参数较多的模型。使用K折交叉验证来估计模型的泛化误差。对于小样本集留一法交叉验证可能更合适。2. 混淆矩阵与更丰富的指标对于多分类问题准确率可能掩盖问题。绘制混淆矩阵可以清晰看到模型在哪些类别之间容易混淆。进一步可以计算每个类别的精确率、召回率和F1-score特别是在不平衡分类中这些指标比整体准确率更有意义。3. 决策边界可视化对于二维或三维特征或经过LDA降维后绘制决策边界是理解模型行为的强大工具。你可以清晰地看到LDA的线性边界和QDA的弯曲边界是如何划分空间的。import matplotlib.pyplot as plt from sklearn.inspection import DecisionBoundaryDisplay from sklearn.decomposition import PCA # 为了可视化我们使用前两个特征或者先用PCA降到2维 pca PCA(n_components2) X_train_pca pca.fit_transform(X_train) X_test_pca pca.transform(X_test) # 在降维后的数据上训练LDA lda_viz LinearDiscriminantAnalysis() lda_viz.fit(X_train_pca, y_train) # 绘制决策边界 fig, ax plt.subplots(figsize(8, 6)) DecisionBoundaryDisplay.from_estimator( lda_viz, X_train_pca, response_methodpredict, alpha0.3, axax ) # 绘制训练数据点 scatter ax.scatter(X_train_pca[:, 0], X_train_pca[:, 1], cy_train, edgecolorsk) ax.set_xlabel(PCA Component 1) ax.set_ylabel(PCA Component 2) ax.set_title(LDA Decision Boundary on PCA-reduced Iris Data) plt.legend(*scatter.legend_elements(), titleClasses) plt.show()4.3 模型解释与判别特征提取判别分析的一个副产品是强大的可解释性。LDA找到的判别方向 $w$ 的每个分量对应了原始特征的权重。权重绝对值越大说明该特征对区分类别的贡献越大。这本身就是一种特征重要性排序。1. 判别特征权重分析训练好LDA模型后可以查看coef_属性对于二分类或scalings_属性对于多分类即判别方向。分析这些权重可以告诉我们哪些特征是区分不同类别的关键。例如在鸢尾花数据中你可能会发现花瓣长度和宽度在区分三个品种时权重最高。2. LDA作为降维器如前所述LDA找到的 $K-1$ 个判别方向是专门为分类任务优化的降维方向。将原始高维数据投影到这些方向上可以在最大程度保留分类信息的前提下进行降维。这种降维后的数据不仅可视化效果好有时作为其他分类器如SVM、随机森林的输入特征也能提升性能。scikit-learn的LDA通过transform方法直接提供这个功能。# 使用LDA进行有监督降维 lda_for_dr LinearDiscriminantAnalysis(n_components2) # 对于3类最多降到2维 X_train_lda lda_for_dr.fit_transform(X_train, y_train) X_test_lda lda_for_dr.transform(X_test) print(f原始特征维度 {X_train.shape[1]}) print(fLDA降维后维度 {X_train_lda.shape[1]}) # 可视化降维后的数据 plt.figure(figsize(8,6)) scatter plt.scatter(X_train_lda[:, 0], X_train_lda[:, 1], cy_train, alpha0.7, edgecolorsk) plt.xlabel(LDA Component 1) plt.ylabel(LDA Component 2) plt.title(Iris Data Projected onto First Two LDA Components) plt.legend(*scatter.legend_elements(), titleClasses) plt.show()5. 判别分析的边界与进阶何时该寻求其他武器判别分析特别是LDA因其简单、高效、可解释性强在诸多领域如生物信息学、金融风险评估、人脸识别有着悠久而成功的应用历史。但它并非银弹清晰地认识其边界才能更好地使用它。5.1 判别分析的固有局限性1. 对分布假设敏感LDA和QDA的核心都建立在数据或投影后数据服从多元正态分布的假设上。当数据严重偏离正态分布例如高度偏态、多峰分布时其性能会下降。虽然在实际中模型对正态性假设有一定的鲁棒性但对于类别边界极度非线性的数据如同心圆、螺旋线线性或二次边界都无能为力。2. 对异常值敏感均值和协方差矩阵的估计都对异常值非常敏感。数据中的少数极端点可能会极大地扭曲判别方向或决策边界。在应用前进行异常值检测和处理是必要的。3. 只能处理数值特征判别分析本质是处理连续数值特征。对于分类特征需要先进行编码如独热编码但这可能会破坏特征的内在结构并增加维度。5.2 当判别分析力不从心时替代方案当数据不符合判别分析的假设时我们需要转向更灵活的模型。1. 逻辑回归对于二分类问题逻辑回归是LDA一个强有力的竞争对手。它直接对条件概率 $P(Y|X)$ 建模没有对特征分布做任何假设除了线性决策边界在log-odds上。当正态性假设不成立时逻辑回归往往更稳健。此外逻辑回归天然输出概率解释性也很好。但逻辑回归扩展到多分类相对复杂需要一对多等策略。2. 朴素贝叶斯这是一个生成模型它假设特征在给定类别下条件独立。这个假设通常很强但在文本分类等领域朴素贝叶斯表现惊人地好。它计算效率极高特别适合高维数据。当判别分析因维度灾难而失效时朴素贝叶斯可能是一个可行的基线模型。3. 非线性模型决策树、SVM、神经网络对于复杂的非线性决策边界这些模型是更现代的选择。决策树/随机森林完全非参数对数据分布没有假设能处理混合类型特征并且能给出特征重要性。但容易过拟合且决策边界是轴平行的可能不够平滑。支持向量机通过核技巧可以隐式地将数据映射到高维空间从而拟合非常复杂的非线性边界。对于小样本、高维数据SVM通常表现优异。神经网络最灵活的模型理论上可以拟合任何函数。但需要大量数据、调参复杂且可解释性差。5.3 一个实战决策框架面对一个新的分类问题我个人的经验流程通常是这样的探索性数据分析可视化数据分布检查类别是否线性/近似线性可分各类别的协方差矩阵是否相似可用散点图矩阵、箱线图、计算协方差矩阵观察。建立基线模型从简单的LDA和逻辑回归开始。它们训练快可解释性强能快速给出一个性能基准。使用交叉验证比较。处理非线性如果基线模型表现不佳观察误分类样本是否呈现出明显的非线性模式。尝试QDA如果样本量足够、带核SVM或随机森林。处理高维小样本如果特征维度远大于样本量首先考虑特征选择或使用正则化模型如正则化LDA、L1逻辑回归、线性SVM。朴素贝叶斯也值得一试。追求极致性能如果数据量巨大且问题非常复杂再考虑深度神经网络。判别分析尤其是LDA在这个流程中扮演着“第一块试金石”和“可解释性标杆”的角色。它可能不是最终胜出的模型但通过它我们能快速理解数据的线性可分程度获得关键特征的权重信息这些对于后续更复杂模型的构建和调试都有宝贵的指导意义。它教会我们的不仅仅是一个模型更是一种“寻找最优分离边界”的建模哲学。
返回列表