SciPy Interpolation

درون یابی چیست؟

درون یابی روشی جهت تولید نقاط بین نقاط داده شده است. مثلاً فرض کنید برای دو نقطه 1 و 2 ممکن است درون یابی را انجام دهیم و نقاط 1.33 و 1.66 را پیدا کنیم.

درون یابی کاربردهای فراوانی دارد. در یادگیری ماشین اکثر اوقات با داده‌های گمشده از یک مجموعه داده سر و کار داریم. درون یابی این نقاط را برای ما جایگزین می‌کند.

انجام درون یابی بوسیله SciPy

SciPy مدول scipy.interpolate با توابع بسیار جهت انجام درون یابی برای ما فراهم آورده است.

درون یابی یک بعدی

جهت درون یابی متغیری با توزیع یک بعدی می‌توان از تابع interp1d() استفاده کرد.

نقاط x و y را به عنوان ورودی گرفته و تابعی با قابلیت فراخوانی را برمی‌گرداند. این تابع را می‌توان با x جدید فراخوانی کرده و مقادیر y مربوطه را به دست‌آورد.

در کد زیر با نقاط مشخص xs و ys درون یابی را برای مقادیر 2.1 تا 2.9 انجام داده‌ایم.


from scipy.interpolate import interp1d
import numpy as np

xs = np.arange(10)
ys = 2*xs + 1

interp_func = interp1d(xs, ys)

newarr = interp_func(np.arange(2.1, 3, 0.1))

print(newarr)

خروجی:

توجه داشته باشید که محدوده مقادیر x جدید باید در محدوده مقادیر x قدیم باشد. یعنی در اینجا x جدید نباید از 10 بزرگتر و یا از صفر کوچکتر باشد. در غیر اینصورت نمی‌توان تابع interp_func() را برای آن فراخوانی کرد.

درون یابی اسپلاین

در درون یابی یک بعدی نقاط بر اساس یک منحنی برازش می‌شوند در حالیکه در درون یابی اسپلاین (Spline Interpolation) نقاط در برابر یک تابع تکه‌ای (piecewise function) که بوسیله چند جمله‌ای‌ها تعریف شده و به آن اسپلاین می‌گویند برازش می‌شوند.

تابع UnivariateSpline() نقاط x و y را به عنوان ورودی گرفته و تابعی با قابلیت فراخوانی را برمی‌گرداند. این تابع را می‌توان با x جدید فراخوانی کرده و مقادیر y مربوطه را به دست‌آورد.

تابع تکه‌ای: تابعی که برای محدوده‌های متفاوت تعاریف متفاوتی داشته باشد.

در کد زیر درون یابی نقاط 2.1 تا 2.9 را برای نقاط غیرخطی زیر توسط تابع UnivariateSpline() انجام داده‌ایم.


from scipy.interpolate import UnivariateSpline
import numpy as np

xs = np.arange(10)
ys = xs**2 + np.sin(xs) + 1

interp_func = UnivariateSpline(xs, ys)

newarr = interp_func(np.arange(2.1, 3, 0.1))

print(newarr)

خروجی:

درون یابی بوسیله توابع پایه شعاعی

تابع پایه شعاعی (Radial Basis Function) تابعی است که نسبت به یک نقطه ثابت مرجع تعریف شده باشد.

تابع Rbf() نقاط x و y را به عنوان ورودی گرفته و تابعی با قابلیت فراخوانی را برمی‌گرداند. این تابع را می‌توان با x جدید فراخوانی کرده و مقادیر y مربوطه را به دست‌آورد.

در کد زیر درون یابی نقاط 2.1 تا 2.9 را برای نقاط غیرخطی زیر توسط تابع Rbf() انجام داده‌ایم.


from scipy.interpolate import Rbf
import numpy as np

xs = np.arange(10)
ys = xs**2 + np.sin(xs) + 1

interp_func = Rbf(xs, ys)

newarr = interp_func(np.arange(2.1, 3, 0.1))

print(newarr)

خروجی: