Fisher線性判別
Fisher判別法介紹
Fisher判別法是判別分析的方法之一,它是借助於方差分析的思想,利用已知各總體抽取的樣品的p維觀察值構造一個或多個線性判別函數y=l′x其中l= (l1,l2…lp)′,x= (x1,x2,…,xp)′,使不同總體之間的離差(記為B)盡可能地大,而同一總體內的離差(記為E)盡可能地小來確定判別系數l=(l1,l2…lp)′。數學上證明判別系數l恰好是|B-λE|=0的特征根,記為λ1≥λ2≥…≥λr>0。所對應的特征向量記為l1,l2,…lr,則可寫出多個相應的線性判別函數,在有些問題中,僅用一個λ1對應的特征向量l1所構成線性判別函數y1=l′1x不能很好區分各個總體時,可取λ2對應的特征向量l′2建立第二個線性判別函數y2=l′2x,如還不夠,依此類推。有了判別函數,再人為規定一個分類原則(有加權法和不加權法等)就可對新樣品x判別所屬 [1] 。
Fisher判別法是根據方差分析的思想建立起來的一種能較好區分各個總體的線性判別法,由Fisher在1936年提出。該判別方法對總體的分布不做任何要求。
Fisher判別法是一種投影方法,把高維空間的點向低維空間投影。在原來的坐標系下,可能很難把樣品分開,而投影后可能區別明顯。一般說,可以先投影到一維空間(直線)上,如果效果不理想,在投影到另一條直線上(從而構成二維空間),依此類推。每個投影可以建立一個判別函數 [2] 。
Fisher線性判別
Fisher分類器也叫Fisher線性判別(Fisher Linear Discriminant),或稱為線性判別分析(Linear Discriminant Analysis,LDA)。LDA有時也被稱為Fisher’s LDA。最初於1936年,提出Fisher線性判別,后來於1948年,進行改進成如今所說的LDA。
Fisher的基本思想是:
訓練時,將訓練樣本投影到某條直線上,這條直線可以使得同類型的樣本的投影點盡可能接近,而異類型的樣本的投影點盡可能遠離。要學習的就是這樣的一條直線。
預測時,將待預測數據投影到上面學習到的直線上,根據投影點的位置來判斷所屬於的類別。
線性判別函數的一般形式可表示成
g(X)=WTW^TWTX+w0w_0w0
其中

Fisher選擇投影方向W的原則,即使原樣本向量在該方向上的投影能兼顧類間分布盡可能分開,類內樣本投影盡可能密集的要求。
Fisher准則函數的定義
幾個必要的基本參量:
在d維X空間
(1)各類樣本的均值向量mi

(2)樣本類內離散度矩陣Si和總樣本類內離散度矩陣Sw

其中Sw是對稱半正定矩陣,而且當N>d時通常是非奇異的。(半正定矩陣:特征值都不小於零的實對稱矩陣;非奇異矩陣:矩陣的行列式不為零)
(3)樣本類間離散度矩陣Sb

Sb是對稱半正定矩陣。
在一維Y空間
(1)各類樣本的均值

(2)樣本類內離散度 和總樣本類內離散度

我們希望投影后,在一維Y空間中各類樣本盡可能分得開些,即希望兩類均值之差越大越好,同時希望各類樣本內部盡量密集,即希望類內離散度越小越好。
Fisher准則函數定義

由各類樣本的均值可推出:

這樣,Fisher准則函數JF(w)的分子可寫成:

