Estoy resolviendo un problema de LSE no lineal que, dependiendo de los datos, tiene un grado de dependencia diferente entre los parámetros del modelo estimado. La dependencia se manifiesta, por ejemplo, como una deficiencia de rango del jacobiano.
Un ejemplo de este tipo de problema sería la adaptación de un $f(x)=be^{ax}+c$ a un conjunto de puntos de datos. Si estos puntos de datos forman una línea horizontal, el $a$ sería $0$ y parámetros $b$ y $c$ serían dependientes (ya que sólo podemos estimar su suma a partir de los datos).
Me gustaría poder analizar de alguna manera qué parámetros son dependientes y en qué grado. Tengo la sensación de que un SVD de la jacobiana podría ayudar, pero no tengo ni idea de cómo abordar esto.
EDITAR:
He hecho un pequeño programa de prueba en python 2.7 para el ejemplo anterior, con el cálculo de la matriz Corr, según la respuesta de vibe.
import sympy as sp
import numpy as np
def merge_dicts(a,b):
c = a.copy()
c.update(b)
return c
a,b,c,x,y=sp.symbols("a b c x y")
params = [a,b,c]
fun = sp.exp(a*x)*b+c
residual = fun-y
diffs = [ sp.diff(residual,p) for p in params ]
print("diffs:\n",diffs)
sol = {a:0.0, b:10.0, c:-5.0}
data = [ {x:xv, y: float(fun.subs(merge_dicts(sol, {x:xv}))) } for xv in range(-2,5) ]
print("data:\n",data)
J = np.array([[ float(diffs[i].subs(merge_dicts(data[j], sol))) for i in range(len(diffs)) ] for j in range(len(data))] )
print("J:\n", J)
C = np.linalg.pinv(np.matmul(J.transpose(), J))
print("C:\n", C)
D = np.diag(np.sqrt(np.diag(C)))
print("D:\n", D)
Dinv = np.linalg.inv(D);
print("Corr:\n", np.matmul(np.matmul(Dinv, C), Dinv))