Fisher判別的推導概念和過程+python代碼實現(三分類)

數據集Iris.csv:鏈接下載:
提取碼:eah8

一、Fisher算法的主要思想

  • 線性判別分析(Linear Discriminant Analysis
    簡稱LDA)是一種經典的線性學習方法,在二分類問題上因爲最早由【Fisher,1936年】提出,所以也稱爲“Fisher 判別分析!”
    Fisher(費歇)判別思想是投影,使多維問題簡化爲一維問題來處理。選擇一個適當的投影軸,使所有的樣本點都投影到這個軸上得到一個投影值。對這個投影軸的方向的要求是:使每一類內的投影值所形成的類內離差儘可能小,而不同類間的投影值所形成的類間離差儘可能大。
    在這裏插入圖片描述

二、Fisher數學算法步驟

  • 爲了找到最佳投影方向,需要計算出 各類樣本均值、樣本類內離散度矩陣 Si\boldsymbol S_{i}S i和樣本總類內離散度矩陣 Sw\boldsymbolS_{w}Sw、樣本類間離散度矩陣 Sb\boldsymbol S_{b}Sb ,根據Fisher準則,找到最佳投影向量,將訓練集內的所有樣本進行投影,投影到一維Y空間,由於Y空間是一維的,則需要求出Y空間的劃分邊界點,找到邊界點後,就可以對待測樣本進行一維Y空間投影,判斷它的投影點與分界點的關係,將其歸類。具體方法如下(以兩類問題爲例子):

①計算各類樣本均值向量mim_i,mim_i是各個類的均值,NiN_iwiw_i類的樣本個數。

在這裏插入圖片描述

②計算樣本類內離散度矩陣SiS_i和總類內離散度矩陣SwS_w

在這裏插入圖片描述

③計算樣本類間離散度矩陣SbS_b

在這裏插入圖片描述

④求投影方向向量 WW (維度和樣本的維度相同)。我們希望投影后,在一維YY空間裏各類樣本儘可能分開,就是我們希望的兩類樣本均值之差(m1m2)(\overline{m_1}-\overline{m_2})越大越好,同時希望各類樣本內部儘量密集,即是:希望類內離散度越小越好。因此,我們可以定義Fisher準則函數爲:

在這裏插入圖片描述

2使得JF(w)J_F(w)取得最大值ww爲:

在這裏插入圖片描述

⑤將訓練集內所有樣本進行投影。

在這裏插入圖片描述

⑥. 計算在投影空間上的分割閾值y0y_0,在一維Y空間,各類樣本均值mi\overline{m_i}爲:

在這裏插入圖片描述
樣本類內離散度Si2\overline{S_i}^2和總類內離散度 Sw\overline{S_w}
在這裏插入圖片描述
而此時類間離散度就成爲兩類均值差的平方。
在這裏插入圖片描述

計算閾值y0y_0
在這裏插入圖片描述

⑦對於給定的測試樣本xx,計算出它在ww上的投影點yy

在這裏插入圖片描述

⑧根據決策規則分類!

在這裏插入圖片描述

三、python實現代碼

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt 
import seaborn as sns
path=r'D:/iris-data/iris.csv'
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) 
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維度
#判別函數以及閾值T(即w0)
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
kind2=0
kind3=0
newiris1=[]
newiris2=[]
newiris3=[]
for i in range(30,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(30,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(30,50):
    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,'%')

運行結果:
在這裏插入圖片描述

以上便是此次實驗的所有結果。

 參考博客:http://bob0118.club/?p=266 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章