Kiedy próbowałem obliczyć w^T * x
użyciu numpy, było również bardzo mylące dla mnie. W rzeczywistości nie mogłem sam tego wdrożyć. Jest to jeden z niewielu gier w NumPy, z którymi musimy się zapoznać.
ile 1D Tablica się, to nie ma żadnej różnicy pomiędzy wektora wierszy i kolumn wektora. Są dokładnie takie same.
Spójrz na poniższe przykłady, w których możemy uzyskać ten sam rezultat w każdym przypadku, co nie jest prawdą w (teoretyczne poczucie) algebry liniowej:
In [37]: w
Out[37]: array([0, 1, 2, 3, 4])
In [38]: x
Out[38]: array([1, 2, 3, 4, 5])
In [39]: np.dot(w, x)
Out[39]: 40
In [40]: np.dot(w.transpose(), x)
Out[40]: 40
In [41]: np.dot(w.transpose(), x.transpose())
Out[41]: 40
In [42]: np.dot(w, x.transpose())
Out[42]: 40
Dzięki tej informacji, teraz spróbujmy obliczyć kwadratową długość wektora |w|^2
.
W tym celu musimy przekształcić w
na tablicę 2D.
In [51]: wt = w[:, np.newaxis]
In [52]: wt
Out[52]:
array([[0],
[1],
[2],
[3],
[4]])
Teraz Obliczmy długość kwadratu (lub kwadratu wielkości) wektora w
:
In [53]: np.dot(w, wt)
Out[53]: array([30])
Zauważ, że użyliśmy w
, wt
zamiast wt
, w
(jak w teoretycznym algebry liniowej) z powodu niedopasowania kształtu za pomocą np.dot (wt, w). Mamy więc kwadratową długość wektora jako [30]
. Może to jeden ze sposobów odróżnienia (numpy's interpretacja) wektora wiersza i kolumny?
I wreszcie, czy wspomniałem, że wymyśliłem sposób na wdrożenie w^T * x
? Tak, zrobiłem:
In [58]: wt
Out[58]:
array([[0],
[1],
[2],
[3],
[4]])
In [59]: x
Out[59]: array([1, 2, 3, 4, 5])
In [60]: np.dot(x, wt)
Out[60]: array([40])
Więc w NumPy kolejność argumentów jest odwracany, co widać powyżej, wbrew temu, co badaliśmy w teoretycznym algebry liniowej.
P.S.: potential gotchas in numpy
Zachowanie który obserwujemy jest faktycznie * poprawna * „w realnym świecie ": * jedna * wymiarowa sekwencja liczb nie jest ani rzędem, ani kolumnowym wektorem. Wektor wiersza lub kolumny jest w rzeczywistości * dwuwymiarową tablicą (w której jeden z dwóch wymiarów to 1). Zatem twoje testy powinny być wykonywane za pomocą 'array ([[1, 2, 3]]), która nie jest równa jej transpozycji. – EOL
To jest matematycznie nie do końca poprawne. Matryce to mxn, a wektory rzędów są z definicji tymi, w których m = 1, a wektorami kolumnowymi są te, w których n = 1. Wymiarowość jest zupełnie inna w matematyce, ma do czynienia z liczbą wektorów w podstawie ustalonej w przestrzeni wektorowej, więc tak naprawdę nie powinniśmy w ogóle mówić o wymiarowości pojedynczego wektora. Myślę, że oryginalny plakat w rozmowach o "realnym świecie" mówił o świecie algebry liniowej i matematyki, więc był poprawny. Programiści zwykle używają niewłaściwych terminów. – neuronet