我有两个函数f和g之间的图表。 我知道它遵循具有指数截止的幂律函数。
f(x) = x**(-alpha)*e**(-lambda*x)
如何找到指数alpha的值?
答案 0 :(得分:3)
如果您有足够接近的x点(例如每0.1一个),您可以尝试以下方法:
ln(f(x)) = -alpha ln(x) - lambda x ln(f(x))' = - alpha / x - lambda
因此,取决于您的积分: 如果你有很多积分接近0,你可以尝试:
h(x) = x ln(f(x))' = -alpha - lambda x
因此当x变为0时函数h的极限是-alpha 如果你有大的x值,函数x - >当x变为无穷大时,ln(f(x))'倾向于lambda,所以你可以猜测lambda并使用pwdyson的表达式。
如果你没有接近的x点,那么数值导数会非常嘈杂,所以我会尝试将lambda猜测为大x的-ln(f(x)/x
的极限......
如果你没有大的值,但是有大量的x,你可以尝试最小化
sum_x_i (ln(y_i) + alpha ln(x_i) + lambda x_i) ^2alpha和lambda上的
(我猜它会比初始表达更精确)......
这是一个简单的最小二乘回归(numpy.linalg.lstsq
将完成这项工作)。
所以你有很多方法,选择的方法实际上取决于你的输入。
答案 1 :(得分:2)
执行所需操作的通常和一般方法是执行非线性回归(尽管如另一个响应中所述,可以将问题线性化)。 Python可以在许多科学家使用的SciPy包的帮助下轻松完成这项工作。
您正在寻找的例程是least-square optimization routine(scipy.optimize.leastsq)。一旦你围绕这个通用优化程序的工作方式(参见示例),您可能会发现许多其他机会使用它。基本上,您计算测量值与理想值f(x)
之间的差异列表,并且您要求SciPy找到使这些差异尽可能小的参数,以便您的数据尽可能地适合模型。然后,它会为您提供所需的参数。
答案 2 :(得分:2)
听起来你可能试图将幂律拟合到由于不完整而在低端指数截止的分布 - 但我可能正在读你的问题太多。
如果这是您正在处理的问题,本网站(及随附的出版物)将解决此问题:http://tuvalu.santafe.edu/~aaronc/powerlaws/。我在那个页面上编写了power-law fitter的python实现;它是从那里链接的。
答案 3 :(得分:0)
如果你知道这些点完全遵循这个定律,那么反转方程并输入一个x及其对应的f(x)值:
import math
alpha = -(lambda*x + math.log(f(x)))/math.log(x)
但如果这些点不完全符合等式,则需要进行某种回归以确定alpha。
编辑:好的,所以他们并不完全适合。这超出了Python的问题,但可能有一些可以处理它的numpy。这是一个numpy linear regression recipe,但你的方程不能重新排列成线性形式,所以你必须考虑非线性回归。