独热编码冗余已移除,求解θ解析解时仍触发值错误
解答:独热编码冗余移除正确性与矩阵乘法错误分析
首先,先确认你的冗余移除操作是完全正确的:
- 你针对每个类别特征(
day、sex、smoker、time)都移除了一个基准列(比如用day=Fri作为日期特征的基准类别,sex=Male作为性别特征的基准类别等),这正是独热编码避免多重共线性的标准做法——每个含k个类别的特征只保留k-1个列,防止X矩阵出现线性相关导致X^T X不可逆。所以这部分操作没有问题。
接下来看你遇到的ValueError,核心问题出在矩阵乘法的运算符使用错误:
在你的get_analytical_sol函数中,你用了*来做矩阵乘法,但在pandas中,*是逐元素乘法(element-wise multiplication),不是线性代数意义上的矩阵乘法。这会引发两个问题:
- 计算
X.T * X时,pandas会尝试对齐索引进行广播运算,生成形状完全不符合预期的矩阵(比如你报错里的(252,252),而非预期的(特征数, 特征数)矩阵); - 后续的矩阵乘法步骤会因为形状不匹配,直接触发
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
相关产品推荐
相关产品推荐

