1

numpy.optimize.curve_fit を使用して、オン/オフ シーケンスの周波数と位相を推定しようとしています。これは私が使用しているコードです:

from numpy import *
from scipy import optimize

row = array([0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0,])

def fit_func(x, a, b, c, d):
    return c * sin (a * x + b) + d

p0 = [(pi/10.0), 5.0, row.std(), row.mean()]
result = optimize.curve_fit(fit_func, arange(len(row)), row, p0)
print result

これは機能します。しかし、一部の行では、完全に問題ないように見えても失敗します。失敗した行の例:

row = array([1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0, 0.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0, 0.0,  0.0,  0.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  0.0,  0.0,  0.0,  0.0, 0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  0.0,  0.0, 0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0,  1.0, 1.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,  0.0,])

エラーは次のとおりです。

RuntimeError: 最適なパラメーターが見つかりません: 平方和の実際の相対削減と予測された相対削減の両方が最大 0.000000 であり、2 つの連続する反復間の相対誤差は最大 0.000000 です

何が起こったのかほとんど教えてくれません。簡単なテストでは、p0 のパラメーターを変更すると、その行が成功し、他の行が失敗することがわかります。何故ですか?

4

1 に答える 1

2

あなたが提供した両方のデータ行を試してみましたが、どちらもうまくいきました。Scipy 0.8.0rc3 を使用しています。どのバージョンを使用していますか? 役立つかもしれないもう 1 つの方法は、c と d を固定値に設定することです。これは、実際には毎回同じにする必要があるためです。c を 0.6311786 に、d を .5 に設定しました。別の方法が必要な場合は、ピークの周りにゼロパディングと二次フィッティングを備えた fft を使用して周波数を見つけることもできます。実際、基本周波数を探しているので、どのピッチ推定方法も適用できます。

于 2010-10-12T16:15:53.093 に答える