您还没有绑定微信,更多功能请点击绑定

如何用判别分析(LDA)精准分类?一文看懂 Fisher 线性判别法

如何用判别分析(LDA)精准分类?一文看懂 Fisher 线性判别法

在质量管理和数据分析中,我们经常遇到这样的问题:手头有一批已知类别的样本(比如合格品与不合格品),需要根据多个测量指标建立规则,以便对新样本进行归类。判别分析(Discriminant Analysis)正是解决此类问题的经典统计方法。本文基于 Fisher(1936)提出的线性判别分析(LDA)经典理论,为您系统讲解其原理、计算步骤与演示算例,助您快速上手。

什么是判别分析(LDA)?

判别分析是一种有监督的统计分类方法。它的核心思想是:寻找一个或多个原始变量的线性组合(即判别函数),使得组间(类别之间)的差异相对于组内(类别内部)的差异尽可能大。换句话说,我们希望将高维数据投影到一条直线(或低维平面)上,让不同类别的点在投影后“分得开”,同类别的点“聚得拢”。

Fisher(1936)提出的线性判别分析是这一领域的奠基之作。它不要求数据服从多元正态分布(虽然正态性有助于小样本下的显著性检验),而是直接基于方差分析的思想构造判别准则。该方法在工业质检、医学诊断、市场细分等领域均有广泛应用。

怎么做:LDA 的公式与步骤

1. 基本设定

假设有 k 个类别(组),每类有 n_i 个样本( i=1,2,…,k ),总样本数 N=Σ n_i。每个样本有 p 个特征变量 X=(X_1,X_2,…,X_p)^T。

2. 计算组内散度矩阵与组间散度矩阵
  • 组内散度矩阵 S_W (Within-class scatter matrix):


S_W = Σ(i=1..k) Σ(j=1..n_i) (x_(ij) - x̄_i)(x_(ij) - x̄_i)^T

其中 x̄_i 为第 i 类的均值向量。
  • 组间散度矩阵 S_B (Between-class scatter matrix):


S_B = Σ(i=1..k) n_i (x̄_i - x̄)(x̄_i - x̄)^T

其中 x̄ 为总体均值向量。

3. 寻找最优判别方向

Fisher 准则函数为:

J(w) = (w^T S_B w)/(w^T S_W w)

其中 w 为判别系数向量(投影方向)。使 J(w) 最大化的 w 可通过求解广义特征值问题获得:

S_B w = λ S_W w

对于二分类问题( k=2 ),最优方向为:

w = S_W^(-1)(x̄_1 - x̄_2)

(该公式基于 Fisher 1936 原文推导,此处仅给出最终形式。)

4. 建立判别函数与分类规则

判别函数为线性组合 y = w^T x。对于二分类,通常取判别阈值 y_0 为两类判别得分均值的加权平均(或按先验概率调整)。新样本 x_(new) 计算 y_(new)=w^T x_(new),若 y_(new) ge y_0 则归为类别1,否则归为类别2。

5. 多类别扩展

当 k>2 时,最多可提取 min(k-1, p) 个判别函数。依次求解广义特征值问题,取前几个特征值较大的方向即可。

一个演示算例(示例数据,仅供演示)

背景:某工厂希望根据两个指标——硬度( X_1 )与拉伸强度( X_2 )——区分两种材料(A类与B类)。以下为示例数据(仅供演示),并非真实测量结果。









样本类别X_1 (硬度)X_2 (拉伸强度)
1A42
2A53
3A64
4B86
5B97
6B108


步骤1:计算各类均值与总体均值
  • A类均值: x̄_A = (5, 3)^T
  • B类均值: x̄_B = (9, 7)^T
  • 总体均值: x̄ = (7, 5)^T


步骤2:计算组内散度矩阵 S_W

A类内部离差平方和:
  • 样本1:(4-5, 2-3)=(-1,-1),外积为 [[1,1],[1,1]]
  • 样本2:(0,0),外积为 [[0,0],[0,0]]
  • 样本3:(1,1),外积为 [[1,1],[1,1]]

A类贡献合计:[[2,2],[2,2]]

B类内部离差平方和:
  • 样本4:(8-9,6-7)=(-1,-1),外积为 [[1,1],[1,1]]
  • 样本5:(0,0)
  • 样本6:(1,1),外积为 [[1,1],[1,1]]

