En el curso de Aprendizaje Automático de Andrew Ng, en la clase 4.6 sobre "Ecuación Normal", dice que para minimizar J(θ)=12mm∑i=1(hθ(x(i))−y(i))2, donde hθ(x)=θ0+θ1x1+θ2x2+...+θnxn y resolver para θ, se debe tomar la matriz de diseño X y calcular la siguiente expresión:
θ=(XTX)−1XTy,
donde la matriz de diseño es la matriz de todos los vectores de características [1,x(i)1,x(i)2,...,x(i)m] como filas. Muestra el código de Octave (Matlab) para calcularlo, como pinv(x'*x)*x'*y
.
Sin embargo, hace mucho tiempo, cuando usé Numpy para resolver el mismo problema, simplemente usé np.linalg.pinv(x) @ y
. Incluso se menciona en la documentación de pinv de Numpy que pinv
resuelve el problema de los mínimos cuadrados para Ax=b, de manera que ¯x=A+b.
Entonces, ¿por qué debería calcular θ=(XTX)−1XTy cuando puedo simplemente calcular θ=X−1y? ¿Hay alguna diferencia?
EDICIÓN:
De hecho, es fácil ver que θ=(XTX)−1XTy es correcto, porque por definición,
,
tal que al multiplicar X por la izquierda por (XTX)−1)XT, obtenemos I, lo que significa que es su matriz inversa por la izquierda. La inversa por la izquierda es la matriz que se utiliza para resolver el problema de los mínimos cuadrados, ya que al multiplicar ambos lados por ella desde la izquierda, convierte Xθ=y en Iθ=(XTX)−1XTy, lo que significa que los coeficientes son ,
lo que nuevamente, gracias a la propiedad asociativa de la multiplicación de matrices, se puede escribir como
X(XT(XXT)−1)=I,
Por lo tanto, obtenemos que (XT(XXT)−1) es la inversa por la derecha de X.