- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用正规方程 方法进行线性回归。在我的数据中,我有 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
这个公式用于正规方程:
程序的输出(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:
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/
我是一名优秀的程序员,十分优秀!