本关任务:使用 python 实现Fisher判别分析并将给定数据投影到一维空间。
时间: 2023-06-15 19:08:32 浏览: 212
基于Python进行模式识别(Fisher线性判别)【100012070】
5星 · 资源好评率100%
好的,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)
完整代码如下:
阅读全文