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