木水小亭:數模系列(7):fisher判別分析(fisher discriminant analysis)zhuanlan.zhihu.com
在計算距離時,我們最常用的歐式距離,但是在統計學中,歐式距離就不適用了,統計學中常用馬氏(mahalanobis)距離來定義「距離」這個概念,馬氏距離的計算公式如下:
x,y表示兩點,
表示協方差。
當需要計算點與總體的馬氏距離時:
, -表示總體的均值。
先假設有
兩個總體,
總體有
個樣本,
總體有
個樣本,每個樣本有
個特徵。現有乙個樣本
判斷屬於
還是 ,則分別計算
的馬氏距離,越小則越靠近。
我們以matlab自帶的資料集fisheriris為例來演示距離判別如何實現分類判別的。具體matlab**如下:
load fisheriris
function [biaoji,label_s,t_rate]judge(meas,species)
m=length(species);
index=randperm(m);%打亂順序
species1=species(index);
meas1=meas(index,:);
meas1=meas1(:,3:4);
a=;b=;
c=;for i=1:100
if species1(i)=="setosa"
a=[a;meas1(i,:)];
plot(meas1(i,1),meas1(i,2),"r*")
hold on
elseif species1(i)=="versicolor"
b=[b;meas1(i,:)];
plot(meas1(i,1),meas1(i,2),"bx")
hold on
elseif species1(i)=="virginica"
c=[c;meas1(i,:)];
plot(meas1(i,1),meas1(i,2),"g+")
hold on
endend
sample=meas1(101:m,:);
label_s=species1(101:m,:);
label=["setosa","versicolor","virginica"];
biaoji=distance_d(a,b,c,sample,label);
label_s=string(label_s);
t_sum=0;
for i=1:length(biaoji)
if biaoji(i)==label_s(i)
t_sum=t_sum+1;
endend
t_rate=t_sum/length(biaoji);
disp("判斷準確率:"+num2str(t_rate));
end%距離判別函式
function biaoji=distance_d(a,b,c,sample,label)
ma=mean(a);
mb=mean(b);
mc=mean(c);
ca=cov(a);
cb=cov(b);
cc=cov(c);
a=length(a);
b=length(b);
c=length(c);
s=((a-1)*ca+(b-1)*cb+(c-1)*cc)/(a+b+c-3);
n=length(sample);
for i=1:n
d(i,1)=(sample(i,:)-ma)*inv(s)*(sample(i,:)-ma)';
d(i,2)=(sample(i,:)-mb)*inv(s)*(sample(i,:)-mb)';
d(i,3)=(sample(i,:)-mc)*inv(s)*(sample(i,:)-mc)';
index=d(i,:)==min(d(i,:));
biaoji(i)=label(index);
endend
輸出結果的準確率是92%
fisheriris:資料報是matlab自帶的資料集,包含兩個資料集,meas是樣本資料,species是樣本的標記。
function biaoji=fisher(a,b,sample,label)
%類的均值向量
m1=mean(a);
m2=mean(b);
%各類內離散度矩陣
s1=zeros(2);
s2=zeros(2);
for i=1:1:length(a)
s1=s1+(a(i,:)-m1)'*(a(i,:)-m1);
endfor i=1:1:length(b)
s2=s2+(b(i,:)-m2)'*(b(i,:)-m2);
end%總類內離散矩陣
sw=s1+s2;
%投影方向
w=inv(sw)*(m2-m1)';
%判別函式以及閾值t
t=0.5*(m1+m2)*w;
n=length(sample);
% x=[1:0.1:5];
% yy=-w(1)/w(2)*x;
% plot(x,yy)
for i=1:n
y=sample(i,:)*w;
if y>t
biaoji(i)=label(2);
else
biaoji(i)=label(1);
endend
endfunction [biaoji,label_s,t_rate]=judge_f(meas,species)
species_two=species(1:100);
m=length(species_two);
index=randperm(m);%打亂順序
species1=species_two(index);
meas1=meas(index,:);
meas1=meas1(:,3:4);
a=;b=;
for i=1:80
if species1(i)=="setosa"
a=[a;meas1(i,:)];
plot(meas1(i,1),meas1(i,2),"r*")
hold on
elseif species1(i)=="versicolor"
b=[b;meas1(i,:)];
plot(meas1(i,1),meas1(i,2),"bx")
hold on
endend
sample=meas1(81:m,:);
label_s=species1(81:m,:);
label=["setosa","versicolor"];
biaoji=fisher(a,b,sample,label);
label_s=string(label_s);
t_sum=0;
for i=1:length(biaoji)
if biaoji(i)==label_s(i)
t_sum=t_sum+1;
endend
t_rate=t_sum/length(biaoji);
disp("判斷準確率:"+num2str(t_rate));
end
注意這裡將三個標籤拿走了乙個變成了乙個二分類問題。 fisher線性判別 判別分析 Fisher判別
上期 判別分析概述 中我們提到,判別分析 discriminant analysis 是根據判別物件若干個指標的觀測結果判定其應屬於哪一類的資料統計方法,其中fisher判別一般用於指標為定量資料的兩類判別,bayes判別多用於指標為定量資料的多類判別,同時,兩者均可利用spss完成,但在運用和解讀...
Fisher線性判別分析
三 結果 四 在uci資料集上的iris和sonar資料上驗證演算法的有效性 iris資料3類,4維,150個資料 sonar資料2類,60維,208個樣本.訓練和測試樣本有三種方式進行劃分 三選一 1.將資料隨機分訓練和測試,多次平均求結果 2.k折交叉驗證 3.留1法 針對不同維數,畫出曲線圖 ...
LDA 線性判別分析 Fisher線性判別
1.lda是什麼 線性判別式分析 linear discriminant analysis 簡稱為lda。也稱為fisher線性判別 fisher linear discriminant,fld 是模式識別的經典演算法,在1996年由belhumeur引入模式識別和人工智慧領域。基本思想是將高維的模...