Fisher線性分類器

1.Fisher線性判別

線性判別分析是一種經典的線性學習方法,其思想:給定訓練樣例集,設法將樣例投影到一條直線上,使得同類樣例的投影點儘可能接近,異樣樣例的投影點儘可能遠離;在對新樣本進行分類時,將其投影到同樣的直線上,再根據投影點的位置來確定新樣本的類別

在這裏插入圖片描述

基本原理:

在這裏插入圖片描述

分析w1方向之所以比w2方向優越,可以歸納出這樣一個準則,即向量w的方向選擇應能使兩類樣本投影的均值之差儘可能大些,而使類內樣本的離散程度儘可能小。這就是Fisher準則函數的基本思路。

Fisher準則的基本原理,就是要找到一個最合適的投影軸,使兩類樣本在該軸上投影的交迭部分最少,從而使分類效果爲最佳。

最佳W值的確定:

最佳w值的確定實際上就是對Fisher準則函數求取其達極大值時的。

對於這個問題可以採用拉格朗日乘子算法解決,保持分母爲一非零常數c的條件下,求其分子項的極大值。

在這裏插入圖片描述

在這裏插入圖片描述

這個函數稱爲Fisher準則函數。應該尋找使分子儘可能大,分母儘可能小的w作爲投影向量。

在這裏插入圖片描述

定義函數Lagrange函數:

在這裏插入圖片描述

對拉格朗日函數分別對w求偏導並置爲0來求w的解。

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

這是一個求矩陣
在這裏插入圖片描述
的特徵值問題。

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

其中(m1-m2)Tw*=R

實際上我們關心的只是向量w*的方向,其數值大小對分類器沒有影響。因此在忽略了數值因子R/λ 後,可得:

在這裏插入圖片描述

上式就是使用Fisher準則求最佳法線向量的解。

向量w就是使Fisher準則函數JF(w)達極大值的解,也就是按Fisher準則將d維X空間投影到一維Y空間的最佳投影方向,該向量w的各分量值是對原d維特徵向量求加權和的權值。

閾值的確定

對於兩類問題的線性分類器可以採用下屬決策規則:

g(x)=g1(x)-g2(x)

如果g(x)>0,則決策x屬於W1;如果g(x)<0,則決策x屬於W2;如果g(x)=0,則可將x任意分到某一類,或拒絕。

Fisher線性判別的決策規則

根據上述式子:

在這裏插入圖片描述

可以得到最後決策規則,如果:

在這裏插入圖片描述

在這裏插入圖片描述

對於某一個未知類別的樣本向量x,如果y=WT·x>y0,則x∈w1;否則x∈w2。

“羣內離散度”與“羣間離散度”

樣本類內離散度矩陣Si

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YkS0yY2i-1588653485704)(attachment:image.png)]

樣本類間離散度矩陣Sb

在這裏插入圖片描述

2.Python代碼


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt 
import seaborn as sns
path=r'F:/人工智能與機器學習/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) 
    #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
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章