【问题标题】:Generating random numbers for a probability density function in Python在 Python 中为概率密度函数生成随机数
【发布时间】:2018-02-08 06:43:39
【问题描述】:

我目前正在从事与布朗运动相关的项目,并尝试使用 Python(我承认这是一种非常新的语言)来模拟其中的一些。目前,我的目标是按照给定的概率密度函数生成随机数。我一直在尝试使用 scipy 库。

我当前的代码如下所示:

>>> import scipy.stats as st
>>> class my_pdf(st.rv_continuous):
        def _pdf(self,x,y):
            return (1/math.sqrt(4*t*D*math.pi))*(math.exp(-((x^2)/(4*D*t))))*(1/math.sqrt(4*t*D*math.pi))*(math.exp(-((y^2)/(4*D*t))))
>>> def get_brown(a,b):
        D,t = a,b
        return my_pdf()
>>> get_brown(1,1)
<__main__.my_pdf object at 0x000000A66400A320>

所有启动 get_brown 函数的尝试最终都会给我这些十六进制数(总是从 0x000000A66400A 开始,只有最后三位数字发生变化,无论我为 D 和 t 提供什么参数)。我不确定如何解释。我想要的只是在给定的PDF之后得到随机数;这些十六进制是什么意思?

【问题讨论】:

  • 您正在打印一个对象引用。也许你想调用它的_pdf 方法?比如return my_pdf()._pdf(a,b) 什么的?
  • 你是对的,它应该是 **,我已经开始使用 my_pdf.pdf(a,b)。但是,我认为我仍然做错了。它现在给了我一个数字——对于给定的参数总是相同的——当我想要做的是使用 PDF 生成随机 (x,y) 坐标时。

标签: python scipy probability-density


【解决方案1】:

你看到的结果是你创建的对象的内存地址。现在你可能会问:哪个对象?您的方法get_brown(int, int) 调用return my_pdf(),它创建my_pdf 类的对象并返回它。如果你现在想访问你的类的_pdf 函数并计算pdf 的值,你可以使用这个代码:

get_brown(1,1)._pdf(x, y)

在您刚刚创建的对象上,您还可以使用scipy.stats.rv_continous 类的所有方法,您可以找到here

对于您的情况,您也可以丢弃当前代码,只使用 scipy 中包含的正态分布,因为布朗运动主要是正态随机过程。

【讨论】:

  • 嗯。我尝试调用 get_brown(1,1)._pdf(x, y),但我得到的只是“NameError: name 'y' is not defined”...
【解决方案2】:

如前所述,这是一个内存位置。您的函数get_brown 获取my_pdf 类的实例,但不评估该类中的方法。

您可能想要做的是在该实例上调用_pdf 方法,而不是返回类本身。

def get_brown(a,b):
    D,t = a,b  #  what is D,t for?
    return my_pdf()_pdf(a,b)

我希望您发布的代码是对您实际操作的简化,但函数不需要位于类内部 - 因此_pdf 函数可以独立存在。或者,您不需要使用 get_brown 函数 - 只需实例化 my_pdf 类并调用计算方法即可。

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    相关资源
    最近更新 更多