教材上的一个例子(统计学习 李航著 朴素贝叶斯那章)
输入:
2 15
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
s m m s s s m m l l l m m l l
-1 -1 1 1 -1 -1 -1 1 1 1 1 1 1 1 -1
2 s
代码:
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
#define INF 0x3fffffff
#define clr(s,t) memset(s,t,sizeof(s));
#define N 1000
#define D 30
int s[D][N],t[N];
int n,m,k;
int prior[N];
double condition[10][D][N];
struct dic{
char str[100];
int c;
}d[D][N];
int len[D];
int find(int id,char *x){
int i;
for(i = 0;i<len[id];i++)
if(!strcmp(d[id][i].str, x))
return i;
strcpy(d[id][len[id]].str, x);
len[id]++;
return len[id]-1;
}
int main(){
int i,j,q,num,a,b;
char str[10];
clr(len, 0);
scanf("%d %d",&n,&m);
for(i = 1;i<=n;i++){
for(num = 0,j= 1;j<=15;j++){
scanf("%s",str);
q = find(i,str);
s[i][j] = q;
}
}
b = i;
k = 0;
for(i = 1;i<=m;i++){
scanf("%s",str);
j = find(b,str);
s[b][i] = j;
k = max(k,j);
}
clr(prior, 0);
clr(condition, 0);
for(i = 1;i<=m;i++)
prior[s[b][i]]++;
for(i = 1;i<=n;i++)
for(j = 1;j<=m;j++)
condition[s[b][j]][i][s[i][j]]++;
scanf("%s",str);
a = find(1,str);
scanf("%s",str);
b = find(2,str);
printf("%lf\n",condition[0][1][a]/prior[0]*condition[0][2][b]/prior[0]*prior[0]/m);
printf("%lf\n",condition[1][1][a]/prior[1]*condition[1][2][b]/prior[1]*prior[1]/m);
//printf("%lf %lf\n",1./45,1./15);
}