微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

归一化二元概率密度函数 - python

如何解决归一化二元概率密度函数 - python

我的目标是对 norm1 下表示的概率密度函数进行归一化。当我将方程直接导入 ax.contour 时它有效,但在外部调用方程时无效。

尝试将 norm1 传递到 ax.contour 时,出现以下错误

    raise TypeError(f"Input z must be 2D,not {z.ndim}D")

TypeError: Input z must be 2D,not 3D

就上下文而言,我有两个单独的组,其中包含各种 XY 点。每个 XY 点都有一个标记id 的标识符。我为每个独特的点分配一个圆或半径。我想从每个组中减去 PDF输出是 0 到 1 之间的归一化 PDF,其中 >0.5 由 A 组控制,

df = pd.DataFrame({'Int_1': [1.0,2.0,1.0,3.0,2.0],'Int_2': [1.0,'Item_X': [0.0,0.0,1.0],'Item_Y': [0.0,'Period': [1,1,2,2],'Group': ['A','B','A','B'],'Item': ['Y','Y','id': ['1','2','3','4','1','4']})

Group_A = [df[df['Group'] == 'A'][['Int_1','Int_2']].to_numpy()]
Group_B = [df[df['Group'] == 'B'][['Int_1','Int_2']].to_numpy()]
Item = [df[['Item_X','Item_Y']].to_numpy()]

period = df['Period'].drop_duplicates().reset_index(drop = True)


def impact_func(member_no,location,time_index,group):

  if group == 'A':
    data = Group_A.copy()

  elif group == 'B':
    data = Group_B.copy()

  else:

    return

  if np.all(np.isfinite(data[member_no][[time_index,time_index + 1],:])) & np.all(np.isfinite(Item[0][time_index,:])):

    sxy = (data[member_no][time_index + 1,:] - data[member_no][time_index,:]) / (period[time_index + 1] - period[time_index])

    mu = data[member_no][time_index,:] + sxy * 0.5

    out = mvn.pdf(location,mu) / mvn.pdf(data[member_no][time_index,:],mu)

  else:
    out = np.zeros(location.shape[0])

  return out

xx,yy = np.meshgrid(np.linspace(-10,10,200),np.linspace(-10,200))
Z_GA = np.zeros(40000)
Z_GB = np.zeros(40000)

for k in range(1):
  Z_GA += impact_func(k,np.c_[xx.flatten(),yy.flatten()],'A')
  Z_GB += impact_func(k,'B')

fig,ax = plt.subplots(figsize=(8,8))
ax.set_xlim(-10,10)
ax.set_ylim(-10,10)

Z_GA = Z_GA.reshape((200,200))
Z_GB = Z_GB.reshape((200,200))

norm1 = xx,yy,1 / (1 + np.exp(Z_GB - Z_GA))
norm2 = Z_GA / (Z_GA + Z_GB)

#cfs = ax.contourf(norm1,cmap = 'magma')
cfs = ax.contourf(xx,1 / (1 + np.exp(Z_GB - Z_GA)),cmap = 'magma')

fig.colorbar(cfs,ax = ax)

解决方法

解决方案

您只是想解压Norm1

cfs = ax.contourf(*Norm1,cmap = 'magma')

结果:

contourf with unpacking

快速说明:

Norm1 是 3 个数组的元组。 contourf 需要一到三个值 [X,Y,Z],其中 Z 代表每个点的高度。

如果按原样传递 Norm1contourf 将假定它只是 Z 参数,这将在内部解释为 3D ndarray。

一旦使用 * 解包,您将明确地将 Nomr1 的三个组件作为三个不同的参数传递,即 X,Y and Z

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。