如何为多项式回归添加预测功能?能否实现类Scikit-learn的predict函数?
如何为自定义多项式回归实现类似Scikit-learn的predict功能?
当然可以实现类似Scikit-learn中predict的功能!我们可以基于你现有的自定义多项式回归代码,通过几处调整和封装,就能完成这个需求。下面一步步来拆解实现过程:
1. 修复现有代码的向量兼容性问题
你的monomial函数目前用了math.pow,它只支持标量输入,无法处理批量数据(比如列表或numpy数组)。我们把它换成numpy的np.pow,这样就能支持向量化运算,为批量预测打下基础:
import numpy as np import math def monomial(a,b): # 替换math.pow为np.pow,支持向量输入 return lambda x : a * np.pow(x,b)
2. 封装类似Scikit-learn的predict函数
Scikit-learn的predict函数可以接收单个样本、列表或numpy数组作为输入,返回对应的预测值。我们基于你训练好的模型(即polyTrain返回的加权和函数),封装一个这样的函数:
def predict(model, X): # 将输入统一转换为numpy数组,确保兼容性 X = np.asarray(X) # 直接调用训练好的模型函数,因为我们已经让它支持向量输入 return model(X)
这个函数的逻辑很简单:先把输入转换成numpy数组(不管你传的是单个数值、列表还是数组),然后直接用训练好的模型计算预测值——因为修改后的monomial支持向量运算,模型函数会自动对数组中的每个元素计算预测结果。
3. 完整使用示例
我们用一个实际的例子来验证整个流程:
# 准备训练数据:近似y = x² + 1 x_train = [1, 2, 3, 4, 5] y_train = [2, 5, 10, 17, 26] # 训练2阶多项式回归模型 trained_model = polyTrain(x_train, y_train, order=2) # 预测单个值 single_pred = predict(trained_model, 6) print(f"单个值预测结果:{single_pred}") # 输出约37.0 # 预测多个值 multi_pred = predict(trained_model, [6, 7, 8]) print(f"多个值预测结果:{multi_pred}") # 输出[37. 50. 65.]左右
4. 额外优化:修正polyTrain中的小细节
你代码里初始化w的时候用了[1 for i in range(0,order)],但阶数为order的多项式应该有order+1个系数(从x⁰到x^order)。虽然这行代码最后会被w = numpy.dot(pinv,t)覆盖,不影响结果,但为了代码可读性,可以改成:
def polyTrain(x,y,order): # 初始化权重向量(长度为order+1,对应0到order阶的单项式) w = [1]*(order+1) F = polyList(order) design = [[f(i) for f in F] for i in x] # 转换为numpy数组 w = np.asarray(w) design = np.asarray(design) # 求解Ax=b,[x值×(order+1)][系数]^T = [y值] pinv = np.linalg.pinv(design) t = np.asarray(y).T # 权重的最大似然估计为w* = pinv(design)y.T w = np.dot(pinv,t) return weightedSum(w,F)
这样代码逻辑更清晰,避免后续维护时产生误解。
内容的提问来源于stack exchange,提问作者user330959
相关产品推荐
相关产品推荐

