2013-01-16 33 views
6

Bazı verilere eğri uydurma konusunda biraz sorun yaşıyorum, ancak yanlış gittiğim yerde çalışamıyorum. Sayısal ve scipy'de üstel kayma eğrisi uydurma

Geçmişte üstel fonksiyonlar için numpy.linalg.lstsq ve sigmoid fonksiyonlar için scipy.optimize.curve_fit ile bu yapmış. Bu sefer çeşitli işlevleri belirtmeme, parametreleri belirlemeye ve verilere karşı uygunluğunu test etmeme izin veren bir betik oluşturmayı istedim. Bunu yaparken Scipy leastsq ve Numpy lstsq'un aynı veri kümesi ve aynı işlev için farklı yanıtlar sağladığını fark ettim. Bu fonksiyon sadece y = e^(l*x) olup numaralı telefondan y=1 ile sınırlıdır.

Excel eğilim çizgisi, Numpy lstsq sonucuyla aynı fikirde ancak Scipy leastsq'un herhangi bir işlevi alabildiğinden, sorunun ne olduğunu bulmak güzel olurdu.

import scipy.optimize as optimize 
import numpy as np 
import matplotlib.pyplot as plt 

## Sampled data 
x = np.array([0, 14, 37, 975, 2013, 2095, 2147]) 
y = np.array([1.0, 0.764317544, 0.647136491, 0.070803763, 0.003630962,  0.001485394,  0.000495131]) 

# function 
fp = lambda p, x: np.exp(p*x) 

# error function 
e = lambda p, x, y: (fp(p, x) - y) 

# using scipy least squares 
l1, s = optimize.leastsq(e, -0.004, args=(x,y)) 
print l1 
# [-0.0132281] 


# using numpy least squares 
l2 = np.linalg.lstsq(np.vstack([x, np.zeros(len(x))]).T,np.log(y))[0][0] 
print l2 
# -0.00313461628963 (same answer as Excel trend line) 

# smooth x for plotting 
x_ = np.arange(0, x[-1], 0.2) 

plt.figure() 
plt.plot(x, y, 'rx', x_, fp(l1, x_), 'b-', x_, fp(l2, x_), 'g-') 
plt.show() 

Düzenleme - MWE üzerinde veri kümesi küçük bir örnek içerir

ek bilgiler. Gerçek verileri uydururken, scipy.optimize.curve_fit eğrisi, 0,82 R^2 sunar, Excel tarafından hesaplananla aynı numpy.linalg.lstsq eğrisi, 0,41 R^2 değerine sahiptir. .

cevap

4

Farklı hata işlevlerini en aza indiriyorsunuz. Eğer numpy.linalg.lstsq kullandığınızda

, minimize edilen hata fonksiyonu scipy.optimize.leastsq

np.sum((y - np.exp(p * x))**2) 

birinci durumda bağımlı ve bağımsız değişkenler arasındaki bir doğrusal bağımlılığın gerektirir fonksiyonunu en ise

np.sum((np.log(y) - p * x)**2) 

olmakla Çözüm analitik olarak bilinir, ikincisi herhangi bir bağımlılığı ele alabilir, ancak yinelemeli bir yönteme dayanır.

l2 = np.linalg.lstsq(x[:, None], np.log(y))[0][0] 
+0

Teşekkürler @Jaime - harika cevap!Ne yazık ki matematik bilgim o kadar da iyi değil; bir yazım ya da yanlış [aynı zamanda yukarıdaki düzenlemeye bakınız], yoksa temelde farklı mıdırlar? Diğer işlevlerin etkileri nelerdir, örneğin, bir Sigmoid veya Gompertz eğrisinin aynı verilere uymasını test etmek isteseydim? – StacyR

+0

@StacyR Sorunuzu düzgün bir şekilde cevaplayabilmek için gereken bilgiye sahip değilim, ancak np.linalg.lstsq ile yaptığınız gibi bir üstelin uydurmasının sadece hesaplanamayan bir hiledir. hatalar düzgün. Burada biraz tartışma var (takip etmem zor): http://mathworld.wolfram.com/LeastSquaresFittingExponential.html Eğer bu konuya gerçekten dalmak istemezseniz, her şey için scipy'nin yöntemine giderdim. daha iyi uyum sağlamalı ve sonuçlarınız tüm işlevler için tutarlı olacaktır. – Jaime

+0

tekrar teşekkürler! Bu konuda daha fazla araştırma yaptım ve bahsettiğiniz gibi, 'np.linalg.lstsq' yönteminin, düşük x değerlerinde y-hatalarını aşırı derecede ağırladığını tespit ettim. Paylaştığınız bağlantı ve bulduğum diğer kaynaklar, başka bir analitik yöntem türetmeme izin verdi (bunu zorlaştıran şey kısıtlamadır --- tüm kitaplar y = a * e^b * x yöntemini tanımlar. Bununla birlikte, y = e^b * x), bu aynı zamanda, iteratif "scipy.optimize.leastsq" den daha kötü bir uydurma eğrisi de üretir. – StacyR

1

için: numpy.linalg.lstsq kullanırken

Ayrı bir not

, Sana, aşağıdaki işleri de vstack için sıfır bir sıra gerekmez, şu anda test, ama olamaz Jaime'nin noktasından biraz bahseder, verilerin herhangi bir doğrusal olmayan dönüşümü farklı bir hata fonksiyonuna ve dolayısıyla farklı çözümlere yol açacaktır. Bunlar, uydurma parametreleri için farklı güven aralıklarına yol açacaktır. Yani bir karar vermek için kullanmak için üç olası kriteriniz var: En aza indirmek istediğiniz hata, daha fazla güvenmek istediğiniz parametreler ve son olarak, eğer bir değeri tahmin etmek için bağlantı parçasını kullanıyorsanız, hangi yöntemin daha az hata verdiğini, tahmini değer. Analitik olarak ve Excel'de biraz oynamak, verilerde farklı gürültü türlerinin (örneğin, gürültü fonksiyonu genliği ölçeklendirir, zaman sabitini veya katkısını etkilerse) farklı çözüm seçeneklerine yol açtığını gösterir.

Ayrıca, bu hile, üstel çürüme için 0 "çalışır", ancak, daha genel (ve ortak) durumda sönük üslü (yükselen veya düşen) durumda olamayacak değerler için kullanılamaz 0 olarak kabul edildi

İlgili konular