实现N特征梯度下降时参数m形状随迭代不断变化的问题咨询
多特征梯度下降参数m维度不断膨胀问题解答
核心原因
- 星号解包语法误用:你的代码中两次出现
*m,c = 函数返回值的写法,new_step_gradient固定返回两个值(new_m数组、new_c标量),加星号后会把第一个返回值(new_m数组)包装成一个列表赋值给m。当下一轮迭代把这个列表传入new_step_gradient,执行m=np.array(m)时,会把列表转成多了一个维度的数组,每迭代一次就多一个维度,最终出现你看到的形状从(13,)变成(13,1)再变成(13,1,1)的情况。 - 梯度计算的形状不匹配:计算
c_slope时使用了y-m*x-c的写法,当m已经是多维度数组时,和一维的x相乘会触发numpy广播,进一步加剧维度错乱。
修复方案
- 移除所有赋值语句中m前面的星号,直接用
m,c = new_step_gradient(...)接收返回值 - 统一c_slope的计算逻辑,和m_slope保持一致使用点积,避免形状不匹配
修正后代码
import numpy as np data = np.genfromtxt("train.csv", delimiter=",") M = data.shape[0] N = data.shape[1] - 1 def new_step_gradient(data, learning_rate, m, c): m_slope = np.zeros(N) c_slope = 0 m = np.array(m) for i in range(M): x = data[i, 0:N] y = data[i, N] pred = m.T.dot(x) + c for j in range(N): m_slope[j] += (-2/M) * (y - pred) * x[j] c_slope += (-2/M) * (y - pred) new_m = m - learning_rate * m_slope new_c = c - learning_rate * c_slope return new_m, new_c def n_feature_gradient_descent(data, learning_rate, num_iterations): m = np.zeros(N) c = 0 for i in range(num_iterations): m, c = new_step_gradient(data, learning_rate, m, c) return m,c num_iterations = 3 learning_rate = 0.0001 m, c = n_feature_gradient_descent(data, learning_rate, num_iterations) print(m,c)
可选优化
你可以用numpy向量化操作替代双重循环,大幅提升计算速度,核心梯度计算逻辑可以改成:
x = data[:, :N] y = data[:, N:] pred = x @ m.reshape(-1,1) + c m_slope = (-2/M) * np.sum(x * (y - pred), axis=0) c_slope = (-2/M) * np.sum(y - pred)
内容的提问来源于stack exchange,提问作者mukund shah
相关产品推荐
相关产品推荐

