матричная ковариационная матрица
Предположим, что у меня два вектора длины 25, и я хочу вычислить их ковариационную матрицу. Я пытаюсь сделать это с помощью numpy.cov, но всегда получаю матрицу 2x2.
>>> import numpy as np
>>> x=np.random.normal(size=25)
>>> y=np.random.normal(size=25)
>>> np.cov(x,y)
array([[ 0.77568388, 0.15568432],
[ 0.15568432, 0.73839014]])
Использование флага rowvar тоже не помогает - я получаю точно такой же результат.
>>> np.cov(x,y,rowvar=0)
array([[ 0.77568388, 0.15568432],
[ 0.15568432, 0.73839014]])
Как я могу получить матрицу ковариации 25x25?
Ответы
Ответ 1
У вас есть два вектора, а не 25. На компьютере, на котором я установлен, нет питона, поэтому я не могу проверить это, но попробуйте:
z = zip(x,y)
np.cov(z)
Конечно... действительно то, что вы хотите, вероятно, больше похоже на:
n=100 # number of points in each vector
num_vects=25
vals=[]
for _ in range(num_vects):
vals.append(np.random.normal(size=n))
np.cov(vals)
Это берет ковариацию (я думаю/надеюсь) из num_vects
1x n
векторов
Ответ 2
Попробуй это:
import numpy as np
x=np.random.normal(size=25)
y=np.random.normal(size=25)
z = np.vstack((x, y))
c = np.cov(z.T)
Ответ 3
Читая документацию как,
>> np.cov.__doc__
или глядя на Numpy Covariance, Numpy рассматривает каждую строку массива как отдельную переменную, поэтому у вас есть две переменные, и, следовательно, вы получаете матрицу ковариации 2 x 2.
Я думаю, что предыдущее сообщение имеет правильное решение. У меня есть объяснение :-)
Ответ 4
Вы должны изменить
np.cov(x,y, rowvar=0)
на
np.cov((x,y), rowvar=0)
Ответ 5
Я предполагаю, что вы ищете на самом деле функцию ковариации, которая является функцией timelag. Я делаю автоковариацию следующим образом:
def autocovariance(Xi, N, k):
Xs=np.average(Xi)
aCov = 0.0
for i in np.arange(0, N-k):
aCov = (Xi[(i+k)]-Xs)*(Xi[i]-Xs)+aCov
return (1./(N))*aCov
autocov[i]=(autocovariance(My_wector, N, h))
Ответ 6
То, что вы получили (2 на 2), более полезно, чем 25 * 25. Ковариантность X и Y является недиагональной записью в симметричной матрице cov_matrix.
Если вы настаиваете на (25 на 25), что я считаю бесполезным, то почему бы вам не написать это определение?
x=np.random.normal(size=25).reshape(25,1) # to make it 2d array.
y=np.random.normal(size=25).reshape(25,1)
cov = np.matmul(x-np.mean(x), (y-np.mean(y)).T) / len(x)
Ответ 7
Ковариационная матрица из векторов выборок
Чтобы прояснить небольшую путаницу относительно того, что такое ковариационная матрица, определенная с использованием двух N-мерных векторов, есть две возможности.
Вопрос, который вы должны задать себе: считаете ли вы:
- каждый вектор как N реализаций/выборок одной единственной переменной (например, два трехмерных вектора
[X1,X2,X3]
и [Y1,Y2,Y3]
, где у вас есть 3 реализации для переменных X и Y соответственно) - каждый вектор как 1 реализация для N переменных (например, два трехмерных вектора
[X1,Y1,Z1]
и [X2,Y2,Z2]
, где у вас есть 1 реализация для переменных X, Y и Z на вектор)
Поскольку ковариационная матрица интуитивно определяется как дисперсия, основанная на двух разных переменных:
- в первом случае у вас есть 2 переменные, N примеров значений для каждой, так что вы получите матрицу 2x2, в которой ковариации вычисляются благодаря N выборкам на переменную
- во втором случае у вас есть N переменных, по 2 выборки для каждой, так что вы получите матрицу NxN
О фактическом вопросе, используя NumPy
если вы считаете, что у вас есть 25 переменных на вектор (для упрощения примера кода потребовалось 3 вместо 25), поэтому одну реализацию для нескольких переменных в одном векторе используйте rowvar=0
# [X1,Y1,Z1]
X_realization1 = [1,2,3]
# [X2,Y2,Z2]
X_realization2 = [2,1,8]
numpy.cov([X,Y],rowvar=0) # rowvar false, each column is a variable
Код возвращается с учетом 3 переменных:
array([[ 0.5, -0.5, 2.5],
[-0.5, 0.5, -2.5],
[ 2.5, -2.5, 12.5]])
в противном случае, если вы считаете, что один вектор равен 25 выборкам для одной переменной, используйте rowvar=1
(параметр numpy по умолчанию)
# [X1,X2,X3]
X = [1,2,3]
# [Y1,Y2,Y3]
Y = [2,1,8]
numpy.cov([X,Y],rowvar=1) # rowvar true (default), each row is a variable
Код возвращается с учетом 2 переменных:
array([[ 1. , 3. ],
[ 3. , 14.33333333]])
Ответ 8
Как указано выше, у вас есть только два вектора, поэтому вы получите только 2x2 cov-матрицу.
IIRC 2 основные диагональные члены будут суммой ((x-mean (x)) ** 2)/(n-1) и аналогично для y.
2 недиагональных члена будут суммой ((x-mean (x)) (y-mean (y)))/(n-1). n = 25 в этом случае.
Ответ 9
согласно документу, вы должны ожидать переменную vector в столбце:
If we examine N-dimensional samples, X = [x1, x2, ..., xn]^T
хотя позже он говорит, что каждая строка является переменной
Each row of m represents a variable.
поэтому вам нужно ввести свою матрицу как транспонировать
x=np.random.normal(size=25)
y=np.random.normal(size=25)
X = np.array([x,y])
np.cov(X.T)
и согласно википедии: https://en.wikipedia.org/wiki/Covariance_matrix
X is column vector variable
X = [X1,X2, ..., Xn]^T
COV = E[X * X^T] - μx * μx^T // μx = E[X]
Вы можете реализовать это самостоятельно:
# X each row is variable
X = X - X.mean(axis=0)
h,w = X.shape
COV = X.T @ X / (w-1)
Ответ 10
я не думаю, что вы понимаете определение ковариационной матрицы. Если вам нужна матрица ковариации 25 х 25, вам нужно 25 векторов каждый с n точками данных.