матричная ковариационная матрица

Предположим, что у меня два вектора длины 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 точками данных.