numpy .corrcoeff () MemoryError - PullRequest
       15

numpy .corrcoeff () MemoryError

0 голосов
/ 17 февраля 2020

Не могу понять MemoryError Я использую numpy .corrcoeff (), чтобы найти коэффициент корреляции между 2 векторами smin & smax следующим образом:

import numpy as np
from numpy import random as rn
r=0.01
sigma=0.2
T=1
K=1
N=252
h=T/N 
M  = 50000
Z = rn.randn(M,N)
S=np.ones((M,N+1))
smax=np.ones((M,1))
smin=np.ones((M,1))
for i in range(0,N):
    S[:,i+1]=S[:,i]*(np.exp((r-(sigma**2)/2)*h+sigma*Z[:,i]*np.sqrt(h)))
for j in range(0,M):
    smax[j,:]=np.exp(-r*T)*(np.max(S[j,:])>K)*(np.max(S[j,:])-K)
    smin[j,:]=np.exp(-r*T)*(np.min(S[j,:])<K)*(K-np.min(S[j,:]))
c=np.corrcoef(smax,smin)
print(c)

, если есть другой способ найти коэффициент корреляции, например, используя pandas, это тоже хорошо.

1 Ответ

0 голосов
/ 17 февраля 2020

Форма ваших массивов - вот в чем проблема. Документация к функции гласит, что x - это «1-D или 2-D массив, содержащий несколько переменных и наблюдений. Каждая строка x представляет переменную, а каждый столбец - отдельное наблюдение всех этих переменных». и что у является дополнительным набором переменных и наблюдений. Поэтому мы пытаемся выделить массив размером (10000, 10000), который огромен.

Если вы просто хотите вычислить коэффициент корреляции Пирсона между двумя одномерными векторами, вы можете использовать гораздо более простую формулу, чем что здесь реализовано. Эта документация имеет формулу, на которую я ссылаюсь.

https://hydroerr.readthedocs.io/en/stable/api/HydroErr.HydroErr.pearson_r.html#HydroErr .HydroErr.pearson_r

Но для того, чтобы по-прежнему использовать версию numpy, необходимо передать наблюдения и прогнозы в одном и том же параметре x, а x и y должны быть одномерными массивами.

import numpy as np

simulated_array = np.random.rand(50000)
observed_array = np.random.rand(50000)

c = np.corrcoef([simulated_array, observed_array])[1, 0]

Подробнее об этом здесь .

...