我需要適應的功能二維配合蟒蛇
z(u,v) = C u v^p
也就是說,我有一個二維數據集,我必須找到兩個參數,C和P。是否有一些可以以直接的方式做到這一點的numpy或scipy?我看了一下scipy.optimize.leastsq,但我不清楚在這裏如何使用它。
我需要適應的功能二維配合蟒蛇
z(u,v) = C u v^p
也就是說,我有一個二維數據集,我必須找到兩個參數,C和P。是否有一些可以以直接的方式做到這一點的numpy或scipy?我看了一下scipy.optimize.leastsq,但我不清楚在這裏如何使用它。
def f(x,u,v,z_data):
C = x[0]
p = x[1]
modelled_z = C*u*v**p
diffs = modelled_z - z_data
return diffs.flatten() # it expects a 1D array out.
# it doesn't matter that it's conceptually 2D, provided flatten it consistently
result = scipy.optimize.leastsq(f,[1.0,1.0], # initial guess at starting point
args = (u,v,z_data) # alternatively you can do this with closure variables in f if you like
)
# result is the best fit point
針對您的特殊功能,您可能能夠更好地做到這一點 - 例如,對於p
任何給定值存在,可以通過簡單的線性代數來確定C
一個最佳值。
您可以將問題轉換爲簡單的線性最小二乘問題,然後根本不需要leastsq()
。
z[i] == C * u[i] * v[i]**p
成爲
z[i]/u[i] == C * v[i]**p
然後
log(z[i]/u[i]) == log(C) + p * log(v[i])
變化的變量,你可以解決一個簡單的線性問題:
Z[i] == L + p * V[i]
使用numpy
並假設你有數據在陣列z
,u
和v
,這將呈現爲:
Z = log(z/u)
V = log(v)
p, L = np.polyfit(V, Z, 1)
C = exp(L)
你也許應該把try:
和except:
周圍的情況下,一些u
值是零或有負值。
幾個問題:1)u,v製作一個2D網格。我有每個u,v對的數據點。我不需要像np.outer(u,v ** p)這樣的東西嗎? 2)我很驚訝「modelled_z」是「參數」中的第三個參數。我不需要「observed_z」或類似的東西嗎?謝謝。 – 2015-04-01 19:27:54
與np.outer()它工作正常,所以我接受這個答案。 – 2015-04-01 19:40:14
'modelled_z' vs'z_data'對我來說是一個錯誤 - 我已經糾正過了。 'np.outer'確實取決於你如何存儲'u'和'v'。我可能會把'u'定義爲'm','v'和'1 by n',它會像我寫的那樣工作。我假設你已經將它們定義爲一維數組,所以在這種情況下'np.outer'是好的。 – DavidW 2015-04-01 20:28:18