np.linalg.lstsq()进行线性回归拟合

np.linalg.lstsq()进行线性回归拟合

1.函数意义

明确这个函数的原义是用来求超定线性方程组的:

image-20210830092448990

系数矩阵的第一列相当于给定了x的观测值 X=[0,1,2,3].transpose

右边的结果矩阵相当于给定了y的观测值 Y=[-1,0.2,0.9,2.1].transpose

然后使用两个观测值来拟合经验函数 y=mx+c

系数矩阵的第二列存在的意义有点类似于机器学习中的偏置θ0,用于和C相乘,注意这是必要的,在只给定观测值的情况下,我们也常常需要np.ones_like(X的长度来构建有这一“无效列”的矩阵.

2.函数参数详解

**lstsq(a,b,rcond=“warn”)**函数的参数详解(下面的矩阵都是array_like(类数组对象)):

  • a是一个M行N列的系数矩阵,前面说过需要构造np.ones_like(M)

  • b是一个(M,)或者(M,K),如果b是一个M行K列的二维矩阵,函数会逐个计算每一列的最小二乘法

  • rcond这个参数是可选的,是用于奇异矩阵的处理的,感兴趣的可以自行查看源码,官方推荐我们一般用 rcond=None

**返回值:**以下提到的所有矩阵都是ndarray, NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引):

  • x : {(N,), (N, K)} ndarray

    (如果前面的b是二维的,那么这里也会有k列的a和b结果)

  • residuals : {(1,), (K,), (0,)} ndarray

  • rank: int

  • a 的奇异值

返回值重点关注返回集合中的x就行,所以我们一般的用法是lstsq()[0]

Examples

Fit a line, y = mx + c, through some noisy data-points:


>>> x = np.array([0, 1, 2, 3])
>>> y = np.array([-1, 0.2, 0.9, 2.1])

By examining the coefficients, we see that the line should have a gradient of roughly 1 and cut the y-axis at, more or less, -1.
We can rewrite the line equation as y = Ap, where A = [[x 1]] and p = [[m], [c]]. Now use lstsq to solve for p:

>>> A = np.vstack([x, np.ones(len(x))]).T
>>> A
array([[ 0.,  1.],
       [ 1.,  1.],
       [ 2.,  1.],
       [ 3.,  1.]])
>>> m, c = np.linalg.lstsq(A, y, rcond=None)[0]
>>> m, c
(1.0 -0.95) # may vary

Plot the data along with the fitted line:

>>> import matplotlib.pyplot as plt
>>> _ = plt.plot(x, y, 'o', label='Original data', markersize=10)
>>> _ = plt.plot(x, m*x + c, 'r', label='Fitted line')
>>> _ = plt.legend()
>>> plt.show()

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vCEvKRP-1630568732882)(https://i.loli.net/2021/08/30/X8dP3pFSYRMultV.png)]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值