文章目录
- 线性最小二乘法
- 函数解释
- 实现思路
线性最小二乘法
记1790,1800,···,2000分别用k=1,2···,22表示,利用向前差分,得到差分方程
其中步长,下面对其中给的参数r和s进行拟合(这里因为是线性最小二乘法)
所以我们使用前面介绍过的numpy的linalg方法来进行参数的拟合):
import numpy as np
d=np.loadtxt("Pdata8_10_2.txt") #加载文件中的数据
t0=d[0]; x0=d[1] #提取年代数据及对应的人口数据
#我们这里只取二十一个数据来进行拟合
b=np.diff(x0)/10/x0[:-1] #构造线性方程组的常数项列
a=np.vstack([np.ones(len(x0)-1),-x0[:-1]]).T #构造线性方程组系数矩阵
rs=np.linalg.pinv(a)@b; r=rs[0]; xm=r/rs[1]
print("人口增长率r和人口最大值xm的拟合值分别为", np.round([r,xm],4))
xhat=xm/(1+(xm/3.9-1)*np.exp(-r*(2010-1790))) #求预测值
print("2010年的预测值为:",round(xhat,4))
函数解释
Numpy.linalg模块的pinv()求其广义逆矩阵
np.round(对给定的数组进行四舍五入,可以指定精度)
x0[:-1]就是除去了最后一个值剩下的部分
np.diff numpy.diff(a, n=1,axis=-1) 沿着指定轴计算第N维的离散差值
参数:
a:输入矩阵
n:可选,代表要执行几次差值
axis:默认是最后一个
实际就是沿着指定的轴执行后一个元素减前一个元素
@ 用于对两个numpy数组实现矩阵乘法
实现思路
函数的实现思路就是把线性组合ax+r=b 化成矩阵相乘 np.dot(a,rx) 的形式
这样就变成了一个AX=b的线性方程组 再用逆矩阵求解出X 也就得到了rank为1的参数数组
这对于一元线性组合是很有用的也是很取巧的一种办法