Python: 绘制带指数截止的幂律函数

2 投票
4 回答
2975 浏览
提问于 2025-04-15 19:11

我有两个函数 f 和 g 之间的图形。
我知道这个图形遵循一种叫做幂律函数的规律,并且有一个指数截断。

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

我该怎么找到指数 alpha 的值呢?

4 个回答

2

听起来你可能是在尝试将一个幂律模型应用到一个分布上,但这个分布在低值部分因为不完整而出现了指数截断——不过我可能对你的问题理解得有点过了。

如果这确实是你遇到的问题,这个网站(以及相关的出版物)可以帮助你解决这个问题:http://tuvalu.santafe.edu/~aaronc/powerlaws/。我在那个页面上写了幂律拟合器的Python实现,你可以从那里找到链接。

2

你想要做的事情一般来说是进行非线性回归(虽然有些人提到过,可以把问题变成线性的来处理)。在Python中,这个过程其实很简单,可以借助一个叫做SciPy的工具包,很多科学家都在用它。

你需要找的功能是它的最小二乘优化例程(scipy.optimize.leastsq)。一旦你理解了这个优化过程是怎么运作的(可以参考一下例子),你会发现还有很多其他地方可以用到它。简单来说,你需要计算你测量值和理想值f(x)之间的差异,然后请SciPy帮你找到那些能让这些差异尽可能小的参数,这样你的数据就能尽量贴合模型。最终,这样你就能得到你想要的参数了。

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趋向于无穷大时会接近λ,所以你可以猜测λ并使用pwdyson的表达式。

如果你的x点不够近,数值导数会变得很嘈杂,所以我建议你可以猜测λ,方法是计算-ln(f(x)/x在大x值下的极限...

如果你没有很大的值,但有很多x点,你可以尝试对

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

同时对α和λ进行最小化(我觉得这样会比最初的表达式更准确)...这其实就是一个简单的最小二乘回归(numpy.linalg.lstsq可以完成这个工作)。所以你有很多方法可以选择,具体用哪种方法真的取决于你的输入数据。

撰写回答