Fisher线性判别分析以及python实现
文章目錄
- 線(xiàn)性判別函數(shù)基本概念
- Fisher線(xiàn)性判別分析基本思想
- 最優(yōu)方向推導(dǎo)過(guò)程
- 轉(zhuǎn)換為判別函數(shù)
- 完整代碼
線(xiàn)性判別函數(shù)基本概念
我們主要討論在兩類(lèi)情況下判別函數(shù)為線(xiàn)性的情況,這里給出一般情況:g(x)=wTxg(\bf{x})=\bf{w}^T \bf{x}g(x)=wTx+w0w_0w0?
式子中x\bf{x}x為d維樣本向量,w\bf{w}w為權(quán)向量,如下:
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è)常數(shù),稱(chēng)為閾值權(quán)
令
g(x)=g1(x)?g2(x)g(\bf{x})=g_1(\bf{x})-g_2(\bf{x})g(x)=g1?(x)?g2?(x)
設(shè)x0\bf{x}_0x0?為一個(gè)待分類(lèi)樣本,我們可以通過(guò)比較g(x0)g(\bf{x}_0)g(x0?)與0的大小來(lái)區(qū)分此樣本屬于哪一類(lèi)
Fisher線(xiàn)性判別分析基本思想
Fisher線(xiàn)性判別分析的基本思想是把所有樣本向某一一維向量上投影,使得同一類(lèi)樣本的投影點(diǎn)盡可能集中,而不同類(lèi)的樣本投影點(diǎn)之間距離比較遠(yuǎn),如圖:
而如何定量分析找到這一最佳投影方向則是我們下面需要進(jìn)行的任務(wù)
最優(yōu)方向推導(dǎo)過(guò)程
在原樣本空間中,設(shè)共有NNN個(gè)樣本,屬于第一類(lèi)Ψ1\Psi_1Ψ1?的有N1N_1N1?個(gè),屬于第二類(lèi)Ψ2\Psi_2Ψ2?的有N2N_2N2?個(gè),每個(gè)樣本都為一個(gè)d維向量,如之前所述。為了方便計(jì)算我們定義一些量:
類(lèi)均值向量:
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
各類(lèi)的類(lèi)內(nèi)離散度矩陣:
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
總類(lèi)內(nèi)離散度矩陣:
Sw=S1+S2\bf{S}_w=\bf{S}_1+\bf{S}_2Sw?=S1?+S2?
類(lèi)間離散度矩陣:
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
而在投影之后,變?yōu)槿缦赂髁?#xff1a;
樣本:
yi=wTxi,y_i=\bf{w}^T\bf{x}_i,yi?=wTxi?, i=1,2,?,Ni=1,2,\cdots,Ni=1,2,?,N
兩類(lèi)均值:
mi~=wTmi,\tilde{m_i}=\bf{w}^T\bf{m}_i,mi?~?=wTmi?, i=1,2i=1,2i=1,2
內(nèi)離散度:
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
總類(lèi)內(nèi)離散度:
Sw~=S12~+S22~\tilde{S_w}=\tilde{S_1^2}+\tilde{S_2^2}Sw?~?=S12?~?+S22?~?
類(lèi)間離散度:
Sb~=(m1~?m2~)2\tilde{S_b}=(\tilde{m_1}-\tilde{m_2})^2Sb?~?=(m1?~??m2?~?)2
有了以上的定義,我們的目標(biāo)可以寫(xiě)為如下:
maxJF(w)=Sb~Sw~max\;J_F(w)=\frac{\tilde{S_b}}{\tilde{S_w}}maxJF?(w)=Sw?~?Sb?~??
進(jìn)一步推導(dǎo)可得:
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
由于我們僅僅關(guān)心的是w\bf{w}w的方向而并不關(guān)心其幅值,因此我們可以假定分母為常數(shù)而使分子盡量大,也就變?yōu)槿缦聹?zhǔn)則:
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
利用拉格朗日乘子的有關(guān)知識(shí),我們可以求解出最優(yōu)方向的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?)
轉(zhuǎn)換為判別函數(shù)
以上我們只是求解出了投影方向,如果要得到分類(lèi)面,需要在投影之后的一維空間上確定一個(gè)分類(lèi)閾值wow_owo?,并采取如下決策規(guī)則:
若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?
如果不考慮兩類(lèi)樣本先驗(yàn)概率不同的情況,可以進(jìn)行如下取值:
w0=?12(m1~+m2~)w_0=-\frac{1}{2}(\tilde{m_1}+\tilde{m_2})w0?=?21?(m1?~?+m2?~?)
完整代碼
以下是利用python將以上過(guò)程實(shí)現(xiàn)的例子
#導(dǎo)入所需庫(kù): import numpy as np from matplotlib import pyplot as plt#創(chuàng)建樣本集: 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]#類(lèi)均值向量: 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#類(lèi)內(nèi)離散度矩陣: 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#類(lèi)間離散度矩陣: 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#測(cè)試樣本: x_test = np.array([[3.42],[5.86]]) g = np.dot(np.transpose(w),x_test)+w0 if g>0:print('測(cè)試樣本屬于第一類(lèi)!') else:print('測(cè)試樣本屬于第二類(lèi)!')#可視化: 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()運(yùn)行結(jié)果如圖:
最終將測(cè)試樣本分入第一類(lèi),從圖像上來(lái)看是合理的
總結(jié)
以上是生活随笔為你收集整理的Fisher线性判别分析以及python实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: phP imageMagic抠图,使用
- 下一篇: python break怎么用_怎么使用