已知两类二维样本服从正态分布,设两类样本数相同,试求按Fisher准则设计线性分类器及其法线向量
时间: 2023-07-16 14:12:26 浏览: 134
根据Fisher准则,我们需要找到一个线性变换,将原始数据映射到一个新的空间,使得两类样本分别聚集在新空间中的两个不同点附近,且两个点之间距离越大越好。
设两类样本为$\{x_1,x_2,...,x_m\}$和$\{y_1,y_2,...,y_n\}$,其中$x_i \in R^2$表示第一类样本的第$i$个样本点,$y_i \in R^2$表示第二类样本的第$i$个样本点。
我们可以先计算两类样本的均值向量:
$$
\begin{aligned}
\mu_1 &= \frac{1}{m}\sum_{i=1}^{m}x_i\\
\mu_2 &= \frac{1}{n}\sum_{i=1}^{n}y_i
\end{aligned}
$$
然后计算类内散度矩阵$S_w$:
$$
S_w = \sum_{i=1}^{m}(x_i - \mu_1)(x_i - \mu_1)^T + \sum_{i=1}^{n}(y_i - \mu_2)(y_i - \mu_2)^T
$$
接着计算类间散度矩阵$S_b$:
$$
S_b = (\mu_1 - \mu_2)(\mu_1 - \mu_2)^T
$$
最后,我们需要找到一个法向量$w$,使得$w$与$S_b w$成正比而$w$与$S_w w$成反比。也就是说,我们需要求解如下的广义特征值问题:
$$
S_b w = \lambda S_w w
$$
解出来的$w$就是我们要找的法向量,可以用来构建线性分类器。
需要注意的是,如果$S_w$不可逆,我们可以用广义逆矩阵来代替。
另外,如果我们将$w$归一化,那么$w$就是线性分类器的法向量。
完整的算法流程如下:
1. 计算两类样本的均值向量$\mu_1$和$\mu_2$
2. 计算类内散度矩阵$S_w$
3. 计算类间散度矩阵$S_b$
4. 解广义特征值问题$S_b w = \lambda S_w w$
5. 归一化$w$,得到线性分类器的法向量
代码实现如下(假设两类样本已经分别存储在变量x和y中):
```python
import numpy as np
# 计算均值向量
mu1 = np.mean(x, axis=0)
mu2 = np.mean(y, axis=0)
# 计算类内散度矩阵
Sw = np.cov(x.T) + np.cov(y.T)
# 计算类间散度矩阵
Sb = np.outer(mu1 - mu2, mu1 - mu2)
# 解广义特征值问题
eigvals, eigvecs = np.linalg.eig(np.linalg.pinv(Sw).dot(Sb))
# 找到最大的特征值对应的特征向量
w = eigvecs[:, np.argmax(eigvals)]
# 归一化
w = w / np.linalg.norm(w)
```
其中,`np.cov()`函数用来计算协方差矩阵,`np.outer()`函数用来计算外积,`np.linalg.eig()`函数用来解特征值问题,`np.linalg.pinv()`函数用来计算广义逆矩阵。
阅读全文