实验二Fisher线性判别准则设计分类器.docVIP

  • 17
  • 0
  • 约 8页
  • 2017-08-10 发布于天津
  • 举报

实验二Fisher线性判别准则设计分类器.doc

实验二Fisher线性判别准则设计分类器

Fisher线性判别准则设计分类器 1)编程实现算法 #include stdio.h #include math.h #include stdlib.h #define trainingnum 100 #define testingnum 100 #define feadim 2 #define N1 50 #define N2 50 double s1[feadim][feadim],s2[feadim][feadim];//两类样本类内离散度 double m1[feadim][1],m2[feadim][1]; //两类样本的均值 double insw[feadim][feadim];//存放sw的逆矩阵 double w[feadim][1];//存放解结果 double _m1,_m2,yo; //存放~m1,~m2 double y[testingnum];//一维空间样本 int right,wrong;//存放识别的结果 struct sample { char serial[4]; //序号 float feature[feadim][1];//存储身高与体重 int trueclass; //真实类别 int classifiedclass; //被识别的分类 }; //打印矩阵 void PrintOut(double M[feadim][feadim]) { int i,j; for(i = 0; ifeadim; i++) //行 { for(j=0; jfeadim; j++) printf(%8.2f,M[i][j]); printf(\n); } } //采用部分主元法的高斯消去法求方阵A的逆矩阵B //A 方阵 (IN) //n 方阵的阶数 (IN) //B 方阵 (OUT) //返回true 说明正确计算出逆矩阵 //返回false说明矩阵A不存在逆矩阵 bool gaussj(double A[feadim][feadim], double B[feadim][feadim]) { int i,j,k; double lMax,temp; //临时矩阵存放A double tt[feadim][feadim]; for(i=0;ifeadim;i++) { for(j=0;jfeadim;j++) { tt[i][j] = A[i][j]; } } //初始化B为单位阵 for(i=0;ifeadim;i++) { for(j=0;jfeadim;j++) { if(i!=j)B[i][j] = 0; else B[i][j] = 1; } } for(i=0;ifeadim;i++) { //寻找主元 lMax = tt[i][i]; k = i; for(j=i+1;jfeadim;j++) //扫描从i+1到n的各行 { if( fabs(tt[j][i]) fabs(lMax)) { lMax = tt[j][i]; k = j; } } //如果主元所在行不是第i行,进行行交换 if(k!=i) { for(j=0;jfeadim;j++) { temp = tt[i][j] ; tt[i][j] = tt[k][j]; tt[k][j] = temp; //B伴随计算 temp = B[i][j]; B[i][j] = B[k][j]; B[k][j] = temp; } } //判断主元是否是0,如果是,则矩阵A不是满秩矩阵,不存在逆矩阵 if(tt[i][i] == 0) return false; //消去A的第i列除去i行以外的各行元素 temp = tt[i][i]; for(j=0;jfeadim;j++) { tt[i][j] = tt[i][j] / temp; //主对角线上元素变成1 B[i][j] = B[i][j] / temp; //伴随计算 } for(j=0;jfeadim;j++) //行 0 - n { if(j!=i) //不是第i行 { temp = tt[j][i]; for(k=0;kfeadim;k++) // j行元素 - i行元素* j行i列元素 { tt[j][k] = tt[j][k] - tt[i][k] * temp; B[j][k] = B[j][k] - B[i][k] * temp; } } } } return true; } //计算两个矩阵的乘积 // AB - C void Multi(double A[feadim][feadim], double B[feadim][1], double C[feadim][1]) { int i,j,k; for(i=0;ifeadim;i++) { for(j=

文档评论(0)

1亿VIP精品文档

相关文档