我一直在尝试绘制贝茨分布曲线,贝茨分布是n
独立标准均匀变量(从0到1)平均值的分布
(我在区间[-1;1]
上工作,我对变量做了一个简单的更改)
这条曲线在n之后会不稳定,这会阻止我前进。
为了考虑变量x是连续的,在10×6样本中对采样间隔进行采样。以下是不同n
的一些示例:
但是n
大于29时,曲线发散,且n
越大,发散引起的变形越接近曲线的(平均)中心:
贝茨概率分布定义如下:
我的代码:
samples=10**6
def combinaison(n,k): # combination of K out of N
cnk=fac(n)/(fac(k)*fac(abs(n-k))) # fac is factoriel
return cnk
def dens_probas(a,b,n):
x=np.linspace(a, b, num=samples)
y=(x-a)/(b-a)
F=list()
for i in range(0,len(y)):
g=0
for k in range(0,int(n*y[i]+1)):
g=g+pow(-1,k)*combinaison(n,k)*pow(y[i]-k/n,n-1)
d=(n**n/fac(n-1))*g
F.append(d)
return F
有没有办法纠正较大的n
的分歧
主要问题是,具有交替和的公式极易出现数值精度问题
避免右侧问题的一个技巧是假设分布是对称的,只计算一半
一个简单的精度优化是通过调用
scipy.special.comb
来替换combinaison
公式中的阶乘。这避免了需要划分非常大的数字较小精度的优化是同时计算奇偶数的
g
。但乍一看,该公式不能减少太多,因此替换为:作者:
其他一些评论:
samples
仅用于告诉xaxis中的除法。一个小得多的数字就足够了。(在下面的代码中,我将变量重命名为xaxis_steps
)李>F
使用append
将非常缓慢。最好创建一个大小正确的numpy数组,然后填充它。(这也使得复制对半部分更容易。)所有这些优化一起将精度问题从
n=30
转移到n=80
左右:另一种完全不同的方法是生成大量统一的样本,并采取相应的方法。从这些样本可以生成kde图。此类曲线的平滑度取决于采样数。kde可以通过seaborn's kdeplot直接绘制。您还可以单独calculate the kde function,然后将其应用于给定的x范围,并通过标准matplotlib进行打印
相关问题 更多 >
编程相关推荐