.. _lda_qda: ========================================== 线性判别分析和二次判别分析 ========================================== .. currentmodule:: sklearn 线性判别分析(:class:`~discriminant_analysis.LinearDiscriminantAnalysis` )和二次判别分析(:class:`~discriminant_analysis.QuadraticDiscriminantAnalysis` )是两种经典的分类器,正如它们的名字所示,分别具有线性和二次决策面。 这些分类器因其具有封闭形式的解,可以轻松计算,本质上是多类别的,已在实践中证明有效,并且没有需要调整的超参数而受到青睐。 .. |ldaqda| image:: ../auto_examples/classification/images/sphx_glr_plot_lda_qda_001.png :target: ../auto_examples/classification/plot_lda_qda.html :scale: 80 .. centered:: |ldaqda| 该图显示了线性判别分析和二次判别分析的决策边界。底部行表明,线性判别分析只能学习线性边界,而二次判别分析可以学习二次边界,因此更加灵活。 .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_classification_plot_lda_qda.py` : 在合成数据上比较LDA和QDA。 使用线性判别分析进行降维 =========================================================== :class:`~discriminant_analysis.LinearDiscriminantAnalysis` 可以用于执行监督降维,通过将输入数据投影到一个线性子空间,该子空间由最大化类别间分离的方向组成(具体含义在下面的数学部分讨论)。输出的维度必然小于类别的数量,因此这在一般情况下是一个相当强的降维,并且仅在多类别设置中有意义。 这是在 `transform` 方法中实现的。可以通过 ``n_components`` 参数设置所需的维度。该参数对 `fit` 和 `predict` 方法没有影响。 .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_decomposition_plot_pca_vs_lda.py` : 比较 LDA 和 PCA 对鸢尾花数据集的降维效果 .. _lda_qda_math: LDA 和 QDA 分类器的数学表述 ======================================================= LDA 和 QDA 都可以从简单的概率模型中推导出来,这些模型对每个类别 :math:`k` 的数据类条件分布 :math:`P(X|y=k)` 进行建模。然后可以通过使用贝叶斯规则获得预测,对于每个训练样本 :math:`x \in \mathcal{R}^d` : .. math:: P(y=k | x) = \frac{P(x | y=k) P(y=k)}{P(x)} = \frac{P(x | y=k) P(y = k)}{ \sum_{l} P(x | y=l) \cdot P(y=l)} 我们选择最大化这个后验概率的类别 :math:`k` 。 更具体地说,对于线性和二次判别分析,:math:`P(x|y)` 被建模为具有密度的多元高斯分布: .. math:: P(x | y=k) = \frac{1}{(2\pi)^{d/2} |\Sigma_k|^{1/2}}\exp\left(-\frac{1}{2} (x-\mu_k)^t \Sigma_k^{-1} (x-\mu_k)\right) 其中 :math:`d` 是特征的数量。 QDA --- 根据上述模型,后验的对数为: .. math:: \log P(y=k | x) &= \log P(x | y=k) + \log P(y = k) + Cst \\ &= -\frac{1}{2} \log |\Sigma_k| -\frac{1}{2} (x-\mu_k)^t \Sigma_k^{-1} (x-\mu_k) + \log P(y = k) + Cst, 其中常数项 :math:`Cst` 对应于分母 :math:`P(x)` ,以及来自高斯分布的其他常数项。预测的类别是最大化这个对数后验的类别。 .. note:: **与高斯朴素贝叶斯的关系** 如果在 QDA 模型中假设协方差矩阵是 diagonal 的,那么就假设输入在每个类别中是条件独立的, 和由此产生的分类器等价于高斯朴素贝叶斯分类器 :class:`naive_bayes.GaussianNB` 。 LDA --- LDA 是 QDA 的一个特例,其中假设每个类的高斯分布共享相同的协方差矩阵:对于所有 :math:`k` ,:math:`\Sigma_k = \Sigma` 。这减少了对数后验概率为: .. math:: \log P(y=k | x) = -\frac{1}{2} (x-\mu_k)^t \Sigma^{-1} (x-\mu_k) + \log P(y = k) + Cst. 其中 :math:`(x-\mu_k)^t \Sigma^{-1} (x-\mu_k)` 对应于样本 :math:`x` 和均值 :math:`\mu_k` 之间的 `马氏距离 `_ 。马氏距离表示 :math:`x` 与 :math:`\mu_k` 的接近程度,同时考虑了每个特征的方差。因此,我们可以将 LDA 解释为将 :math:`x` 分配给在马氏距离上最接近的类别,同时考虑类别先验概率。 LDA 的对数后验概率也可以写成 [3]_: .. math:: \log P(y=k | x) = \omega_k^t x + \omega_{k0} + Cst. 其中 :math:`\omega_k = \Sigma^{-1} \mu_k` 和 :math:`\omega_{k0} = -\frac{1}{2} \mu_k^t\Sigma^{-1}\mu_k + \log P (y = k)` 。这些量分别对应于 `coef_` 和 `intercept_` 属性。 从上述公式可以看出,LDA 具有线性决策面。在 QDA 的情况下,高斯分布的协方差矩阵 :math:`\Sigma_k` 没有假设,导致二次决策面。更多细节请参见 [1]_。 LDA 降维的数学表述 ================== 首先注意,K 个均值 :math:`\mu_k` 是 :math:`\mathcal{R}^d` 中的向量,并且它们位于一个维度最多为 :math:`K - 1` 的仿射子空间 :math:`H` 中(2 个点位于一条线上,3 个点位于一个平面上,等等)。 如上所述,我们可以将 LDA 解释为将 :math:`x` 分配给在马氏距离上最接近的类别,同时考虑类别先验概率。 其均值 :math:`\mu_k` 在马氏距离意义上最接近,同时考虑类别先验概率。或者,LDA 等价于首先对数据进行 *球化* 处理,使得协方差矩阵为单位矩阵,然后根据欧氏距离(仍然考虑类别先验概率)将 :math:`x` 分配给最近的均值。 在这个 d 维空间中计算欧氏距离等价于首先将数据点投影到 :math:`H` 中,并在那里计算距离(因为其他维度将对每个类别的距离贡献相等)。换句话说,如果 :math:`x` 在原始空间中最接近 :math:`\mu_k` ,那么在 :math:`H` 中也是如此。这表明,在 LDA 分类器中隐含着通过线性投影到 :math:`K-1` 维空间的降维。 我们可以进一步降低维度,通过投影到线性子空间 :math:`H_L` 上,该子空间最大化投影后 :math:`\mu^*_k` 的方差(实际上,我们正在对变换后的类别均值 :math:`\mu^*_k` 进行一种 PCA)。这个 :math:`L` 对应于 :func:`~discriminant_analysis.LinearDiscriminantAnalysis.transform` 方法中使用的 ``n_components`` 参数。更多细节请参见 [1]_。 收缩和协方差估计器 ================== 收缩是一种正则化方法,用于在训练样本数量远小于特征数量的情况下改进协方差矩阵的估计。在这种情况下,经验样本协方差是一个糟糕的估计器,而收缩有助于提高分类器的泛化性能。可以通过将 :class:`~discriminant_analysis.LinearDiscriminantAnalysis` 类的 ``shrinkage`` 参数设置为 'auto' 来使用收缩 LDA。这将自动在解析上确定最佳收缩参数。 遵循Ledoit和Wolf引入的引理[2]_的方法。请注意,目前仅当将 ``solver`` 参数设置为'lsqr'或'eigen'时,收缩才有效。 ``shrinkage`` 参数也可以在0和1之间手动设置。特别是,值为0对应于无收缩(这意味着将使用经验协方差矩阵),值为1对应于完全收缩(这意味着将使用方差的对角矩阵作为协方差矩阵的估计)。将此参数设置为这两个极值之间的值将估计协方差矩阵的收缩版本。 Ledoit和Wolf的协方差收缩估计器并不总是最佳选择。例如,如果数据的分布是正态分布,Oracle Approximating Shrinkage估计器:class:`sklearn.covariance.OAS` 产生的均方误差比使用shrinkage="auto"的Ledoit和Wolf公式给出的要小。在LDA中,假设数据在给定类别下是高斯分布的。如果这些假设成立,使用带有OAS协方差估计器的LDA将比使用Ledoit和Wolf或经验协方差估计器产生更好的分类准确性。 可以使用:class:`discriminant_analysis.LinearDiscriminantAnalysis` 类的 ``covariance_estimator`` 参数选择协方差估计器。协方差估计器应具有:term:`fit` 方法和 ``covariance_`` 属性,就像:mod:`sklearn.covariance` 模块中的所有协方差估计器一样。 .. |shrinkage| image:: ../auto_examples/classification/images/sphx_glr_plot_lda_001.png :target: ../auto_examples/classification/plot_lda.html :scale: 75 .. centered:: |shrinkage| .. rubric:: 示例 * :ref:`sphx_glr_auto_examples_classification_plot_lda.py` : 比较使用经验、Ledoit Wolf和OAS协方差估计器的LDA分类器。 估计算法 ======== 使用LDA和QDA需要计算依赖于类别先验 :math:`P(y=k)` 、类别均值 :math:`\mu_k` 和协方差矩阵的对数后验。 'svd' 求解器是用于 :class:`~sklearn.discriminant_analysis.LinearDiscriminantAnalysis` 的默认求解器,并且是唯一可用于 :class:`~sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis` 的求解器。它可以执行分类和变换(对于LDA)。由于它不依赖于协方差矩阵的计算,因此在特征数量较大的情况下,'svd' 求解器可能更可取。'svd' 求解器不能与收缩一起使用。对于QDA,使用SVD求解器依赖于协方差矩阵 :math:`\Sigma_k` 根据定义等于 :math:`\frac{1}{n - 1} X_k^tX_k = \frac{1}{n - 1} V S^2 V^t` ,其中 :math:`V` 来自(中心化的)矩阵的SVD::math:`X_k = U S V^t` 。事实证明,我们可以在不显式计算 :math:`\Sigma` 的情况下计算上述对数后验:通过计算 :math:`X` 的SVD得到 :math:`S` 和 :math:`V` 就足够了。对于LDA,计算两个SVD:中心化输入矩阵 :math:`X` 的SVD和类均值向量的SVD。 'lsqr' 求解器是一种仅适用于分类的高效算法。它需要显式计算协方差矩阵 :math:`\Sigma` ,并支持收缩和自定义协方差估计器。该求解器通过求解 :math:`\Sigma \omega = \mu_k` 来计算系数 :math:`\omega_k = \Sigma^{-1}\mu_k` ,从而避免显式计算逆 :math:`\Sigma^{-1}` 。 'eigen' 求解器基于类间散布与类内散布比的优化。它可以用于分类和变换,并支持收缩。然而,'eigen' 求解器需要计算协方差矩阵,因此可能不适用于具有大量特征的情况。 .. rubric:: 参考文献 .. [1] "统计学习基础", Hastie T., Tibshirani R., Friedman J., 第4.3节, 第106-119页, 2008年. .. [2] Ledoit O, Wolf M. 蜜蜂,我缩小了样本协方差矩阵. 投资组合管理杂志 30(4), 110-119, 2004年. .. [3] R. O. Duda, P. E. Hart, D. G. Stork. 模式分类 (第二版), 第2.6.2节.