Fisher线性判别分析

博客围绕高维特征的两类线性判别问题展开,将样本投影到一个方向确定分类阈值和分类面。介绍了Fisher准则函数,通过一系列矩阵计算和转换得到最优投影方向。还提及在投影方向上确定分类阈值及决策规则,前提是样本为正态分布且协方差矩阵相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)高维特征的两类线性判别问题可以看作是把所有样本都投影到一个方向上,然后在这个一维样本空间中确定一个分类的阈值。过这个阈值点且与投影方向垂直的超平面就是两类的分类面。

(2)由(1),我们可知,所谓分类就是要寻找一个投影方向w(w\in R^d),使原始空间中的样本x投影之后变成y= w^Tx。我们以两类分类为例,即i=1,2:使用X i表示第i类样本,m_{i}表示第i类样本的均值,N_{i}表示第i类的样本数量。

  ①则原始空间中的第i类样本均值计算如下:

                                                    m_{i}=\frac{1}{N_{i}}\sum_{x_{j}\in X i}{x_{j}},\quad(j=1,2,3,...)

  ②原始样本的各类内离散度矩阵为:

                                                       S_{i}=\sum_{x_{j}\in X{i}}(x_{j}-m_{i})(x_{j}-m_{i})^T

  ③总类内离散度矩阵为:

                                                                 S_{w}=S_{1}+S_{2}

  ④类间离散度矩阵为:

                                                        S_{b}=(m_1-m_2)(m_1-m_2)^T

  ⑤我们使用Yi表示第i类样本投影后的结果,\widetilde{m_{i}}表示第i类样本投影之后的均值,\widetilde{S_{i}^2}表示投影后的类内离散度矩阵,\widetilde{S_{w}}表示投影后的总类内离散度矩阵,\widetilde{S_{b}}表示投影后的类间离散度矩阵可以得到:

                                     \widetilde{m_i}={\frac{1}{N_{i}}}\sum_{y_j\in Y_i}y_{j}={\frac{1}{N_{i}}}\sum_{x_j\in X_i}w^Tx_{j}=w^{T}\sum_{x_{j}\in X_{i}}x_{j}=w^Tm_{i}

                                                       \widetilde{S_{i}^2}=\sum_{y_{i}\in Y_{i}}(y_{j}-\widetilde{m_{i}})^2,(i=1,2)

                                                           \widetilde{S_{w}}=\widetilde{S_{1}^2}+\widetilde{S_{2}^2}=w^TS_{w}w

                                                          \widetilde{S_{b}}=(\widetilde{m_{1}}-\widetilde{m_{2}})^2=w^TS_{b}w

   ⑥我们希望使投影后类间距大,类内距小,这样利于分类。即得到如下的准则:

                                             maxJ_{F}(w)=\frac{\widetilde{S_b}}{\widetilde{S_w}}=\frac{(\widetilde{m_1}-\widetilde{m_2})^2}{(\widetilde{S_1^2}+\widetilde{S_2^2})^2}=\frac{w^TS_bw}{w^TS_ww}

   称为Fisher准则函数。

   ⑦将⑥问题转化,可以得到:

                                                      \begin{Bmatrix} max &w^TS_bw\\ s.t.& w^TS_ww=c\neq 0\\ \end{matrix}

   转换为拉格朗日函数的无约束极值问题:

                                           L(w,\lambda)=w^TS_bw-\lambda(w^TS_ww-c)

   由\frac{\partial L}{\partial w}=0,可以得到S_bw^*-\lambda S_ww^*=0,即S_bw^*=\lambda S_ww^*。在两边同乘以S_w^{-1},即可得到

                                        S_w^{-1}S_bw^*=\lambda w^*=S_w^{-1}(m_{1}-m_{2})(m_{1}-m_{2})^Tw^*

   因为(m_{1}-m_{2})^Tw^*为常数,故w^*在方向上服从S_w^{-1}(m_{1}-m_{2}),也即Fisher判别准则下的最优投影方向。

