我有一堆数据,通常是以这种形式呈现:
a, b, c, ..., y
其中y = f(a, b, c...)
它们大多数都是三个或四个变量,并且有10k-10M的记录。我的基本假设是它们具有代数性质,例如:
y = P1 a^E1 + P2 b^E2 + P3 c^E3
不幸的是,我上一次统计分析课已经是20年前的事了。有什么简单的方法可以很好地近似f吗?最好是开源工具且学习曲线非常低(即我可以在一个小时左右获得不错的近似值)。谢谢!
我有一堆数据,通常是以这种形式呈现:
a, b, c, ..., y
其中y = f(a, b, c...)
它们大多数都是三个或四个变量,并且有10k-10M的记录。我的基本假设是它们具有代数性质,例如:
y = P1 a^E1 + P2 b^E2 + P3 c^E3
不幸的是,我上一次统计分析课已经是20年前的事了。有什么简单的方法可以很好地近似f吗?最好是开源工具且学习曲线非常低(即我可以在一个小时左右获得不错的近似值)。谢谢!
如果有用的话,这里是一个Numpy/Scipy (Python)模板来实现你想要的:
from numpy import array
from scipy.optimize import leastsq
def __residual(params, y, a, b, c):
p0, e0, p1, e1, p2, e2 = params
return p0 * a ** e0 + p1 * b ** e1 + p2 * c ** e2 - y
# load a, b, c
# guess initial values for p0, e0, p1, e1, p2, e2
p_opt = leastsq(__residual, array([p0, e0, p1, e1, p2, e2]), args=(y, a, b, c))
print 'y = %f a^%f + %f b^%f %f c^%f' % map(float, p_opt)
如果你真的想理解正在发生的事情,那么你需要投入时间去学习一些工具或者编程环境-我真的认为没有任何绕过这个步骤的方法。人们通常不会专门为做类似于三项幂回归之类的事情编写专用工具。
输入 | 输出 |
---|---|
a1,b1, | y1 |
a2,b2, | y2 |
... | ... |
aN,bN, | yN |
如果你想要拟合一个二次多项式,形如 y = c1a^2b^2 + c2a^2b + c3a^2 + c4ab^2 + c5ab + c6a + c7b^2 + c8b + c9,那么你的 X 矩阵将会是:
a1^2*b1^2 | a1^2*b1 | a1^2 | a1*b1^2 | a1*b1 | a1 | b1^2 | b1 | 1 |
a2^2*b2^2 | a2^2*b2 | a2^2 | a2*b1^2 | a2*b2 | a2 | b2^2 | b2 | 1 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
aN^2*bN^2 | aN^2*bN | aN^2 | aN*bN^2 | aN*bN | aN | bN^2 | bN | 1 |
y1 |
y2 |
... |
yN |
c1 |
c2 |
c3 |
c4 |
c5 |
c6 |
c7 |
c8 |
c9 |
x = 0:0.1:10;
y = 5.*x.^2 + 4.*x + 3;
% Add noise to y data
y = y + randn(size(y))*0.1;
% Estimate coefficients of polynomial
p = polyfit(x,y,2)
ans =
5.0886 3.9050 2.9577
如果你对 f 的形式有猜测,[*] 你需要一个最小化器来找到最优参数。Scottie T 建议的工具 可以使用,ROOT 也可以,还有许多其他工具。
如果你不知道 f 可能采取什么形式,那你真的很麻烦。
[*] 意思是,你知道
f = f(x,y,z,w,...;p1,p2,p3...)
其中p
是参数,而坐标是x
、y
等等。