Matlab - Clasificador multinomial en Octave/matlab

   
Vista:

Clasificador multinomial en Octave/matlab

Publicado por Carlos gonzalez (1 intervención) 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:

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Dave

Clasificador multinomial en Octave/matlab

Publicado por Dave correa.dave30@gmail.com (934 intervenciones) el 17/05/2016 04:52:38
Hola Carlos;

Creo que va ser un poco dificil que alquien pueda probar tu código, ya que veo que utiliza algunos archivo que no estás adjuntando.

Quizás si subes algún archivo, alguien pueda hacer algunas pruebas y ayudarte.

Espeor ser de alguna ayuda.

Saludos
Dave Correa
correa.dave30@gmail.com
WhatsApp: +51 - 962906438
dcorrea@fismatlab.org
Servicios de Programación Matlab
http://fismatlab.org​​
http://fismatlab.blogspot.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar