python之numpy之伪逆numpy.linalg.pinv

24 篇文章 5 订阅

解释及实现

X X X的伪逆为 p i n v ( X ) pinv(X) pinv(X),则有
p i n v ( X ) = ( X T X ) − 1 X T pinv(X)=(X^TX)^{-1}X^T pinv(X)=(XTX)1XT,容易发现 p i n v ( X ) X = I pinv(X)X=I pinv(X)X=I
在numpy中可以使用numpy.linalg.pinv求伪逆。
例子:1

>>> a = np.random.randn(9, 6)
>>> B = np.linalg.pinv(a)
>>> np.allclose(a, np.dot(a, np.dot(B, a)))
True
>>> np.allclose(B, np.dot(B, np.dot(a, B)))
True
>>> np.allclose(np.transpose(a), np.dot(B, np.dot(a, np.transpose(a))))
True

numpy.linalg.pinv只是numpy众多线性代数函数中的一个,了解更多numpy的线性代数方面的函数,可以看这个链接

笔记

矩阵 A A A 的伪逆矩阵,记为 A + A^+ A+ , 定义为:解决最小二乘问题的矩阵。例如, A x = b Ax=b Ax=b 的最小二乘解 x ^ = A + b \hat x = A^+ b x^=A+b

可以证明,如果 Q 1 Σ Q 2 T Q_1 \Sigma Q_2^T Q1ΣQ2T A A A 的奇异值分解,那么 A + = Q 2 Σ + Q 1 T A^+=Q_2 \Sigma^+ Q_1^T A+=Q2Σ+Q1T,其中, Q 1 , 2 Q_{1,2} Q1,2 是正交矩阵, Σ \Sigma Σ 是一个由 A A A 的奇异值构成的对角矩阵, Σ + \Sigma^+ Σ+ 是由 A 的奇异值的倒数组成的对角矩阵。

伪逆在最简单的线性回归中的应用

最小二乘回归是最简单的线性回归,下边就用伪逆来计算一下最小二乘回归。并使用了sklearn中的最小二乘回归做对比,比较两者效率的高下。

import numpy as np
n = 9999999
x = np.arange(n)
np.random.seed(123)
y = x + 3 + np.random.standard_normal(n)

# 使用伪逆来计算
import time as t
tic = t.time()
temp = np.ones(n).reshape(-1, 1)
x_aug = np.c_[temp, x]
pinv_x_aug = np.linalg.pinv(x_aug)  # 这个叫伪逆
b1, k1 = np.dot(pinv_x_aug, y)  # 第一个的是截距,第二个是斜率
toc = t.time()
cost_pinv = toc-tic

# 使用sklearn的线性模型来计算
from sklearn import linear_model
tic = t.time()
reg = linear_model.LinearRegression()
reg.fit(x.reshape(-1, 1), y.reshape(-1, 1))
k2 = reg.coef_
b2 = reg.intercept_
toc = t.time()
cost_sklearn = toc-tic


计算结果截图如下

在这里插入图片描述

从结果中看出,两种方法计算得到的斜率和截距都是一样的。但是:

  1. sklearn的耗时大概是使用伪逆方法的一半!

  2. 可见sklearn还是厉害啊!没事就不要自己造轮子了。


  1. SciPy官方:numpy.linalg.pinv ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千行百行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值