在 Python 中使用线性代数进行线性回归

塞尔达1234

在 Python 中对维基百科 ( https://en.wikipedia.org/wiki/Coefficient_of_determination )上的这些公式的解释有误吗?以下是我尝试过的。

ssres

def ss_res(X, y, theta):

    y_diff=[]
    y_pred = X.dot(theta)

    for i in range(0, len(y)):
        y_diff.append((y[i]-y_pred[i])**2)

    return np.sum(y_diff)

输出看起来正确,但数字略有偏差......就像几个小数点。

标准错误

def std_error(X, y, theta):


    delta = (1/(len(y)-X.shape[1]+1))*(ss_res(X,y,theta))
    matrix1=matrix_power((X.T.dot(X)),-1)
    thing2=delta*matrix1
    thing3=scipy.linalg.sqrtm(thing2)

    res=np.diag(thing3)
    serr=np.reshape(res, (6, 1))
    return serr

std_error_array=std_error(X,y,theta)

山姆·梅森

您可能需要也可能不想+1在您调用的内容中使用delta,这取决于您是否X包含“常量”列(即所有值 = 1)

否则,如果有点非 Pythonic,它看起来还可以。我很想把它们写成:

import numpy as np
from numpy.linalg import inv
from scipy.linalg import sqrtm

def solve_theta(X, Y):
    return np.linalg.solve(X.T @ X, X.T @ Y)

def ss_res(X, Y, theta):
    res = Y - (X @ theta)
    return np.sum(res ** 2)

def std_error(X, Y, theta):
    nr, rank = X.shape
    resid_df = nr - rank
    residvar = ss_res(X, Y, theta) / resid_df
    var_theta = residvar * inv(X.T @ X)
    return np.diag(sqrtm(var_theta))[:,None]

注意:这使用Python 3.5 样式矩阵乘法运算符 @而不是写出.dot()

这种算法的数值稳定性并不惊人,您可能想看看使用 SVD 或 QR 分解。有一个平易近人的描述,你将如何使用 SVD 做到这一点:

John Mandel (1982)“在回归分析中使用奇异值分解” 10.1080/00031305.1982.10482771

我们可以通过创建一些虚拟数据来测试:

np.random.seed(42)

N = 20
K = 3

true_theta = np.random.randn(K, 1) * 5
X = np.random.randn(N, K)
Y = np.random.randn(N, 1) + X @ true_theta

并在其上运行上面的代码:

theta = solve_theta(X, Y)
sse = std_error(X, Y, theta)

print(np.column_stack((theta, sse)))

这使:

[[ 2.23556391  0.35678574]
 [-0.40643163  0.24751913]
 [ 3.14687637  0.26461827]]

我们可以用statsmodels以下方法测试

import statsmodels.api as sm

sm.OLS(Y, X).fit().summary()

这使:

                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x1             2.2356      0.358      6.243      0.000       1.480       2.991
x2            -0.4064      0.248     -1.641      0.119      -0.929       0.116
x3             3.1469      0.266     11.812      0.000       2.585       3.709

这是非常接近的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python在线性代数中的性能

来自分类Dev

Python上的线性代数(高斯消除)

来自分类Dev

使用python进行线性回归的简单预测

来自分类Dev

Stata与R / Python中数据框的线性代数

来自分类Dev

Python:具有域检查功能的线性代数包

来自分类Dev

Python:具有域检查功能的线性代数包

来自分类Dev

Python中复杂稀疏线性代数的限制

来自分类Dev

在TensorFlow线性回归Python中使用属性和目标矩阵

来自分类Dev

使用Python进行线性回归(Pandas和Numpy)

来自分类Dev

python线性回归实现

来自分类Dev

使用python进行线性编程

来自分类Dev

使用Python和Julia进行线性回归的解析解决方案

来自分类Dev

如何使用 selenium/python 进行线性回归的 web scape table 数据?

来自分类Dev

在 Python 中实现线性回归

来自分类Dev

python自动统计线性回归

来自分类Dev

导入线性代数块

来自分类Dev

numpy中的线性代数

来自分类Dev

使用python或excel进行线性编程

来自分类Dev

使用Python计算线性回归标准化系数(beta)

来自分类Dev

Python:使用Statsmodels预测y值-线性回归

来自分类Dev

在包中使用工作空间导入的线性代数库Eigen

来自分类Dev

使用postgres进行线性回归

来自分类Dev

python中最快的线性回归实现

来自分类Dev

将线性回归从Matlab转换为Python

来自分类Dev

Python多重简单线性回归

来自分类Dev

Python中的简单线性回归

来自分类Dev

Python多元线性回归无法绘制

来自分类Dev

线性回归的模拟scikit-learn python

来自分类Dev

python中最快的线性回归实现