人工智能与机器学习---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判别所属 。

二、步骤

以2分类为例:
(1)计算各类样本的均值向量mi,Ni是类ωi的样本个数
在这里插入图片描述
(2)计算样本类内离散度矩阵Si和总类内离散度矩阵Sw
在这里插入图片描述
在这里插入图片描述
(3)计算样本类间离散度矩阵Sb
在这里插入图片描述
(4) 求向量w∗。为此定义Fisher准则函数在这里插入图片描述
使得JF(W)取的最大值的w∗为: w∗=S−1w(m1−m2)。
(5)将训练集内所有样本进行投影。在这里插入图片描述
(6)计算在投影空间上的分割阈值y0。阈值的选取可以有不同的方案,比较常用的一种为 在这里插入图片描述
(7)对于给定的X,计算它在w∗上的投影点y。
在这里插入图片描述
(8)根据决策规则分类,有
在这里插入图片描述
用Fisher函数解决多分类问题时,首先实现两类Fisher分类,然后根据返回的类别与新的类别再做两类Fisher分类,又能够得到比较接近的类别,以此类推,直至所有的类别,最后得出未知样本的类别。

三、python代码完成Fisher判别的推导

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt 
import seaborn as sns
df = pd.read_csv(r'http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data')
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(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,'%')

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值