B类贡献合计:[[2,2],[2,2]]

故 S_W = [[4,4],[4,4]]

步骤3:计算判别方向 w


S_W^(-1) = (1)/(det(S_W)) begin{bmatrix} 4 & -4 \ -4 & 4 end{bmatrix}

其中 det(S_W) = 4×4 - 4×4 = 0。此处出现奇异矩阵——因为示例数据中两类内部变异方向完全一致(均为沿对角线方向),导致 S_W 不可逆。这提示我们:当特征之间存在完全共线性时,经典 LDA 无法直接求解。

为继续演示,我们改用 Fisher 原始论文中的经典示例数据(鸢尾花数据)? 不,此处我们调整示例数据,使 S_W 可逆(示例数据,仅供演示):









样本类别X_1X_2
1A21
2A32
3A43
4B73
5B84
6B95

  • A类均值:(3, 2)^T,B类均值:(8, 4)^T,总体均值:(5.5, 3)^T


A类内部离差:
  • 样本1:( -1,-1) → [[1,1],[1,1]]
  • 样本2:(0,0)
  • 样本3:(1,1) → [[1,1],[1,1]]

A类合计:[[2,2],[2,2]]

B类内部离差:
  • 样本4:( -1,-1) → [[1,1],[1,1]]
  • 样本5:(0,0)
  • 样本6:(1,1) → [[1,1],[1,1]]

B类合计:[[2,2],[2,2]]

S_W = [[4,4],[4,4]] 仍然奇异。这说明示例数据设计不当。为避免误导,我们直接给出一个可逆的演示数据(示例数据,仅供演示):









样本类别X_1X_2
1A11
2A21
3A32
4B64
5B75
6B86

  • A类均值:(2, 1.333)^T,B类均值:(7, 5)^T,总体均值:(4.5, 3.167)^T


A类内部离差:
  • 样本1:( -1,-0.333) → [[1, 0.333],[0.333, 0.111]]
  • 样本2:(0, -0.333) → [[0,0],[0,0.111]]
  • 样本3:(1, 0.667) → [[1, 0.667],[0.667, 0.444]]

A类合计:[[2, 1],[1, 0.666]]

B类内部离差:
  • 样本4:( -1,-1) → [[1,1],[1,1]]
  • 样本5:(0,0)
  • 样本6:(1,1) → [[1,1],[1,1]]

B类合计:[[2,2],[2,2]]

S_W = [[4,3],[3,2.666]],行列式 = 4×2.666 - 3×3 = 10.664 - 9 = 1.664 ≠ 0,可逆。


S_W^(-1) = (1)/(1.664) begin{bmatrix} 2.666 & -3 \ -3 & 4 end{bmatrix} ≈ begin{bmatrix} 1.602 & -1.803 \ -1.803 & 2.404 end{bmatrix}


均值差: x̄_B - x̄_A = (5, 3.667)^T


w = S_W^(-1) (x̄_B - x̄_A) ≈ begin{bmatrix} 1.602×5 + (-1.803)×3.667 \ (-1.803)×5 + 2.404×3.667 end{bmatrix}
= begin{bmatrix} 8.01 - 6.61 \ -9.015 + 8.815 end{bmatrix}
≈ begin{bmatrix} 1.40 \ -0.20 end{bmatrix}


步骤4:计算判别得分与阈值

A类样本判别得分(示例):
  • 样本1:1.40×1 + (-0.20)×1 = 1.20
  • 样本2:1.40×2 + (-0.20)×1 = 2.60
  • 样本3:1.40×3 + (-0.20)×2 = 3.80

A类均值得分: ȳ_A ≈ 2.53

B类样本判别得分:
  • 样本4:1.40×6 + (-0.20)×4 = 7.60
  • 样本5:1.40×7 + (-0.20)×5 = 8.80
  • 样本6:1.40×8 + (-0.20)×6 = 10.00

B类


下图是 6SQ 在线工具一键生成的结果效果:



0 个评论

游客无法查看评论和回复, 请先登录注册

发起人

龙天
龙天

我努力,我进步,我付出,我收获,我坚持,我成功!

推荐文章

文章状态

  • 发布时间: 2026-09-09 22:35
  • 浏览: 22
  • 评论: 0
  • 赞: 0