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

独热编码冗余已移除,求解θ解析解时仍触发值错误

解答:独热编码冗余移除正确性与矩阵乘法错误分析

首先,先确认你的冗余移除操作是完全正确的:

  • 你针对每个类别特征(day、sex、smoker、time)都移除了一个基准列(比如用day=Fri作为日期特征的基准类别,sex=Male作为性别特征的基准类别等),这正是独热编码避免多重共线性的标准做法——每个含k个类别的特征只保留k-1个列,防止X矩阵出现线性相关导致X^T X不可逆。所以这部分操作没有问题。

接下来看你遇到的ValueError,核心问题出在矩阵乘法的运算符使用错误:
在你的get_analytical_sol函数中,你用了*来做矩阵乘法,但在pandas中,*是逐元素乘法(element-wise multiplication),不是线性代数意义上的矩阵乘法。这会引发两个问题:

  1. 计算X.T * X时,pandas会尝试对齐索引进行广播运算,生成形状完全不符合预期的矩阵(比如你报错里的(252,252),而非预期的(特征数, 特征数)矩阵);
  2. 后续的矩阵乘法步骤会因为形状不匹配,直接触发ValueError。

修正后的函数实现

你需要使用线性代数的矩阵乘法运算符,这里提供两种可靠的写法:

方法1:转换为numpy数组运算(推荐,逻辑更直观)

def get_analytical_sol(X, y):
    """ Computes the analytical solution to our least squares problem
    Parameters
    -----------
    X: a 2D dataframe of numeric features (one-hot encoded)
    y: a 1D vector of tip amounts
    Returns
    -----------
    The estimate for theta
    """
    # 将DataFrame/Series转换为numpy数组
    X_np = X.values
    y_np = y.values.reshape(-1, 1)  # 将y转换为列向量
    
    # 使用@进行矩阵乘法(也可以用np.dot)
    X_T_X = X_np.T @ X_np
    X_T_y = X_np.T @ y_np
    
    return np.linalg.inv(X_T_X) @ X_T_y

方法2:直接使用pandas的@运算符

pandas从0.23版本开始支持@作为矩阵乘法运算符,因此也可以直接对DataFrame进行操作:

def get_analytical_sol(X, y):
    """ Computes the analytical solution to our least squares problem
    Parameters
    -----------
    X: a 2D dataframe of numeric features (one-hot encoded)
    y: a 1D vector of tip amounts
    Returns
    -----------
    The estimate for theta
    """
    X_T = X.T
    return np.linalg.inv(X_T @ X) @ (X_T @ y)

额外提醒:别忘添加截距项!

另外,注意你当前的X矩阵中没有截距项(全1列),这意味着你估计的是过原点的线性回归模型。如果需要估计包含截距的标准线性回归模型,建议在独热编码后的X中添加一列全1的截距项:

# 给修正后的独热编码数据添加截距列
one_hot_X_revised.insert(0, 'intercept', 1)

内容的提问来源于stack exchange,提问作者user3085496

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:37:56