Python 在间隔之间强制scipy.stats.cauchy

Python 在间隔之间强制scipy.stats.cauchy,python,python-3.x,scipy,Python,Python 3.x,Scipy,我想强制scipy.stats.cauchy概率密度函数只生成-1到1之间的值 目前,我正在通过在while循环中运行y=cauchy.rvs(中心,sigma)来执行hacky方法,当其低于-1或高于1时,它会重新计算,并在进入所需的间隔后返回y。所以本质上我在画一个新的随机变量,直到条件不满足 我想知道是否有可能以一种更简单的方式来实现这一点,因为scipy文档并没有太大帮助,而且非常模糊。有没有办法指定函数参数中随机变量的最小/最大范围,比如通过**kwargs或其他方式?简短回答:不是直

我想
强制scipy.stats.cauchy
概率密度函数只生成-1到1之间的值

目前,我正在通过在while循环中运行
y=cauchy.rvs(中心,sigma)
来执行hacky方法,当其低于-1或高于1时,它会重新计算,并在进入所需的间隔后返回y。所以本质上我在画一个新的随机变量,直到条件不满足


我想知道是否有可能以一种更简单的方式来实现这一点,因为scipy文档并没有太大帮助,而且非常模糊。有没有办法指定函数参数中随机变量的最小/最大范围,比如通过**kwargs或其他方式?

简短回答:不是直接的,不是

问题是分布是标准化的,pdf在支持上的积分是统一的。当您更改支持时,实际上就是在更改分发


对于截断的Cauchy分布,您可以使用均匀随机变量的反函数变换轻松地滚动您自己的小生成器。

@ev br是正确的,使用SciPy或NumPy没有内置的方法@ev br同样正确,“你可以使用均匀随机变量的反函数变换轻松地滚动你自己的小生成器”。你在评论中说“不幸的是,scipy包中没有反函数,我想我会保持while循环…”,而不是手动输入它,这会很长,但实际上公式非常简单。(实际上,柯西分布的CDF有一个倒数,
scipy.stats.Cauchy.ppf
,但这里我将直接实现这个公式。)

下面是一个使用逆变换的截断Cauchy采样器:

import numpy as np


def truncated_cauchy_rvs(loc=0, scale=1, a=-1, b=1, size=None):
    """
    Generate random samples from a truncated Cauchy distribution.

    `loc` and `scale` are the location and scale parameters of the distribution.
    `a` and `b` define the interval [a, b] to which the distribution is to be
    limited.

    With the default values of the parameters, the samples are generated
    from the standard Cauchy distribution limited to the interval [-1, 1].
    """
    ua = np.arctan((a - loc)/scale)/np.pi + 0.5
    ub = np.arctan((b - loc)/scale)/np.pi + 0.5
    U = np.random.uniform(ua, ub, size=size)
    rvs =  loc + scale * np.tan(np.pi*(U - 0.5))
    return rvs
比如说,

In [57]: x = truncated_cauchy_rvs(loc=0.25, scale=1/3, size=200000)                                

In [58]: ignore = plt.hist(x, bins=100, density=True, color='green', alpha=0.25)                   

In [59]: plt.grid(alpha=0.5)

是的,不幸的是,scipy软件包中没有反函数,我不想手动输入它,这会很长,我想我会保持while循环,这样更有效,至少对于我会使用的小偏差,它很少超出边界,否则,它确实会很麻烦,循环会很慢,但在这种情况下,我想我会坚持下去。