13 KiB
第四章
“这个过程的一个很重要的类是 线性判别边界 (decision boundaries);这也是我们说的分类的线性方法” => 寻找界限,把回归看成条件期望的估计 => 分类 = 算概率 + 选最大的
- 指示矩阵的线性回归 => 回归方法对每个类别建立判别函数 (discriminant functions) ,然后将分到取最大值的判别函数所在类别中. 比如设置One-Hot编码(1,0,0),(0,1,0),(0,0,1)等内容,来x则分析后得到如(0.1, 0.7, 0.2)则是第二类 。
直接建模$P(G | X)$:用回归拟合
问题就是,用线性回归的方法约束性太小。但用线性回归去拟合指示变量的条件期望,而这个期望等于类别的后验概率,因此可以用最大值来做分类。
- 线性判别分析LDA:
通过建模$P(X | G)$,通过Bayes间接得到$P(G | X)$:
P(G | X) = \frac{P(X | G) * P(G)}{P(X)}
P(G=k∣x)=∑l=1Kfl(x)πlfk(x)πk
f_k(x)=P(X=x∣G=k): 第 k 类的数据“长什么样”(密度) 𝜋 𝑘
𝑃 ( 𝐺 | 𝑘 ) π k =P(G=k):第 k 类出现的概率(先验)
简单来说,协方差(Covariance) 是衡量两个变量之间协同变化关系的物理量。
如果说方差(Variance)是描述一个变量自己“抖动”得有多厉害,那么协方差就是描述两个变量
X和Y是否“一起抖动”。
1. 直观理解:三种关系
协方差的结果正负号直接反映了两个变量的相关方向:
正协方差 ($Cov(X, Y) > 0$):
表示两个变量是“同向变化”的。
X变大时,Y通常也变大(比如:身高和体重)。负协方差 ($Cov(X, Y) < 0$):
表示两个变量是“反向变化”的。
X变大时,Y通常变小(比如:运动量和体脂率)。零协方差 ($Cov(X, Y) \approx 0$):
表示两个变量之间没有明显的线性关系,它们的变化是相互独立的(比如:你的饭量和当天的天气)。
2. 数学定义
对于两个随机变量
X和 $Y$,协方差的定义公式为:
Cov(X, Y) = E[(X - E(X))(Y - E(Y))]在实际计算中,我们常用这个更简便的展开公式:
Cov(X, Y) = E(XY) - E(X)E(Y)公式解读:它是
X与其均值之差,乘以Y与其均值之差的期望。如果X大于均值时,Y也经常大于均值,那么乘积就是正的,累加起来协方差就是正的。
3. 协方差 vs 相关系数
协方差有一个致命的缺点:它的数值大小受量纲(单位)影响。
比如你计算身高(米)和体重的协方差,得到的数值可能很小;但如果你把身高换成厘米,协方差会立刻变大 100 倍。这让你很难通过协方差的绝对值来判断相关性有多“强”。
为了解决这个问题,我们将协方差标准化,就得到了相关系数 ($\rho$):
\rho_{XY} = \frac{Cov(X, Y)}{\sigma_X \sigma_Y}相关系数的范围被锁定在
[-1, 1]之间,数值越接近 1 或 -1,说明线性相关性越强。
4. 为什么你在 CS/AI 领域会经常见到它?
既然你在研究 强化学习 和 机器人控制,协方差对你来说极其重要:
多维正态分布:在描述高维数据分布时,我们需要一个协方差矩阵 (Covariance Matrix)。矩阵里的每一个元素
a_{ij}都是第i个变量和第j个变量的协方差。卡尔曼滤波 (Kalman Filter):这是机器人定位的核心。它通过维护一个协方差矩阵来表示系统对当前位置估计的“不确定度”。
PCA(主成分分析):通过对协方差矩阵进行特征分解,找到数据方差最大的方向,从而实现降维。
你想看看如何用 Python (NumPy) 快速计算一组实验数据的协方差矩阵吗?或者需要我推导一下
Cov(X, Y) = E(XY) - E(X)E(Y)这个过程?
协方差矩阵:把“一堆样本数据” → 压缩成“变量之间关系 + 分布形状”的一个矩阵
-
线性判别分析LDA:假设每个类别的协方差一样,只根据$\mu, \pi$判断位置**,**二次项抵消 → 判别函数变线性 => 分类边界 = 直线 / 超平面
-
其实是用一个统一的 Σ 做“坐标变换”
x \rightarrow \Sigma^{-1/2} x变换之后:所有数据变成“球形”,然后:只比较中心距离。所以你那句话可以升级为:LDA = 把所有类变成同样形状 → 再用位置区分
LDA 的目标是找到一个线性判别准则,将数据分配到后验概率 P(G=k|X=x) 最大的那一类。我们按照你的逻辑链条一步步拆解:
1. 建模与高斯假设
首先,我们利用贝叶斯定理来计算样本 x 属于第 k 类的概率:
P(G=k|X=x) = \frac{f_k(x)\pi_k}{\sum_{l=1}^K f_l(x)\pi_l}
其中 \pi_k 是第 k 类的先验概率(通常是该类样本占总样本的比例)。
关键假设:
-
每类数据服从多元正态分布:$X|G=k \sim N(\mu_k, \Sigma)$。
-
协方差矩阵相等:所有类别共享同一个协方差矩阵 $\Sigma_k = \Sigma$。
2. 代入贝叶斯分类
我们要比较不同类别的后验概率。由于分母 \sum f_l(x)\pi_l 对所有类别都是一样的,我们只需要最大化分子,或者最大化分子的对数:
\log(f_k(x)\pi_k) = \log f_k(x) + \log \pi_k
代入多元高斯密度的公式 $f_k(x) = \frac{1}{(2\pi)^{p/2}|\Sigma|^{1/2}} e^{-\frac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k)}$:
\delta_k(x) = \log \pi_k - \frac{p}{2}\log(2\pi) - \frac{1}{2}\log|\Sigma| - \frac{1}{2}(x-\mu_k)^T\Sigma^{-1}(x-\mu_k)
3. \Sigma 相同 \rightarrow 二次项消失
这一步是 LDA 为何被称为“线性”的关键。展开上面的二次型部分:
(x-\mu_k)^T\Sigma^{-1}(x-\mu_k) = x^T\Sigma^{-1}x - x^T\Sigma^{-1}\mu_k - \mu_k^T\Sigma^{-1}x + \mu_k^T\Sigma^{-1}\mu_k
当你比较两类(比如 k 和 $l$)的判别函数大小时:
-
常数项
\frac{p}{2}\log(2\pi)和\frac{1}{2}\log|\Sigma|抵消了。 -
关键点:由于
\Sigma相同,二次项x^T\Sigma^{-1}x在做减法比较时也完全抵消了。
4. 得到线性判别函数 (Linear Discriminant Function)
删掉抵消掉的项,只保留与 k 相关的项,我们得到线性判别函数:
\delta_k(x) = x^T\Sigma^{-1}\mu_k - \frac{1}{2}\mu_k^T\Sigma^{-1}\mu_k + \log \pi_k
可以看到,x 的最高次数是 1。这意味着两个类别之间的决策边界 \delta_k(x) = \delta_l(x) 是一个超平面(Hyperplane)。
5. 总结:LDA 的直观理解
虽然上面的推导是从概率视角出发的(生成模型),但 LDA 最终在做的事情可以概括为:
-
类内方差最小化:让同一类的数据尽量紧凑。
-
类间均值最大化:让不同类的数据中心尽量远离。
延伸思考:如果 \sigma 不同呢?
如果每一类有自己的 $\Sigma_k$,那么二次项 x^T\Sigma_k^{-1}x 就无法抵消。这会导致决策边界变成二次曲线(抛物线、双曲线等),这就是 QDA(二次判别分析)。
你在做计算机视觉或者机器人传感器融合时,如果环境噪声(协方差)在不同状态下差异很大,QDA 可能会比 LDA 更准,但计算开销也更大。
需要我用一段简单的 NumPy 代码演示一下如何从数据中估计 \Sigma 和 \mu_k 吗?
-
逻辑斯蒂回归:直接假设:
\log \frac{P(G=1|X)}{P(G=0|X)} = \beta_0 + \beta^T X -
它的逻辑是:“我不管你数据怎么来的,我直接学分类边界”
-
下面的分母可以是一个锚点,比如:
\ln \left( \frac{P(G=1|x)}{P(G=K|x)} \right) = w_1^Tx + b_1
“首先对于凸函数 (convex func on),其局部最优点即为全局最优点,所以总是 (?) 可以收敛到最 优点的,除非数值不稳定,比如矩阵的条件数过大。而凹函数取负号就变成了凸函数。 步长折 半 (step size halving):”
LDA:
-
从 概率分布出发
-
有强假设(高斯 + 同协方差)
-
推出线性边界
Logistic:
-
从 边界形式出发
-
不关心分布
-
直接优化分类概率
第一阶段:概率建模(建立“打分”协议)
我们要解决的问题是:给定输入 $X$,预测它属于哪一类 $G$。
1. 定义输出
对于二分类,我们假设 Y 服从伯努利分布:
P(Y=1|X) = p(x), \quad P(Y=0|X) = 1-p(x)
为了用一个统一的连续函数来回归这个 $p(x)$,我们引入 Logistic(Sigmoid)函数:
p(x) = \sigma(z) = \frac{1}{1 + e^{-z}}, \quad \text{其中 } z = \beta^T x
逻辑点: 为什么要用 $\sigma(z)$?因为它能把
(-\infty, +\infty)的线性回归结果,压缩到(0, 1)的概率空间。
2. 推广到多分类(Softmax)
如果我们有 K 个类别,我们给每一类都配一个线性得分 $z_k = \beta_k^T x$。为了让所有类的概率和为 1,我们采用 Softmax:
p_k(x) = \frac{e^{z_k}}{\sum_{j=1}^K e^{z_j}}
第二阶段:似然估计(寻找最合理的参数)
现在模型有了,我们需要一套标准来衡量什么样的 \beta 是最好的。
1. 构建似然函数
假设我们的样本是独立同分布的。对于单个样本 $(x, y)$,其出现的概率(似然)可以巧妙地写成:
P(y|x) = p(x)^y (1-p(x))^{1-y}
对于整个数据集 $N$,总似然函数就是所有样本概率的累乘:
L(\beta) = \prod_{i=1}^N p(x_i)^{y_i} (1-p(x_i))^{1-y_i}
2. 取对数(降维打击)
乘法太难算,由于 \log 是单调递增的,最大化 L(\beta) 等价于最大化 $\log L(\beta)$:
\ell(\beta) = \sum_{i=1}^N [y_i \log p(x_i) + (1-y_i) \log (1-p(x_i))]
这就是 对数似然(Log-Likelihood)。
第三阶段:定义损失函数(从统计转向优化)
在计算机科学和优化领域,我们习惯“最小化”一个成本,而不是“最大化”一个收益。
1. 负对数似然 (NLL)
我们给对数似然加个负号,就得到了损失函数:
Loss = -\ell(\beta) = \sum_{i=1}^N \underbrace{-[y_i \log p(x_i) + (1-y_i) \log (1-p(x_i))]}_{\text{每个样本的交叉熵}}
2. 链接交叉熵 (Cross-Entropy)
回到信息论。如果我们有两个分布 $y$(真实分布)和 $p$(预测分布),它们之间的交叉熵定义为:
H(y, p) = -\sum_k y_k \log p_k
-
在二分类中,只有两项:$- [y \log p + (1-y) \log (1-p)]$。
-
在多分类中,它是:$-\sum_{k=1}^K y_k \log p_k$。
总结:逻辑闭环
-
物理层 (Data):观测到
X和标签 $Y$。 -
协议层 (Model):用线性回归算出得分 $z$,通过 Sigmoid/Softmax 映射成概率 $p$。
-
度量层 (Strategy):基于极大似然估计,推导出我们希望预测概率
p在真实标签y上的分布越集中越好。 -
实现层 (Loss):最终落脚到最小化交叉熵。
你会发现:
这套推导完全避开了“分类”这个动作,它全程都在做概率密度的回归。所谓的分类,只是在最后选一个 p 最大的索引罢了。
这套逻辑在你写 AI 相关的 Rust 代码时,对应的就是从 Linear Layer 输出 Logits (z),经过 Softmax 变成 Probs (p),最后塞进 CrossEntropyLoss 计算梯度。
这遍梳理下来,AIC/BIC 和这个 Loss 之间的联系是不是更清晰了?(提示:AIC 里的 -2 \log L 里的 L 就是我们刚才算的这个似然函数)。
我们假设:
Y \sim \text{Bernoulli}(p(x))
P(Y=1|X)=p(x), \quad P(Y=0|X)=1-p(x)
P(y|x) = p(x)^y (1-p(x))^{1-y}
L(\beta) = \prod_i p(x_i)^{y_i} (1-p(x_i))^{1-y_i}
\ell(\beta) = \sum_i \left[ y_i \log p(x_i) + (1-y_i)\log(1-p(x_i)) \right]
\min_\beta -\ell(\beta)
\sum_i \left[ -y_i \log p(x_i) - (1-y_i)\log(1-p(x_i)) \right]
二分类你用的是:
p(x)=\frac{1}{1+e^{-z}}
多分类换成:
p_k(x)=\frac{e^{z_k}}{\sum_{j=1}^K e^{z_j}}
其中:z_k = \beta_k^T x
对数似然:\log P = \sum_{k=1}^K y_k \log p_k(x)
最终 loss(交叉熵):-\sum_{k=1}^K y_k \log p_k(x)
Logistic(二分类)
建模:P(G|X)
Softmax Regression(多分类 Logistic)
建模:P(G=k|X)
LDA(多分类)
推导:
f_k(x)
P(G=k|X) \propto e^{f_k(x)}
- 分离超平面:直接分离 或者 根据距离平均分离