Scipy的wrapcauchy函数是否存在异常?关于包裹柯西分布输出结果的疑问及解决方案求助
Scipy的wrapcauchy函数是否存在异常?关于包裹柯西分布输出结果的疑问及解决方案求助
我最近在研究Scipy里的wrapcauchy(包裹柯西分布)函数,想确认自己对这个分布的理解是否正确。根据维基百科的定义:
包裹柯西分布是一种包裹型概率分布,由柯西分布在单位圆上“包裹”得到,这一点和冯·米塞斯(Von Mises)分布类似。
为了验证,我写了一段代码来生成大量随机变量、绘制直方图对比效果,但遇到了一个奇怪的问题:
测试代码
from scipy.stats import wrapcauchy, vonmises import plotly.graph_objects as go import numpy as np def plot_cauchy(c, loc = 0, scale = 1, size = 100000): ''' rvs(c, loc=0, scale=1, size=1, random_state=None) ''' # 使用Von Mises分布时的代码(正常工作) rvses = vonmises.rvs(c, loc = loc, scale = scale, size = size) # 切换为wrapcauchy时出现问题 # rvses = wrapcauchy.rvs(c, # loc = loc, # scale = scale, # size = size) y,x = np.histogram(rvses, bins = 200, range = [-np.pi,np.pi], density = True) return x,y fig = go.Figure() loc = -3 x,y = plot_cauchy(0.5, loc = loc) fig.add_trace(go.Scatter(x=x, y=y, mode='lines+markers', name= f'Centered on {loc}')) loc = 1.5 x,y = plot_cauchy(0.5, loc = loc) fig.add_trace(go.Scatter(x=x, y=y, mode='lines+markers', name= f'Centered on {loc}')) loc = 0 x,y = plot_cauchy(0.5, loc = loc) fig.add_trace(go.Scatter(x=x, y=y, mode='lines+markers', name=f'Centered on {loc}')) fig.show()
问题现象
- 当我使用
vonmises.rvs()生成随机变量时,得到的分布完全符合预期:所有样本都落在[-π, π]范围内,直方图也能正确展示不同loc参数下的中心分布。 - 但当我注释掉Von Mises的代码,切换使用
wrapcauchy.rvs()时,生成的随机变量并没有被包裹在[-π, π]范围内,看起来像是“未被包裹”的原始柯西分布结果,导致我必须手动调整直方图的范围才能完整绘制,这和我对“包裹柯西分布”的理解完全不符。
我当前使用的Scipy版本是1.15.2,想请教大家:
- 是我对
wrapcauchy函数的使用方式有误吗?有没有办法让它的输出正确包裹到[-π, π]区间内? - 如果Scipy的这个函数本身存在问题,有没有其他Python库可以生成符合预期的包裹柯西分布随机变量?
内容来源于stack exchange
相关产品推荐
相关产品推荐

