线性回归寻找最小MSE:代码逻辑错误排查
线性回归遍历寻优代码问题排查
核心错误分析
- 无效循环且覆盖变量:第一个
for y in x:循环完全多余,每次迭代都重复计算ypred = a*x+b,还覆盖了原本存储真实标签的y变量(后续靠ytrue=data.y规避了直接错误,但这个循环毫无意义,应直接删除)。 - 遍历a的逻辑彻底错误:
- 错误将真实标签
ytrue赋值为候选a的数值(ytrue = a-0.1*(i+1)),混淆了模型参数与真实数据的边界,ytrue必须始终是原始的data.y。 - 遍历过程中未根据当前候选a重新计算预测值
ypred,全程使用初始a=10时的结果,导致MSE计算完全偏离目标。 - 错误将候选a的值存入
tmp_a(因误把ytrue当成a的候选值),最终输出的tmp_a根本不是最优斜率参数。
- 错误将真实标签
修正后的单参数(a)优化代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt data = pd.read_csv('dataset.csv') x = data.x ytrue = data.y # 可视化原始数据分布 plt.scatter(x, ytrue) plt.show() # 初始化最优参数与最小MSE min_mse = np.infty best_a = 0 fixed_b = 0 # 暂时固定b为0 # 遍历a从10递减到0,步长0.1(共101次循环,包含0) for i in range(101): current_a = 10 - 0.1 * i ypred = current_a * x + fixed_b current_mse = np.square(ytrue - ypred).mean() if current_mse < min_mse: min_mse = current_mse best_a = current_a print(f"最优a值: {best_a}, 对应MSE: {min_mse}")
双参数(a+b)优化实现
若需同时寻找最优的a和b,可通过嵌套循环遍历两个参数的候选范围(示例中b的范围设为-2到2,步长0.1,可根据数据调整):
import pandas as pd import numpy as np data = pd.read_csv('dataset.csv') x = data.x ytrue = data.y min_mse = np.infty best_a = 0 best_b = 0 # 遍历a的候选值 for i in range(101): current_a = 10 - 0.1 * i # 遍历b的候选值 for j in range(41): current_b = -2 + 0.1 * j ypred = current_a * x + current_b current_mse = np.square(ytrue - ypred).mean() if current_mse < min_mse: min_mse = current_mse best_a = current_a best_b = current_b print(f"最优a值: {best_a}, 最优b值: {best_b}, 对应MSE: {min_mse}")
额外建议
这种暴力遍历的寻优方法效率极低,实际项目中推荐直接使用np.linalg.lstsq求解最小二乘解,或者使用scikit-learn的LinearRegression模型,能快速得到最优参数,无需手动遍历。
内容的提问来源于stack exchange,提问作者Aaron Beattie
相关产品推荐
相关产品推荐

