Нахождение собственных значений ковариационной матрицы - PullRequest
0 голосов
/ 05 февраля 2019

предположим, что есть некоторые двумерные нормально распределенные данные, и я хочу найти собственные векторы его ковариационной матрицы.Каким-то образом собственные векторы, которые я вычисляю, не соответствуют данным, что-то не так в моем коде?

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
import scipy.linalg as la

# Generate a positive-definite covariance matrix & generate data
A          = np.random.random([2,2])
cov_given  = np.dot(A,A.T)
mean_given = np.random.random([2])
data       = np.random.multivariate_normal(mean_given,cov_given,10000)

# Find the numerical mean and covariance, diagonalize
mean = np.mean(data, axis = 0 )
cov  = np.cov(data.T)
w, v = la.eig(cov)

# Plotting procedures
fig, ax = plt.subplots()
xmin, ymin = np.min(data,axis=0)
xmax, ymax = np.max(data,axis=0)
x, y = np.mgrid[xmin:xmax:.01, ymin:ymax:.01]
pos  = np.dstack((x, y))
ax.contourf(x,y, multivariate_normal(mean=mean, cov=cov).pdf(pos))
ax.plot([mean[0], mean[0] + v[0][1]],[mean[1],mean[1] + v[1][1]])
ax.plot([mean[0], mean[0] + v[0][0]],[mean[1],mean[1] + v[1][0]])
ax.set_xlim(xmin,xmax)
ax.set_ylim(ymin,ymax)
plt.show()

data with bad covariance eigenvectors

Сначала я подумал, что я смешалстолбцы и строки v, но, как выясняется, это не работает лучше.Вы замечаете проблему?

1 Ответ

0 голосов
/ 05 февраля 2019

Нет проблем.Векторы были найдены правильно (отметьте это с помощью v[:,0].dot(v[:, 1]), который равен 0, если они ортогональны).Это проверка, которая имеет значение.Вы можете увидеть это на графике, установив соотношение сторон на один с помощью

xmin, ymin = -3, -3
xmax, ymax = 3, 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...