???個人主頁:Sarapines Programmer
???系列專欄:《模式之謎 | 數(shù)據(jù)奇跡解碼》
?詩賦清音:云生高巔夢遠(yuǎn)游, 星光點(diǎn)綴碧海愁。 山川深邃情難晤, 劍氣凌云志自修。
目錄
??1 初識模式識別
??2?Fisher線性判別
??2.1 研究目的
??2.2?實(shí)驗(yàn)環(huán)境
??2.3?實(shí)驗(yàn)內(nèi)容
??2.3.1 算法原理介紹
??2.3.2?實(shí)驗(yàn)步驟
??2.3.3?結(jié)果分析
??2.4?實(shí)驗(yàn)體會
??總結(jié)
??1 初識模式識別
模式識別是一種通過對數(shù)據(jù)進(jìn)行分析和學(xué)習(xí),從中提取模式并做出決策的技術(shù)。這一領(lǐng)域涵蓋了多種技術(shù)和方法,可用于處理各種類型的數(shù)據(jù),包括圖像、語音、文本等。以下是一些常見的模式識別技術(shù):
圖像識別:
計算機(jī)視覺:使用計算機(jī)和算法模擬人類視覺,使機(jī)器能夠理解和解釋圖像內(nèi)容。常見的應(yīng)用包括人臉識別、物體檢測、圖像分類等。
卷積神經(jīng)網(wǎng)絡(luò)(CNN):一種專門用于圖像識別的深度學(xué)習(xí)模型,通過卷積層、池化層等結(jié)構(gòu)提取圖像中的特征。
語音識別:
自然語言處理(NLP):涉及對人類語言進(jìn)行處理和理解的技術(shù)。包括文本分析、情感分析、命名實(shí)體識別等。
語音識別:將語音信號轉(zhuǎn)換為文本,使機(jī)器能夠理解和處理語音命令。常見應(yīng)用包括語音助手和語音搜索。
模式識別在生物醫(yī)學(xué)領(lǐng)域的應(yīng)用:
生物特征識別:包括指紋識別、虹膜識別、基因序列分析等,用于生物醫(yī)學(xué)研究和安全身份驗(yàn)證。
醫(yī)學(xué)圖像分析:利用模式識別技術(shù)分析醫(yī)學(xué)影像,如MRI、CT掃描等,以輔助醫(yī)生進(jìn)行診斷。
時間序列分析:
- 時間序列模式識別:對時間序列數(shù)據(jù)進(jìn)行建模和分析,用于預(yù)測趨勢、檢測異常等。在金融、氣象、股票市場等領(lǐng)域有廣泛應(yīng)用。
數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí):
聚類算法:將數(shù)據(jù)集中的相似對象分組,常用于無監(jiān)督學(xué)習(xí),如K均值聚類。
分類算法:建立模型來對數(shù)據(jù)進(jìn)行分類,如決策樹、支持向量機(jī)等。
回歸分析:用于建立輸入和輸出之間的關(guān)系,用于預(yù)測數(shù)值型結(jié)果。
深度學(xué)習(xí):通過多層神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)數(shù)據(jù)的表示,適用于處理大規(guī)模和復(fù)雜的數(shù)據(jù)。
模式識別在安全領(lǐng)域的應(yīng)用:
行為分析:監(jiān)測和識別異常行為,如入侵檢測系統(tǒng)。
生物特征識別:用于身份驗(yàn)證和訪問控制,如指紋、面部識別。
這些技術(shù)通常不是孤立存在的,而是相互交叉和融合的,以解決更復(fù)雜的問題。在實(shí)際應(yīng)用中,根據(jù)具體的問題和數(shù)據(jù)特點(diǎn)選擇合適的模式識別技術(shù)是至關(guān)重要的。
資源獲?。宏P(guān)注文末公眾號回復(fù)? 模式識別實(shí)驗(yàn)
??2?Fisher線性判別
??2.1 研究目的
- 探究Fisher線性判別分析(FLD)在人臉識別中的應(yīng)用,通過最大化不同類別之間的差異,提高模型對于不同人臉的判別性。
- 評估使用主成分分析(PCA)進(jìn)行特征提取對人臉識別性能的影響,為后續(xù)與Fisher線性判別的對比實(shí)驗(yàn)提供基準(zhǔn)。
- 研究Fisher線性判別在降維后的特征子空間中如何優(yōu)化投影方向,以最小化同一類別內(nèi)的差異,從而提高人臉識別系統(tǒng)的準(zhǔn)確性和魯棒性。
??2.2?實(shí)驗(yàn)環(huán)境
-
C++編程語言及其相關(guān)庫:
- 語言支持: VSCode具備強(qiáng)大的C++語言支持,提供代碼高亮、自動完成等功能,使得編碼更加高效。
- Eigen庫: 作為線性代數(shù)的重要工具,Eigen庫被集成用于進(jìn)行高效的線性代數(shù)運(yùn)算,為數(shù)學(xué)計算提供了強(qiáng)大的支持。
-
OpenCV庫:
- 圖像處理: OpenCV庫作為計算機(jī)視覺領(lǐng)域的重要工具,為圖像處理和可視化提供了廣泛的功能。包括圖像讀取、處理、特征提取等一系列操作,為圖像相關(guān)的應(yīng)用提供了基礎(chǔ)支持。
- 可視化: OpenCV還支持直觀的圖像可視化,使開發(fā)者能夠直觀地觀察圖像處理的效果,有助于調(diào)試和優(yōu)化。
-
C++編譯器配置:
- GCC配置: 在使用VSCode進(jìn)行C++開發(fā)時,確保已配置好C++編譯器,常用的是GNU Compiler Collection(GCC)。正確的配置保證了代碼的正確編譯和執(zhí)行。
-
硬件環(huán)境:
- 計算資源: 為了處理圖像數(shù)據(jù),需要充足的計算資源,包括足夠的內(nèi)存和強(qiáng)大的CPU/GPU。這保障了對大規(guī)模圖像數(shù)據(jù)進(jìn)行高效處理和運(yùn)算。
- 內(nèi)存管理: 在處理大規(guī)模圖像數(shù)據(jù)時,合理的內(nèi)存管理變得至關(guān)重要,以防止內(nèi)存溢出和提高程序運(yùn)行效率。
??2.3?實(shí)驗(yàn)內(nèi)容
??2.3.1 算法原理介紹
Fisher線性判別(Fisher Linear Discriminant,簡稱FLD)是一種用于進(jìn)行模式識別和分類的線性判別方法。它旨在找到一個投影方向,將不同類別的數(shù)據(jù)在該方向上的投影盡可能分開,從而使得類間方差最大,而類內(nèi)方差最小。FLD通常用于二分類問題,但也可以擴(kuò)展到多類別情況。
以下是Fisher線性判別的算法原理:
1. 定義問題:
假設(shè)有兩個類別,分別為類別1和類別2,目標(biāo)是找到一個投影方向,使得兩個類別在這個方向上的投影差異盡可能大。
2. 計算類內(nèi)散度矩陣:
對于每個類別,計算其數(shù)據(jù)點(diǎn)的協(xié)方差矩陣,然后將這些協(xié)方差矩陣加和,得到類內(nèi)散度矩陣(Sw)。
Sw=∑i=1c?∑j=1ni??(xij??μi?)?(xij??μi?)T
其中:
c 是類別數(shù)量,
ni? 是類別 i 中的樣本數(shù)量,
xij? 是類別 i 中的第 j 個樣本,
μi? 是類別 i 中所有樣本的均值向量。
3. 計算類間散度矩陣:
計算兩個類別的均值向量之差的外積,得到類間散度矩陣(Sb)。
Sb=(μ1??μ2?)?(μ1??μ2?)T
4. 計算廣義特征值問題:
通過解決廣義特征值問題,得到投影方向的系數(shù)。廣義特征值問題的解決將產(chǎn)生一個特征值和對應(yīng)的特征向量,其中特征向量表示投影方向。
Sw?1??Sb??w=λ?w
其中:
Sw?1? 是類內(nèi)散度矩陣的逆矩陣,
Sb? 是類間散度矩陣,
w 是投影方向的權(quán)重向量,
λ 是廣義特征值。
5. 選擇投影方向:
選擇前 C?1 個最大廣義特征值對應(yīng)的特征向量,其中 C 是類別的數(shù)量。這些特征向量構(gòu)成了投影方向的基,也稱為Fisher判別子空間。
6. 進(jìn)行投影:
將數(shù)據(jù)點(diǎn)投影到所選擇的判別子空間,然后通過選擇一個閾值對投影結(jié)果進(jìn)行分類。
Fisher線性判別的優(yōu)勢在于在選擇投影方向時,不僅考慮了類別之間的差異(類間散度),還考慮了類別內(nèi)部的差異(類內(nèi)散度),因此更加適用于具有類別內(nèi)部差異的情況。
??2.3.2?實(shí)驗(yàn)步驟
- 數(shù)據(jù)收集與預(yù)處理: 從已有的人臉數(shù)據(jù)庫中獲取人臉圖像數(shù)據(jù)集,確保數(shù)據(jù)集涵蓋了多個人物和不同表情的圖片。對圖像進(jìn)行預(yù)處理,包括灰度化、歸一化等操作,以便于后續(xù)的特征提取。
- 特征提?。?使用主成分分析(PCA)對預(yù)處理后的人臉圖像數(shù)據(jù)進(jìn)行降維處理,提取主要的特征。通過計算協(xié)方差矩陣、特征值和特征向量,選擇最重要的特征子空間。
- Fisher線性判別: 在降維后的特征子空間中應(yīng)用Fisher線性判別,以找到最佳的投影方向,最大化不同類別之間的差異,同時最小化同一類別內(nèi)的差異。這一步驟的目標(biāo)是獲得最具判別性的特征,以提高分類的準(zhǔn)確性。
- 模型訓(xùn)練與測試: 使用判別特征訓(xùn)練人臉識別模型,并在測試集上進(jìn)行性能評估。記錄準(zhǔn)確率、召回率和其他相關(guān)性能指標(biāo),以評估Fisher線性判別在人臉識別中的效果。
C語言程序:
// fisher.cpp : Defines the entry point for the console application.
//
// rmbdis.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "math.h"
#include "conio.h"
#include <fstream>
#include <iomanip>
using namespace std;
#define PNUM 60
unsigned char dat[10][4][8][8][60]={
//0--樣本1,1--樣本1,......,8--樣本9,9--樣本10
//0--100,1--50,2--20,3--10
//0--A向,1--B向,2--C向,3--D向,4--新A向,5--新B向,6--新C向,7--新D向
//0--傳感1,1--傳感2,2--傳感3,3--傳感4,4--傳感5,5--傳感6,6--傳感7,7--傳感8
//
{
#include "樣本\\rmb00.txt"
},
{
#include "樣本\\rmb01.txt"
},
{
#include "樣本\\rmb02.txt"
},
{
#include "樣本\\rmb03.txt"
},
{
#include "樣本\\rmb04.txt"
},
{
#include "樣本\\rmb05.txt"
},
{
#include "樣本\\rmb06.txt"
},
{
#include "樣本\\rmb07.txt"
},
{
#include "樣本\\rmb08.txt"
},
{
#include "樣本\\rmb09.txt"
}
};
#define NUM 8
double Eucliden(double x[],double y[],int n)
{
double d;
d=0.0;
for (int i=0;i<n;i++) {
d+=(x[i]-y[i])*(x[i]-y[i]);
}
d=sqrt(d);
return d;
}
double Manhattan(double x[],double y[],int n)
{
double d;
d=0.0;
for (int i=0;i<n;i++) {
d+=fabs(x[i]-y[i]);
}
return d;
}
double Chebyshev(double x[],double y[],int n)
{
double d;
d=0.0;
for (int i=0;i<n;i++) {
if(fabs(x[i]-y[i])>d) d=fabs(x[i]-y[i]);
}
return d;
}
double Minkowski(double x[],double y[],int n,int m)
{
double d;
d=0.0;
for (int i=0;i<n;i++) {
d+=(double)powf((float)(x[i]-y[i]),(float)m);
}
d=(double)powf((float)d,1.0f/m);
return d;
}
double Mahalanobis(double x[],double y[],double matv1[8][8])
{
double dx,dy;
int i,j;
dx=0.0;
for (i=0;i<8;i++) {
dy=0.0;
for (j=0;j<8;j++) {
dy+=matv1[i][j]*(x[j]-y[j]);
}
dx+=dy*(x[i]-y[i]);
}
return dx;
}
void GetMatV(double V[8][8],int k)
{
int i,j,m,n1,n2,n3;
double xm[8],d,x,y;
m=4*8*PNUM;
for (i=0;i<8;i++) {
d=0;
for (n1=0;n1<4;n1++) {
for (n2=0;n2<8;n2++) {
for (n3=0;n3<PNUM;n3++) {
d+=(double)dat[k][n1][n2][i][n3];
}
}
}
d/=m;
xm[i]=d;
}
for (i=0;i<8;i++) {
for (j=0;j<8;j++) {
d=0;
for (n1=0;n1<4;n1++) {
for (n2=0;n2<8;n2++) {
for (n3=0;n3<PNUM;n3++) {
x=(double)dat[k][n1][n2][i][n3]-xm[i];
y=(double)dat[k][n1][n2][j][n3]-xm[j];
d+=x*y;
}
}
}
d/=m-1.0;
V[i][j]=d;
}
}
}
void Gauss_Jordan(double matv[8][8],double matv1[8][8])
{
int n=8;
double mat[8][16],d;
int i,j,l,k;
for (i=0;i<n;i++) {
for (j=0;j<2*n;j++) {
if (j<n)
mat[i][j]=matv[i][j];
else
mat[i][j]=0.0;
}
}
for (i=0;i<n;i++) mat[i][n+i]=1.0;
for (k=0;k<n;k++) {
d=fabs(mat[k][k]);
j=k;
for (i=k+1;i<n;i++) {//選主元
if (fabs(mat[i][k])>d) {
d=fabs(mat[i][k]);
j=i;
}
}
if (j!=k) { //交換
for (l=0;l<2*n;l++) {
d=mat[j][l];
mat[j][l]=mat[k][l];
mat[k][l]=d;
}
}
for (j=k+1;j<2*n;j++) {
mat[k][j]/=mat[k][k];
}
for (i=0;i<n;i++) {
if (i==k) continue;
for (j=k+1;j<2*n;j++) {
mat[i][j]-=mat[i][k]*mat[k][j];
}
}
}
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
matv1[i][j]=mat[i][j+n];
}
}
}
void getswj(double mats[8][8],double mj[8],unsigned char data[8][60])
{
int i,j,k;
for (i=0;i<8;i++)
{
mj[i]=0.0;
for (k=0;k<PNUM;k++)
{
mj[i]+=(double)data[i][k];
}
mj[i]/=60.0;
}
for (i=0;i<8;i++)
{
for (j=0;j<8;j++)
{
mats[i][j]=0;
for (k=0;k<PNUM;k++)
{
mats[i][j]+=(data[i][k]-mj[i])*(data[j][k]-mj[j]);
}
mats[i][j]/=59.0;
}
}
}
void get4sw(double mats[8][8],double mj[8],unsigned char data[8][8][60])
{
int i,j,k,m;
for (i=0;i<NUM;i++) {
mj[i]=0.0;
for (j=0;j<8;j++) {
for (k=0;k<PNUM;k++) {
mj[i]+=(double)data[j][i][k];
}
}
mj[i]/=8.0*PNUM;
}
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
mats[i][j]=0;
for (m=0;m<8;m++) {
for (k=0;k<PNUM;k++) {
mats[i][j]+=(data[m][i][k]-mj[i])*(data[m][j][k]-mj[j]);
}
}
mats[i][j]/=8*PNUM-1;
}
}
}
void getsb(double sb[8][8],double mj[32][8],unsigned char data[4][8][8][60])
{
int i,j,k;
double m[8];
for (i=0;i<8;i++) {
m[i]=0;
for (j=0;j<32;j++) {
for (k=0;k<60;k++) {
m[i]+=data[j/8][j%8][i][k];
}
}
m[i]/=60.0*32.0;
}
for (i=0;i<8;i++) {
for (j=0;j<8;j++) {
sb[i][j]=0;
for (k=0;k<32;k++) {
sb[i][j]+=(mj[k][i]-m[i])*(mj[k][j]-m[j]);
}
sb[i][j]/=32;
}
}
}
void getsw(double swj[32][8][8],double sw[8][8])
{
int i,j,k;
for (i=0;i<8;i++) {
for (j=0;j<8;j++) {
sw[i][j]=0;
for (k=0;k<32;k++) {
sw[i][j]+=swj[k][i][j];
}
sw[i][j]/=32.0;
}
}
}
void MatMul(double mata[8][8],double matb[8][8],double matc[8][8])
{
int i,j,k;
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
matc[i][j]=0;
for (k=0;k<NUM;k++) {
matc[i][j]+=mata[i][k]*matb[k][j];
}
}
}
}
void MatAdd(double mata[8][8],double matb[8][8],double matc[8][8])
{
int i,j;
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
matc[i][j]=mata[i][j]+matb[i][j];
}
}
}
void MatDec(double mata[8][8],double matb[8][8],double matc[8][8])
{
int i,j;
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
matc[i][j]=mata[i][j]-matb[i][j];
}
}
}
void getst(double sw[8][8],double sb[8][8],double st[8][8])
{
MatAdd(sw,sb,st);
}
double MatTrace(double mat[8][8])
{
int i;
double d=0.0;
for(i=0;i<NUM;i++) {
d+=mat[i][i];
}
return d;
}
void OutSw(ofstream outfile,double sw[NUM][NUM])
{
int i,j;
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
outfile<<setprecision(5)<<sw[i][j];
if (j<NUM-1) outfile<<",";
else outfile<<endl;
}
}
}
double MulVector(double x[NUM],double y[NUM])
{
int i;
double d;
d=0.0;
for (i=0;i<NUM;i++) {
d+=x[i]*y[i];
}
return d;
}
int main(int argc, char* argv[])
{
double sw[32][8][8];
double mj[32][8];
double sww[8][8];
double sww1[8][8];
int i,j;
// char name[20]="sw100aa.h";
/* for (i=0;i<32;i++) {
getswj(sw[i],mj[i],dat[0][i/8][i%8]);
}
MatAdd(sw[0],sw[8],sww);
Gauss_Jordan(sww,sww1);
ofstream outfile;
outfile.open("sw100ab.txt");
outfile<<"http://100A m1: \n";
for (i=0;i<NUM;i++) {
outfile<<setw(5)<<setprecision(3)<<mj[0][i]<<",";
}
outfile<<endl;
outfile<<"http://100b m2: \n";
for (i=0;i<NUM;i++) {
outfile<<setw(5)<<setprecision(3)<<mj[8][i]<<",";
}
outfile<<endl;
outfile<<"http://100A SW1: \n";
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
outfile<<setw(5)<<setprecision(3)<<sw[0][i][j];
if (j<NUM-1) outfile<<",";
else outfile<<endl;
}
}
outfile<<"http://100b SW2: \n";
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
outfile<<setw(5)<<setprecision(3)<<sw[8][i][j];
if (j<NUM-1) outfile<<",";
else outfile<<endl;
}
}
outfile<<"http://SW=SW1+SW2: \n";
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
outfile<<setw(5)<<setprecision(3)<<sww[i][j];
if (j<NUM-1) outfile<<",";
else outfile<<endl;
}
}
outfile<<"http://SW-1: \n";
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
outfile<<setw(5)<<setprecision(3)<<sww1[i][j];
if (j<NUM-1) outfile<<",";
else outfile<<endl;
}
}
double d,u[NUM];
for (i=0;i<NUM;i++) {
d=0.0;
for (j=0;j<NUM;j++) {
d+=sww1[i][j]*(mj[0][j]-mj[8][j]);
}
u[i]=d;
}
outfile<<"http://u=sw-1(m1-m2): \n";
for (i=0;i<NUM;i++) {
outfile<<setw(5)<<setprecision(3)<<u[i]<<",";
}
outfile<<endl;
d=MulVector(u,mj[0]);
outfile<<"u*m1="<<d<<endl;
double d2;
d2=MulVector(u,mj[8]);
outfile<<"u*m2="<<d2<<endl;
d=(d+d2)/2.0;
outfile<<"yt="<<d<<endl;
double pt[NUM];
outfile<<"100AResult:\n";
for (i=0;i<PNUM;i++)
{
for (j=0;j<NUM;j++)
{
pt[j]=(double)dat[0][0][0][j][i];
}
d=MulVector(u,pt);
outfile<<setw(5)<<setprecision(3)<<d;
if ((i+1)%8==0) outfile<<endl;
else outfile<<",";
}
outfile<<endl;
outfile<<"100bResult:\n";
for (i=0;i<PNUM;i++) {
for (j=0;j<NUM;j++) {
pt[j]=dat[0][1][0][j][i];
}
d=MulVector(u,pt);
outfile<<setw(5)<<setprecision(3)<<d;
if ((i+1)%8==0) outfile<<endl;
else outfile<<",";
}
outfile<<endl;
outfile.close();
*/
for (i=0;i<32;i++) {
getswj(sw[i],mj[i],dat[0][i/8][i%8]);
}
// MatAdd(sw[0],sw[8],sww);
MatAdd(sw[1],sw[8],sww);
Gauss_Jordan(sww,sww1);
ofstream outfile;
outfile.open("sw100b50a.h");
// outfile<<"http://100A m1: \n";
outfile<<"http://100b m1: \n";
for (i=0;i<NUM;i++) {
// outfile<<setw(5)<<setprecision(3)<<mj[0][i]<<",";
outfile<<setw(5)<<setprecision(3)<<mj[1][i]<<",";
}
outfile<<endl;
outfile<<"http://50A m2: \n";
for (i=0;i<NUM;i++) {
outfile<<setw(5)<<setprecision(3)<<mj[8][i]<<",";
}
outfile<<endl;
// outfile<<"http://100A SW1: \n";
outfile<<"http://100b SW1: \n";
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
// outfile<<setw(5)<<setprecision(3)<<sw[0][i][j];
outfile<<setw(5)<<setprecision(3)<<sw[1][i][j];
if (j<NUM-1) outfile<<",";
else outfile<<endl;
}
}
outfile<<"http://50A SW2: \n";
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
outfile<<setw(5)<<setprecision(3)<<sw[8][i][j];
if (j<NUM-1) outfile<<",";
else outfile<<endl;
}
}
outfile<<"http://SW=SW1+SW2: \n";
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
outfile<<setw(5)<<setprecision(3)<<sww[i][j];
if (j<NUM-1) outfile<<",";
else outfile<<endl;
}
}
outfile<<"http://SW-1: \n";
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
outfile<<setw(5)<<setprecision(3)<<sww1[i][j];
if (j<NUM-1) outfile<<",";
else outfile<<endl;
}
}
double d,u[NUM];
for (i=0;i<NUM;i++) {
d=0.0;
for (j=0;j<NUM;j++) {
// d+=sww1[i][j]*(mj[0][j]-mj[8][j]);
d+=sww1[i][j]*(mj[1][j]-mj[8][j]);
}
u[i]=d;
}
outfile<<"http://u=sw-1(m1-m2): \n";
for (i=0;i<NUM;i++) {
outfile<<setw(5)<<setprecision(3)<<u[i]<<",";
}
outfile<<endl;
// d=MulVector(u,mj[0]);
d=MulVector(u,mj[1]);
outfile<<"u*m1="<<d<<endl;
double d2;
d2=MulVector(u,mj[8]);
outfile<<"u*m2="<<d2<<endl;
d=(d+d2)/2.0;
outfile<<"yt="<<d<<endl;
double pt[NUM];
// outfile<<"100AResult:\n";
outfile<<"100bResult:\n";
for (i=0;i<PNUM;i++) {
for (j=0;j<NUM;j++) {
// pt[j]=(double)dat[0][0][0][j][i];
pt[j]=(double)dat[0][0][1][j][i];
}
d=MulVector(u,pt);
outfile<<setw(5)<<setprecision(3)<<d;
if ((i+1)%8==0) outfile<<endl;
else outfile<<",";
}
outfile<<endl;
outfile<<"50AResult:\n";
for (i=0;i<PNUM;i++) {
for (j=0;j<NUM;j++) {
pt[j]=dat[0][1][0][j][i];
}
d=MulVector(u,pt);
outfile<<setw(5)<<setprecision(3)<<d;
if ((i+1)%8==0) outfile<<endl;
else outfile<<",";
}
outfile<<endl;
outfile.close();
return 0;
}
??2.3.3?結(jié)果分析
分析實(shí)驗(yàn)結(jié)果,比較PCA與Fisher線性判別前后的人臉識別性能差異,將結(jié)果輸出到sw100b50a.h文件,結(jié)果如下:
//100b m1:
57, 67.2, 72.8, 67, 94.4, 93.9, 83, 84.4,
//50A m2:
59.2, 55.5, 81.9, 63.9, 95.1, 91, 91.1, 86.5,
//100b SW1:
3.95,-2.11, 1.74,-2.51, 3.09, 1.85, 1.49,0.804
-2.11, 11.7,-17.7, 2.45,-1.32, 0.31,-6.01,-0.041
1.74,-17.7, 67.9, 16.7, 3.62, 2.19, 24.8, 12.3
-2.51, 2.45, 16.7, 32.9,-2.14, 1.17, 6.49, 14.1
3.09,-1.32, 3.62,-2.14, 8.55, 2.94, 1.98, 2.31
1.85, 0.31, 2.19, 1.17, 2.94, 5.28, 3.67, 3.86
1.49,-6.01, 24.8, 6.49, 1.98, 3.67, 15.1, 6.28
0.804,-0.041, 12.3, 14.1, 2.31, 3.86, 6.28, 9.13
//50A SW2:
28.3, 45.7, 49.6, 48.6, 1.59, 17.4, 14, 15.2
45.7, 124, 63.2, 88.6, 6.21, 44.1, 15.8, 17.4
49.6, 63.2, 119, 82.6, 3.31, 25.9, 38, 28.8
48.6, 88.6, 82.6, 109,-2.86, 33, 14.1, 28.6
1.59, 6.21, 3.31,-2.86, 4.93, 3.69, 5.21,-1.53
17.4, 44.1, 25.9, 33, 3.69, 17.7, 7.79, 6.71
14, 15.8, 38, 14.1, 5.21, 7.79, 23, 9.07
15.2, 17.4, 28.8, 28.6,-1.53, 6.71, 9.07, 13.9
//SW=SW1+SW2:
32.2, 43.6, 51.4, 46.1, 4.69, 19.2, 15.5, 16
43.6, 136, 45.5, 91, 4.9, 44.4, 9.84, 17.3
51.4, 45.5, 187, 99.3, 6.93, 28, 62.8, 41
46.1, 91, 99.3, 142, -5, 34.2, 20.6, 42.7
4.69, 4.9, 6.93, -5, 13.5, 6.63, 7.19,0.775
19.2, 44.4, 28, 34.2, 6.63, 23, 11.5, 10.6
15.5, 9.84, 62.8, 20.6, 7.19, 11.5, 38.1, 15.4
16, 17.3, 41, 42.7,0.775, 10.6, 15.4, 23
//SW-1:
0.112,-0.0211,-0.0242,0.00562,-0.0137,-0.0229,0.0187,-0.0307
-0.0211,0.0369,0.00917,-0.0212,0.00628,-0.0489,-0.00547,0.0356
-0.0242,0.00917,0.0266,-0.0185,-0.00154,0.00792,-0.0352,0.0167
0.00562,-0.0212,-0.0185,0.0492,0.0245,-0.00716,0.0305,-0.0639
-0.0137,0.00628,-0.00154,0.0245,0.122,-0.0629,-0.00764,-0.00795
-0.0229,-0.0489,0.00792,-0.00716,-0.0629,0.198,-0.0275,-0.0187
0.0187,-0.00547,-0.0352,0.0305,-0.00764,-0.0275,0.0918,-0.0508
-0.0307,0.0356,0.0167,-0.0639,-0.00795,-0.0187,-0.0508,0.169
//u=sw-1(m1-m2):
-0.401,0.158,0.135,-0.0915,0.0103,0.253,-0.399,0.148,
u*m1=-4.4
u*m2=-9.25
yt=-6.83
100bResult:
-8.94,-8.94,-7.42,-6.08,-4.08,-4.02,-4.44,-4.54
-4.8,-4.76,-5.03,-5.03,-5.11,-4.81,-4.81,-4.31
-3.8,-3.67, -3.5,-3.59,-3.49,-2.94,-3.12,-2.97
-4.25,-3.98,-3.54, -3,-3.21,-3.18,-3.36,-3.84
-4.24,-3.75,-3.92,-3.98,-4.97, -4.5,-4.21,-3.21
-2.68,-3.02,-2.97,-3.35, -3.3,-3.83,-4.63,-4.41
-4.97, -4.2,-4.69,-5.22,-5.77,-6.28,-6.16, -5.9
-5.03,-4.78,-3.78, -3.9,
50AResult:
-7.69,-7.91,-7.68,-7.34,-6.79,-7.32,-7.95,-8.68
-8.24,-8.03,-7.78,-8.27,-8.87,-9.26,-9.72, -9.4
-8.77,-8.75,-8.55,-9.28, -8.1,-8.43,-7.86,-8.78
-9.11,-9.55,-9.15,-9.19,-9.64,-10.1,-9.96,-9.61
-8.91,-8.28,-8.14,-8.14,-8.93,-9.14,-10.3,-10.1
-9.79, -10,-10.5,-10.6,-10.5,-10.7,-11.7,-12.5
-13.2,-13.8,-13.7,-13.6,-12.4,-11.2,-9.61,-8.41
-6.74, -6.4,-5.85,-6.27,
??2.4?實(shí)驗(yàn)體會
-
特征選擇的關(guān)鍵作用: 在人臉識別實(shí)驗(yàn)中,我深刻認(rèn)識到特征選擇對模型性能提升至關(guān)重要。通過采用PCA降維和Fisher線性判別,成功提取出最具判別性的特征,顯著提高了模型在人臉辨識任務(wù)上的準(zhǔn)確性,同時有助于減少數(shù)據(jù)維度,提高計算效率。
-
Fisher線性判別的獨(dú)特優(yōu)勢: 通過與PCA進(jìn)行對比實(shí)驗(yàn),我深入了解了Fisher線性判別在提高人臉識別性能方面的獨(dú)特優(yōu)勢。相較于PCA,F(xiàn)isher線性判別更注重最大化不同類別之間的差異,使得模型更專注于人臉數(shù)據(jù)中的重要特征,而非僅僅是全局的數(shù)據(jù)結(jié)構(gòu),尤其在多類別數(shù)據(jù)集中表現(xiàn)更為明顯。
-
Fisher線性判別的解釋性提升: 通過實(shí)驗(yàn),我領(lǐng)悟了Fisher線性判別如何通過最大化類間差異和最小化類內(nèi)差異來提高模型的解釋性。這種優(yōu)化使得模型更具可解釋性,能夠更清晰地揭示人臉數(shù)據(jù)中的類別差異,為實(shí)際應(yīng)用提供更為直觀的判別依據(jù),對理解模型決策背后的原因具有指導(dǎo)意義。
-
特征選擇與降維方法的深入認(rèn)識: 通過實(shí)際應(yīng)用,我對特征選擇和降維方法有了更加深入的認(rèn)識。通過實(shí)驗(yàn)經(jīng)驗(yàn),我能有針對性地選擇合適的特征提取和降維方法,使得Fisher線性判別在實(shí)際人臉識別系統(tǒng)中更為有效地應(yīng)用。
-
實(shí)踐經(jīng)驗(yàn)的積累與未來展望: 通過本次實(shí)驗(yàn),我不僅拓寬了對Fisher線性判別的理解,還提升了實(shí)驗(yàn)技能。這為將理論知識應(yīng)用于實(shí)際問題提供了有力的支持,為未來進(jìn)一步優(yōu)化人臉識別算法奠定了堅實(shí)的基礎(chǔ)。
??總結(jié)
模式匹配領(lǐng)域就像一片未被勘探的信息大海,引領(lǐng)你勇敢踏入數(shù)據(jù)科學(xué)的神秘領(lǐng)域。這是一場獨(dú)特的學(xué)習(xí)冒險,從基本概念到算法實(shí)現(xiàn),逐步揭示更深層次的模式分析、匹配算法和智能模式識別的奧秘??释魬?zhàn)模式匹配的學(xué)習(xí)路徑和掌握信息領(lǐng)域的技術(shù)?不妨點(diǎn)擊下方鏈接,一同探討更多數(shù)據(jù)科學(xué)的奇跡吧。我們推出了引領(lǐng)趨勢的?? 數(shù)據(jù)科學(xué)專欄:《模式之謎 | 數(shù)據(jù)奇跡解碼》,旨在深度探索模式匹配技術(shù)的實(shí)際應(yīng)用和創(chuàng)新。????文章來源:http://www.zghlxwxcb.cn/news/detail-762188.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-762188.html
到了這里,關(guān)于【模式識別】探秘判別奧秘:Fisher線性判別算法的解密與實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!