346 lines
13 KiB
Markdown
346 lines
13 KiB
Markdown
# 第四章
|
||
|
||
“这个过程的一个很重要的类是 线性判别边界 (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$ 类的先验概率(通常是该类样本占总样本的比例)。
|
||
|
||
**关键假设**:
|
||
|
||
1. 每类数据服从**多元正态分布**:$X|G=k \sim N(\mu_k, \Sigma)$。
|
||
|
||
2. **协方差矩阵相等**:所有类别共享同一个协方差矩阵 $\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$。
|
||
|
||
|
||
---
|
||
|
||
### 总结:逻辑闭环
|
||
|
||
1. **物理层 (Data)**:观测到 $X$ 和标签 $Y$。
|
||
|
||
2. **协议层 (Model)**:用线性回归算出得分 $z$,通过 Sigmoid/Softmax 映射成概率 $p$。
|
||
|
||
3. **度量层 (Strategy)**:基于极大似然估计,推导出我们希望预测概率 $p$ 在真实标签 $y$ 上的分布越集中越好。
|
||
|
||
4. **实现层 (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)}$
|
||
|
||
- **分离超平面:直接分离** 或者 **根据距离平均分离** |