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 Scipyleastsq
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. .
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
@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
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