使用 np.histogram2d 计算联合概率质量函数的问题
Problems with computing the joint probability mass function with np.histogram2d
我目前有一个 4024 x 10 数组 - 其中第 0 列代表股票 1 的 4024 个不同 returns,第 1 列代表股票 2 的 4024 returns 等等 - 用于分配我的主人要求我计算不同随机变量的熵和联合熵(每个随机变量显然是股票 returns)。但是,这些熵计算都需要计算P(x)和P(x,y)。到目前为止,我已经成功地使用以下代码计算了各个经验概率:
def entropy(ret,t,T,a,n):
returns=pd.read_excel(ret)
returns_df=returns.iloc[t:T,:]
returns_mat=returns_df.as_matrix()
asset_returns=returns_mat[:,a]
hist,bins=np.histogram(asset_returns,bins=n)
empirical_prob=hist/hist.sum()
entropy_vector=np.empty(len(empirical_prob))
for i in range(len(empirical_prob)):
if empirical_prob[i]==0:
entropy_vector[i]=0
else:
entropy_vector[i]=-empirical_prob[i]*np.log2(empirical_prob[i])
shannon_entropy=np.sum(entropy_vector)
return shannon_entropy, empirical_prob
P.S。忽略代码的整个熵部分
如您所见,我只是完成了 1d 直方图,然后将每个计数除以直方图结果的总和,以找到各个概率。但是,我真的很纠结如何使用
来计算 P(x,y)
np.histogram2d()
现在,显然 P(x,y)=P(x)*P(y) 如果随机变量是独立的,但在我的例子中它们不是,因为这些股票属于同一个指数,因此具有某种正相关性,即它们是相关的,因此取两个个体概率的乘积是不成立的。我试过听从教授的建议,他说:
"We had discussed how to get the empirical pdf for a univariate distribution: one defines the bins and then counts simply how many observations are in the respective bin (relative to the total number of observations). For bivariate distributions you can do the same, but now you make 2-dimensional binning (check for example the histogram2 command in matlab)"
如您所见,他指的是 MATLAB 的 2d 直方图函数,但我决定在 Python 上进行此作业,到目前为止,我已经详细说明了以下代码:
def jointentropy(ret,t,T,a,b,n):
returns=pd.read_excel(ret)
returns_df=returns.iloc[t:T,:]
returns_mat=returns_df.as_matrix()
assetA=returns_mat[:,a]
assetB=returns_mat[:,b]
hist,bins1,bins2=np.histogram2d(assetA,assetB,bins=n)
但我不知道从这里开始做什么,因为
np.histogram2d()
returns 一个 4025 x 4025 数组以及两个独立的 bin,所以我不知道如何为我的两个相关随机变量计算 P(x,y)。
我已经尝试了好几个小时来解决这个问题,但没有任何运气或成功,所以非常感谢任何形式的帮助!非常感谢您!
看来您手上有一个明确的条件或贝叶斯概率案例。例如,您可以在此处查找 http://www.mathgoodies.com/lessons/vol6/dependent_events.html,它给出了两个事件发生的概率 P(x,y) = P(x) · P(x|y),其中 P(x| y) 是 "probability of event x given y"。这应该适用于您的情况,因为如果两只股票来自同一指数,那么一个价格就不可能在没有另一个的情况下发生。只需像构建一个容器那样构建两个单独的容器,然后按上述方法计算概率。
我目前有一个 4024 x 10 数组 - 其中第 0 列代表股票 1 的 4024 个不同 returns,第 1 列代表股票 2 的 4024 returns 等等 - 用于分配我的主人要求我计算不同随机变量的熵和联合熵(每个随机变量显然是股票 returns)。但是,这些熵计算都需要计算P(x)和P(x,y)。到目前为止,我已经成功地使用以下代码计算了各个经验概率:
def entropy(ret,t,T,a,n):
returns=pd.read_excel(ret)
returns_df=returns.iloc[t:T,:]
returns_mat=returns_df.as_matrix()
asset_returns=returns_mat[:,a]
hist,bins=np.histogram(asset_returns,bins=n)
empirical_prob=hist/hist.sum()
entropy_vector=np.empty(len(empirical_prob))
for i in range(len(empirical_prob)):
if empirical_prob[i]==0:
entropy_vector[i]=0
else:
entropy_vector[i]=-empirical_prob[i]*np.log2(empirical_prob[i])
shannon_entropy=np.sum(entropy_vector)
return shannon_entropy, empirical_prob
P.S。忽略代码的整个熵部分
如您所见,我只是完成了 1d 直方图,然后将每个计数除以直方图结果的总和,以找到各个概率。但是,我真的很纠结如何使用
来计算 P(x,y)np.histogram2d()
现在,显然 P(x,y)=P(x)*P(y) 如果随机变量是独立的,但在我的例子中它们不是,因为这些股票属于同一个指数,因此具有某种正相关性,即它们是相关的,因此取两个个体概率的乘积是不成立的。我试过听从教授的建议,他说:
"We had discussed how to get the empirical pdf for a univariate distribution: one defines the bins and then counts simply how many observations are in the respective bin (relative to the total number of observations). For bivariate distributions you can do the same, but now you make 2-dimensional binning (check for example the histogram2 command in matlab)"
如您所见,他指的是 MATLAB 的 2d 直方图函数,但我决定在 Python 上进行此作业,到目前为止,我已经详细说明了以下代码:
def jointentropy(ret,t,T,a,b,n):
returns=pd.read_excel(ret)
returns_df=returns.iloc[t:T,:]
returns_mat=returns_df.as_matrix()
assetA=returns_mat[:,a]
assetB=returns_mat[:,b]
hist,bins1,bins2=np.histogram2d(assetA,assetB,bins=n)
但我不知道从这里开始做什么,因为
np.histogram2d()
returns 一个 4025 x 4025 数组以及两个独立的 bin,所以我不知道如何为我的两个相关随机变量计算 P(x,y)。
我已经尝试了好几个小时来解决这个问题,但没有任何运气或成功,所以非常感谢任何形式的帮助!非常感谢您!
看来您手上有一个明确的条件或贝叶斯概率案例。例如,您可以在此处查找 http://www.mathgoodies.com/lessons/vol6/dependent_events.html,它给出了两个事件发生的概率 P(x,y) = P(x) · P(x|y),其中 P(x| y) 是 "probability of event x given y"。这应该适用于您的情况,因为如果两只股票来自同一指数,那么一个价格就不可能在没有另一个的情况下发生。只需像构建一个容器那样构建两个单独的容器,然后按上述方法计算概率。