не считается ковариация между двумя выборками из распределений из scipy.stats
Задача состоит в том чтобы посчитать ковариацию между двумя выборками из двух распределений (равномерного и распределения Максвелла).
В задании предлагается использовать библиотеку numpy чтобы посчитать ковариацию.
При запуске кода возникает такая ошибка:
TypeError: only size-1 arrays can be converted to Python scalars
Я предполагаю что проблема в типе массива, который создается при генерации выборки, он каким то образом создается с размерностью большей чем один (понятно из типа ошибки), а функция ковариации np.cov из базовой библиотеки numpy разработана так, чтобы не работать с типами данных из scipy (поразительная кроссплатформенность).
В документации ковариации np.cov приводятся примеры с искусственным созданием массивов, на всех других сайтах, что я проглядел, приводится просто перевод с документации, соответственно ни одного комментария по тому как работать с типами данных из функций генерации выборок распределений из библиотеки scipy нигде нет.
Написать код самостоятельно по переводу многомерного массива в одномерный у меня не хватает мозгов. (есть предположение если он двумерный, то нужно просто просуммировать вертикальные столбцы и получить что-то на подобии гистограммки распределения, т.е. как бы сжать по одной из размерностей)
Вот что я написал и что у меня не работало:
import scipy.stats as sps
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# генерируем выборку из 1000 элементов равномерного распределения
uni_distr = sps.uniform.rvs(size = 1000)
# генерируем выборку из 1000 элементов распределения Максвелла
max_distr = sps.maxwell.rvs(size = 1000)
#print(max_distr)
#считаем выборочную ковариацию и корреляцию между полученными выборками
#Z = np.sum(uni_distr, max_distr)
#Z = np.vstack((uni_distr, max_distr))
#print(Z)
print('Выборочная ковариация: %.3f' % np.cov(max_distr, uni_distr))
#print('Выборочная корреляция: %.3f' % np.correlate(max_distr, uni_distr))
Ответы (1 шт):
print('Выборочная ковариация: %.3f' % np.cov(max_distr, uni_distr))
TypeError: only size-1 arrays can be converted to Python scalars
Дело в том, что np.cov выдаёт матрицу (Estimate a covariance matrix, given data and weights.), а вы пытаетесь эту матрицу напечатать как одно число в формате %.3f, вот питон и ругается. Напечатать матрицу можно так:
print('Выборочная ковариация:\n', np.cov(max_distr, uni_distr))
Или лучше, если у вас свежий питон, с помощью f-string:
print(f'Выборочная ковариация:\n{np.cov(max_distr, uni_distr)}')
Вывод:
Выборочная ковариация:
[[0.4798678 0.00347072]
[0.00347072 0.08130409]]
Как трактовать эту матрицу, или что из неё вам нужно брать я не знаю - я не статистик, я программист. :)
Так что данные между пакетами прекрасно совместимы, большинство математических и статистических пакетов питона обычно использует именно библиотеку numpy и её типы данных у себя внутри, потому что это быстро и удобно.