Я пытаюсь реализовать PCA в Python, но когда я go аннотирую свою фигуру основными осями, оказывается, что мои векторы не ортогональны.
import numpy as np
import matplotlib.pyplot as plt
import scipy.linalg as LA
N = 1000
xTrue = np.linspace(0, 1000, N)
yTrue = 4 * xTrue
xData = xTrue + np.random.normal(0, 100, N)
yData = yTrue + np.random.normal(0, 100, N)
xData = np.reshape(xData, (N, 1))
yData = np.reshape(yData, (N, 1))
Data = np.hstack((xData, yData))
C = np.cov(Data, rowvar = False)
e_vals, e_vecs = LA.eig(C)
e_vals = np.real(e_vals)
e_vecs = -e_vecs
avg = (1/Data.shape[0] )*sum(Data, 0)
arrowprops = dict(arrowstyle = '->', linewidth = 3, shrinkA = 0, shrinkB = 0, color = 'r')
plt.scatter(Data[:,0], Data[:,1])
plt.title("Principal Component Analysis Example: Linear Data")
for i in [0,1]:
ax = plt.gca()
ax.annotate('', avg + np.sqrt(e_vals[i])*e_vecs[:,i], avg, arrowprops = arrowprops)
Я могу убедитесь, что мои собственные векторы ортогональны, показав, что np.matmul(e_vecs, e_vecs.T)
- это примерно единичная матрица. Однако изображение, которое я получаю, выглядит следующим образом:
Очевидно, что векторы не являются ортогональными на изображении, но это не имеет смысла, почему они не потому что перевод их через вектор avg
не должен был устранить это свойство. Кто-нибудь знает, что с этим не так? Это проблема масштабирования или я пропустил какой-то важный параметр?