Python线性回归代价函数多次调用返回值不一致问题求解
解决线性回归代价函数两次调用结果不一致的问题
嘿,我来帮你拆解下这个问题!首先你怀疑的“未初始化CostFunction和GradientDescent”其实不是核心矛盾——看你的代码,每次调用函数时CostFun和gradientDescent都是基于当前输入参数重新计算的局部变量,不存在上一次调用的残留值影响。
真正的问题出在**thetaZero = theta这行的浅拷贝逻辑**上!如果theta是numpy矩阵(从你的返回结果格式来看确实是),直接赋值会让thetaZero和theta指向同一个内存对象。当你执行thetaZero[0] = 0时,你其实悄悄修改了传入函数的原始theta变量!这就导致第一次调用后,外部的theta已经被篡改,第二次调用时用的是修改后的theta,自然得到不同的结果。
那怎么修复呢?我们需要对theta做深拷贝,同时可以显式初始化代价和梯度变量(虽然不是必须,但能让代码逻辑更清晰,也满足你对“初始化”的顾虑)。
下面是修正后的函数代码:
import numpy as np def linearRegCostFunction(X,y,theta,lamda): [m,n] = X.shape # 显式初始化代价和梯度变量,增强代码可读性 CostFun = 0 gradientDescent = np.zeros_like(theta.T) # 匹配梯度的输出形状 # 计算假设函数 h_theta = X @ theta # 用@运算符表示矩阵乘法,比*更清晰准确 # 计算代价函数 error = h_theta - y J = (1/(2*m)) * error.T @ error JReg = (lamda/(2*m)) * theta[1:,:].T @ theta[1:,:] CostFun = J + JReg # 计算梯度:深拷贝theta,避免修改原参数 thetaZero = theta.copy() # numpy矩阵的copy()方法实现深拷贝 thetaZero[0] = 0 G = (1/m) * error.T @ X JGrad = (lamda/m) * thetaZero.T gradientDescent = G + JGrad return (CostFun, gradientDescent)
关键修改点说明:
- 深拷贝
thetaZero:用theta.copy()替代直接赋值,确保修改thetaZero的操作不会影响外部传入的原始theta,保证每次调用函数时使用的都是初始输入的参数。 - 显式初始化变量:虽然Python允许局部变量先计算再赋值,但显式初始化
CostFun和gradientDescent能让代码逻辑更直观,也消除了你对“未初始化”的顾虑。 - 使用
@运算符:替代*执行矩阵乘法,numpy中*是元素级乘法,@才是标准的矩阵乘法操作,让代码更准确易读。
现在你再多次调用这个函数,只要传入的biasX、y、theta、lamda参数不变,得到的代价函数和梯度结果就会完全一致了。
内容的提问来源于stack exchange,提问作者Ruzannah
相关产品推荐
相关产品推荐

