python - 仅使用 numpy 的多元多元线性回归
问题描述
我希望建立一个包含 N 个因变量和 M 个自变量的多元、多元线性回归模型。我环顾四周,似乎找不到实现。我做了一些研究并在这里找到了一些注释:幻灯片 51 上的http://users.stat.umn.edu/~helwig/notes/mvlr-Notes.pdf。这似乎很容易实现:
import numpy as np
M = 10
N = 3
p = 15
Y = np.random.rand(p,N)
X = np.random.rand(p,M)
A = np.dot(np.transpose(X),X)
B = np.dot(np.transpose(X),Y)
sol = np.linalg.solve(A,B)
其中 sol 输出系数矩阵。我最终会将其扩展到非常大的数据集。我主要关心的是这种方法的准确性。老实说,这似乎太简单了。有人可以权衡这在多元、多元回归中是否足够,或者是否有一些我可以使用的包或其他更好的东西?
谢谢
解决方案
幕后发生的事情比你想象的要多。您正在查看的是过度约束线性方程组系统的最小二乘解。让我这样解释。你有p
方程和q
未知数。
案例1:p < q
无限多的解决方案。A
大小矩阵p x q
是奇异的,因此存在无限多的解决方案。它们可以通过寻找零空间的特定解和基础来找到。np.linalg.solve
不能用于解决这样的系统,因为它只需要满秩方阵。你可以np.linalg.lstsq
改用。
案例 2:p = q
独特的解决方案。这意味着p x q
矩阵是可逆的,您可以Ax = b
使用求解系统x = A^(-1) b
。事实上,当您调用 时np.linalg.solve
,这正是正在发生的事情。
案例3:p > q
不存在解决方案。但是我们可以通过将向量b
正交投影到矩阵的列空间来进行近似A
。这意味着我们想要找到一个向量,b_hat
使得某个任意向量垂直于和位于矩阵 A 的列空间中。因此,存在一些这样的和(因为位于左零空间中)。正如,我们有。因此,我们得出了一个解决方案,。这是具有 的线性方程组的最佳近似解。它可以在数学上证明,但我认为这是一个合理的解释。再次,b_hat + w = b
w
b_hat
b_hat
x_hat
A * x_hat = b
A^(T) w = 0
w
w = b - b_hat
A^(T) w = A^(T) * b - A^(T) * ( A * x_hat )
x_hat = (A^(T) * A)^(-1) * A^(T) * b
x_hat
p > q
np.linalg.solve
不能用于解决这种类型的线性系统,但np.linalg.lstsq
可以使用另一个例程。
推荐阅读
- javascript - 基于函数返回的条件类名
- javascript - 如何修复 HTML 页面中的“Google 登录”按钮样式?
- angularjs - $scope.message 无法显示文本值
- qt - 如何检查运行时结构更改后waitForObject结果对象是否仍然存在?
- ios - iOS/Metal 可以读取像素深度吗?
- javascript - 如何在事件中重置jquery变量
- laravel - UTF-8 编码不正确
- haskell - 使用镜头阅读时如何解决“无法将类型 'Item a0' 与 '[Item [Char]]' 匹配”
- html - 页面末尾的 CSS 不会影响所有内容
- reactjs - React Redux 通过从 API 获取数据设置初始状态