如何创建Rician随机变量

2024-10-01 05:05:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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))

分布似乎同时匹配Wikipedia和{a3},但奇怪的是,我得到的结果与Scipy不同。我将分别问这个问题(asked and answered)。在

作为旁注,下面的一行使lambdify密度函数成为可能,其中包括贝塞尔函数:

^{pr2}$

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


Tags: 函数fromselfreturndefstats名字噪声
2条回答

如果您知道pdf函数,那么使用sympy.stats公司. 看看sympy source中现有的发行版。您只需要子类SingleContinuousDistribution并定义一些方法。例如,这里是正态分布(去掉了docstring):

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))

是的,你可以用卡平方和泊松来生成大米。请参阅任何有关Rice的详细讨论,例如https://en.wikipedia.org/wiki/Rice_distribution

Another case where Rice(nu,sigma) comes from the following steps:

  1. Generate P having a Poisson distribution with parameter (also mean, for a Poisson) lambda = nu^2 / (2*sigma^2).
  2. Generate X having a chi-squared distribution with 2P + 2 degrees of freedom.
  3. Set R = sigma * sqrt(X).

相关问题 更多 >