Fisher线性判别C++实现
把王丽梅老师的《模式识别》里源码实现了一下
原书共11页代码,和同学分段写了一节课实现了
样本及源码文件已经上传zip
样本数据是老师给的
double sw[32][8][8]; //类内离差矩阵
double mj[32][8]; //模式均值矢量
double sww[8][8]; //类间离差矩阵
//#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]={
{
#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<4;n2++){
for(n3=0;n3<4;n3++){
d+=(