Python随机抽取5000次
Python random draws 5,000 times
我想随机抽取 N = 30 个斜率和截距对,并进行替换,并执行 F = 5,000 次。对于每次绘制,我想计算回归线的斜率和截距,然后绘制斜率和截距的直方图。这是我目前的代码。
F = 10000
N = 30
X = sigma*(np.random.randn(F)/F)
Y = beta*X + alpha + sigma*(np.random.randn(F))
Xbar = np.mean(X)
Ybar = np.mean(Y)
numer2 = 0
denom2 = 0
for i in range(F):
for j in range(N):
numer2 += (X[j]-Xbar)*(Y[j]-Ybar)
denom2 += (X[j]-Xbar)**2
slope = numer2/denom2
intercept = Ybar - slope*Xbar
plt.figure(1)
plt.hist(slope, bins=50)
plt.hist(intercept, bins=50)
plt.grid()
plt.show()
我想得到 30 个斜率和截距对,5,000 次。我认为双 for 循环可以做到这一点。不幸的是,我所能得到的只是每个值一个。我该如何解决这个问题?
每次 slope = numer2/denom2
都会覆盖 slope
的先前值。如果要保存所有值,则需要将它们存储到循环外定义的集合中,例如列表:
slopes = []
intercepts = []
for i in range(F):
for j in range(N):
numer2 += (X[j]-Xbar)*(Y[j]-Ybar)
denom2 += (X[j]-Xbar)**2
slopes = numer2/denom2
intercept = Ybar - slope*Xbar
slopes.append(slope)
intercepts.append(intercept)
...
plt.hist(slopes, bins=50)
plt.hist(intercepts, bins=50)
有两个错误,首先是@GreenCloakGuy 指出的,您没有存储斜率和截距的值。其次,您不会在第二次迭代中从 X 和 Y 中随机抽样。此外,您不需要循环来进行计算,numpy 数组计算是矢量化的:
F = 5000
N = 30
sigma = 0.5
beta = 2
alpha = 0.2
X = np.random.randn(F)
Y = beta*X + alpha + sigma*(np.random.randn(F))
Xbar = np.mean(X)
Ybar = np.mean(Y)
slopes = []
intercepts = []
for i in range(F):
j = np.random.randint(0,F,N)
numer2 = np.sum((X[j]-Xbar)*(Y[j]-Ybar))
denom2 = np.sum((X[j]-Xbar)**2)
slope = numer2/denom2
intercept = Ybar - slope*Xbar
slopes.append(slope)
intercepts.append(intercept)
不太确定您要对代码做什么以及 sigma 值的去向。我认为上面应该给你一个斜率和截距的分布。
我想随机抽取 N = 30 个斜率和截距对,并进行替换,并执行 F = 5,000 次。对于每次绘制,我想计算回归线的斜率和截距,然后绘制斜率和截距的直方图。这是我目前的代码。
F = 10000
N = 30
X = sigma*(np.random.randn(F)/F)
Y = beta*X + alpha + sigma*(np.random.randn(F))
Xbar = np.mean(X)
Ybar = np.mean(Y)
numer2 = 0
denom2 = 0
for i in range(F):
for j in range(N):
numer2 += (X[j]-Xbar)*(Y[j]-Ybar)
denom2 += (X[j]-Xbar)**2
slope = numer2/denom2
intercept = Ybar - slope*Xbar
plt.figure(1)
plt.hist(slope, bins=50)
plt.hist(intercept, bins=50)
plt.grid()
plt.show()
我想得到 30 个斜率和截距对,5,000 次。我认为双 for 循环可以做到这一点。不幸的是,我所能得到的只是每个值一个。我该如何解决这个问题?
每次 slope = numer2/denom2
都会覆盖 slope
的先前值。如果要保存所有值,则需要将它们存储到循环外定义的集合中,例如列表:
slopes = []
intercepts = []
for i in range(F):
for j in range(N):
numer2 += (X[j]-Xbar)*(Y[j]-Ybar)
denom2 += (X[j]-Xbar)**2
slopes = numer2/denom2
intercept = Ybar - slope*Xbar
slopes.append(slope)
intercepts.append(intercept)
...
plt.hist(slopes, bins=50)
plt.hist(intercepts, bins=50)
有两个错误,首先是@GreenCloakGuy 指出的,您没有存储斜率和截距的值。其次,您不会在第二次迭代中从 X 和 Y 中随机抽样。此外,您不需要循环来进行计算,numpy 数组计算是矢量化的:
F = 5000
N = 30
sigma = 0.5
beta = 2
alpha = 0.2
X = np.random.randn(F)
Y = beta*X + alpha + sigma*(np.random.randn(F))
Xbar = np.mean(X)
Ybar = np.mean(Y)
slopes = []
intercepts = []
for i in range(F):
j = np.random.randint(0,F,N)
numer2 = np.sum((X[j]-Xbar)*(Y[j]-Ybar))
denom2 = np.sum((X[j]-Xbar)**2)
slope = numer2/denom2
intercept = Ybar - slope*Xbar
slopes.append(slope)
intercepts.append(intercept)
不太确定您要对代码做什么以及 sigma 值的去向。我认为上面应该给你一个斜率和截距的分布。