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
- Ковариационная матрица, указанной выборки наблюдений.
Замечание
Если использовать данную функцию без указания необязательных параметров, то будет вычислена обычная ковариационная матрица. Но параметры 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, так же сильно коррелируют и обе возрастают.