教材上的一个例子(统计学习 李航著 朴素贝叶斯那章)
输入:
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); }