هل هناك طريقة سهلة في بيثون لاستقراء نقاط البيانات إلى المستقبل؟

StackOverflow https://stackoverflow.com/questions/1599754

سؤال

لدي صفيف numpy بسيط ، لكل تاريخ هناك نقطة بيانات. شيء من هذا القبيل:

>>> import numpy as np
>>> from datetime import date
>>> from datetime import date
>>> x = np.array( [(date(2008,3,5), 4800 ), (date(2008,3,15), 4000 ), (date(2008,3,
20), 3500 ), (date(2008,4,5), 3000 ) ] )

هل هناك طريقة سهلة لاستقراء نقاط البيانات إلى المستقبل: التاريخ (2008،5،1) ، التاريخ (2008 ، 5 ، 20) وما إلى ذلك؟ أنا أفهم أنه يمكن القيام به مع الخوارزميات الرياضية. لكنني هنا أسعى للحصول على بعض الفاكهة المعلقة المنخفضة. في الواقع ، أحب ما يفعله numpy.linalg.solve ، لكنه لا يبدو قابلاً للتطبيق على الاستقراء. ربما أنا مخطئ تماما.

في الواقع لأكون أكثر تحديداً ، أقوم ببناء مخطط محترق (مصطلح XP): سوف يذهب إذا استمر الوضع الحالي. وأخيراً أريد التنبؤ بتاريخ الإصدار. لذا فإن طبيعة "حجم العمل الذي يتعين القيام به" هو أن تنخفض دائمًا على الرسوم البيانية المحترقة. كما أرغب في الحصول على تاريخ الإصدار الاستقراء: التاريخ عندما يصبح حجم الصوت صفرًا.

هذا كل شيء لإظهاره لفريق ديف كيف تسير الأمور. الدقة ليست مهمة للغاية هنا :) دوافع فريق DEV هو العامل الرئيسي. هذا يعني أنني بخير تمامًا مع تقنية الاستقراء التقريبية للغاية.

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

المحلول

من السهل جدًا أن يولد القمامة ؛ جرب هذا. العديد من الاستقراء المختلفة ممكنة بالطبع ؛ ينتج البعض القمامة الواضحة ، وبعض القمامة غير الواضحة ، والكثير منها غير محدد.

alt text

""" extrapolate y,m,d data with scipy UnivariateSpline """
import numpy as np
from scipy.interpolate import UnivariateSpline
    # pydoc scipy.interpolate.UnivariateSpline -- fitpack, unclear
from datetime import date
from pylab import *  # ipython -pylab

__version__ = "denis 23oct"


def daynumber( y,m,d ):
    """ 2005,1,1 -> 0  2006,1,1 -> 365 ... """
    return date( y,m,d ).toordinal() - date( 2005,1,1 ).toordinal()

days, values = np.array([
    (daynumber(2005,1,1), 1.2 ),
    (daynumber(2005,4,1), 1.8 ),
    (daynumber(2005,9,1), 5.3 ),
    (daynumber(2005,10,1), 5.3 )
    ]).T
dayswanted = np.array([ daynumber( year, month, 1 )
        for year in range( 2005, 2006+1 )
        for month in range( 1, 12+1 )])

np.set_printoptions( 1 )  # .1f
print "days:", days
print "values:", values
print "dayswanted:", dayswanted

title( "extrapolation with scipy.interpolate.UnivariateSpline" )
plot( days, values, "o" )
for k in (1,2,3):  # line parabola cubicspline
    extrapolator = UnivariateSpline( days, values, k=k )
    y = extrapolator( dayswanted )
    label = "k=%d" % k
    print label, y
    plot( dayswanted, y, label=label  )  # pylab

legend( loc="lower left" )
grid(True)
savefig( "extrapolate-UnivariateSpline.png", dpi=50 )
show()

وأضاف: أ تذكرة Scipy يقول: "إن سلوك فصول FitPack في Scipy.Interpolate أكثر تعقيدًا من أن المستندات سيؤدي إلى الاعتقاد" - IMHO صحيح في DOC للبرامج الأخرى أيضًا.

نصائح أخرى

تتمثل إحدى الطرق البسيطة في إجراء الاستقراء في استخدام متعدد الحدود أو الحشرات: هناك العديد من الإجراءات الروتينية لهذا في Scipy.Interpolate, ، وهناك سهلة الاستخدام للغاية (فقط أعطي النقاط (x ، y) ، وستحصل على وظيفة [قابلة للاتصال ، على وجه التحديد]).

الآن ، كما هو موضح في هذا الموضوع ، لا يمكنك أن تتوقع أن يكون الاستقراء ذا معنى دائمًا (خاصةً عندما تكون بعيدًا عن نقاط البيانات الخاصة بك) إذا لم يكن لديك نموذج لبياناتك. ومع ذلك ، فإنني أشجعك على اللعب مع الاستيفاءات متعددة الحدود أو خطوط من Scipy.Interpolate لمعرفة ما إذا كانت النتائج التي تحصل عليها تناسبك.

النماذج الرياضية هي السبيل للذهاب في هذه الحالة. على سبيل المثال ، إذا كان لديك ثلاث نقاط بيانات فقط ، فيمكنك ألا يكون لديك أي إشارة على الإطلاق على كيفية تطور الاتجاه (يمكن أن يكون أي من اثنين من المكافئين.)

احصل على بعض دورات الإحصاء وحاول تنفيذ الخوارزميات. محاولة wikibooks.

عليك أن تتفوق على الوظيفة التي تحتاجها إلى الاستقراء. مما يمكنك استخدام الانحدار http://en.wikipedia.org/wiki/regression_analysis للعثور على paratmeters من الوظيفة. واستقراء هذا في المستقبل.

على سبيل المثال: ترجمة التواريخ إلى قيم x واستخدم اليوم الأول كـ x = 0 لمشكلتك ، تكون القيم shoul shoul shoully (0،1.2) ، (400،1.8) ، (900،5.3)

الآن تقرر أن نقاطه تكمن في وظيفة النوع A+Bx+cx^2

استخدم طريقة الصغار الصغرى للعثور على A و B و C.http://en.wikipedia.org/wiki/Linear_Least_Squares(سأقدم مصدرًا كاملاً ، لكن لاحقًا ، ليس لدي وقت لهذا)

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