python实现最小二乘拟合/平方逼近问题

本文介绍python实现最小二乘拟合/平方逼近问题的方法

最优平方逼近问题的定义为:

python实现最小二乘拟合/平方逼近问题
可以使用正规方程组求解:
python实现最小二乘拟合/平方逼近问题
解方程即得 ( c 0 , c 1 , . . . , c n ) (c_0, c_1, ..., c_n) (c0​,c1​,...,cn​),即为拟合式的系数。

当拟合式为多项式时:
python实现最小二乘拟合/平方逼近问题

正规方程组可以转化为:
python实现最小二乘拟合/平方逼近问题
用python语言描述正规方程组的求解过程如下:

def mox(n):
    sum = 0
    for i in x:
        sum += pow(i, n)
    return sum

def moy(n):
    sum = 0
    for i, j in zip(x, y):
        sum += pow(i, n) * j
    return sum

def p(i):
    p = 0
    for idx, k in enumerate(c):
        p += k * pow(i, idx)
    return p

def compute_error(c):
    error = 0
    for i, j in zip(x, y):
        error += pow(p(i)-j, 2)
    return math.sqrt(error)

def compute(n):
    global c
    A = np.zeros((n, n))
    for i in range(n):
        for j in range(n):
            A[i, j] = A[j, i] = mox(i+j)
    b = np.zeros(n)
    for i in range(n):
        b[i] = moy(i)
    print('A = ', A)
    print('b = ', b)
    c = np.matmul(np.linalg.inv(A), b)
    print('c = ', c)
    error = compute_error(c)
    print('error = ', error)

使用一道例题来检验一下:
python实现最小二乘拟合/平方逼近问题
输入例题:

 x = [0.25*i for i in range(5)]
 y = [1.0000, 1.2840, 1.6487, 2.1170, 2.7183]
 compute(n=3)

输出结果:

A =  [[5.        2.5       1.875    ]
 [2.5       1.875     1.5625   ]
 [1.875     1.5625    1.3828125]]
b =  [8.768     5.4514    4.4015375]
c =  [1.00513714 0.86418286 0.84365714]
error =  0.016556949339433698

拟合曲线和数据点的可视化结果为:
python实现最小二乘拟合/平方逼近问题
和手算的结果对比可发现他们是一致的:

python实现最小二乘拟合/平方逼近问题

上一篇:unity HDRcolor面板的intensity 获取和设置


下一篇:八大排序算法总结与java实现(转)