我在练习使用sklearn中的SGDRegressor时遇到了一些问题,我已经简化了代码如下:
这是输出结果:
intercept= [0.19835632]coef= [0.18652387]
所有输出都大约是intercept=0.19和coef=0.18,但显然正确的答案应该是intercept=0
和coef=1
。即使在这样简单的例子中,程序也无法得到参数的正确解。我想知道我犯了什么错误。
回答:
使用n=10000个数据点(从你最初的3个点中抽样并替换)时,SGD的输出结果如下:
n = 10000X = np.random.choice([0,0.5,1], n, replace=True)y = XX = X.reshape((n,1))sgd = SGDRegressor(verbose=1) sgd.fit(X, y)# -- Epoch 1# Norm: 0.86, NNZs: 1, Bias: 0.076159, T: 10000, Avg. loss: 0.012120# Total training time: 0.04 seconds.# -- Epoch 2# Norm: 0.96, NNZs: 1, Bias: 0.024337, T: 20000, Avg. loss: 0.000586# Total training time: 0.04 seconds.# -- Epoch 3# Norm: 0.98, NNZs: 1, Bias: 0.008826, T: 30000, Avg. loss: 0.000065# Total training time: 0.04 seconds.# -- Epoch 4# Norm: 0.99, NNZs: 1, Bias: 0.003617, T: 40000, Avg. loss: 0.000010# Total training time: 0.04 seconds.# -- Epoch 5# Norm: 1.00, NNZs: 1, Bias: 0.001686, T: 50000, Avg. loss: 0.000002# Total training time: 0.05 seconds.# -- Epoch 6# Norm: 1.00, NNZs: 1, Bias: 0.000911, T: 60000, Avg. loss: 0.000000# Total training time: 0.05 seconds.# -- Epoch 7# Norm: 1.00, NNZs: 1, Bias: 0.000570, T: 70000, Avg. loss: 0.000000# Total training time: 0.05 seconds.# 在7个周期后收敛,耗时0.05秒print("intercept=", sgd.intercept_)print("coef=", sgd.coef_)# intercept= [0.00057032]# coef= [0.99892893]plt.plot(X, y, 'r.')plt.plot(X, sgd.intercept_ + sgd.coef_*X, 'b-')
下面的动画展示了在上述代码中,随着n的增加,SGD回归器如何开始收敛到正确的极值: