【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战
🌈个人主页:Sarapines Programmer
🔥 系列专栏:《模式之谜 | 数据奇迹解码》
⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。
目录
🌌1 初识模式识别
🌌2 Fisher线性判别
🌍2.1 研究目的
🌍2.2 实验环境
🌍2.3 实验内容
🌕2.3.1 算法原理介绍
🌕2.3.2 实验步骤
🌕2.3.3 结果分析
🌍2.4 实验体会
📝总结
🌌1 初识模式识别
模式识别是一种通过对数据进行分析和学习,从中提取模式并做出决策的技术。这一领域涵盖了多种技术和方法,可用于处理各种类型的数据,包括图像、语音、文本等。以下是一些常见的模式识别技术:
图像识别:
计算机视觉:使用计算机和算法模拟人类视觉,使机器能够理解和解释图像内容。常见的应用包括人脸识别、物体检测、图像分类等。
卷积神经网络(CNN):一种专门用于图像识别的深度学习模型,通过卷积层、池化层等结构提取图像中的特征。
语音识别:
自然语言处理(NLP):涉及对人类语言进行处理和理解的技术。包括文本分析、情感分析、命名实体识别等。
语音识别:将语音信号转换为文本,使机器能够理解和处理语音命令。常见应用包括语音助手和语音搜索。
模式识别在生物医学领域的应用:
生物特征识别:包括指纹识别、虹膜识别、基因序列分析等,用于生物医学研究和安全身份验证。
医学图像分析:利用模式识别技术分析医学影像,如MRI、CT扫描等,以辅助医生进行诊断。
时间序列分析:
- 时间序列模式识别:对时间序列数据进行建模和分析,用于预测趋势、检测异常等。在金融、气象、股票市场等领域有广泛应用。
数据挖掘和机器学习:
聚类算法:将数据集中的相似对象分组,常用于无监督学习,如K均值聚类。
分类算法:建立模型来对数据进行分类,如决策树、支持向量机等。
回归分析:用于建立输入和输出之间的关系,用于预测数值型结果。
深度学习:通过多层神经网络学习数据的表示,适用于处理大规模和复杂的数据。
模式识别在安全领域的应用:
行为分析:监测和识别异常行为,如入侵检测系统。
生物特征识别:用于身份验证和访问控制,如指纹、面部识别。
这些技术通常不是孤立存在的,而是相互交叉和融合的,以解决更复杂的问题。在实际应用中,根据具体的问题和数据特点选择合适的模式识别技术是至关重要的。
🌌2 Fisher线性判别
🌍2.1 研究目的
- 探究Fisher线性判别分析(FLD)在人脸识别中的应用,通过最大化不同类别之间的差异,提高模型对于不同人脸的判别性。
- 评估使用主成分分析(PCA)进行特征提取对人脸识别性能的影响,为后续与Fisher线性判别的对比实验提供基准。
- 研究Fisher线性判别在降维后的特征子空间中如何优化投影方向,以最小化同一类别内的差异,从而提高人脸识别系统的准确性和鲁棒性。
🌍2.2 实验环境
-
C++编程语言及其相关库:
- 语言支持: VSCode具备强大的C++语言支持,提供代码高亮、自动完成等功能,使得编码更加高效。
- Eigen库: 作为线性代数的重要工具,Eigen库被集成用于进行高效的线性代数运算,为数学计算提供了强大的支持。
-
OpenCV库:
- 图像处理: OpenCV库作为计算机视觉领域的重要工具,为图像处理和可视化提供了广泛的功能。包括图像读取、处理、特征提取等一系列操作,为图像相关的应用提供了基础支持。
- 可视化: OpenCV还支持直观的图像可视化,使开发者能够直观地观察图像处理的效果,有助于调试和优化。
-
C++编译器配置:
- GCC配置: 在使用VSCode进行C++开发时,确保已配置好C++编译器,常用的是GNU Compiler Collection(GCC)。正确的配置保证了代码的正确编译和执行。
-
硬件环境:
- 计算资源: 为了处理图像数据,需要充足的计算资源,包括足够的内存和强大的CPU/GPU。这保障了对大规模图像数据进行高效处理和运算。
- 内存管理: 在处理大规模图像数据时,合理的内存管理变得至关重要,以防止内存溢出和提高程序运行效率。
🌍2.3 实验内容
🌕2.3.1 算法原理介绍
Fisher线性判别(Fisher Linear Discriminant,简称FLD)是一种用于进行模式识别和分类的线性判别方法。它旨在找到一个投影方向,将不同类别的数据在该方向上的投影尽可能分开,从而使得类间方差最大,而类内方差最小。FLD通常用于二分类问题,但也可以扩展到多类别情况。
以下是Fisher线性判别的算法原理:
1. 定义问题:
假设有两个类别,分别为类别1和类别2,目标是找到一个投影方向,使得两个类别在这个方向上的投影差异尽可能大。
2. 计算类内散度矩阵:
对于每个类别,计算其数据点的协方差矩阵,然后将这些协方差矩阵加和,得到类内散度矩阵(Sw)。
Sw=∑i=1c∑j=1ni(xij−μi)⋅(xij−μi)T
其中:
c 是类别数量,
ni 是类别 i 中的样本数量,
xij 是类别 i 中的第 j 个样本,
μi 是类别 i 中所有样本的均值向量。
3. 计算类间散度矩阵:
计算两个类别的均值向量之差的外积,得到类间散度矩阵(Sb)。
Sb=(μ1−μ2)⋅(μ1−μ2)T
4. 计算广义特征值问题:
通过解决广义特征值问题,得到投影方向的系数。广义特征值问题的解决将产生一个特征值和对应的特征向量,其中特征向量表示投影方向。
Sw−1⋅Sb⋅w=λ⋅w
其中:
Sw−1 是类内散度矩阵的逆矩阵,
Sb 是类间散度矩阵,
w 是投影方向的权重向量,
λ 是广义特征值。
5. 选择投影方向:
选择前 C−1 个最大广义特征值对应的特征向量,其中 C 是类别的数量。这些特征向量构成了投影方向的基,也称为Fisher判别子空间。
6. 进行投影:
将数据点投影到所选择的判别子空间,然后通过选择一个阈值对投影结果进行分类。
Fisher线性判别的优势在于在选择投影方向时,不仅考虑了类别之间的差异(类间散度),还考虑了类别内部的差异(类内散度),因此更加适用于具有类别内部差异的情况。
🌕2.3.2 实验步骤
- 数据收集与预处理: 从已有的人脸数据库中获取人脸图像数据集,确保数据集涵盖了多个人物和不同表情的图片。对图像进行预处理,包括灰度化、归一化等操作,以便于后续的特征提取。
- 特征提取: 使用主成分分析(PCA)对预处理后的人脸图像数据进行降维处理,提取主要的特征。通过计算协方差矩阵、特征值和特征向量,选择最重要的特征子空间。
- Fisher线性判别: 在降维后的特征子空间中应用Fisher线性判别,以找到最佳的投影方向,最大化不同类别之间的差异,同时最小化同一类别内的差异。这一步骤的目标是获得最具判别性的特征,以提高分类的准确性。
- 模型训练与测试: 使用判别特征训练人脸识别模型,并在测试集上进行性能评估。记录准确率、召回率和其他相关性能指标,以评估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 60unsigned 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 8double 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<<"//100A m1: \n";for (i=0;i<NUM;i++) {outfile<<setw(5)<<setprecision(3)<<mj[0][i]<<",";}outfile<<endl;outfile<<"//100b m2: \n";for (i=0;i<NUM;i++) {outfile<<setw(5)<<setprecision(3)<<mj[8][i]<<",";}outfile<<endl;outfile<<"//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<<"//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<<"//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<<"//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<<"//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<<"//100A m1: \n";
outfile<<"//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<<"//50A m2: \n";for (i=0;i<NUM;i++) {outfile<<setw(5)<<setprecision(3)<<mj[8][i]<<",";}outfile<<endl;// outfile<<"//100A SW1: \n";outfile<<"//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<<"//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<<"//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<<"//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<<"//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 结果分析
分析实验结果,比较PCA与Fisher线性判别前后的人脸识别性能差异,将结果输出到sw100b50a.h文件,结果如下:
//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.0411.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.13.09,-1.32, 3.62,-2.14, 8.55, 2.94, 1.98, 2.311.85, 0.31, 2.19, 1.17, 2.94, 5.28, 3.67, 3.861.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.245.7, 124, 63.2, 88.6, 6.21, 44.1, 15.8, 17.449.6, 63.2, 119, 82.6, 3.31, 25.9, 38, 28.848.6, 88.6, 82.6, 109,-2.86, 33, 14.1, 28.61.59, 6.21, 3.31,-2.86, 4.93, 3.69, 5.21,-1.5317.4, 44.1, 25.9, 33, 3.69, 17.7, 7.79, 6.7114, 15.8, 38, 14.1, 5.21, 7.79, 23, 9.0715.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, 1643.6, 136, 45.5, 91, 4.9, 44.4, 9.84, 17.351.4, 45.5, 187, 99.3, 6.93, 28, 62.8, 4146.1, 91, 99.3, 142, -5, 34.2, 20.6, 42.74.69, 4.9, 6.93, -5, 13.5, 6.63, 7.19,0.77519.2, 44.4, 28, 34.2, 6.63, 23, 11.5, 10.615.5, 9.84, 62.8, 20.6, 7.19, 11.5, 38.1, 15.416, 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.83100bResult:
-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 实验体会
-
特征选择的关键作用: 在人脸识别实验中,我深刻认识到特征选择对模型性能提升至关重要。通过采用PCA降维和Fisher线性判别,成功提取出最具判别性的特征,显著提高了模型在人脸辨识任务上的准确性,同时有助于减少数据维度,提高计算效率。
-
Fisher线性判别的独特优势: 通过与PCA进行对比实验,我深入了解了Fisher线性判别在提高人脸识别性能方面的独特优势。相较于PCA,Fisher线性判别更注重最大化不同类别之间的差异,使得模型更专注于人脸数据中的重要特征,而非仅仅是全局的数据结构,尤其在多类别数据集中表现更为明显。
-
Fisher线性判别的解释性提升: 通过实验,我领悟了Fisher线性判别如何通过最大化类间差异和最小化类内差异来提高模型的解释性。这种优化使得模型更具可解释性,能够更清晰地揭示人脸数据中的类别差异,为实际应用提供更为直观的判别依据,对理解模型决策背后的原因具有指导意义。
-
特征选择与降维方法的深入认识: 通过实际应用,我对特征选择和降维方法有了更加深入的认识。通过实验经验,我能有针对性地选择合适的特征提取和降维方法,使得Fisher线性判别在实际人脸识别系统中更为有效地应用。
-
实践经验的积累与未来展望: 通过本次实验,我不仅拓宽了对Fisher线性判别的理解,还提升了实验技能。这为将理论知识应用于实际问题提供了有力的支持,为未来进一步优化人脸识别算法奠定了坚实的基础。
📝总结
模式匹配领域就像一片未被勘探的信息大海,引领你勇敢踏入数据科学的神秘领域。这是一场独特的学习冒险,从基本概念到算法实现,逐步揭示更深层次的模式分析、匹配算法和智能模式识别的奥秘。渴望挑战模式匹配的学习路径和掌握信息领域的技术?不妨点击下方链接,一同探讨更多数据科学的奇迹吧。我们推出了引领趋势的💻 数据科学专栏:《模式之谜 | 数据奇迹解码》,旨在深度探索模式匹配技术的实际应用和创新。🌐🔍
相关文章:
【模式识别】探秘判别奥秘:Fisher线性判别算法的解密与实战
🌈个人主页:Sarapines Programmer🔥 系列专栏:《模式之谜 | 数据奇迹解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 🌌1 初识模式识…...
【XML】TinyXML 详解
1、简介 优点: TinyXML 是一个简单、小型的 C XML 解析器,可以轻松集成到项目中。 TinyXML 解析 XML 文档,并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的,因此可以在开源或商业代码中…...
泛社交裂变场景下AB增量科学评估方案
在数据驱动业务的大环境下,AB实验是对策略效果进行评估的重要指南针,并广泛应用在用增/推荐/搜索/内容/商业化等多个领域,尤其是综合评估多个策略对于大盘影响的对比效果,AB增量的计算就尤为重要。 背景 现在普遍常见的泛社交裂变…...
【无标题】json报错
操作失败,JSON parse error: Cannot deserialize value of type com.alibaba.fastjson.JSONArray from String value (token JsonToken.VALUE_STRING); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize valu…...
MyBatis中延迟加载,全局和局部的开启使用与关闭
文章目录 MyBatis中延迟加载,全局和局部的开启使用与关闭1、问题提出2、延迟加载和立即加载延迟加载立即加载 3、三种对应的表关系中的加载4、打开全局延迟加载(实现一对一的延迟加载)5、实现一对多的延迟加载(将上面设置的全局延…...
MyBatis增删改查基础及其xml文件
目录 一.增删改查基础 1.增 增Insert 获取自增ID 对insert参数进行重命名 2.删 3.改 4.查 1)对MySQL查询结果进行重命名 从MySQL层面--as 从mybatis层面--Results注解 复用Results的定义 2)配置自动转换驼峰命名(推荐) 二.Mybatis xml配置…...
视觉学习(1)—— 理论
一、提问 初入视觉的几个问题: 1、视觉是怎么被控制的 2、怎么让视觉启动 3、视觉需要完成什么东西 4、视觉启动如何将完成的东西反馈给我 二、回答 1、视觉都是通过通讯协议控制,如串口、Modbus TCP等协议 2、视觉中的所有功能块都在流程中&…...
pip 常用指令 pip list 命令用法介绍
📑pip 常用命令归类整理 pip list 是一个用于列出已安装的 Python 包的命令。这个命令会显示出所有已安装的包,以及它们的版本号。 pip list 命令有以下参数 -o, --outdated:列出所有过时的包,即有新版本可用的包。-u, --uptod…...
【DP】62.不同路径
题目 法1:二维DP 必须掌握! class Solution {public int uniquePaths(int m, int n) {int[][] matrix new int[m][n];Arrays.fill(matrix[0], 1);for (int i 0; i < m; i) {matrix[i][0] 1;}for (int i 1; i < m; i) {for (int j 1; j <…...
大数据、知识图谱和强化学习的综合应用
大数据、知识图谱和强化学习各自在不同的方面都发挥了重要作用,它们分别涉及了大规模数据的处理和挖掘、基于图的数据结构和信息提取,以及基于奖励反馈的决策制定。将它们结合使用,可以构建出更加强大和智能的系统。以下是一些可能的应用场景…...
MFC使用高速绘图控件high-speed Charting Control绘制柱形图
1. 创建MFC单文档工程BarChartDemo。 2. 在工程文件夹下新建文件夹ChartCtrl,将ChartCtrl源码放入,如下图所示。在工程中添加这些项,项目——添加——现有项,全部添加。 3. 添加一个对话框,ID为IDD_DLG_BAR,类名为CBarDlg。 4. 在对话框中添加Custom Control控件,将控…...
vue3 H5项目中实现PDF预览
是需要npm i vue-pdf-embed 安装这个插件的,可兼容ios/Android,下面是本人的使用实例 <template><div class"conten_box"><vue-pdf-embed v-if"pdfSource.url" :source"pdfSource" /></div> <…...
【WebRTC---源码篇】(十一:一)采集编码发送期间使用时间戳的详细解读
一、时间戳定义 1、 NTP时间 NtpTime RealTimeClock::CurrentNtpTime() //获取从1900-01-01 00:00.00到当前时刻经过的时间 int64_t RealTimeClock::CurrentNtpInMilliseconds() //获取从1900-01-01 00:00.00到当前时刻经过的毫秒数,ms int64_t rtc::TimeUTCMicros() //获取…...
Python学习路线 - Python语言基础入门 - Python异常、模块与包
Python学习路线 - Python语言基础入门 - Python异常、模块与包 了解异常什么是异常bug单词的诞生异常演示 异常的捕获方法为什么要捕获异常捕获常规异常捕获指定异常捕获多个异常捕获异常并输出描述信息捕获所有异常异常 else异常的finally 异常的传递Python模块什么是模块模块…...
eventbus,在this.$on监听事件时无法在获取数据
问题:vue中eventbus被多次触发,在this.$on监听事件时,内部的this发生改变导致,无法在vue实例中添加数据。 项目场景 一开始的需求是这样的,为了实现两个组件(A.vue ,B.vue)之间的数据传递。 页面A,点击页面…...
【Python必做100题】之第二十五题(统计字符)
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数 代码如下: string input("请输入字符串:")char 0 number 0 space 0 other 0for i in string:if i.isalpha():char 1elif i.isdigit():number 1eli…...
开发语言:ArkTS
简介 ArkTS是华为为鸿蒙操作系统(HarmonyOS)开发的一种应用开发语言。这种语言在TypeScript(简称TS)的基础上进行了扩展,以更好地适应鸿蒙系统的特点和开发需求。ArkTS不仅继承了TS的所有特性,而且还对TS的…...
Qt中字符串转换为JS的函数执行
简介 在 QML 中,将 JavaScript 字符串转换为函数通常涉及使用 Function 构造函数或 eval() 函数。但是,QML 的环境对 JavaScript 的支持有一定的限制,因此不是所有的 JavaScript 功能都可以在 QML 中直接使用。 以下介绍都是在Qt5.12.1…...
TCP/IP:从数据包到网络的演变
引言 TCP/IP协议的起源可以追溯到20世纪60年代末和70年代初,美国国防部高级研究计划局(ARPA)研究开发一种可靠的通信协议,用于连接分散在不同地点的计算机和资源。 在当时,计算机之间的连接并不像现在这样普遍和便捷…...
闪存驱动器与机械硬盘与固态硬盘
目录 U盘(闪存驱动器) 固态硬盘(SSD) 机械硬盘(HDD) 目前主流 U盘(闪存驱动器) U盘是便携式存储设备,内部采用闪存芯片作为存储介质。它们通常具有小巧轻便的外形&am…...
java String转asc码,然后ascII再转四位的16进制数。
理论知识补充: char是Java中的保留字,表示一种数据类型。与别的语言不同的是,char在Java中是16位的,因为Java用的是Unicode编码。不过8位的ASCII码包含在Unicode编码中,其值对应十进制的表示范围是0~127。 char是Java八…...
零基础制作宠物用品小程序
随着人们对宠物用品的需求不断增长,越来越多的人开始探索如何制作一个专业的宠物用品小程序。而乔拓云作为一款功能强大的在线商城制作工具,成为了许多商家的首选。本文将详细介绍如何使用乔拓云制作宠物用品小程序,让你轻松上手,…...
【SpringBoot篇】解决缓存击穿问题① — 基于互斥锁方式
文章目录 🌹什么是缓存击穿🌺基于互斥锁解决问题🛸思路 🏳️🌈代码实现 🌹什么是缓存击穿 缓存击穿是指在使用缓存系统时,对一个热点数据的高并发请求导致缓存失效,多个请求同时访…...
系列一、GitHub搜索技巧
一、GitHub搜索技巧 1.1、概述 作为程序员,GitHub大家应该都再熟悉不过了,很多时候当我们需要使用某一项技能而又无从下手时,通常会在百度(面向百度编程)或者在GitHub上通过关键字寻找相关案例,比如我想学…...
35.java后端面试宝典
一、自我介绍。 我叫什么,这次是应聘什么岗位,会什么技术,会什么框架,熟练掌握框架之间的整合技术,做过什么项目并且介绍主要做了什么,并且可以为公司带来什么价值。 总的来说,初级Java工程师岗…...
Linux 磁盘空间占满故障解决方法
故障排查: 使用命令查看磁盘使用量 # 使用人类可读的格式(预设值是不加这个选项的...) df -h # --inodes 列出 inode 资讯,不列出已使用 block df -i # 查看当前目录下各个文件及目录占用空间大小 du -sh / 情况一:一般磁盘空间满了&a…...
让生活更智能,P1600边缘智能网关带你进入智能家居新时代
一、什么是P1600边缘智能网关? 在科技日新月异的今天,我们的生活已经被各种智能产品所包围。而在这个智能化的浪潮中,P1600边缘智能网关以其独特的优势,成为了智能家居的重要组成部分。那么,什么是P1600边缘智能网关呢…...
Java与前端:2023年的真实状况与焦虑解读
一、引言 在2023年,IT圈中流传着一些关于Java和前端的言论,这些言论引起了广泛的关注。有些人认为“Java已死、前端已凉”,而另一些人则持不同观点。那么,这些言论背后的真相是什么?它们是在贩卖焦虑吗?本…...
adb 基本命令合集
1.获取所有的包信息: adb shell pm list packages com.yu.weskul 2.清除APP缓存 adb shell pm clear <package-name> 3.查看当前应用及Activity adb shell dumpsys window | findstr "mCurrentFocus" 4.查看应用详细信息 adb shell dumpsys pack…...
[RK-Linux] RK3399支持M.2 NVMe SSD启动
延续《[RK-Linux] 从主线U-Boot移植PCIe及其PHY驱动到RK3399 U-Boot》 启动流程: maskrom -> loader(从 eMMC 存储器加载) -> u-boot(从 eMMC 存储器加载)-> kernel (从 M.2 NVMe SSD 加载)-> rootfs (从 M.2 NVMe SSD 挂载)配置从 M.2 NVMe SSD 启动: …...
门户网站界面设计/seo是什么地方
题目表述 泰波那契序列 Tn 定义如下: T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n,请返回第 n 个泰波那契数 Tn 的值。示例 1: 输入:n 4 输出:4 解释: T_3 0 1 1 2 T…...
网站建设公司那家好/关键词优化排名首页
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一、runtime简介 RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数。…...
dede做招聘网站/营销方式方案案例
资料准备 官方模拟考试平台 官方视频教学 软件包、依赖包、配置文档、设备包、PPT等可在我的资源进行下载,我已打包格式上传。 软件安装 本人安装最新版本,如果你之前下了eNSP软件,你需要将安装目录删除掉,并且同时将 User->…...
java网站建设技术参数/注册网站多少钱
python中使用import来将别的模块导入到自己的脚本里面使用,那么什么样的文件才能被识别为模块,又该如何制作自己的模块呢。这一切都得从__init__.py这个文件说起。 我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关…...
做网站的备案/百度一下你就知道手机版
正则表达式经常被用于字段或任意字符串的校验,比如下面这段校验基本日期格式的JavaScript代码:var reg /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r fieldValue.match(reg); if(rnull)alert(Date format error!); 1、校验密码强…...
南京营销型网站建设/线下推广宣传方式有哪些
内存数据库:大数据时代数据管理新宠在2012中国系统架构师大会上,笔者曾做过一份有关大数据的调查,其中一项“在众多的技术趋势中,您所关注的数据管理的新技术是什么?”的调查结果中,“内存数…...