Question

J'ai cette ligne de code dans MATLAB, écrite par quelqu'un d'autre:

c=a.'/b

Je dois le traduire en Python. a, b et c sont tous des tableaux. Les dimensions que j'utilise actuellement pour tester le code sont les suivantes:

a: 18x1,
b: 25x18,

qui me donne c avec les dimensions 1x25.

Les tableaux ne sont pas carrés, mais je ne voudrais pas que le code échoue s’ils l’étaient. Quelqu'un peut-il expliquer exactement ce que fait cette ligne (mathématiquement) et comment le faire en Python? (c’est-à-dire l’équivalent de la fonction mrdivide intégrée dans MATLAB s’il existe en Python?)

Était-ce utile?

La solution

La ligne

c = a.' / b

calcule la solution de l'équation c b = a T pour c . Numpy n'a pas d'opérateur qui le fasse directement. Au lieu de cela, vous devriez résoudre b T c T = a pour c T et transposer le résultat:

c = numpy.linalg.lstsq(b.T, a.T)[0].T

Autres conseils

Le symbole / est l'opérateur de division droite de la matrice dans MATLAB, qui appelle le mrdivide . Dans la documentation, la division droite de la matrice est liée à la division gauche de la matrice dans la manière suivante:

B/A = (A'\B')'

Si A est une matrice carrée, B / A est à peu près égal à B * inv (A) (bien qu'il soit calculé dans une manière différente, plus robuste). Sinon, x = B / A est la solution au sens des moindres carrés pour le système d'équations sous-déterminé ou surdéterminé x * A = B . Vous trouverez plus de détails sur les algorithmes utilisés pour résoudre le système d'équations ici . Des paquets tels que LAPACK ou BLAS sont utilisés sous le capot.

Le paquet NumPy pour Python contient une routine lstsq pour le calcul des moindres carrés solution à un système d'équations. Cette routine vous donnera probablement des résultats comparables à ceux obtenus avec la fonction mrdivide dans MATLAB, mais il est peu probable que ce soit exact . Toute différence dans les algorithmes sous-jacents utilisés par chaque fonction entraînera probablement des réponses légèrement différentes les unes des autres (c’est-à-dire qu’une peut renvoyer une valeur de 1,0, tandis que l’autre peut renvoyer une valeur de 0,999). La taille relative de cette erreur pourrait finir par être plus grande, en fonction du système d'équations spécifique que vous résolvez.

Pour utiliser lstsq , vous devrez peut-être ajuster légèrement votre problème. Il semble que vous souhaitiez résoudre une équation de la forme cB = a , où B est 25-sur-18, a est 1-. 18 ans et c est égal à 1 sur 25. L'application d'une transposer sur les deux côtés vous donne l'équation B T c T = a T , qui est une forme plus standard (c'est-à-dire Ax = b ). Les arguments de lstsq doivent être (dans cet ordre) B T (un tableau 18 sur 25) et un T (un tableau de 18 éléments). lstsq doit renvoyer un tableau de 25 éléments ( c T ).

Remarque: si NumPy ne fait pas de distinction entre un tableau 1 par N ou N par 1, MATLAB le fait certainement et vous hurle dessus si vous n'utilisez pas le bon.

Dans Matlab, A. ' signifie transposer la matrice A. Donc mathématiquement, le code permet d’atteindre A T / B.

Comment implémenter la division de matrice en Python (ou n’importe quel langage) (Remarque: passons à une simple division de la forme A / B ; pour votre exemple, vous devez d'abord faire A T puis A T / B ensuite, et il est assez facile de faire l'opération de transposition en Python | left-as-an -exercice:) |)

Vous avez une équation matricielle C * B = A (vous voulez trouver C comme A / B)

DROITE DIVISION (/) est la suivante:

C * (B * B T ) = A * B T

Vous isolez ensuite C en inversant (B * B T )

c'est-à-dire

C = A * B T * (B * B T ) '----- [1]

Par conséquent, pour implémenter la division de matrice en Python (ou n’importe quel langage), obtenez les trois méthodes suivantes.

  • Multiplication matricielle
  • Transposition de matrice
  • Inverse de la matrice

Puis appliquez-les de manière itérative pour obtenir la division comme dans [1].

Seulement, vous devez exécuter A T / B. Par conséquent, votre opération finale après la mise en œuvre des trois méthodes de base doit être:

A T * B T * (B * B T ) '

Remarque: N'oubliez pas les règles de base de la priorité des opérateurs:)

[édité] Comme Suvesh l’a souligné, j’avais complètement tort avant. cependant, numpy peut toujours effectuer facilement la procédure qu'il donne à son poste:

A = numpy.matrix(numpy.random.random((18, 1))) # as noted by others, your dimensions are off
B = numpy.matrix(numpy.random.random((25, 18)))
C = A.T * B.T * (B * B.T).I

Vous pouvez également aborder ceci en utilisant le pseudo-inverse de B , puis poster en multipliant ce résultat avec A . Essayez d’utiliser numpy.linalg.pinv puis combinez cela avec la multiplication de matrice via < code> numpy.dot :

c = numpy.dot(a, numpy.linalg.pinv(b))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top