2010-02-12 131 views
2

我有两个函数f和g之间的图。 我知道它遵循指数截止的幂律函数。Python:用指数截点绘制幂律函数

f(x) = x**(-alpha)*e**(-lambda*x) 

如何找到指数alpha的值?

+0

什么是g?你只有图表还是你有价值?在哪个范围(任意大的正数,在0和1之间...)?你知道阿尔法? python以什么方式参与? – LeMiz 2010-02-12 08:30:43

+0

f和g是每个包含100个值的列表。我不知道阿尔法。我想用图来计算它。 – Bruce 2010-02-12 08:43:58

+0

如果您没有任何有关alpha或lambda的信息,那么没有理由给它们一个负号。 :o) – 2010-02-12 09:19:11

回答

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的极限是-α 如果你有x的值很大,函数x - > LN(F(X))”当x趋于无穷时,趋向于lambda,所以你可以猜测lambda并使用pwdyson's表达。

如果您还没有关闭X分,数值导会很吵,所以我会尝试猜测拉姆达为-ln(f(x)/x大型X的极限......

如果没有较大的值,但大量的X的,你可以尝试在字母和拉姆达(我想这将是比最初的表达更精确)... 这是一个简单的至少

 
sum_x_i (ln(y_i) + alpha ln(x_i) + lambda x_i) ^2 

最小化平方回归(numpy.linalg.lstsq将完成这项工作)。 所以你有很多方法,选择的方法真的取决于你的输入。

+0

做一个回归之前尝试一些好的东西作为最后的手段 – pwdyson 2010-02-12 09:05:28

+0

好的一点,关于问题本质上是线性的。你可能是指'numpy.linalg.lstsq',虽然...... – EOL 2010-02-14 21:24:08

+0

当然是......编辑! – LeMiz 2010-02-15 08:35:23

0

如果您知道点遵循这一规律完全相同,则反转方程,并把在x和其对应的F(X)值:

import math 
alpha = -(lambda*x + math.log(f(x)))/math.log(x) 

但如果点不完全符合等式,你需要做一些回归来确定alpha。

编辑:好的,所以他们不完全适合。这超出了Python的问题,但可能会有一些可以处理它的numpy。这里是numpy linear regression recipe,但你的方程不能重新排列成线性形式,所以你必须考虑非线性回归。

+0

没有点不完全符合方程。我有每个f和g 100个值。从图中我发现这是一个指数截断的幂律。我现在想找出阿尔法。该方程不完全适合图形。 – Bruce 2010-02-12 08:45:29

2

做你想做的事情的一般和一般方法是执行非线性回归(尽管如另一个回答中指出的那样,可以线性化问题)。在许多科学家使用的SciPy软件包的帮助下,Python可以很容易地完成这项工作。

你正在寻找的例程是它的least-square optimization routine(scipy.optimize.leastsq)。一旦你围绕着这个通用优化程序的工作方式(见示例),你可能会发现许多其他的机会来使用它。基本上,您可以计算您的测量结果与其理想值之间的差异列表,并且您要求SciPy找到使这些差异尽可能小的参数,以便您的数据尽可能符合模型。然后这给你你正在寻找的参数。

2

这听起来像是你可能试图将一个幂定律拟合到一个由于不完整而在低端指数截断的分布 - 但是我可能对你的问题读得太多了。

如果这是您正在处理的问题,则本网站(及随附出版物)解决此问题:http://tuvalu.santafe.edu/~aaronc/powerlaws/。我在该页面上编写了幂函数钳工的python实现;它从那里链接。