【问题标题】:How to transform a two dimensional normal distribution into a two dimensional lognorm distribution in python如何在python中将二维正态分布转换为二维对数正态分布
【发布时间】:2018-10-25 02:56:16
【问题描述】:

我的问题有两个部分,一个是如何定义一个二维 lognorm 函数,该函数接受 x 和 y 位置并返回 lognorm 输出。然后我想获取这个输出并将其用作 3d 曲面图中的 z 维度。所以我的目标是将二维对数范数分布绘制为 3d 曲面图。非常感谢任何帮助。

【问题讨论】:

  • 你不需要定义它,它由你正在使用的库提供给你from scipy.stats import lognorm
  • 我明白,但我如何使用它来绘制二维对数规范?然后将其用于 3d 表面,非常感谢您回复帮助
  • GIYF matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-plots 提供切片为 3 个长度相同的向量然后 z[i][j]=f(x[i],y[j])
  • 好的,所以我的 x 和 y 看起来像:x = np.linspace(-90, 90, 400) 和 y = np.linspace(-90, 90, 400)。我怎样才能得到对应于 lognorm 输出的 z 值?
  • 我必须承认您对特定问题的统计无知,但据我所知,只有 lognorm 在二维情况下运行,因此您需要生成目标表面的横截面。

标签: python matplotlib scipy


【解决方案1】:

大意到此为止,我没有测试过,但逻辑不是太复杂。它也可以向量化以加快速度,但您必须将您的 linspaces 映射到一个长的二维向量数组中。

dx = xMax - xMin
dy = yMax - yMin
c= (dx+dx/2.0,dy+dy/2.0)
z=np.array(shape=(N,M))
#Lets use a cartersian input vector space instead of polar
for i in range(len(xlinspace)):
    for j in range(len(ylinspace)):
        p=(xlinspace[i],ylinspace[j])
        d= np.norm(p-c) # produce a distance form the centre for the smapled point
        t=d #I'm just renaming distance to t to make it clear, this is an extra step as far as the program is concerned.
        #Now put your lognorm logic here, i'll use f as a placeholder function
        z[i][j]=f(t)
#You now have a 2d array of z outputs

【讨论】:

  • 非常感谢,我肯定会使用它作为一个框架,最后一个问题,对于 lognorm 逻辑,我可以简单地使用 scipy lognorm 函数并将 t 值输入正确吗?再次非常感谢您的所有帮助
  • 根据页面底部显示的调用,两个输入是必需的,数据和一个 sigma(stddev),您必须决定如何使用它,例如,您是否需要 pdf或 cdf,或者您是否正在拟合数据。您必须从模块中选择特定的调用,例如lognrom.pdf(data,s)docs.scipy.org/doc/scipy/reference/generated/…
  • 我明白了! np范数也是距离的简单计算吗?所以我们可以使用任何距离方法,例如欧几里得,因为 np.norm 不是函数
  • 您可以使用任意大尺寸的勾股定理计算欧几里得距离。将两个向量相减产生一个以 (0,0) 为中心的向量,指向 a,其大小等于 a 和 b 之间的距离,所以如果你要求范数,它等于欧几里得距离,这是一个很好的速记.
  • 请看下面的答案,看看我是如何实现的
【解决方案2】:
dx = 90 - (-90)
dy = 90 - (-90)
c = [dx + dx/2.0, dy+dy/2.0]
z = np.zeros((400, 400))
x = np.linspace(-90, 90, 400)
y = x.copy()
for i in range(len(x)):
    for j in range(len(y)):
        p =[x[i], y[j]]
        d = math.sqrt((p[0]-c[0])**2 + (p[1]-c[1])**2)
        t = d

        z[i][j] = lognorm.pdf(t, 1.2)




fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.plot_surface(x,y, z, cmap = 'viridis')



plt.show()

好的,这是我编写的代码,输出肯定会到达那里,但看起来有点奇怪。我已为你附上,请看你是否可以提供指导。@​​987654321@

【讨论】:

  • awiebe 有机会请看
猜你喜欢
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
相关资源
最近更新 更多