Я пытаюсь проецировать точки 2D данных на верхний главный компонент ковариационной матрицы данных, но мои проецируемые точки не l ie на ожидаемом векторе. Ниже мой код и вывод. Я посмотрел на другие вопросы и до сих пор не могу определить, в чем может быть проблема. Может кто-нибудь сказать мне, что я делаю не так или определить ошибку?
# generate random 2D data (2 neurons, 40 data points each)
t = 40
r1 = [i for i in range(40)]
r2 = [i+np.random.randint(-20,20) for i in range(40)]
data = np.array([r1,r2]) / 10
# SVD
data_cov = data @ data.T # covariance matrix (<x,x.T>)
u, s, v = np.linalg.svd(data_cov, full_matrices=True) # svd
dir_max_var = v[:,0] # direction of maximal variance
# project data
data_proj = np.ndarray(shape=(2,t))
v_norm = np.sqrt(sum(dir_max_var**2))
for i in range(t):
data_proj[:,i] = ((data[:,i] @ dir_max_var)/v_norm**2)*dir_max_var
# # project data - vectorized (gives same output as the for loop version)
# data_T = data.T # (40 x 2) * (2 x 1) * (1 x 2) =
# data_proj = data_T @ dir_max_var.reshape(1,2).T @ dir_max_var.reshape(1,2)
# data_proj = data_proj.T
# plot
fig = plt.figure()
ax = fig.add_subplot()
ax.scatter(data[0,:],data[1,:], s=75, c='gray', edgecolors='w')
ax.scatter(data_proj[0,:],data_proj[1,:], s=100,alpha=0.2,c='red', edgecolors='w')
ax.set_xlabel('$r_1$')
ax.set_ylabel('$r_2$')
ax.quiver(np.mean(data[0,:]),np.mean(data[1,:]),dir_max_var[0],dir_max_var[1], \
color='green',scale=1, alpha = 0.6)
ax.quiver(np.mean(data[0,:]),np.mean(data[1,:]),-dir_max_var[0],-dir_max_var[1], \
color='green',scale=1, alpha = 0.6)
plt.show()
Выход: