
Clasificador multinomial en Octave/matlab
Publicado por Carlos gonzalez (10 intervenciones) el 16/05/2016 22:14:12
Hola gente tengo un problema con un clasificador multinomial que estoy haciendo en octave pero es mas o menos lo mismo que matlab por eso lo pongo aqui. Mi problema surge en que estoy calculando el error de mi clasificador de dos formas con un bucle for y con operaciones matriciales (al ser mas rapido lo hago con operaciones matriciales) pero resulta que no me coincide el error con el bucle for me sale un error del 55% y con matriciales me sale 44% entonces quiero saber que es lo que me esta fallando ¿alguien que me puede ayudar?
aqui dejo mi clasificador:
Y esto es todo espero que me puedan ayudar
Gracias.
aqui dejo mi clasificador:
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
#!/usr/bin/octave -qf
if(nargin!=1)
printf("Usage: multinomial.m <data_filename>");
exit(1);
end
arglist=argv();
datafile=arglist{1};
disp("Loading data...");
load(datafile);
disp("Data load complete.");
## Aleatorización de las filas para escoger luego los conjuntos de train/test ##
[nrows,ncols] = size(data);
rand("seed",23);
perm=randperm(nrows);
pdata=data(perm,:);
## Obtención del 90% de filas para test y 10% de filas para train ##
trper=0.9;
ntr=floor(nrows*trper);
nte=nrows-ntr;
tr=pdata(1:ntr,:); # Conjunto de entrenamiento #
te=pdata(ntr+1:nrows,:); # Conjunto de test #
[nrows,ncols] = size(tr);
rows_ham = tr(find(tr(:,end)==0),1:end-1); #saco un vector con las filas de ham
rows_spam = tr(find(tr(:,end)==1),1:end-1);#vector con spam
prior_ham = rows(rows_ham)/nrows; # probabilidad a priori de ham
prior_spam = rows(rows_spam)/nrows; # probabilidad a priori de spam
sum_ham = sum(rows_ham);
sum_spam = sum(rows_spam);
p_ham = (1/sum(sum_ham,2))*sum_ham; #estimacion
p_spam = (1/sum(sum_spam,2))*sum_spam;
disp(prior_ham),disp(prior_spam);
#Aqui esta la parte de operaciones matriciales
x = te(:,1:end-1);
log_p_ham = log(p_ham);
log_p_spam = log(p_spam);
g_ham = (log_p_ham*x')+prior_ham;
g_spam = (log_p_spam*x')+prior_spam;
correct_clases = g_ham > g_spam;
correct_clases = correct_clases == te(:,end)';
error = sum(correct_clases)/length(correct_clases);
disp("El % de error con ops matriciales es: "),disp(error);
Y esto es todo espero que me puedan ayudar
Gracias.
Valora esta pregunta


0