首页 > 编程笔记 > Python笔记

线性判别分析之方差与投影

线性判别也称为 Fisher 线性判别,它经常被用于分类和数据预处理中的降维步骤。之所以被称为Fisher线性判别,是因为它的提出者是罗纳德·费希尔(Ronald Fisher)。线性判别首次提出是在1936年,其最主要的使用场景是处理维数灾难而造成的过度拟合问题,少数情况下也用于处理分类问题。

一般意义上的线性判别算法(Linear Discriminant Analysis,LDA)与主成分分析算法(Principal Component Analysis,PCA)十分相似。它们的不同之处是PCA寻找的低纬空间是使全部数据方差最大,而 LDA 寻找的低纬空间则是综合考量方差与类别间距。

用高等数学的知识来解释线性判别算法,即线性判别就是降维,通过线性变换将高维空间的数据降到低维空间。但这对初学者来说并不好理解,所以本章我们将通过高中的数学知识来解释线性判别算法。

线性判别算法最核心的知识是方差和投影。方差用来描述一组数据的离散程度,即刻画各个数据和平均值的关系,而投影则用来解二元一次方程组。

1. 方差

方差用来描述一组数据的离散程度。可以形象地理解为,一组数据的方差越大,则取值范围越大,在图像中就越长;相反,则取值范围越小,在图像中就越短。假设有3组数据,如表 1 所示。
表1:3组数据
分组 数据
第1组 [1,2,3,4,5]
第2组 [2.7,25.3.5,3.7]
第3组 [3,3,3,3,3]
查看对 3 组数据的统计描述,如表 2 所示。

数据描述
表2:数据描述
可以看到,三组数据都有 5 个数,它们的均值都是 3,第一组数据的标准差>第二组数据的标准差>第三组数据的标准差。最直观的感受就是方差越大的数组,它的范围越大,越“长”;方差越小的数组,它的范围越小,越“短”,如图 1 所示。

数据的箱型图
图1:3组数据的箱型图

2. 投影

如图 2 所示,已知点

P(5,5)

和直线L

y=0.6x

现在求 P 点在直线上投影的坐标。

点P(5,5)和直线y=0.6x
图2:点P(5,5)和直线y=0.6x
 
如图 3 所示,直线 L 外一点P到直线L投影,是过点 P,并与直线 L 垂直的直线与直线 L 的交点 M。

点P在直线L上的投影
图3:点P在直线L上的投影

通过高中的知识我们知道,两条直线垂直,则他们的斜率乘积为 -1

k1⋅k2=-1

设过P点 (x0,y0) 的直线 L2 为:

y-y0=-k-(x-x0)

两条直线的交点为 M(x1,y1),那么可以得到如下方程:

线性判别分析:解方程
 
解方程可得交点 M 的坐标:

线性判别方程
Python 代码实现如下。

1) 导入画图模块

In [1]: import matplotlib.pyplot as plt

2) 实现公式

In [2]: def ty(k,b,p):
   ...:     x=range(0,12)
   ...:     y=[k*i+b for i in x]
   ...:     x1=(k*(p[1]-b)+p[0])/(k*k+1)
   ...:     y1=k*x1+b
   ...:     return {"line":[x,y],"tyd":[x1,y1]}

3) 初始化参数

In [3]: k=0.6
   ...: b=0
   ...: p=[5,5]

4) 获得相关数据

In [4]: data = ty(k,b,p)

5) 初始化作图的数据

In [5]: x=data['line'][0]
   ...: y=data['line'][1]
   ...: x1=data['tyd'][0]
   ...: y1=data['tyd'][1]

6) 作图

In [6]: plt.figure(figsize=(10,10))
   ...: plt.plot(x,y,color='k')
   ...: plt.scatter(p[0],p[1],color='',edgecolors='k')
   ...: plt.scatter(x1,y1,color='',edgecolors='k')
   ...: plt.plot([p[0],x1],[p[1],y1],ls='--',c='k')
   ...: plt.xlim(0,11)
   ...: plt.ylim(0,11)
   ...: plt.show()

3. 方差与投影的关系

已知点集 A,它在二维平面的分布如图 4 所示。

点集A的分布
图4:点集A的分布
 
如果将它们映射到一条直线上,我们很容易想到映射到 x 轴上时,得到的映射点的方差会大(长),如图 5 所示:

映射到x轴后,方差为1.02
图5:映射到x轴后,方差为1.02

我们逐渐增大斜率,将它们映射到 y=x 上(斜率为1)时,得到的映射点的方差会减小,如图 6 所示。

映射到y=x后,方差为0.79
图6:映射到y=x后,方差为0.79
 
而当映射到y轴上(斜率无限大)时,得到的映射点的方差会很小(短),如图 7 所示:

映射到y轴后,方差为0.11
图7:映射到y轴后,方差为0.11
 
斜率从0到正无穷逐渐增大的过程中,数组的方差是逐渐减小的,也就是数组的方差与斜率成反比。

声明:《Python系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。