numpy.cov

numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)

Функция cov() вычисляет ковариационную матрицу.

Ковариация двух выборок (двух случайных величин) - это мера их линейной зависимости, которая определяется следующим образом:

$${\mathrm {cov}}(X,Y)={\mathbb {M}}\left[(X-{\mathbb {M}}X)(Y-{\mathbb {M}}Y)\right]$$

Где \({\mathbb {M}}\) - математическое ожидание.

Если мы рассмотрим n-мерную выборку \(X = [x_{1},x_{2},...,x_{n}]^{T}\), то элемент ковариационной матрицы \(C_{ij}\) для данной выборки будет представлять собой ковариацию двух соответствующих выборок \(C_{ij} = \mathrm {cov}(x_{i},x_{j})\). Диагональные элементы данной матрицы \(C_{ii}\) будут представлять собой дисперсии соответствующей выборки \(x_{i}\).

Параметры:
m - массив NumPy или подобный массиву объект.
Входные данные в виде одномерного или двумерного массива, содержащего несколько выборок (случайных величин). Каждая строка в этом массиве представляет собой отдельную выборку (случайную переменную), а столбец отдельное наблюдение в каждой выборке.
y - массив NumPy или подобный массиву объект (необязательный параметр).
Дополнительный набор выборок, который имеет ту же форму что и m.
rowvar - True или False (необязательный параметр).
Если rowvar = True (по умолчанию это так), то каждой строке соответствует определенная выборка, а столбцу определенное наблюдение из этой выборки. Если параметр установлен в значение False, выполняется транспонирование массива, т.е. каждый столбец начинает соответсвовать выборкам, а каждая строка соответствующим наблюдениям из этих выборок.
bias - True или False (необязательный параметр).
Определяет используемую нормализацию. False - n - 1 нормализация (установлено по умолчанию). True - n нормализация, где n - это количество данных в выборке. Данный параметр может быть переопределен с помощью параметра ddof в NumPy начиная с версии 1.5.0.
ddof - вещественное число (необязательный параметр).

Параметр ddof - дельта степени свободы. Обычно, принято (и по умолчанию установлено) считать ddof = 0, но в разных источниках (например ГОСТ) требуется что бы параметр ddof имел значение отличное от 0, например 1 или 1,5.

Если установлен в отличное от None значение, то это приводит к переопределению параметра bias. Так, например, если ddof = 1, то будет возвращена несмещенная оценка, даже несмотря на установленные параметры fweights и aweights. А если ddof = 0, то это приведет к вычислению простого среднего арифметического.

fweights - массив NumPy или подобный массиву объект (необязательный параметр).
Одномерный массив целых чисел - частотных весов, указывающих количество повторения каждого вектора наблюдений. По умолчанию установлен в значение None. Доступно в NumPy с версии 1.10.0.
aweights - массив NumPy или подобный массиву объект (необязательный параметр).
Одномерный массив весовых коэфициентов, указывающих "важность" отдельных наблюдений. Если ddof = 0, то данный массив позволяет определить вероятности отдельных векторов. По умолчанию установлен в значение None. Доступно в NumPy с версии 1.10.0.
Возвращает:
результат - массив NumPy
Ковариационная матрица, указанной выборки наблюдений.

Смотрите так же:
corrcoef, var

Замечание

Если использовать данную функцию без указания необязательных параметров, то будет вычислена обычная ковариационная матрица. Но параметры fweights и aweights, позволяют вычислять "взвешенную" ковариацию.

Для того что бы определить взвешенную ковариацию представим, что все наши наблюдения хранятся в массиве m, а массивы fweights и aweights обозначим переменными f и a соответственно. Тогда взвешенная ковариация будет вычисляться следующим образом:

>>> w = f*a
>>> v1 = np.sum(w)
>>> v2 = np.sum(w*a)
>>> m = m - np.sum(m*w, axis = 1, keepdims = True)/v1
>>> cov = np.dot(m*w, m.T)*v1/(v1**2 - ddof*v2)

Если a == 1, то коэфициент нормализации v1/(v1**2 - ddof*v2) становится равен 1/(np.sum(f) - ddof).


Примеры

Рассмотрим четыре случайные величины x0, x1, x2 и x3:

Пример случайных величин для которых рассчитывается ковариационная матрица

>>> import numpy as np
>>> 
>>> np.random.seed(777)
>>> 
>>> t = np.arange(10)
>>> 
>>> x_0 = t + 2+ np.random.randn(10)
>>> x_1 = 2*t + 2+ np.random.randn(10)
>>> x_2 = -2*t + 10 + np.random.randn(10)
>>> x_3 = np.full(10, 5) + 0.5*np.random.randn(10)
>>> 
>>> X = np.vstack((x_0, x_1, x_2, x_3))
>>> 

Теперь вычислим ковариационную матрицу данной выборки:

>>> C = np.cov(X)
>>> C
array([[ 10.71923787,  18.06322696, -18.01298407,  -0.1373089 ],
       [ 18.06322696,  36.14284874, -34.64948098,  -0.08372059],
       [-18.01298407, -34.64948098,  35.10659441,   0.15301609],
       [ -0.1373089 ,  -0.08372059,   0.15301609,   0.22107079]])

Как видим, величина x3 (четвертая строка), практически не коррелирует ни с какой другой величиной. Сильнее всего коррелируют возрастающая x1 и убывающая x2, что отражает отрицательный знак ковариации. В тоже время C[1, 0] = 18.06322695843117, это говорит о том, что величины x0 и x1, так же сильно коррелируют и обе возрастают.