アットウィキロゴ

機械学習 > ナイーブベイズ > ソース

#include <map>
#include <set>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <bitset>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <sys/time.h>
using namespace std;
#define li        long long int
#define rep(i,to) for(li i=0;i<((li)(to));++i)
#define pb        push_back
#define sz(v)     ((li)(v).size())
#define bit(n)    (1ll<<(li)(n))
#define all(vec)  (vec).begin(),(vec).end()
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
#define MP        make_pair
#define F         first
#define S         second
 
#define MAX 2
#define RANGE 100
string name[]={"even","odd "};
double cnt1[MAX];
double cnt2[MAX][RANGE];
 
void study(){
	rep(i,10000){
		int target=rand()%2;
		int num=rand()/2*2+target;
		if(rand()%3==0) num++;
		cnt1[target]++;
		cnt2[target][num%RANGE]++;
	}
}
 
void init(){
	rep(i,MAX) cnt1[i]++;
	rep(i,MAX)rep(j,RANGE) cnt2[i][j]++;
}
 
void classify(vector<int> a){
	double ans[2]={0,0};
	rep(i,MAX){
		ans[i]+=sz(a)*log(cnt1[i]/(cnt1[0]+cnt1[1]));
		rep(j,sz(a)) ans[i]+=log(cnt2[i][a[j]]/(cnt2[0][a[j]]+cnt2[1][a[j]]));
	}
	rep(i,sz(a)) cout<<a[i]<<" "; cout<<endl;
	rep(i,MAX) printf("%s : %0.6lf\n",name[i].c_str(),ans[i]); cout<<endl;
}
 
int main(){
	init();
	study();
 
	rep(i,2){ rep(j,10) cout<<cnt2[i][j]<<" "; cout<<endl; } cout<<endl;
	rep(i,10){
		vector<int> vec;
		rep(i,5) vec.pb(rand()%RANGE);
		classify(vec);
	}
}
最終更新:2012年02月17日 10:09