Почему суммирование нормального распределения отличается в numpy? - PullRequest
1 голос
/ 03 февраля 2020

Я просто хочу проверить, почему результат отличается.

Предположим, X и Y независимы стандартное нормальное распределение

X ~ N (0, 1)

Y ~ N (0, 1)

и сумма будет X + Y ~ N (0, √ (2)) (согласно этой записи )

Так что если я создам код в numpy с форма (1,5), это было бы так:

np.random.seed(100)
k3 = np.random.normal(0, √(2), size=(1,5))

со следующим результатом

k3 = array([[-0.64774797,  0.61541411, -0.82532804,  1.15519621,  0.95137089]])

Но если бы я попытался использовать код ниже

np.random.seed(100)
k1 = np.random.normal(0, 1, size=(1,5))
k2 = np.random.normal(0, 1, size=(1,5))
k = k1 + k2

результат будет следующим:

k = array([[-1.23554663,  0.56386007,  0.08299247, -0.44193187,  1.23632223]])

Итак, мой вопрос, как k и k3 могут отличаться? Предполагается ли иметь такой же результат? Или я здесь неправильно истолковал?

1 Ответ

1 голос
/ 04 февраля 2020

Здесь равным является распределение двух переменных, и это можно доказать (см., Например, https://en.wikipedia.org/wiki/Sum_of_normally_distributed_random_variables).

Чтобы убедиться, что эти два распределения одинаковы, вы можно посмотреть гистограммы k и k1 + k2 (обратите внимание, что образцы взяты из одного и того же распределения, но не одинаковы!), построив гистограммы массивов.

Еще один способ увидеть, что k и k3 происходят из одного и того же распределения, - использовать некоторый статистический тест, такой как t-критерий, ранговая корреляция Спирмена и т. Д. c.

N = 500 # num. samples
# generate data
import numpy as np
np.random.seed(100)

k1 = np.random.normal(0, 1, size=N)
k2 = np.random.normal(0, 1, size=N)
k3 = np.random.normal(0,np.sqrt(2), size=N)

# plot data
import matplotlib.pyplot as plt
import seaborn as sns
# side-by-side
plt.subplot(1, 2, 1)
sns.distplot(k1+k2)
plt.subplot(1, 2, 2)
sns.distplot(k3)
plt.show()
# overlayed
sns.distplot(k1+k2, hist=False)
sns.distplot(k3, hist=False)
plt.show()


# test
import scipy.stats
(k1+k2).sort()
k3.sort()
#stat, p = scipy.stats.ttest_ind(k1+k2, k3)
stat, p = scipy.stats.spearmanr(k1+k2, k3)
print('Statistics=%.3f, p=%.3f' % (stat, p))
# interpret
alpha = 0.05
if p > alpha:
    print('Same distributions (fail to reject H0)')
else:
    print('Different distributions (reject H0)')

# print statistics like mean, variance
scipy.stats.describe(k3)
scipy.stats.describe(k1+k2)

Увеличивая количество выборок, можно лучше и лучше видеть, что два распределения одинаковы (в вашем примере вы просто просматриваете 5 выборок, а это слишком мало).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...