我有一个由20个实数组成的向量X和一个由20个实数组成的向量Y。
我想把它们建模为
y = ax^2+bx + c如何找出'a‘,'b’和'c‘的值以及最佳拟合二次方程。
给定值
X = (x1,x2,...,x20)
Y = (y1,y2,...,y20)我需要一个公式或过程来查找以下值
a = ???
b = ???
c = ???提前谢谢。
发布于 2014-01-16 19:41:50
@Bartoss说的每件事都是对的,+1。我想我只是在这里添加了一个实际的实现,没有QR分解。您希望评估a,b,c的值,使测量数据和拟合数据之间的距离最小。您可以选择作为度量
sum(ax^2+bx + c -y)^2)其中和在向量x,y的元素上。
然后,最小值意味着量关于a,b,c中每一个的导数为零:
d (sum(ax^2+bx + c -y)^2) /da =0
d (sum(ax^2+bx + c -y)^2) /db =0
d (sum(ax^2+bx + c -y)^2) /dc =0这些方程式是
2(sum(ax^2+bx + c -y)*x^2)=0
2(sum(ax^2+bx + c -y)*x) =0
2(sum(ax^2+bx + c -y)) =0除以2,上面的代码可以重写为
a*sum(x^4) +b*sum(x^3) + c*sum(x^2) =sum(y*x^2)
a*sum(x^3) +b*sum(x^2) + c*sum(x) =sum(y*x)
a*sum(x^2) +b*sum(x) + c*N =sum(y)在你的情况下N=20在哪里。下面是一段简单的python代码,展示了如何做到这一点。
from numpy import random, array
from scipy.linalg import solve
import matplotlib.pylab as plt
a, b, c = 6., 3., 4.
N = 20
x = random.rand((N))
y = a * x ** 2 + b * x + c
y += random.rand((20)) #add a bit of noise to make things more realistic
x4 = (x ** 4).sum()
x3 = (x ** 3).sum()
x2 = (x ** 2).sum()
M = array([[x4, x3, x2], [x3, x2, x.sum()], [x2, x.sum(), N]])
K = array([(y * x ** 2).sum(), (y * x).sum(), y.sum()])
A, B, C = solve(M, K)
print 'exact values ', a, b, c
print 'calculated values', A, B, C
fig, ax = plt.subplots()
ax.plot(x, y, 'b.', label='data')
ax.plot(x, A * x ** 2 + B * x + C, 'r.', label='estimate')
ax.legend()
plt.show()

实现解决方案的一种更快的方法是使用非线性最小二乘算法。这样写起来会更快,但运行起来不会更快。使用由scipy提供的一个,
from scipy.optimize import leastsq
def f(arg):
a,b,c=arg
return a*x**2+b*x+c-y
(A,B,C),_=leastsq(f,[1,1,1])#you must provide a first guess to start with in this case.发布于 2014-01-16 18:18:23
这是一个linear least squares problem。我认为给出准确结果的最简单的方法是QR decomposition using Householder reflections。这不是在stackoverflow答案中需要解释的东西,但我希望你能找到这个链接所需要的所有东西。
如果你以前从未听说过这些,并且不知道它如何与你的问题联系在一起:
A = [[x1^2, x1, 1]; [x2^2, x2, 1]; ...]
Y = [y1; y2; ...]现在,您希望找到v = [a; b; c],使A*v尽可能接近Y,这正是最小二乘问题的全部内容。
https://stackoverflow.com/questions/21158765
复制相似问题