可以准确的解出来,本质上就是矩阵相乘,第一个矩阵的参数w,第二个参数是x的多项式,和之前的一次的函数拟合一样的。

第一个矩阵w求解的是[5, 1.2, -3.4, 5.6],利用机器学习进行拟合,而第二个矩阵是[1, x, x^2, x^3]。同时原方程是是一个线性函数,所以可以通过机器学习的方式进行拟合。
证明公式如下:
l
=
∣
∣
X
w
−
y
∣
∣
2
=
(
X
w
−
y
)
T
(
X
w
−
y
)
=
w
T
X
T
X
w
−
w
T
X
T
y
−
y
T
X
w
+
y
T
y
d
l
d
w
=
2
X
T
X
w
−
X
T
w
−
2
X
T
y
d
l
d
w
=
2
X
T
X
w
−
X
T
w
−
2
X
T
y
=
0
X
T
y
=
X
T
X
w
w
=
(
X
T
X
)
−
1
X
T
y
l=||Xw−y||2=(Xw−y)T(Xw−y)=wTXTXw−wTXTy−yTXw+yTydldw=2XTXw−XTw−2XTydldw=2XTXw−XTw−2XTy=0XTy=XTXww=(XTX)−1XTy
通过修改函数代码调整多项式阶数:

多项式次数为4的情况

多项式次数为6的情况

多项式次数为10的情况

多项式次数为15的情况

多项式次数为20的情况
多项式次数为100的情况

可以发现村咋子过拟合情况,因为阶数变多,函数复杂度也上升了。而对于train训练损失来说,其实只需要4阶以上,就可以将训练损失函数降到0附近,因为噪声原因,损失函数可能需要无穷阶数才能够将训练损失减少到0.
如上
调整训练函数如下:
def train(train_features, test_features, train_labels, test_labels, num_epochs=400):
loss = nn.MSELoss(reduction='none')
input_shape = train_features.shape[-1]
# 不设置偏置,因为我们已经在多项式中实现了它
net = nn.Sequential(nn.Linear(input_shape, 1, bias=False))
batch_size = min(10, train_labels.shape[0])
train_iter = d2l.load_array((train_features, train_labels.reshape(-1,1)), batch_size)
test_iter = d2l.load_array((test_features, test_labels.reshape(-1,1)), batch_size, is_train=False)
trainer = torch.optim.SGD(net.parameters(), lr=0.01)
# animator = d2l.Animator(xlabel='epoch', ylabel='loss', yscale='log', xlim=[1, num_epochs], ylim=[1e-3, 1e2], legend=['train', 'test'])
for epoch in range(num_epochs):
train_epoch_ch3(net, train_iter, loss, trainer)
# if epoch == 0 or (epoch + 1) % 20 == 0:
# animator.add(epoch + 1, (evaluate_loss(net, train_iter, loss), evaluate_loss(net, test_iter, loss)))
print('weight:', net[0].weight.data.numpy())
return evaluate_loss(net, train_iter, loss), evaluate_loss(net, test_iter, loss)
# 从多项式特征中选择前4个维度,即1,x,x^2/2!,x^3/3!
animator = d2l.Animator(xlabel='degree', ylabel='loss', yscale='log', xlim=[2, max_degree], ylim=[1e-3, 1e2], legend=['train', 'test'])
for i in range(2, max_degree):
train_loss, test_loss = train(poly_features[:n_train, :i], poly_features[n_train:, :i], labels[:n_train], labels[n_train:])
animator.add(i, (train_loss, test_loss))
得到如下的图像:

当x很大的时候,不进行标准化,导致的就是训练的出参数w权重会很小,可能会接近于0,导致下溢。除了使用标准化的操作的话,还有就是处理数据,将数据进行标准化,降低数据的值,但是这样的话可能就不是线性拟合,而是非线性拟合的过程。
统计学角度出发,不可能存在0,始终有存在没有考虑到的特殊情况,导致误差。