线性判别函数基本概念

我们主要讨论在两类情况下判别函数为线性的情况,这里给出一般情况: g ( x ) = w T x g(\bf{x})=\bf{w}^T \bf{x} g(x)=wTx+ w 0 w_0 w0
式子中 x \bf{x} x为d维样本向量, w \bf{w} w为权向量,如下:
x = [ x 1 x 2 ⋮ x d ] , w = [ w 1 w 2 ⋮ w d ] \bf{x}=\begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_d \end{bmatrix},\bf{w}=\begin{bmatrix} w_1 \\ w_2 \\ \vdots \\ w_d \end{bmatrix} x=x1x2xdw=w1w2wd
w 0 w_0 w0为一个常数,称为阈值权

g ( x ) = g 1 ( x ) − g 2 ( x ) g(\bf{x})=g_1(\bf{x})-g_2(\bf{x}) g(x)=g1(x)g2(x)
x 0 \bf{x}_0 x0为一个待分类样本,我们可以通过比较 g ( x 0 ) g(\bf{x}_0) g(x0)与0的大小来区分此样本属于哪一类

Fisher线性判别分析基本思想

Fisher线性判别分析的基本思想是把所有样本向某一一维向量上投影,使得同一类样本的投影点尽可能集中,而不同类的样本投影点之间距离比较远,如图:
在这里插入图片描述
而如何定量分析找到这一最佳投影方向则是我们下面需要进行的任务

最优方向推导过程

原样本空间中,设共有 N N N个样本,属于第一类 Ψ 1 \Psi_1 Ψ1的有 N 1 N_1 N1个,属于第二类 Ψ 2 \Psi_2 Ψ2的有 N 2 N_2 N2个,每个样本都为一个d维向量,如之前所述。为了方便计算我们定义一些量:
类均值向量:
m i \bf{m_i} mi= 1 N i ∑ x j ∈ Ψ i x j , \frac{1}{N_i} \sum_{x_j\in\Psi_i}^{} \bf{x}_j, Ni1xjΨixj, i = 1 , 2 i=1,2 i=1,2
各类的类内离散度矩阵:
s i = ∑ x j ∈ Ψ i ( x j − m i ) ( x j − m i ) T , \bf{s}_i=\sum_{x_j\in\Psi_i}^{} (\bf{x}_j-\bf{m}_i)(\bf{x}_j-\bf{m}_i)^T, si=xjΨi(xjmi)(xjmi)T, i = 1 , 2 i=1,2 i=1,2
总类内离散度矩阵:
S w = S 1 + S 2 \bf{S}_w=\bf{S}_1+\bf{S}_2 Sw=S1+S2
类间离散度矩阵:
S b = ( m 1 − m 2 ) ( m 1 − m 2 ) T \bf{S}_b=(\bf{m}_1-\bf{m}_2)(\bf{m}_1-\bf{m}_2)^T Sb=(m1m2)(m1m2)T
而在投影之后,变为如下各量:
样本:
y i = w T x i , y_i=\bf{w}^T\bf{x}_i, yi=wTxi, i = 1 , 2 , ⋯   , N i=1,2,\cdots,N i=1,2,,N
两类均值:
m i ~ = w T m i , \tilde{m_i}=\bf{w}^T\bf{m}_i, mi~=wTmi, i = 1 , 2 i=1,2 i=1,2
内离散度:
S i 2 ~ = ∑ y j ∈ Ψ i ( y j − m i ~ ) 2 , i = 1 , 2 \tilde{S_i^2}=\sum_{y_j\in\Psi_i}(y_j-\tilde{m_i})^2,i=1,2 Si2~=yjΨi(yjmi~)2,i=1,2
总类内离散度:
S w ~ = S 1 2 ~ + S 2 2 ~ \tilde{S_w}=\tilde{S_1^2}+\tilde{S_2^2} Sw~=S12~+S22~
类间离散度:
S b ~ = ( m 1 ~ − m 2 ~ ) 2 \tilde{S_b}=(\tilde{m_1}-\tilde{m_2})^2 Sb~=(m1~m2~)2
有了以上的定义,我们的目标可以写为如下:
m a x    J F ( w ) = S b ~ S w ~ max\;J_F(w)=\frac{\tilde{S_b}}{\tilde{S_w}} maxJF(w)=Sw~Sb~
进一步推导可得:
S b ~ = w T S b w \tilde{S_b}=\bf{w}^T\bf{S}_b\bf{w} Sb~=wTSbw
S w ~ = w T S w w \tilde{S_w}=\bf{w}^T\bf{S}_w\bf{w} Sw~=wTSww
由于我们仅仅关心的是 w \bf{w} w的方向而并不关心其幅值,因此我们可以假定分母为常数而使分子尽量大,也就变为如下准则:
m a x    w T S b w ,    s . t .    w T S w w = c ≠ 0 max\;\bf{w}^T\bf{S}_b\bf{w},\;s.t.\;\bf{w}^T\bf{S}_w\bf{w}=c≠0 maxwTSbw,s.t.wTSww=c=0
利用拉格朗日乘子的有关知识,我们可以求解出最优方向 w \bf{w} w值:
w = S w − 1 ( m 1 − m 2 ) \bf{w}=\bf{S}_w^{-1}(\bf{m_1}-\bf{m_2}) w=Sw1(m1m2)

