6

一部のデータに曲線を当てはめるのに少し問題がありますが、どこが間違っているのかわかりません。

過去に、指数関数にはnumpy.linalg.lstsqを、シグモイド関数にはscipy.optimize.curve_fitを使用してこれを行いました。今回は、さまざまな関数を指定し、パラメーターを決定し、データに対する適合性をテストできるスクリプトを作成したいと考えました。これを行っているときに、Scipyと Numpyが同じデータ セットと同じ関数に対して異なる答えを提供しているように見えることに気付きました。関数は単純で、 atのように制約されます。leastsqlstsqy = e^(l*x)y=1x=0

Excel のトレンド ラインは Numpy の結果と一致していますlstsqが、Scipyleastsqは任意の関数を使用できるため、何が問題なのかを突き止めるとよいでしょう。

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()

編集 - 追加情報

上記の MWE には、データセットの小さなサンプルが含まれています。実際のデータをフィッティングすると、scipy.optimize.curve_fit曲線は R^2 0.82 を示しますが、Excel で計算されたものと同じnumpy.linalg.lstsq曲線の R^2 は 0.41 です。

4

2 に答える 2

4

さまざまなエラー関数を最小限に抑えています。

を使用するnumpy.linalg.lstsqと、最小化される誤差関数は

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

whilescipy.optimize.leastsqは関数を最小化します

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

最初のケースでは、従属変数と独立変数の間の線形依存関係が必要ですが、解は分析的にわかっています。2 番目のケースでは、任意の依存関係を処理できますが、反復法に依存しています。

別のメモとして、私は今それをテストすることはできませんが、を使用する場合、ゼロの行を使用numpy.linalg.lstsqする必要はありません。次も同様に機能します。vstack

l2 = np.linalg.lstsq(x[:, None], np.log(y))[0][0]
于 2013-01-16T04:32:08.327 に答える