python代碼實現
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
path=r'./Iris.xls'
df = pd.read_csv(path, header=0)
Iris1=df.values[0:50,0:4]
Iris2=df.values[50:100,0:4]
Iris3=df.values[100:150,0:4]
m1=np.mean(Iris1,axis=0)
m2=np.mean(Iris2,axis=0)
m3=np.mean(Iris3,axis=0)
s1=np.zeros((4,4))
s2=np.zeros((4,4))
s3=np.zeros((4,4))
for i in range(0,30,1):
a=Iris1[i,:]-m1
a=np.array([a])
b=a.T
s1=s1+np.dot(b,a)
for i in range(0,30,1):
c=Iris2[i,:]-m2
c=np.array([c])
d=c.T
s2=s2+np.dot(d,c)
#s2=s2+np.dot((Iris2[i,:]-m2).T,(Iris2[i,:]-m2))
for i in range(0,30,1):
a=Iris3[i,:]-m3
a=np.array([a])
b=a.T
s3=s3+np.dot(b,a)
sw12=s1+s2
sw13=s1+s3
sw23=s2+s3
#投影方向
a=np.array([m1-m2])
sw12=np.array(sw12,dtype='float')
sw13=np.array(sw13,dtype='float')
sw23=np.array(sw23,dtype='float')
#判別函數以及T
#需要先將m1-m2轉化成矩陣才能進行求其轉置矩陣
a=m1-m2
a=np.array([a])
a=a.T
b=m1-m3
b=np.array([b])
b=b.T
c=m2-m3
c=np.array([c])
c=c.T
w12=(np.dot(np.linalg.inv(sw12),a)).T
w13=(np.dot(np.linalg.inv(sw13),b)).T
w23=(np.dot(np.linalg.inv(sw23),c)).T
#print(m1+m2) #1x4維度 invsw12 4x4維度 m1-m2 4x1維度
T12=-0.5*(np.dot(np.dot((m1+m2),np.linalg.inv(sw12)),a))
T13=-0.5*(np.dot(np.dot((m1+m3),np.linalg.inv(sw13)),b))
T23=-0.5*(np.dot(np.dot((m2+m3),np.linalg.inv(sw23)),c))
kind1=0鄭州人流醫院哪家好 http://mobile.zhongyuan120.com/
kind2=0
kind3=0
newiris1=[]
newiris2=[]
newiris3=[]
for i in range(29,49):
x=Iris1[i,:]
x=np.array([x])
g12=np.dot(w12,x.T)+T12
g13=np.dot(w13,x.T)+T13
g23=np.dot(w23,x.T)+T23
if g12>0 and g13>0:
newiris1.extend(x)
kind1=kind1+1
elif g12<0 and g23>0:
newiris2.extend(x)
elif g13<0 and g23<0 :
newiris3.extend(x)
#print(newiris1)
for i in range(29,49):
x=Iris2[i,:]
x=np.array([x])
g12=np.dot(w12,x.T)+T12
g13=np.dot(w13,x.T)+T13
g23=np.dot(w23,x.T)+T23
if g12>0 and g13>0:
newiris1.extend(x)
elif g12<0 and g23>0:
newiris2.extend(x)
kind2=kind2+1
elif g13<0 and g23<0 :
newiris3.extend(x)
for i in range(29,49):
x=Iris3[i,:]
x=np.array([x])
g12=np.dot(w12,x.T)+T12
g13=np.dot(w13,x.T)+T13
g23=np.dot(w23,x.T)+T23
if g12>0 and g13>0:
newiris1.extend(x)
elif g12<0 and g23>0:
newiris2.extend(x)
elif g13<0 and g23<0 :
newiris3.extend(x)
kind3=kind3+1
correct=(kind1+kind2+kind3)/60
print("樣本類內離散度矩陣S1:",s1,'\n')
print("樣本類內離散度矩陣S2:",s2,'\n')
print("樣本類內離散度矩陣S3:",s3,'\n')
print('-----------------------------------------------------------------------------------------------')
print("總體類內離散度矩陣Sw12:",sw12,'\n')
print("總體類內離散度矩陣Sw13:",sw13,'\n')
print("總體類內離散度矩陣Sw23:",sw23,'\n')
print('-----------------------------------------------------------------------------------------------')
print('判斷出來的綜合正確率:',correct*100,'%')