转换为判别函数

以上我们只是求解出了投影方向,如果要得到分类面,需要在投影之后的一维空间上确定一个分类阈值 w o w_o wo,并采取如下决策规则:
若 g ( x ) = w T x + w 0 ≥ 0 , 则 x ∈ Ψ 1 , 否 则 x ∈ Ψ 2 若g(\bf{x})=\bf{w}^T\bf{x}+w_0\geq0,则\bf{x}\in\Psi_1,否则\bf{x}\in\Psi_2 g(x)=wTx+w00,xΨ1,xΨ2
如果不考虑两类样本先验概率不同的情况,可以进行如下取值:
w 0 = − 1 2 ( m 1 ~ + m 2 ~ ) w_0=-\frac{1}{2}(\tilde{m_1}+\tilde{m_2}) w0=21(m1~+m2~)

完整代码

以下是利用python将以上过程实现的例子

#导入所需库:
import numpy as np
from matplotlib import pyplot as plt

#创建样本集:
X1 = np.array([[[1.2],[2.8]],
               [[1.9],[3.7]],
               [[2.5],[3.8]],
               [[4.8],[7.9]],
               [[5.6],[7.8]]])
X2 = np.array([[[9.7],[12.6]],
               [[10.8],[12.7]],
               [[13.7],[22.7]],
               [[7.48],[14.82]],
               [[11.23],[17.16]]])
N1 = X1.shape[0]
N2 = X2.shape[0]

#类均值向量:
m1 = np.array([[0],[0]])
for i in range(0,N1):
    m1 =m1+X1[i]
m1 = m1/N1
m2 = np.array([[0],[0]])
for i in range(0,N2):
    m2 =m2+X2[i]
m2 = m2/N2

#类内离散度矩阵:
S1 = np.zeros((2,2))
for i in range(0,N1):
    S1 = S1+np.dot(X1[i]-m1,np.transpose(X1[i]-m1))
S2 = np.zeros((2,2))
for i in range(0,N2):
    S2 = S2+np.dot(X2[i]-m2,np.transpose(X2[i]-m2))
Sw = S1+S2

#类间离散度矩阵:
Sb = np.dot(m1-m2,np.transpose(m1-m2))

#方向向量:
w = np.dot(np.linalg.inv(Sw),m1-m2)
print(w)

#投影后均值:
m11 = np.dot(np.transpose(w),m1)
m21 = np.dot(np.transpose(w),m2)
w0 = -(m11+m21)/2

#测试样本:
x_test = np.array([[3.42],[5.86]])
g = np.dot(np.transpose(w),x_test)+w0
if g>0:
    print('测试样本属于第一类!')
else:
    print('测试样本属于第二类!')


#可视化:
for i in range(0,N1):
    plt.scatter(X1[i,0],X1[i,1],c='r')
for i in range(0,N2):
    plt.scatter(X2[i,0],X2[i,1],c='b')
plt.scatter(x_test[0],x_test[1],c='g')
x = np.arange(0,15,0.01)
y = w[1]*x/w[0]
plt.plot(x,y,c='black')
plt.show()

运行结果如图:
在这里插入图片描述
在这里插入图片描述
最终将测试样本分入第一类,从图像上来看是合理的

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