fisher線性分類器


 

  • Fisher准則函數

Fisher准則的基本原理:找到一個最合適的投影軸,使兩類樣本在該軸上投影之間的距離盡可能遠,而每一類樣本的投影盡可能緊湊,從而使分類效果為最佳。

假設有兩類樣本,分別為$X_1$和$X_2$

 則各類在d維特征空間里的樣本均值為:

$$M_i = \frac{1}{n_i}\sum_{x_k\in X_i}x_k \ \ \ i=1,2$$

通過$\omega$變換后,將d維空間里的樣本投影到一維。($y_k$是$x_k$通過$\omega$變換后的標量)

各類在1維特征空間里的樣本均值為: 

$$m_i=\frac{1}{n_i}\sum_{y_k \in Y_i}y_k\ \ \ i=1,2$$

各類樣本類內離散度:

$$s_i^2=\sum_{y_k  \in Y_i}(y_k-m_i)^2\ \ \ i=1,2$$

我們的目標是變換以后兩類樣本均值距離盡可能遠並且每個樣本盡可能聚在一起,即:

$$max J_F(\omega) = \frac{(m_1-m_2)^2}{s_1^2+s_2^2}$$

使$J_F$最大的$\omega*$是最佳解向量,也就是Fisher的線性判別式

 

 

  • Fisher准則函數的求解

$$y=\omega^Tx$$

$$m_i=\frac{1}{n_i}\sum_{x_k \in X_i}\omega^Tx_k=\omega^TM_i$$

$$(m_1-m_2)^2 = (\omega^TM_1-\omega^TM_2)^2$$

$$= \omega^T(M_1-M_2)(M_1-M_2)^T\omega = \omega^TS_b\omega$$

原始維度下的類間離散度$S_b=(M_1-M_2)(M_1-M_2)^T$

$S_b$表示兩類均值向量之間的離散度大小

 

$$s_1^2+s_2^2=\sum_{x_k  \in X_i}(\omega^Tx_k-\omega^TM_i)^2 \ \ \ i=1,2$$

$$=\omega^T · \sum_{x_k \in X_i}(x_k-M_i)(x_k-M_i)^T ·\omega = \omega^TS_w\omega$$

樣本"類內總離散度"矩陣$S_w= \sum_{x_k \in X_i}(x_k-M_i)(x_k-M_i)^T \ \ \ i=1,2$

 

將上述推導結論代入$J_F(\omega)$,得:$J_F(\omega)=\frac{\omega^TS_b\omega}{\omega^TS_w\omega}$

其中$S_b$和$S_w$都可以從樣本集$X_i$直接計算出來

 

 用lagrange乘子法求解。令分母為常數$c=\omega^TS_w\omega\ \ \ c\neq0$

$$L(\omega,\lambda)=\omega^TS_b\omega-\lambda(\omega^TS_w\omega-c)$$

$$\frac{\partial L(\omega,\lambda)}{\partial\omega}=2(S_b\omega-\lambda S_w\omega)=0$$

$\omega$是法向量, 所以比例因子可以去掉。

即$\omega = S_w^{-1}(M_1-M-2)$ 

 

閾值可以根據選擇:

$$b=-\frac{1}{2}(m_1+m_2)=-\frac{1}{2}(\omega^TM_1+\omega^Tm_2)$$

 

 

參考代碼:

  

import matplotlib.pyplot as plt
import numpy as np
import random
import math

fig=plt.figure()#初始化figure對象
ax=fig.add_subplot(111)#添加子圖
ax.set(xlim=[0,100],ylim=[0,100],title='Fisher criterion function')
x1=np.zeros((2,100))
x2=np.zeros((2,100))#新建2*100的矩陣用來保存數據
for i in range(100):#隨機生成第1類點
	rd=random.uniform(0,25)#隨機向量長度
	rd2=random.uniform(-math.pi,math.pi)#隨機向量方向
	xlab=25+math.sin(rd2)*rd
	ylab=75+math.cos(rd2)*rd#隨機點的坐標
	x1[0][i]=xlab
	x1[1][i]=ylab#保存到x1中
	ax.plot(xlab,ylab,color='red', marker='.')#圖形化顯示
for i in range(100):#隨機生成第2類點
	rd=random.uniform(0,25)
	rd2=random.uniform(-math.pi,math.pi)
	xlab=75+math.sin(rd2)*rd
	ylab=25+math.cos(rd2)*rd
	x2[0][i]=xlab
	x2[1][i]=ylab
	ax.plot(xlab,ylab,color='blue', marker='.')

M1=np.zeros(2)
M2=np.zeros(2)
for i in range(100):
	for j in range(2):
		M1[j]=M1[j]+0.01*x1[j][i]#求第一類點的重心

for i in range(100):
	for j in range(2):
		M2[j]=M2[j]+0.01*x2[j][i]#求第二類點的重心

ax.plot(M1[0],M1[1],color='black',marker='+',markersize=12)#將重心輸出
ax.plot(M2[0],M2[1],color='black',marker='+',markersize=12)

Sw=np.zeros((2,2))#求總類內離散度矩陣Sw
for i in range(100):
	Sw=Sw+0.01*np.mat(x1[:,i]-M1).T*np.mat(x1[:,i]-M1)
	+0.01*np.mat(x2[:,i]-M2).T*np.mat(x2[:,i]-M1)

w=np.dot(np.linalg.pinv(Sw),(M1-M2))#求出方向向量
w=np.mat(w.T)
midPoint=(M1+M2)/2#閾值
x=range(0,100)
y=[]
for i in range(100):
	y.append(-float(w[0][0])/float(w[1][0])*(i-float(midPoint[0]))+float(midPoint[1]))
#print(y)
ax.plot(x,y,color='green',marker='*')

plt.show()

 

 

 

 

附:向量求導

 

附:拉格朗日乘數法

基本形態:求函數$z=f(x,y)$在滿足$\varphi(x,y)=0$條件下的極值,可以轉化為函數$F(x,y,\lambda)=f(x,y)+\lambda\varphi(x,y)$的無條件極值問題,其中λ為參數。

令$F(x,y,\lambda)$對$x$和$y$和$\lambda$的一階偏導數等於零,即
$$F'_x=ƒ'_x(x,y)+\lambda\varphi'_x(x,y)=0$$
$$F'_y=ƒ'_y(x,y)+\lambda\varphi'_y(x,y)=0$$
$$F'_{\lambda}=\varphi(x,y)=0$$
由上述方程組解出$x$,$y$及$\lambda$,如此求得的$(x,y)$,就是函數$z=ƒ(x,y)$在條件$\varphi(x,y)=0$下的可能極值點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM