Actualmente estoy haciendo el curso de aprendizaje automático de Andrew Ng en coursera, y en la semana 2 habla del escalado de características.
He visto la conferencia y he leído muchos posts; entiendo el razonamiento que hay detrás del escalado de características (básicamente para hacer que el descenso de gradiente converja más rápido representando todas las características más o menos a la misma escala).
Mi problema surge cuando intento hacerlo. Estoy usando Octave, y tengo el código para el descenso de gradiente con regresión lineal configurado: calcula la matriz 'theta' para la hipótesis muy bien para los valores no escalados, dando predicciones precisas.
Cuando utilizo los valores escalados de la matriz de entrada X y el vector de salida Y, los valores de theta y la función de coste J(theta) calculados son diferentes a los de los valores sin escalar. ¿Es esto normal? ¿Cómo puedo "deshacer" el escalado para que, cuando pruebe mi hipótesis con datos reales, obtenga resultados precisos?
Como referencia, aquí está la función de escala que estoy utilizando (en Octave):
function [scaledX, avgX, stdX] = feature_scale(X)
is_first_column_ones=0; %a flag indicating if the first column is ones
sum(X==1)
if sum(X==1)(1) == size(X)(1) %if the first column is ones
is_first_column_ones=1;
X=X(:,2:size(X)(2)); %strip away the first column;
end
stdX=std(X);
avgX=mean(X);
scaledX=(X-avgX)./stdX;
if is_first_column_ones
%add back the first column of ones; they require no scaling.
scaledX=[ones(size(X)(1),1),scaledX];
end
end
¿Escala mi entrada de prueba, escala mi theta, o ambos?
También debo señalar que estoy escalando como tal:
scaledX=feature_scale(X);
scaledY=feature_scale(Y);
donde X e Y son mi entrada y mi salida respectivamente. Cada columna de X representa una característica diferente (la primera columna es siempre 1 para la característica de sesgo theta0) y cada fila de X representa un ejemplo de entrada diferente. Y es una matriz de columnas 1-D donde cada fila es un ejemplo de salida, correspondiente a la entrada de X.
eg: X = [1, x, x^2]
1.00000 18.78152 352.74566
1.00000 0.61030 0.37246
1.00000 21.41895 458.77124
1.00000 3.83865 14.73521
Y =
99.8043
1.8283
168.9060
-29.0058
^ esto es para la función y=x^2 - 14x + 10