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]\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=??????x1?x2??xd????????,w=??????w1?w2??wd????????
w0w_0w0?為一個常數,稱為閾值權
令
g(x)=g1(x)?g2(x)g(\bf{x})=g_1(\bf{x})-g_2(\bf{x})g(x)=g1?(x)?g2?(x)
設x0\bf{x}_0x0?為一個待分類樣本,我們可以通過比較g(x0)g(\bf{x}_0)g(x0?)與0的大小來區分此樣本屬于哪一類
Fisher線性判別分析基本思想
Fisher線性判別分析的基本思想是把所有樣本向某一一維向量上投影,使得同一類樣本的投影點盡可能集中,而不同類的樣本投影點之間距離比較遠,如圖:
而如何定量分析找到這一最佳投影方向則是我們下面需要進行的任務
最優方向推導過程
在原樣本空間中,設共有NNN個樣本,屬于第一類Ψ1\Psi_1Ψ1?的有N1N_1N1?個,屬于第二類Ψ2\Psi_2Ψ2?的有N2N_2N2?個,每個樣本都為一個d維向量,如之前所述。為了方便計算我們定義一些量:
類均值向量:
mi\bf{m_i}mi?=1Ni∑xj∈Ψixj,\frac{1}{N_i} \sum_{x_j\in\Psi_i}^{} \bf{x}_j,Ni?1?∑xj?∈Ψi??xj?, i=1,2i=1,2i=1,2
各類的類內離散度矩陣:
si=∑xj∈Ψi(xj?mi)(xj?mi)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,2i=1,2i=1,2
總類內離散度矩陣:
Sw=S1+S2\bf{S}_w=\bf{S}_1+\bf{S}_2Sw?=S1?+S2?
類間離散度矩陣:
Sb=(m1?m2)(m1?m2)T\bf{S}_b=(\bf{m}_1-\bf{m}_2)(\bf{m}_1-\bf{m}_2)^TSb?=(m1??m2?)(m1??m2?)T
而在投影之后,變為如下各量:
樣本:
yi=wTxi,y_i=\bf{w}^T\bf{x}_i,yi?=wTxi?, i=1,2,?,Ni=1,2,\cdots,Ni=1,2,?,N
兩類均值:
mi~=wTmi,\tilde{m_i}=\bf{w}^T\bf{m}_i,mi?~?=wTmi?, i=1,2i=1,2i=1,2
內離散度:
Si2~=∑yj∈Ψi(yj?mi~)2,i=1,2\tilde{S_i^2}=\sum_{y_j\in\Psi_i}(y_j-\tilde{m_i})^2,i=1,2Si2?~?=∑yj?∈Ψi??(yj??mi?~?)2,i=1,2
總類內離散度:
Sw~=S12~+S22~\tilde{S_w}=\tilde{S_1^2}+\tilde{S_2^2}Sw?~?=S12?~?+S22?~?
類間離散度:
Sb~=(m1~?m2~)2\tilde{S_b}=(\tilde{m_1}-\tilde{m_2})^2Sb?~?=(m1?~??m2?~?)2
有了以上的定義,我們的目標可以寫為如下:
maxJF(w)=Sb~Sw~max\;J_F(w)=\frac{\tilde{S_b}}{\tilde{S_w}}maxJF?(w)=Sw?~?Sb?~??
進一步推導可得:
Sb~=wTSbw\tilde{S_b}=\bf{w}^T\bf{S}_b\bf{w}Sb?~?=wTSb?w
Sw~=wTSww\tilde{S_w}=\bf{w}^T\bf{S}_w\bf{w}Sw?~?=wTSw?w
由于我們僅僅關心的是w\bf{w}w的方向而并不關心其幅值,因此我們可以假定分母為常數而使分子盡量大,也就變為如下準則:
maxwTSbw,s.t.wTSww=c≠0max\;\bf{w}^T\bf{S}_b\bf{w},\;s.t.\;\bf{w}^T\bf{S}_w\bf{w}=c≠0maxwTSb?w,s.t.wTSw?w=c?=0
利用拉格朗日乘子的有關知識,我們可以求解出最優方向的w\bf{w}w值:
w=Sw?1(m1?m2)\bf{w}=\bf{S}_w^{-1}(\bf{m_1}-\bf{m_2})w=Sw?1?(m1??m2?)
轉換為判別函數
以上我們只是求解出了投影方向,如果要得到分類面,需要在投影之后的一維空間上確定一個分類閾值wow_owo?,并采取如下決策規則:
若g(x)=wTx+w0≥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?
如果不考慮兩類樣本先驗概率不同的情況,可以進行如下取值:
w0=?12(m1~+m2~)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()運行結果如圖:
最終將測試樣本分入第一類,從圖像上來看是合理的
總結
以上是生活随笔為你收集整理的Fisher线性判别分析以及python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phP imageMagic抠图,使用
- 下一篇: python break怎么用_怎么使用