Python中生成标准柯西分布的函数是:numpy.random.standard_cauchy(size),
我就在想,能否生成一个非标准的柯西随机数呢?那么面临几个问题:
(1)标准柯西随机数和非标准可惜随机数之间有没有之间转化关系?(没有)
(2)柯西随机数是怎么生成的?
(3)柯西随机数与概率密度有关,还是与概率分布有关?
带着这几个问题,我首先查了什么是柯西分布,包括密度函数、概率分布函数的表达式(来自:百度百科)。
柯西分布也叫作柯西一洛伦兹分布,它是以奥古斯丁-路易-柯西与亨德里克-洛伦兹名字命名的连续概率分布,如图所示。其概率密度函数为
式中: 为定义分布峰值位置的位置参数;为最大值一半处的一半宽度的尺度参数。作为概率分布,通常称为柯西分布,物理学家也将之称为洛伦兹分布或者Breit-Wigner分布。在物理学中的重要性很大以部分归因于它是描述受迫共振的微分方程的解。在光谱学中,它描述了被共振或者其他机制加宽的谱线形状。记随机变量 X服从柯西分布为 . 的特例称为标准柯西分布,其概率密度函数为:
其对应的累积分布函数为:
然后,在生成柯西随机数时,网上有人是这样做的(链接):
计算得到Cauchy分布累计分布函数(CDF)的反函数;
使用rand()函数生成(0,1)区间上均匀分布的初始随机数x;
将初始随机数代入CDF的反函数即可得到我们需要的标准Cauchy随机数:
C(1)_x=tan((x-1/2)*pi);
显然,上面的CDF的反函数起关键作用。在CDF的反函数中,概率变成自变量(对应0和1之间的随机数),因变量就是所求随机数(对应负无穷到正无穷的随机数)。于是,我们可求得非标准柯西随机数生成公式为:
C(gamma, x0)_x = gamma*tan((x-1/2)*pi) + x0 ;
即 C(gamma, x0)_x = gamma*C(1)_x + x0 ;
那么,在python中,要得到gamma为2的非标准柯西随机数,只需要在原来基础上乘以2,即
C(1)_x = numpy.random.standar.cauchy(1)
C(2)_x = 2*numpy.random.standar.cauchy(1)