سؤال

أحاول استخدام numpy.optimize.curve_fit لتقدير تواتر ومرحلة تسلسل ON/OFF. هذا هو الرمز الذي أستخدمه:

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 والخطأ النسبي بين اثنين من التكرارات المتتالية على الأقل 0.000000

الذي يخبرني القليل جدًا بما حدث. يوضح الاختبار السريع أن تغيير المعلمات في P0 سيؤدي إلى تنجاح هذا الصف ... والآخرون يفشلون. لماذا هذا؟

هل كانت مفيدة؟

المحلول

جربت كلا الصفوف من البيانات التي قدمتها وعملت لي على ما يرام. أنا أستخدم Scipy 0.8.0rc3. ما هو إصدار الذي تستخدمه؟ شيء آخر قد يساعد في تعيين C و D على القيم الثابتة لأنها يجب أن تكون هي نفسها في كل مرة. قمت بتعيين C إلى 0.6311786 و D إلى .5. يمكنك أيضًا استخدام FFT مع حشوة صفرية وتركيب تربيعي حول الذروة للعثور على التردد إذا كنت تريد طريقة أخرى. حقا ، أي طريقة تقدير الملعب قابلة للتطبيق لأنك تبحث عن التردد الأساسي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top