Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建Rician随机变量?_Python_Statistics_Sympy - Fatal编程技术网

Python 如何创建Rician随机变量?

Python 如何创建Rician随机变量?,python,statistics,sympy,Python,Statistics,Sympy,我正试图用Sympy来模拟一个信号检测问题,需要两个随机变量。一个是瑞利分布模型噪声,另一个是莱斯分布模型信号+噪声。辛皮,但不是一个蓖麻学家——或者至少不是一个叫这个名字的人 创建一个的最佳方式是什么?它是否以其他名称存在?有没有办法将现有的发行版操纵成Rician 根据@asmeurer的建议,我实施了自己的大米分销,如下所示: from sympy.stats.crv_types import rv from sympy.stats.crv import SingleContinuous

我正试图用Sympy来模拟一个信号检测问题,需要两个随机变量。一个是瑞利分布模型噪声,另一个是莱斯分布模型信号+噪声。辛皮,但不是一个蓖麻学家——或者至少不是一个叫这个名字的人

创建一个的最佳方式是什么?它是否以其他名称存在?有没有办法将现有的发行版操纵成Rician


根据@asmeurer的建议,我实施了自己的大米分销,如下所示:

from sympy.stats.crv_types import rv
from sympy.stats.crv import SingleContinuousDistribution

class RicianDistribution(SingleContinuousDistribution):
    _argnames=('nu','sigma')
    @property
    def set(self): return Interval(0,oo)

    def pdf(self,x):
        nu,sigma=self.nu, self.sigma
        return (x/sigma**2)*exp(-(x**2+nu**2)/(2*sigma**2))*besseli(0,x*nu/sigma**2)

def Rician(name,nu,sigma):
    return rv(name,RicianDistribution,(nu,sigma))
分布似乎与和都匹配,但奇怪的是,我得到的结果与Scipy不同。我将分别问这个问题()

作为旁注,下一行可以对密度函数进行lambdify,其中包括贝塞尔函数:

printing.lambdarepr.LambdaPrinter._print_besseli=(lambda self,expr: 'i0(%s)'%expr.argument)

它不能推广到所有贝塞尔函数,但适用于Rician分布中使用的第一类零阶修正贝塞尔。

是的,可以从卡方和泊松分布生成Rice。查看任何详细的Rice讨论,例如:

Rice(nu,sigma)来自以下步骤的另一种情况:

  • 生成具有泊松分布且参数为λ=nu^2/(2*σ^2)的P(对于泊松分布,也是平均值)
  • 生成具有卡方分布且自由度为2P+2的X
  • 设置R=sigma*sqrt(X)
    如果您了解pdf函数,那么使用sympy.stats创建新发行版就很容易了。请查看中的现有发行版。您只需要将
    SingleContinuousDistribution
    子类化并定义一些方法。例如,以下是正态分布(删除docstring):


    我看过那个描述,但不完全理解。您能用Sympy代码显示该工作流吗?步骤2对我来说特别奇怪:它似乎暗示卡方分布的参数本身是一个随机变量(使用步骤1中的P)?我不使用sympy编程;很抱歉是的,输入是一个随机变量。输出是一个额外维度的分布,将整个分布(值x概率)作为输入,并产生(chi分布x概率)的输出。可能形式x=ContinuousRV(x,exp(-(x-平均值)**2/(2*std**2))/(sqrt(2*pi)*std)更容易编写,尽管不支持参数化。
    class NormalDistribution(SingleContinuousDistribution):
        _argnames = ('mean', 'std')
    
        @staticmethod
        def check(mean, std):
            _value_check(std > 0, "Standard deviation must be positive")
    
        def pdf(self, x):
            return exp(-(x - self.mean)**2 / (2*self.std**2)) / (sqrt(2*pi)*self.std)
    
        def sample(self):
            return random.normalvariate(self.mean, self.std)
    
    
    def Normal(name, mean, std):
        return rv(name, NormalDistribution, (mean, std))