¿Cómo puedo obtener las mismas soluciones 'especiales' para sistemas lineales subdeterminados que el operador 'A \ b' (mldivide) de Matlab devuelve usando numpy / scipy?
Encontre unenlazar donde se muestra con un ejemplo que el Matlabmldivide
operador (\
) da soluciones "especiales" cuando el sistema de ecuaciones lineales tiene infinitas soluciones.
Por ejemplo:
A = [1 2 0; 0 4 3];
b = [8; 18];
c_mldivide = A \ b
c_pinv = pinv(A) * b
da la salida:
c_mldivide =
0
4
0.66666666666667
c_pinv =
0.918032786885245
3.54098360655738
1.27868852459016
La solución es 'especial' en el sentido de que el número de entradas distintas de cero en la soluciónc_mldivide
es igual arank(A)
(en este caso 2). Intenté lo mismo en numpy usandonumpy.linalg.lstsq
, que da un resultado idéntico ac_pinv
.
¿Hay alguna manera de lograr elc_mldivide
solución en Python?
Había otra pregunta muy similar.aquí, pero supongo que la explicación de la palabra "especial" no fue lo suficientemente clara.Otra pregunta preguntado sobre el funcionamiento interno de lamldivide
operador, pero la respuesta aceptada no parece abordar este comportamiento.
Editar 1:numpy
código
In [149]: test_A = np.array([[1,2,0],[0,4,3]])
test_b = np.array([[8],[18]])
np.linalg.lstsq(test_A,test_b)
Out[149]:
(array([[ 0.918 ],
[ 3.541 ],
[ 1.2787]]), array([], dtype=float64), 2, array([ 5.2732, 1.4811]))
Edición 2: Usandoscipy.optimize.nnls
In[189]:
from scipy.optimize import nnls
nnls(test_A,test_b)
Out[190]:
ValueError Traceback (most recent call last)
<ipython-input-165-19ed603bd86c> in <module>()
1 from scipy.optimize import nnls
2
----> 3 nnls(test_A,test_b)
C:\Users\abhishek\Anaconda\lib\site-packages\scipy\optimize\nnls.py in nnls(A, b)
43 raise ValueError("expected matrix")
44 if len(b.shape) != 1:
---> 45 raise ValueError("expected vector")
46
47 m, n = A.shape
ValueError: expected vector