Резюме:
Я пытаюсь построить самые большие и самые маленькие собственные векторы 2-мерных данных в python, используя numpy и matplotlib. Я использовал числовые функции для ковариационной матрицы, собственных значений и собственных векторов. Позже я попытался построить собственные векторы с помощью колчана для заданных данных. Собственные векторы не отображаются правильно. Я предполагаю, что есть какая-то ошибка в том, как я строю сюжет колчана. Может ли кто-нибудь наставить меня на правильный путь?
Это мой код:
import numpy as np
import matplotlib.pyplot as plt
from numpy import array
from numpy import linalg as LA
# Assume that I loaded 'N' no of 2d points from a file and used
# np.cov() to find the below covariance matrix
# This is my covariance matrix obtained from 2 x N points
cov_mat = [[3407.3108669 1473.06388943]
[1473.06388943 1169.53151003]]
eigen_values, eigen_vectors = LA.eig(cov_mat)
origin = [0, 0]
eig_vec1 = eigen_vectors[:,0]
eig_vec2 = eigen_vectors[:,1]
# This line below plots the 2d points
#plt.scatter(np_array[:,0], np_array[:,1])
plt.quiver(origin, eig_vec1, color=['r'], scale=21)
plt.quiver(origin, eig_vec2, color=['b'], scale=21)
plt.show()
Мой вывод:
Это мои 2D данные. Мы можем видеть, что самый большой собственный вектор должен быть в диагональном направлении. Но вектор не отображается правильно на графике.
Вы действительно используете колчан неправильно. X
, Y
, U
и V
должны быть отдельными аргументами (подробности см. В документации). С помощью plt.quiver(*origin, *eig_vec1, color=['r'], scale=21)
(т.е. распаковка вашего источника и собственных векторов) вы должны получить желаемый результат.
import numpy as np
import matplotlib.pyplot as plt
from numpy import array
from numpy import linalg as LA
# Assume that I loaded 'N' no of 2d points from a file and used
# np.cov() to find the below covariance matrix
# This is my covariance matrix obtained from 2 x N points
cov_mat = [[3407.3108669, 1473.06388943],
[1473.06388943, 1169.53151003]]
eigen_values, eigen_vectors = LA.eig(cov_mat)
origin = [0, 0]
eig_vec1 = eigen_vectors[:,0]
eig_vec2 = eigen_vectors[:,1]
print(eig_vec1)
print(eig_vec2)
# This line below plots the 2d points
#plt.scatter(np_array[:,0], np_array[:,1])
plt.quiver(*origin, *eig_vec1, color=['r'], scale=21)
plt.quiver(*origin, *eig_vec2, color=['b'], scale=21)
plt.show()
дает следующий сюжет: