Wie erstelle ich eine Rician-Zufallsvariable?

Ich versuche, ein Signalerkennungsproblem mit Sympy zu modellieren und benötige zwei Zufallsvariablen. Eine mit einer Rayleigh-Verteilung zum Modellieren von Rauschen und eine mit einer Rician-Verteilung zum Modellieren von Signal + Rauschen. Sympyietet eine Rayleigh-Verteilu, aber kein Rizianer-- oder zumindest keiner mit diesem Namen.

Was ist der beste Weg, um eine zu erstellen? Existiert es unter einem anderen Namen? Gibt es eine Möglichkeit, vorhandene Distributionen in einem Rician zu manipulieren?

Folgenden Ratschlägen von @asmeurer folgend, habe ich meine eigene Reisdistribution implementiert, wie folgt:

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

Die Verteilung scheint mit beiden übereinzustimmen Wikipedia und Scipy, aber seltsamerweise erhalte ich andere Ergebnisse als Scipy. Ich werde diese Frage separat stellen gefragt und beantwortet).

Als Randnotiz ermöglicht die folgende Zeile das Lambdifizieren der Dichtefunktion, die eine Bessel-Funktion enthält:

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

Es ist nicht auf alle Bessel-Funktionen verallgemeinert, funktioniert aber für das modifizierte Bessel nullter Ordnung der ersten Art, die in der Rician-Distribution verwendet wird.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage