为何分段运行线性回归代码正常,封装为函数却报Singular matrix错误?
问题原因及解决办法
核心原因
你在分段运行代码时,已经执行了X = np.column_stack([ones, X]),把偏置项(全1列)添加到了X中。但调用train_linear_regression函数时,传入的是这个已经加过偏置项的X,而函数内部又再次执行了X = np.column_stack([ones, X])——这会导致特征矩阵中出现两列完全相同的全1向量,特征列线性相关,进而使得XTX成为奇异矩阵(行列式为0),无法求逆,触发LinAlgError。
验证说明
分段代码执行后,X的维度是(9,4)(1列偏置+3列原始特征);函数内部再次添加ones后,X变成(9,5),前两列都是全1,线性相关,此时XTX的秩小于列数,矩阵不可逆。
解决办法
办法1:传入原始未处理的X(推荐)
恢复X为最初的3列特征数组,再调用函数:
# 原始特征数据(未添加偏置项) X= [ [148, 24,1385], [132,25,2031], [453,11,86], [158,24,185], [172,25,201], [413,11,86], [38,54,185], [142,25,431], [453,31,86] ] X = np.array(X) y = [10000,20000,15000,20050,10000,20000,15000,25000,12000] def train_linear_regression(X, y): ones = np.ones(X.shape[0]) X = np.column_stack([ones, X]) XTX = X.T.dot(X) XTX_inv = np.linalg.inv(XTX) w = XTX_inv.dot(X.T).dot(y) return w[0], w[1:] w0, w = train_linear_regression(X, y) print(w0, w) # 输出:25844.754055766753 array([ -16.08906468, -199.47254894, -1.22802883])
办法2:修改函数,去掉内部添加偏置项的逻辑
如果要传入已经处理好的含偏置项的X,修改函数如下:
def train_linear_regression(X, y): # 不再添加ones,假设X已经包含偏置项 XTX = X.T.dot(X) XTX_inv = np.linalg.inv(XTX) w = XTX_inv.dot(X.T).dot(y) return w[0], w[1:] # 此时X是已经添加过偏置项的(9,4)数组 w0, w = train_linear_regression(X, y) print(w0, w)
内容的提问来源于stack exchange,提问作者Gregory Morris
相关产品推荐
相关产品推荐

