gpt4 book ai didi

python - 线性回归中的正规方程返回 theta 系数为 'NaN'

转载 作者:太空宇宙 更新时间:2023-11-04 10:18:05 26 4
gpt4 key购买 nike

我正在尝试使用正规方程 方法进行线性回归。在我的数据中,我有 n = 143 个特征和 m = 13000 个训练示例。我知道当特征数大于 10000 时推荐使用正规方程法。但我只有 143 个特征。我的代码返回 'nan' 作为我的 thetas(线性系数)数组。

在我的 csv 文件中,数据没有标题。所以我在 csv 文件中的数据看起来像这样(只有前 15 个训练示例并且还没有一列):

2;1;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;3;0;1;0;0;0;0;0;1986;9;1;16;5;1;1.65;1;0;0;0;4;2;1;0;0;0;1;1;0;0;0;0;2.8;1;0;15000
2;1;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;6;0;0;1;0;0;0;0;2006;8;0;23;5;2;1.65;1;0;0;0;2;2.23;1;0;0;0;1;1;0;0;0;0;2.79;1;0;12900
1;1;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;4;0;1;0;0;0;0;0;1987;6;0;29;6;2;1;0;1;0;0;2;1;0;1;0;0;2.12;0;1;0;0;0;2.8;3;0;23438
2;1;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;1;0;0;0;2009;3;0;56;5;3;1;1;0;0;0;4;2;1;0;0;0;2;1;0;0;0;0;2.79;1;0;67000
1;1;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;10;0;1;0;0;0;0;0;1978;5;1;115;6;2;2;1;0;0;0;4;2;1;0;0;0;3;0;1;0;0;0;2.8;3;0;230000
3;1;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;6;0;0;1;0;0;0;0;2006;7;0;250;4.93;4;4;1;0;0;0;3.91;2.23;0;0;1;0;2.12;0;0;1;0;0;3;2;0;224000
1;1;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;8;0;0;1;0;0;0;0;2007;3;0;31;5;2;1;1;0;0;0;3.91;2.23;0;1;0;0;2.12;0;1;0;0;0;2.79;1;0;45000
1;1;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;4;0;1;0;0;0;0;0;1975;8;1;31;6;3;2;1;0;0;0;4;2;1;0;0;0;2;0;1;0;0;0;2.79;2;0;66000
1;1;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;5;0;0;0;1;0;0;0;1992;1;1;32;5;2.52;1.65;0;1;0;0;3.91;2.23;0;1;0;0;2.12;0;0;1;0;0;2.79;1;0;34000
1;1;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;3;0;0;1;0;0;0;0;2012;16;1;32;5;2;2;1;0;0;0;4;2;1;0;0;0;2;1;0;0;0;0;2.79;1;0;36000
2;1;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;8;0;1;0;0;0;0;0;1977;3;0;33;6;2;1.65;1;0;0;0;4;2.23;0;1;0;0;2.12;0;1;0;0;0;2.79;1;0;38000
2;1;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;8;0;0;1;0;0;0;0;2007;3;0;33;4.93;2;1;1;0;0;0;4;2.23;0;1;0;0;2.12;1;0;0;0;0;2.79;2;0;37000
1;1;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;8;0;1;0;0;0;0;0;1990;3;0;33;5;2;1;1;0;0;0;4;2;1;0;0;0;2;1;0;0;0;0;2.79;1;0;38000
2;1;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;8;0;0;1;0;0;0;0;2012;4;0;33;5;2;2;1;0;0;0;4;4;1;0;0;0;2;1;0;0;0;0;2.79;1;0;45000
3;1;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;7;0;0;0;0;1;0;0;1982;1;1;35;5;2;1.65;1;0;0;0;4;2.23;0;0;0;1;2;1;0;0;0;0;2.7;1;0;45000

注意: 数据中包含这么多 0 和 1 的原因是因为我对某些特征使用了伪编码。一些功能具有相当数量的类。


Python 代码:

import pandas as pd
import numpy as np

path = 'DB2.csv'
data = pd.read_csv(path, header=None, delimiter=";")

data.insert(0, 'Ones', 1)

print np.linalg.cond(data)
print np.linalg.matrix_rank(data)

cols = data.shape[1]
X = data.iloc[:,0:cols-1]
y = data.iloc[:,cols-1:cols]

#Normal equation:
xTx = X.T.dot(X)
XtX = np.linalg.inv(xTx)
XtX_xT = XtX.dot(X.T)
theta = XtX_xT.dot(y)

print theta

这个公式用于正规方程:

enter image description here

程序的输出(theta 数组):

[[ nan]
[ nan]
[ nan]
[ nan]
[ nan]
...
[ nan]]

同样在程序中,我尝试通过代码检查矩阵的条件数:

print np.linalg.cond(data) 

这行代码也返回了'nan'

但这行用于检查矩阵秩的代码:

print np.linalg.matrix_rank(data)

返回0


我需要澄清一下发生了什么。我无法弄清楚哪里出了问题以及为什么我得到 nan

最佳答案

使用虚拟/指标变量时需要注意的事情,可能会发生在这里:

包含一个常量向量 + 完整指标(或具有完整指标的多个类别)创建一个排名不足的数据矩阵

假设您有一个表示夜晚的虚拟变量、一个表示白天的虚拟变量、一个表示下雪的虚拟变量和一个表示不下雪的虚拟变量。您的数据可能类似于:

           I_day    I_night     I_snow     I_no_snow
obs 1: 1 0 1 0
obs 2: 0 1 1 0
obs 3: 1 0 0 1
obs 4: 0 1 0 1
etc...

出现了一个微妙但可怕的错误,数据矩阵秩不足! I_day + I_night 始终是 1 的向量,对于 I_snow + I_no_snow 也是如此。我们有线性相关性:I_day+I_night = I_snow+I_no_snow!数据矩阵是第 3 阶,而不是第 4 阶。X'*X 将是第 3 阶(而不是第 4 阶)。

做什么:

  • 如果在数据矩阵 X 中包含一个常量,那么对于每个分类变量,您始终需要从矩阵 X 中保留 1 个类别的虚拟变量。(并且虚拟变量将指示效果相对到这个遗漏的类别)。

在这个例子中,我可以按如下方式形成我的数据矩阵 X:

           const    I_day     I_snow 
obs 1: 1 1 1
obs 2: 1 0 1
obs 3: 1 1 0
obs 4: 1 0 0
etc...
  • 如果没有包含常量,您可以为恰好一个分类变量包含完整虚拟变量。

基本思想是您的数据矩阵中应该只有 1 个常数向量。 2 个以上类别的完整虚拟变量就像在数据矩阵中包含 2 个以上常量向量。

关于python - 线性回归中的正规方程返回 theta 系数为 'NaN',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34161501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com