2010-02-12 120 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實現;它從那裏鏈接。