Python 线性回归中的正态方程将θ系数返回为';楠';

Python 线性回归中的正态方程将θ系数返回为';楠';,python,machine-learning,regression,nan,linear-regression,Python,Machine Learning,Regression,Nan,Linear Regression,我正在尝试使用正态方程方法进行线性回归。在我的数据中,我有n=143特征和m=13000训练示例。我知道当特征数大于10000时,正规方程法是不推荐的。但我只有143个特征。我的代码返回'nan'作为θ数组(线性系数) 在我的csv文件中,显示的数据没有标题。因此,我在csv文件中的数据如下所示(仅前15个培训示例,还没有一列示例): 注意:数据包含这么多零和一的原因是我对一些特性使用了虚拟编码。有些功能具有相当数量的类 Python代码: import pandas as pd import

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

在我的csv文件中,显示的数据没有标题。因此,我在csv文件中的数据如下所示(仅前15个培训示例,还没有一列示例):

注意:数据包含这么多零和一的原因是我对一些特性使用了虚拟编码。有些功能具有相当数量的类


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

此公式用于正态方程:

程序输出(θ数组):

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

print np.linalg.cond(data) 
这行代码还返回了
'nan'

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

print np.linalg.matrix_rank(data)
返回0



我需要澄清一下发生了什么事。我不知道是什么错了,为什么我得到了
nan

获得实际数据有助于了解实际情况,但从您描述的情况来看,您的数据矩阵,即X是病态的。因此,条件估计返回NaN,您的排名为0。因此(X^T*X)不能反转。 要解决这个问题,需要正则化,即计算


(X^T*X+lambda*1)^(-1)*X^T,其中1是适当维度的单位矩阵,lambda是正则化参数

获得实际数据有助于了解实际情况,但从您描述的情况来看,您的数据矩阵,即X是病态的。因此,条件估计返回NaN,您的排名为0。因此(X^T*X)不能反转。 要解决这个问题,需要正则化,即计算


(X^T*X+lambda*1)^(-1)*X^T,其中1是适当维度的单位矩阵,lambda是正则化参数

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

包含一个常量向量+完整指标(或包含完整指标的多个类别)将创建一个排名不足的数据矩阵 假设您有一个用于夜间的虚拟变量,一个用于白天的虚拟变量,一个用于下雪的虚拟变量,以及一个用于不下雪的虚拟变量。您的数据可能类似于:

           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...
  • 如果不包含常量,则可以只包含一个分类变量的完整虚拟体

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

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

包含一个常量向量+完整指标(或包含完整指标的多个类别)将创建一个排名不足的数据矩阵 假设您有一个用于夜间的虚拟变量,一个用于白天的虚拟变量,一个用于下雪的虚拟变量,以及一个用于不下雪的虚拟变量。您的数据可能类似于:

           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...
  • 如果不包含常量,则可以只包含一个分类变量的完整虚拟体

基本思想是,在数据矩阵中应该只有一个常量向量。2+类别的完整假人就像在数据矩阵中包含2+常量向量。

我查看了正则化。我唯一的问题是,为什么在互联网中的一些公式中确实需要将正则化参数lambda乘以身份矩阵,但是在Andrew Ng的演讲中,他也使用lambda,但乘以不完全同一矩阵。Andrew Ng的公式在这页的末尾:为什么他在单位矩阵的1个元素上有零?这取决于特定的问题,但一般来说,你会正则化所有元素。在你的例子中,对于秩0,你应该在正则化之前检查你的数据,因为只有当X都为0时,你才能得到它。我唯一的问题是,为什么在互联网中的一些公式中确实需要将正则化参数lambda乘以身份矩阵,但是在Andrew Ng的演讲中,他也使用lambda,但乘以不完全同一矩阵。Andrew Ng的公式在这页的末尾:为什么他在单位矩阵的1个元素上有零?这取决于o