Python 线性回归中的正态方程将θ系数返回为';楠';
我正在尝试使用正态方程方法进行线性回归。在我的数据中,我有n=143特征和m=13000训练示例。我知道当特征数大于10000时,正规方程法是不推荐的。但我只有143个特征。我的代码返回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
'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个类别的虚拟对象保留下来(并且虚拟对象将指示相对于该保留类别的效果)
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个类别的虚拟对象保留下来(并且虚拟对象将指示相对于该保留类别的效果)
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