📄 bayes.cpp
字号:
// Bayes.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <math.h>
#include <iostream.h>
#include <iomanip.h>
#include "Matrix.h"
#define m 2 //特征数
#define u 3 //样本数
void main()
{
Matrix matrix;
int a1[u][m];//存放第一类样本
int a2[u][m];//存放第二类样本
float aver1[m],aver2[m];//存放两类均值
float **cov1;//第一类的协方差矩阵
float **cov2;//第二类的协方差矩阵
double **inve1;
double **inve2;
float P[2];//两类的先验概率
int samp[2]={2,0};//待分类样本
float gx;//判别函数值
//输入第一类的样本
cout<<"请输入第一类的样本:"<<endl;
for(int i=0;i<u;i++)
{
for(int j=0;j<m;j++)
{
cin>>a1[i][j];
}
cout<<endl;
}
//输入第二类的样本
cout<<"请输入第二类的样本:"<<endl;
for(i=0;i<u;i++)
{
for(int j=0;j<m;j++)
{
cin>>a2[i][j];
}
cout<<endl;
}
//分别计算两类均值
for(i=0;i<m;i++)
{
aver1[i]=(float)(a1[0][i]+a1[1][i]+a1[2][i])/u;
aver2[i]=(float)(a2[0][i]+a2[1][i]+a2[2][i])/u;
}
//分别计算两类的协方差矩阵
cov1=matrix.cov(a1,aver1);
cov2=matrix.cov(a2,aver2);
//求两协方差阵的逆
inve1=matrix.inverse(cov1,m);
inve2=matrix.inverse(cov2,m);
//先验概率
P[0]=0.5;
P[1]=0.5;
double pRatio=log(P[0]/P[1]);
float **covSum;//两协方差矩阵和
double **inveSum;//协方差矩阵和的逆
covSum = new float* [m];
for(i=0; i<m; i++)
{
covSum[i] = new float[m];
}
for(i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
covSum[i][j]=cov1[i][j]+cov2[i][j];
}
}
inveSum=matrix.inverse(covSum,m);
//两类协方差相等
cout<<"如果协方差矩阵相等:"<<endl;
gx=samp[0]*((aver2[0]-aver1[0])*inveSum[0][0]+(aver2[1]-aver1[1])*inveSum[1][0])
+samp[1]*((aver2[0]-aver1[0])*inveSum[0][1]+(aver2[1]-aver1[1])*inveSum[1][1])
+1/2*(aver1[0]*aver1[0]*inveSum[0][0]+aver1[0]*aver1[1]*inveSum[1][0]+aver1[0]*aver1[1]*inveSum[0][2]+aver1[1]*aver1[1]*inveSum[1][1]
-aver2[0]*aver2[0]*inveSum[0][0]+aver2[0]*aver2[1]*inveSum[1][0]+aver2[0]*aver2[1]*inveSum[0][2]+aver2[1]*aver2[1]*inveSum[1][1]);
/* double covRatio=log(det(cov1,2)/det(cov2,2)); //假定协方差矩阵不等
gx=1/2*covRatio-1/2*pRatio+1/2*((samp[0]-ave1[0])*(samp[0]-ave1[0])*cov1[0][0]+(samp[1]-ave1[1])*(samp[0]-ave1[0])*cov1[1][0]
+(samp[0]-ave1[0])*(samp[1]-ave1[1])*cov1[0][1]+(samp[1]-ave1[1])*(samp[1]-ave1[1])*cov1[1][0]); */
if(gx<0)
cout<<"sample (2,0) belongs to the first class"<<endl;
else
cout<<"sample (2,0) belongs to the second class"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -