在三维空间中可视化多元正态分布

6

我正在尝试使用matplotlib可视化多元正态分布。我想制作类似于这样的图形:

enter image description here

我使用以下代码:
from mpl_toolkits import mplot3d
x = np.linspace(-1, 3, 100)
y = np.linspace(0, 4, 100)
X, Y = np.meshgrid(x, y)
Z = np.random.multivariate_normal(mean = [1, 2], cov = np.array([[0.5, 0.25],[0.25, 0.50]]), size = 100000)
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
                cmap='viridis', edgecolor='none')
ax.set_title('surface');

但是我收到了以下错误信息:

...
      7 ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
----> 8                 cmap='viridis', edgecolor='none')
...
ValueError: shape mismatch: objects cannot be broadcast to a single shape

出现错误的原因是什么,我的代码应该如何纠正?


1
Z 不应该是 x, y 对的函数吗?就像这里所示[https://dev59.com/pWox5IYBdhLWcg3wf0Xl#9170879]。目前,您可能为 Z 创建了不同的数组大小。 - Mr. T
1个回答

7

我使用scipy.stats.multivariate_normal来完成此操作,使用pdf方法生成z值。正如@Piinthesky所指出的,numpy实现返回给定分布的x和y值。在Python add gaussian noise in a radius around a point [closed]中找到了使用scipy版本的示例:

已测试在python 3.11.2scipy 1.10.1matplotlib 3.7.1numpy 1.24.3

import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
import numpy as np

x = np.linspace(-1, 3, 100)
y = np.linspace(0, 4, 100)
X, Y = np.meshgrid(x, y)
pos = np.dstack((X, Y))
mu = np.array([1, 2])
cov = np.array([[.5, .25],[.25, .5]])
rv = multivariate_normal(mu, cov)
Z = rv.pdf(pos)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z)
fig.show()

enter image description here


小错误:将spicy拼写成scipy。 - Nazaal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接