5 votos

Problema de la función de coste de la regresión logística en Matlab

Estoy tratando de implementar una función de regresión logística en matlab. Calculé los valores de theta, la función de costo de regresión lineal es convergente y luego uso esos parámetros en la función de regresión logística como un límite de decisión.

Estoy intentando obtener un árbol de regresión logística sobreajustado para mostrar cómo se comporta la función de coste durante el sobreajuste con respecto al tamaño del conjunto de entrenamiento. Obtengo un error de entrenamiento convergente, que es lo esperado. También obtengo un error de validación creciente, lo que también se espera, pero aunque están aumentando, mis valores de error de validación están siempre por debajo de los valores de error de entrenamiento. ¿Se supone que es así (porque estamos usando el logaritmo de la función de hipótesis y no la función de error al cuadrado) o estoy haciendo algo mal? (No puedo publicar imágenes porque soy un miembro nuevo)

Mis cálculos de la función de costes están incluidos en la parte del código, agradecería cualquier ayuda.

    for i=1:row
    if y(i)>0
        classification(i)=1;
    else
        classification(i)=0;
    end
classpredict(i)=1/(1+exp(-(ypredict(i))));
end

for i=1:size(data,1)-row
    if validy(i)>0
        classvalid(i)=1;
    else
        classvalid(i)=0;
    end
classvalidpredict(i)=1/(1+exp(-(validpredicty(i))));
end

for i=1:size(classpredict)

        costclasstrain=-(costclasstrain+(classification(i))*(log(classpredict(i)))+(1-classification(i))*(log(1-classpredict(i))))/row;
end

for i=1:size(classvalidpredict)

      costclassvalid=-(costclassvalid+(classvalid(i))*(log(classvalidpredict(i)))+(1-classvalid(i))*(log(1-classvalidpredict(i))))/(size(data,1)-row);
end

2 votos

¿Cuánto tiempo has dedicado a leer textos y documentos sobre el modelo de regresión logística?

1 votos

¿Por qué cambias el signo del coste en cada iteración? ¿No debería estar el signo menos dentro del paréntesis?

1voto

David Puntos 41

En matlab o R sugeriría utilizar la implementación vectorizada, que la pérdida logística es sólo

$$ \mathbf 1^T (-b \log p -(1-b) \log(1-p)) $$

Donde

$$p=\frac 1 {1+\exp{(-Ax)}}$$

En la notación anterior, $A$ es la matriz de datos y $b$ es la respuesta binaria.

Aquí está el código de matlab (con el cálculo del gradiente)

function [J grad] = lg_loss(A,b,x)
    sigmoid = @(z) 1.0 ./ (1.0 + exp(-z));
    p=sigmoid(A*x);
    J=sum(-b.*log(p)-(1-b).*log(1-p));
    grad=A'*(p-b);
end

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X