Fisher线性判别分析以及python实现

  • Post author:
  • Post category:python




线性判别函数基本概念

我们主要讨论在

两类情况

下判别函数为

线性

的情况,这里给出一般情况:



g

(

x

)

=

w

T

x

g(\bf{x})=\bf{w}^T \bf{x}






g


(




x



)




=







w











T











x









+



w

0

w_0







w










0






















式子中



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





=
















































































x










1

























x










2






































x










d











































































































w





=
















































































w










1

























w










2






































w










d














































































































w

0

w_0







w










0





















为一个常数,称为阈值权







g

(

x

)

=

g

1

(

x

)

g

2

(

x

)

g(\bf{x})=g_1(\bf{x})-g_2(\bf{x})






g


(




x



)




=





g










1


















(




x



)










g










2


















(




x



)














x

0

\bf{x}_0









x











0






















为一个待分类样本,我们可以通过比较



g

(

x

0

)

g(\bf{x}_0)






g


(





x











0


















)






与0的大小来区分此样本属于哪一类



Fisher线性判别分析基本思想

Fisher线性判别分析的基本思想是把所有样本向某一一维向量上投影,使得同一类样本的投影点尽可能集中,而不同类的样本投影点之间距离比较远,如图:

在这里插入图片描述

而如何定量分析找到这一最佳投影方向则是我们下面需要进行的任务



最优方向推导过程



原样本空间

中,设共有



N

N






N





个样本,属于第一类



Ψ

1

\Psi_1







Ψ










1





















的有



N

1

N_1







N










1





















个,属于第二类



Ψ

2

\Psi_2







Ψ










2





















的有



N

2

N_2







N










2





















个,每个样本都为一个d维向量,如之前所述。为了方便计算我们定义一些量:

类均值向量:




m

i

\bf{m_i}









m










i























=



1

N

i

x

j

Ψ

i

x

j

,

\frac{1}{N_i} \sum_{x_j\in\Psi_i}^{} \bf{x}_j,



















N










i
































1





































x










j






















Ψ










i
















































x











j


















,









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,









s











i




















=


















x










j






















Ψ










i











































(





x











j




























m











i


















)


(





x











j




























m











i



















)










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









S











w




















=







S











1




















+







S











2

























类间离散度矩阵:




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









S











b




















=




(





m











1




























m











2


















)


(





m











1




























m











2



















)










T


















而在

投影之后

,变为如下各量:

样本:




y

i

=

w

T

x

i

,

y_i=\bf{w}^T\bf{x}_i,







y










i




















=











w











T












x











i


















,










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,















m










i























~


















=











w











T












m











i


















,










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















S










i








2























~


















=






















y










j






















Ψ










i



































(



y










j






































m










i























~

















)










2









,




i




=








1


,




2






总类内离散度:




S

w

~

=

S

1

2

~

+

S

2

2

~

\tilde{S_w}=\tilde{S_1^2}+\tilde{S_2^2}















S










w























~


















=

















S










1








2























~


















+

















S










2








2























~




















类间离散度:




S

b

~

=

(

m

1

~

m

2

~

)

2

\tilde{S_b}=(\tilde{m_1}-\tilde{m_2})^2















S










b























~


















=








(











m










1























~




































m










2























~

















)










2













有了以上的定义,我们的目标可以写为如下:





m

a

x
  

J

F

(

w

)

=

S

b

~

S

w

~

max\;J_F(w)=\frac{\tilde{S_b}}{\tilde{S_w}}






m


a


x





J










F


















(


w


)




=




























S










w























~





































S










b























~







































进一步推导可得:





S

b

~

=

w

T

S

b

w

\tilde{S_b}=\bf{w}^T\bf{S}_b\bf{w}















S










b























~


















=











w











T












S











b




















w















S

w

~

=

w

T

S

w

w

\tilde{S_w}=\bf{w}^T\bf{S}_w\bf{w}















S










w























~


















=











w











T












S











w




















w











由于我们仅仅关心的是



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






m


a


x







w











T












S











b




















w



,






s


.


t


.







w











T












S











w




















w





=




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





=







S











w












1



















(





m










1





























m










2



















)











转换为判别函数

以上我们只是求解出了投影方向,如果要得到分类面,需要在投影之后的一维空间上确定一个分类阈值



w

o

w_o







w










o





















,并采取如下决策规则:





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



)




=







w











T











x





+





w










0

























0


,









x











Ψ










1


















,












x











Ψ










2




























如果不考虑两类样本先验概率不同的情况,可以进行如下取值:




w

0

=

1

2

(

m

1

~

+

m

2

~

)

w_0=-\frac{1}{2}(\tilde{m_1}+\tilde{m_2})







w










0




















=























2
















1





















(











m










1























~


















+

















m










2























~
















)






完整代码

以下是利用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()

运行结果如图:

在这里插入图片描述

在这里插入图片描述

最终将测试样本分入第一类,从图像上来看是合理的



版权声明:本文为weixin_50744311原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。