Fisher线性判别分析以及python实现
文章目录线性判别函数基本概念Fisher线性判别分析基本思想最优方向推导过程转换为判别函数完整代码线性判别函数基本概念我们主要讨论在两类情况下判别函数为线性的情况,这里给出一般情况:g(x)=wTxg(\bf{x})=\bf{w}^T \bf{x}g(x)=wTx+w0w_0w0式子中x\bf{x}x为d维样本向量,w\bf{w}w为权向量,如下:x=[x1x2⋮xd],w=[w1w2⋮wd]\
线性判别函数基本概念
我们主要讨论在两类情况下判别函数为线性的情况,这里给出一般情况:
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=⎣⎢⎢⎢⎡x1x2⋮xd⎦⎥⎥⎥⎤,w=⎣⎢⎢⎢⎡w1w2⋮wd⎦⎥⎥⎥⎤
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,
Ni1∑xj∈Ψ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(xj−mi)(xj−mi)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=(m1−m2)(m1−m2)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(yj−mi~)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=Sw−1(m1−m2)
转换为判别函数
以上我们只是求解出了投影方向,如果要得到分类面,需要在投影之后的一维空间上确定一个分类阈值
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+w0≥0,则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()
运行结果如图:
最终将测试样本分入第一类,从图像上来看是合理的
更多推荐
所有评论(0)