【问题标题】:How to convert Uniform normality variables in python?如何在python中转换统一正态变量?
【发布时间】:2017-07-25 07:26:16
【问题描述】:

赋值 x~U(a,b) 得到一个均匀分布的数组:

x_U=uniform(a,b,1000)

存在正态分布:

y~N(μ,σ)

我想得到数组y_N,它与x_U 元素相对应。 如何在python中进行?在matlab中看起来很容易。 Such as this link explainnation。 如下代码是Normality转换为Uniform:

from numpy.random import *
import matplotlib.pyplot as plt
a = normal(25,5.4,1000)
hist_N = plt.hist(a,bins=20,normed=True)
a_cum = np.cumsum(a)
hist_U = plt.hist(a_cum,bins=20,normed=True)

a_cum 是与a 元素相关的统一通信者

生成unifrom随机数将应用于Monto-Carlo模拟。但原始参数是正态分布。因此需要转换。我的目的是反转上面的编码过程。

【问题讨论】:

  • “与 x_U 元素对应相关”是什么意思?
  • 我另外举了一个例子。会更清楚。@BrenBarn
  • 我需要明确一点,这不是创建正态分布随机值的正确方法。你得到的是一个很差的近似值,尤其是在分布的尾部。生成正态分布随机值的正确算法的工作方式不同,每个正态分布随机值采用多个均匀分布的随机值。 MATLAB 和 Python 都提供这些函数(请参阅 randn)。

标签: python matlab normal-distribution uniform


【解决方案1】:

如果我点击您问题中的链接,它会告诉我该怎么做。我不确定 erfinv 确实如此,但这段代码似乎将随机统一数组转换为高斯形状数组:

import matplotlib.pyplot as plt
import numpy as np
from scipy.special import erfinv

X = np.random.uniform(0,1,1000)
Gauss = lambda x, mu, sigma: mu + np.sqrt(2)*sigma*erfinv(2*X-1)
plt.hist(Gauss(X, 1, 0.2), bins = 20)
plt.show()

Gauss 在这里是一个函数,由 lambda 语句构成,其工作原理与使用 def 定义函数基本相同。我使用的功能是您链接中的功能。

高斯形状看起来像 和统一的形状 .

【讨论】:

  • erfinv() 是反函数吗?哪个是原始功能?如果我们知道 Normality 的反函数,我认为问题就解决了。
  • 我认为erfinv是erf函数的逆,就是这个。 en.wikipedia.org/wiki/Error_function
猜你喜欢
  • 2014-12-05
  • 2016-12-30
  • 1970-01-01
  • 2013-06-09
  • 2016-09-12
  • 2022-11-19
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多