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

实现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广播,进一步加剧维度错乱。

修复方案

  1. 移除所有赋值语句中m前面的星号,直接用m,c = new_step_gradient(...)接收返回值
  2. 统一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:24:03