线性判别也称为 Fisher 线性判别,它经常被用于分类和数据预处理中的降维步骤。之所以被称为Fisher线性判别,是因为它的提出者是罗纳德·费希尔(Ronald Fisher)。线性判别首次提出是在1936年,其最主要的使用场景是处理维数灾难而造成的过度拟合问题,少数情况下也用于处理分类问题。
一般意义上的线性判别算法(Linear Discriminant Analysis,LDA)与主成分分析算法(Principal Component Analysis,PCA)十分相似。它们的不同之处是PCA寻找的低纬空间是使全部数据方差最大,而 LDA 寻找的低纬空间则是综合考量方差与类别间距。
用高等数学的知识来解释线性判别算法,即线性判别就是降维,通过线性变换将高维空间的数据降到低维空间。但这对初学者来说并不好理解,所以本章我们将通过高中的数学知识来解释线性判别算法。
线性判别算法最核心的知识是方差和投影。方差用来描述一组数据的离散程度,即刻画各个数据和平均值的关系,而投影则用来解二元一次方程组。
方差用来描述一组数据的离散程度。可以形象地理解为,一组数据的方差越大,则取值范围越大,在图像中就越长;相反,则取值范围越小,在图像中就越短。假设有3组数据,如表 1 所示。
分组 | 数据 |
---|---|
第1组 | [1,2,3,4,5] |
第2组 | [2.7,25.3.5,3.7] |
第3组 | [3,3,3,3,3] |
查看对 3 组数据的统计描述,如表 2 所示。
可以看到,三组数据都有 5 个数,它们的均值都是 3,第一组数据的标准差>第二组数据的标准差>第三组数据的标准差。最直观的感受就是方差越大的数组,它的范围越大,越“长”;方差越小的数组,它的范围越小,越“短”,如图 1 所示。
如图 2 所示,已知点
P(5,5)
和直线L
y=0.6x
现在求 P 点在直线上投影的坐标。
如图 3 所示,直线 L 外一点P到直线L投影,是过点 P,并与直线 L 垂直的直线与直线 L 的交点 M。
通过高中的知识我们知道,两条直线垂直,则他们的斜率乘积为 -1
k1⋅k2=-1
设过P点 (x0,y0) 的直线 L2 为:
y-y0=-k-(x-x0)
两条直线的交点为 M(x1,y1),那么可以得到如下方程:
解方程可得交点 M 的坐标:
Python 代码实现如下。
In [1]: import matplotlib.pyplot as plt
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]}
In [3]: k=0.6
...: b=0
...: p=[5,5]
In [4]: data = ty(k,b,p)
In [5]: x=data['line'][0]
...: y=data['line'][1]
...: x1=data['tyd'][0]
...: y1=data['tyd'][1]
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()
已知点集 A,它在二维平面的分布如图 4 所示。
如果将它们映射到一条直线上,我们很容易想到映射到 x 轴上时,得到的映射点的方差会大(长),如图 5 所示:
我们逐渐增大斜率,将它们映射到 y=x 上(斜率为1)时,得到的映射点的方差会减小,如图 6 所示。
而当映射到y轴上(斜率无限大)时,得到的映射点的方差会很小(短),如图 7 所示:
斜率从0到正无穷逐渐增大的过程中,数组的方差是逐渐减小的,也就是数组的方差与斜率成反比。