我知道如何生成具有均值的序列. 例如,在 Matlab 中,如果我想生成一个长度序列, 它是:
2*(rand(1, 10000, 1)<=.5)-1
但是,如何生成一个具有均值的序列,即,与稍微偏爱?
我知道如何生成具有均值的序列. 例如,在 Matlab 中,如果我想生成一个长度序列, 它是:
2*(rand(1, 10000, 1)<=.5)-1
但是,如何生成一个具有均值的序列,即,与稍微偏爱?
您想要的平均值由等式给出:
由此得出 的概率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])
有值的变量和是形式和带参数的伯努利. 它的期望值为,所以你知道如何获得(这里)。
在 R 中,您可以使用 生成伯努利变量rbinom(n, size = 1, prob = p)
,例如
x <- rbinom(100, 1, 0.525)
y <- 2*x-1
产生样品均匀地从,将低于 0.525 的数字重新编码为 1,其余为 -1。
那么你的期望值为
我不是 Matlab 用户,但我想应该是
2*(rand(1, 10000, 1)<=.525)-1
您需要生成比 -1 更多的 1。准确地说,1s 增加 5%,因为您希望平均值为 0.05。因此,您将 1 的概率增加 2.5%,将 -1 的概率减少 2.5%。在您的代码中,它相当于更改0.5
为0.525
,即从 50% 变为 52.5%