(3)在(2)中,Fisher判别函数最优解本身只是给出了一个投影方向,并没有给出我们所要的分类面。我们需要在投影后的方向(一维空间)上确定一个分类阈值w_0,并采取决策规则(\xi_i表示样本类别):

                                                   g(x)=w^Tx+w_0 \begin{Bmatrix} >0 , x\in \xi_1 & \\ \leqslant0 , x\in \xi_2 & \\ \end{matrix}

 ①我们知道,最优贝叶斯分类器是线性函数g(x)=w^Tx+w_0,且有:

                                                  \begin{Bmatrix} w=\sum^{-1}(\mu_1-\mu_2)&\\ w_0=-{}\frac{1}{2}(\mu_1+\mu_2)^T\sum^{-1}(\mu_1-\mu_2)-ln{}\frac{p(w_2)}{p(w_1)} &\\ \end{matrix}

  当然,这个前提得是样本是正太分布的,并且两类样本的协方差矩阵相同。

  ②对比(2)—⑦,我们可以得到:

                                                   \begin{Bmatrix} w=S_w^{-1}(m_1-m_2)&\\ w_0=-{}\frac{1}{2}(m_1+m_2)^TS_w^{-1}(m_1-m_2)-ln{}\frac{p(w_2)}{p(w_1)} &\\ \end{matrix}

  ③故而有决策规则:

                                             g(x)=w^T(x-{}\frac{1}{2}(m_1+m_2)) \begin{Bmatrix} >log{}\frac{p(w_2)}{p(w_1)} , x\in \xi_1 & \\ \leqslant log{}\frac{p(w_2)}{p(w_1)} , x\in \xi_2 & \\ \end{matrix}

   其中,w=S_w^{-1}(m_1-m_2)

 

 

好的,Fisher判别分析是一种分类算法,它可以将多维数据投影到一维空间,并且保证投影后的数据能够最大化类间距离,最小化类内距离。现在我们来实现一下。 首先导入需要的库:numpy、pandas 和 matplotlib。 ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt ``` 接下来,我们将给定的数据导入到程序中。 ```python # 加载数据 data = pd.read_csv('data.csv') print(data.head()) ``` 输出结果: ``` x1 x2 y 0 12.882292 10.228199 1 1 10.658871 -1.516233 1 2 -0.027255 -7.205887 0 3 9.993827 -0.792893 1 4 9.297497 -2.005293 1 ``` 我们可以看到,数据集中有两个特征 x1 和 x2,以及一个标签 y。y 的取值为 0 或 1,表示两个不同的类别。 接下来,我们需要将数据集分成两个类别的样本集。我们可以使用 pandas 的 groupby 函数,将数据按照 y 的取值进行分组。 ```python # 将数据分成两个类别 grouped = data.groupby('y') group1 = grouped.get_group(0) group2 = grouped.get_group(1) ``` 现在我们可以分别计算两个类别的均值向量和协方差矩阵。 ```python # 计算两个类别的均值向量和协方差矩阵 mean1 = group1.mean()[['x1', 'x2']].values mean2 = group2.mean()[['x1', 'x2']].values cov1 = group1[['x1', 'x2']].cov().values cov2 = group2[['x1', 'x2']].cov().values ``` 计算完均值向量和协方差矩阵后,我们需要计算 Fisher 系数,以便找到最佳的投影方向Fisher 系数的计算公式为: $$ F=\frac{(m_1-m_2)^2}{s_1^2+s_2^2} $$ 其中,$m_1$ 和 $m_2$ 分别表示两个类别的均值向量,$s_1^2$ 和 $s_2^2$ 分别表示两个类别的协方差矩阵的迹。 ```python # 计算 Fisher 系数 m1_m2 = mean1 - mean2 s1_s2 = np.trace(cov1) + np.trace(cov2) F = np.dot(m1_m2.T, m1_m2) / s1_s2 ``` 计算完 Fisher 系数后,我们需要将数据投影到一维空间。投影的公式为: $$ y=w^Tx $$ 其中,$y$ 表示投影后的结果,$w$ 是投影向量,$x$ 是原始数据。 我们可以通过最大化 Fisher 系数来找到最佳的投影向量 $w$。最佳的投影向量是两个类别的均值向量之差。 ```python # 找到最佳的投影向量 w = (mean1 - mean2) / np.linalg.norm(mean1 - mean2) ``` 现在我们可以使用投影向量 $w$ 将数据投影到一维空间。 ```python # 投影数据到一维空间 projected1 = np.dot(group1[['x1', 'x2']].values, w) projected2 = np.dot(group2[['x1', 'x2']].values, w) ``` 最后,我们可以将投影后的数据可视化。 ```python # 可视化投影后的数据 plt.scatter(projected1, np.zeros(projected1.shape), color='red') plt.scatter(projected2, np.zeros(projected2.shape), color='blue') plt.show() ``` 输出结果: ![Fisher判别分析](https://img-blog.csdnimg.cn/20210728112406488/4010d6ac693c4f2b9c1cda9c7b4cd2c1.png) 完整代码如下:
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值