如何生成一个± 1±1具有均值的序列0.050.05?

机器算法验证 分布 采样 随机生成
2022-03-09 11:33:24

我知道如何生成±1具有均值的序列0. 例如,在 Matlab 中,如果我想生成一个±1长度序列10000, 它是:

2*(rand(1, 10000, 1)<=.5)-1

但是,如何生成一个±1具有均值的序列0.05,即,与1稍微偏爱?

4个回答

您想要的平均值由等式给出:

NpN(1p)N=.05

由此得出 的概率1s应该是.525

在 Python 中:

x = np.random.choice([-1,1], size=int(1e6), replace = True, p = [.475, .525])

证明:

x.mean()
0.050742000000000002

1'000 次实验,包含 1'000'000 个 1 和 -1 样本: 在此处输入图像描述

为了完整起见(@Elvis 的帽子提示):

import scipy.stats as st
x = 2*st.binom(1, .525).rvs(1000000) - 1
x.mean()
0.053859999999999998

1'000 次实验,包含 1'000'000 个 1 和 -1 样本:

在此处输入图像描述

最后从均匀分布中提取,正如@Łukasz Deryło(也在 Python 中)所建议的那样:

u = st.uniform(0,1).rvs(1000000)
x = 2*(u<.525) -1
x.mean()
0.049585999999999998

1'000 次实验,包含 1'000'000 个 1 和 -1 样本:

在此处输入图像描述

这三个看起来几乎相同!

编辑

中心极限定理的几条线和结果分布的传播。

首先,均值的抽取确实遵循正态分布。

其次,@Elvis 在他对这个答案的评论中对 1'000 次实验(大约(0.048;0.052))得出的平均值的精确分布做了一些很好的计算,95% 的置信区间。

这些是模拟的结果,以确认他的结果:

mn = []
for _ in range(1000):
    mn.append((2*st.binom(1, .525).rvs(1000000) - 1).mean())
np.percentile(mn, [2.5,97.5])
array([ 0.0480773,  0.0518703])

有值的变量11是形式Y=2X1X带参数的伯努利p. 它的期望值为E(Y)=2E(X)1=2p1,所以你知道如何获得p(这里p=0.525)。

在 R 中,您可以使用 生成伯努利变量rbinom(n, size = 1, prob = p),例如

x <- rbinom(100, 1, 0.525)
y <- 2*x-1

产生N样品均匀地从[0,1],将低于 0.525 的数字重新编码为 1,其余为 -1。

那么你的期望值为

10.525+(1)(10.525)=0.5250.475=0.05

我不是 Matlab 用户,但我想应该是

2*(rand(1, 10000, 1)<=.525)-1

您需要生成比 -1 更多的 1。准确地说,1s 增加 5%,因为您希望平均值为 0.05。因此,您将 1 的概率增加 2.5%,将 -1 的概率减少 2.5%。在您的代码中,它相当于更改0.50.525,即从 50% 变为 52.5%