经常涉及到这些小操作,每次都没整理,下次用的时候又得百度,麻烦,干脆整理下,下次使用直接翻笔记了!
>>> x
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> y
array([2, 5, 8])
A=np.vstack([x,np.ones(x.shape[-1])]).T
>>> A
array([[1., 4., 7., 1.],
[2., 5., 8., 1.],
[3., 6., 9., 1.]])
直观的从例子可以看出A就是x另外加上全1的行,两个连接起来,然后转置。
4. 接下来使用lstsq(ndarray)来计算AB=y的最小二乘解:
B=np.linalg.lstsq(A,y)[0]
>>> B
array([ 2.57894737, 1. , -0.57894737, -0.52631579])
m=B[:-1]
>>> m 注意这是除常数的其它系数了
array([ 2.57894737, 1. , -0.57894737])
c=B[-1]
>>> c 注意这是常数项系数
-0.5263157894736847
那显然可以知道,拟合出的线是啥(为了简单,我们就当成直线哇,和帮助吻合,看起来更容易懂)?pre=np.sum(m*x.T,axis=1)+c
原始的线是y, So:
pre=np.sum(m*x.T,axis=1)+c
>>> pre 注意这里m.shape=(3L,),x.shape=(3L,3L),这俩乘积是用m的每个元素分别乘以x的每一列,形成新的(3L,3L)矩阵,要注意理解背后的原理,别被忽悠了!
array([2., 5., 8.])
res=y-pre