You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:12:58