给出以下xs和ys集:
xs = [8294400,2073600,921600,409920]
ys = [124,433,853,1449]
在Excel中使用幂律可以得到一个很好的近似值:
Excel找到了a(x^b)
形式的函数。如何在C#中确定a
和b
?我尝试使用Math.Net数字,但我没有看到任何适用于此形式的函数的方法。 Linear Regression module中的所有函数只能找到各种形式函数的线性系数,但似乎没有一个能够确定指数。
答案 0 :(得分:5)
你想要的等式如下:
Response.Write
采取双方的自然日志:
y = a*x^b
现在,您可以对新变换后的变量ln(y) = ln(a*x^b) = ln(a) + b*ln(x)
使用线性回归,并计算出您想要的两个参数:(ln(x), ln(y))
和ln(a)
。
答案 1 :(得分:1)
在指数系统中,进行回归的最佳方法可能是在对数刻度上进行线性回归。为了澄清,即使你的函数不是线性的,采用等式两边的自然对数也会得到一个更线性的系统
非线性函数:y = a x^b
然后变为ln(y) = ln(a x^b) = ln(a) b ln(x)
在Math.NET Numerics中,编写代码的好方法可能是:
var y = y.Select(r => Math.Log(r)).ToArray(); // transform y = ln(z)
double[] w = Fit.LinearCombination(xy, z_hat,
d => 1.0,
d => Math.Log(d[0]),
d => Math.Log(d[1]))
或者,如果您想让它返回一个功能,您可以使用LinearCombinationFunc()
来源:http://numerics.mathdotnet.com/Regression.html和http://numerics.mathdotnet.com/api/MathNet.Numerics/Fit.htm