You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求优化基于Scikit-Learn的乘法学习程序(新手友好,少改代码)

解决线性回归做乘法学习准确率低的问题

嘿,我懂你的困惑!用线性回归做加法顺风顺水,换成乘法就拉胯——这真的不怪你,因为线性回归天生只能拟合线性关系,而乘法是典型的非线性任务呀!

为啥加法行、乘法不行?

原加法任务是 Y = x1 + x2,刚好完美匹配线性模型的公式 Y = w1*x1 + w2*x2 + b(这里w1=1、w2=1、b=0),模型轻轻松松就能学到正确的权重。但乘法是 Y = x1*x2,这可不是x1和x2的线性组合,线性模型根本没法直接捕捉到这种非线性关系,自然准确率极低。

尽量少改代码的解决方案

下面给你两种改动极小的方案,都能让原有的线性回归模型搞定乘法学习:

方案1:手动添加乘积特征(改动最少)

只需要给每个样本加一个x1*x2的特征,让线性模型能直接学到这个特征和Y的线性关系:

from sklearn import linear_model
from random import randint
reg=linear_model.LinearRegression()
# 改动点1:给每个样本添加x1*x2作为第三个特征
x=[[a, b, a*b] for a, b in [(randint(0,100), randint(0,100)) for _ in range(1000)]]
# 改动点2:把Y改成乘法结果
Y=[a*b for a, b in x]
reg.fit(x, Y)
# 改动点3:预测时也要传入乘积特征
print(reg.predict([[56, 23, 56*23]]))  # 输出会接近56*23=1288

这种方案只改了3处代码,本质是把非线性的乘法问题转换成了线性模型能处理的“对乘积特征做线性拟合”。

方案2:用PolynomialFeatures自动生成非线性特征

如果不想手动写乘积,也可以用sklearn的工具自动生成二次特征,改动也很少:

from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures  # 新增导入
from random import randint
reg=linear_model.LinearRegression()
x=[[randint(0,100),randint(0,100)] for i in range(1000)]
Y=[i[0]*i[1] for i in x]  # 改动点1:Y改成乘法结果
# 新增两步:生成二次特征(包含x1*x2)
poly = PolynomialFeatures(degree=2, include_bias=False)
x_poly = poly.fit_transform(x)
reg.fit(x_poly, Y)
# 改动点2:预测时用poly转换输入
print(reg.predict(poly.transform([[56, 23]])))  # 输出接近1288

这个方案只多导入了一个工具类,加了两行特征转换代码,其他地方只改了Y的计算,同样能让线性模型准确学到乘法关系。

内容的提问来源于stack exchange,提问作者Nikhil.Nixel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:29:04