-
Notifications
You must be signed in to change notification settings - Fork 0
/
NaiveBayes.h
118 lines (114 loc) · 3.48 KB
/
NaiveBayes.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#ifndef NAIVEBAYES_H_
#define NAIVEBAYES_H_
#define PI 3.14
#endif /* NAIVEBAYES_H_ */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct DADOS{
float *array;
float media;
float variancia;
int linhas;
}Dados;
/*Prototipos*/
int class(float *matriz);
float *ProbPosteriori(Matriz *Treino, float *LikehoodProb);
float *ProbPriori(Matriz *Treino, float value, int col, float *ProbPrior);
Dados *getValues(Matriz *Treino,int col,int classe);
float getMedia(Dados *classe);
float getVariancia(Dados *classe);
float LikehoodProbability(Matriz *M, int j, Dados *classe);
float *initVec(float *vec){
int i;
for(i=0;i<classes;i++)
vec[i]=1;
return vec;
}
float NaiveBayes(Matriz *Teste,Matriz *Treino){
int i,j,erro=0,cl,coluna;
float *LikehoodProb=malloc(classes*sizeof(float));
float *ProbPost=malloc(classes*sizeof(float));
Dados *classe1=NULL,*classe2=NULL,*classe3=NULL;
initVec(LikehoodProb);
initMatrizConfusao(Teste);//inicializar Matriz de Confusão
for(i=0;i<Teste->linhas;i++){
initVec(LikehoodProb);
for(j=0;j<Teste->colunas-2;j++){
classe1=getValues(Treino,j,1);
classe2=getValues(Treino,j,2);
classe3=getValues(Treino,j,3);
//puts("medias");
classe1->media=getMedia(classe1);
classe2->media=getMedia(classe2);
classe3->media=getMedia(classe3);
//puts("variancias");
classe1->variancia=getVariancia(classe1);
classe2->variancia=getVariancia(classe2);
classe3->variancia=getVariancia(classe3);
}
LikehoodProb[0]=LikehoodProbability(Treino, i, classe1);
LikehoodProb[1]=LikehoodProbability(Treino, i, classe2);
LikehoodProb[2]=LikehoodProbability(Treino, i, classe3);
ProbPost=ProbPosteriori(Treino, LikehoodProb);
cl=maxValue(ProbPost[0],ProbPost[1],ProbPost[2]);//retorna classe com maior probabilidade
if(cl==0)
printf("Erro de classificação Naive Bayes\n");
coluna = (int)Teste->matriz[i][Teste->colunas-1];
if(coluna-cl<=0.001){
Teste->matrizConfusao[cl-1][cl-1]=Teste->matrizConfusao[cl-1][cl-1]+1;//identificações corretas
}
else{
erro++;
Teste->matrizConfusao[coluna-1][cl-1]=Teste->matrizConfusao[coluna-1][cl-1]+1;//identificações
}
}
return (100-(100*erro)/Teste->linhas);
}
float getVariancia(Dados *classe){
int i;
float variancia=0;
for(i=0;i<classe->linhas;i++)
variancia = variancia+pow(classe->array[i]-classe->media,2);
return variancia/(classe->linhas-1);
}
float getMedia(Dados *classe){
int i;
float sum=0;
for(i=0;i<classe->linhas;i++)
sum+=classe->array[i];
return (sum/classe->linhas);
}
Dados *getValues(Matriz *Treino,int col,int classe){
int i,w=0;
Dados *cl=malloc(sizeof(Dados));
float *dados=NULL;
dados=malloc(1501*sizeof(float));//MUDAR ISTO PARA MEMORIA DINAMICA
for(i=0;i<Treino->linhas;i++){
if(Treino->matriz[i][Treino->colunas-1]==classe){
dados[w]=Treino->matriz[i][col];
w++;
}
}
cl->array=dados;
cl->linhas=w;
return cl;
}
float *ProbPosteriori(Matriz *Treino, float *LikehoodProb){
float *ProbPosteriori=NULL;
int i;
ProbPosteriori=malloc(classes*sizeof(float));
for(i=0;i<classes;i++)
ProbPosteriori[i]=Treino->frelat[i]*LikehoodProb[i];
return ProbPosteriori;
}
float LikehoodProbability(Matriz *M, int j, Dados *classe){
float prob=0;
int i;
for(i=0;i<M->colunas-2;i++){
if(i==1) prob=1.0;
prob=prob*(1/(sqrt(2*PI*classe->variancia)))*(exp(-(pow((M->matriz[j][i]-classe->media),2))/(2*classe->variancia)));
if(prob<=0.001) prob=0.99;//se a probabilidade calculada for 0 torna-la num membro "nulo" da multiplicação
}
return prob;
}