线性回归如何一次性达到最优。

其实很简单,求出线性回归表达式的解析解就好了,还不需要使用梯度下降法。
方法如下:
假设损失函数为(推导提示看文末图):
(1)J(θ)=12i=1n(hθ(x(i)y(i))2=12(XθY)T(XθY)

矩阵展开后:

J(θ)=12(θTXTYT)(XθY)=12(θTXTXθθTXTYYTXθ+YTY)

J(θ)关于θ求导:

αJ(θ)αθ=12(2XTXθXTYXTY)=0

XTXθXTY=0

XTXθ=XTY

求得:

θ=(XTX)1XTY

所以只是一个线性回归器的话,我们可以把整个数据集运用到其上面,一步得到最优解。

代码实践

首先我们定义输入和输出:
假设:

y=2X+3+ξ,X=[x0x1x2]

其中ξN(0,1)
化为矩阵形式为:

y=[23][x0x1x2111]+ξ

代码为:

X = torch.concat([torch.arange(0,20,0.1).view(-1,1),torch.ones(200).view(-1,1)],dim=-1)
y = torch.tensor([2,3],dtype=torch.float)@X.T+torch.randn(size=(200,))

可视化如下:
image

首先我们求出θ的解析解:

theta = torch.inverse(X.T@X)@X.T@y
tensor([2.0043, 2.8775])

然后我们通过sklearn看看线性回归模型拟合后的系数:

model = LinearRegression(fit_intercept=False)
model.fit(X=X,y=y)
model.coef_
array([2.0042787, 2.8774676], dtype=float32)

再来看看用pytorch中的Linear模块训练出的模型的拟合情况:

model = torch.nn.Linear(in_features=2,out_features=1,bias=False)
optimizer = AdamW(model.parameters(),lr=1e-1)

losses = []
for epoch in range(1000):
	logits = model(X).view(-1)
	loss = torch.nn.functional.mse_loss(model(X).view(-1),y)
	loss.backward()
	losses.append(loss.item())
	optimizer.step()
	optimizer.zero_grad()

训练后,查看模型参数:

dict(model.named_parameters())
{'weight': Parameter containing:
 tensor([[2.0057, 2.8103]], requires_grad=True)}

下面的表格展示了三种方法对应的最小loss:

method parameters mse loss
解析解 [2.0043, 2.8775] 0.9377
sklearn [2.0042787, 2.8774676] 0.9377
Pytorch [2.0057, 2.8103] 0.9377844929695129

另外,如果

y=[23][x0x1x2111]

那么三种方法对应的最小loss则为:

method parameters mse loss
解析解(0.7s) [2.0000, 3.0000] 4.6930e-12
sklearn(0.6s) [1.9999994, 2.9999995] 5.3014e-11
Pytorch(迭代1万次)(4s) [2.0023, 2.9671] 0.0002794999163597822
Pytorch(迭代3万次)(12s) [2.0000, 3.0000] 4.183675704049622e-13
式(1)推导提示

image

参考文献

https://www.cnblogs.com/Renyi-Fan/p/13383455.html

posted @   Hisi  阅读(140)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示