【问题标题】:Python random draws 5,000 timesPython随机抽取5000次
【发布时间】:2021-06-18 17:59:53
【问题描述】:

我想随机绘制 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 个斜率和截距对,5000 次。我认为双 for 循环会做到这一点。不幸的是,我只能得到一个值。我该如何解决这个问题?

【问题讨论】:

    标签: python for-loop regression intercept


    【解决方案1】:

    有两个错误,首先是@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 值的去向。我认为上面应该给你一个斜率和截距的分布。

    【讨论】:

    • 实际上,这很好用。这几乎就是我想要的。谢谢。
    【解决方案2】:

    每次执行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)
    

    【讨论】:

    • 好的,是的,我正在覆盖这些值。它几乎可以工作,但现在直方图只显示一个垂直条。你对直方图有什么建议吗?
    • @billyyank 您是否尝试过实际打印出斜率和截距列表,看看它们最终是什么?这可能会导致对代码进行逆向工程以进行补偿(例如,我没有看到在循环内的任何地方使用 i
    • 斜率和截距的长度各为 150,000,尽管我想我可以将它们相加。我用 i's 替换了脚本中的 j's,但并没有太大区别。我认为问题在于直方图太大而无法显示有用的图。
    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多