در سری های زمانی تاب دادن زمان هوشمند یا کش و قوس زمانی پویا (به انگلیسی: (Dynamic time warping(DTW) الگوریتمی برای اندازه گیری شباهت بین دو دنباله زمانیست که ممکن است در سرعت یا زمان متفاوت باشند. برای نمونه، DTW می تواند شباهت بین دو الگوی راه رفتن را بیابد حتی اگر سرعت یا شتاب راه رفتنشان در بازه های زمانی یکسان نباشد.DTW دنباله های زمانی داده های صوتی، ویدئویی و تصویری را تحلیل کرده است. در واقع هر داده ای که بتواند به صورت دنبالهٔ پشت سر هم اطلاعات به دست بیاید، DTW می تواند آن را تحلیل کند. یک کاربرد مهم این الگوریتم بازشناسی گفتار یکسان افراد مختلف با سرعت گفتار مختلف است. و از کاربردهای دیگر DTW می توان به تشخیص صدا، تشخیص دستخط و امضا اشاره کرد. همچنین استفاده های از آن در تشخیص تطبیق اشکال هندسی جزئی دیده شده است.در مجموع، DTW روشی است که بهینه ترین تطبیق بین دو دنباله زمانی با محدودیت های معین را پیدا می کند (برای مثال:سری زمانی).دنباله ها به صورت غیر خطی در محور زمان «کش و قوس پیدا می کنند» تا معیاری برای شباهت آن ها مستقل از برخی تغییرات غیر خطی در محور زمان به دست آورد. این روش تنظیم دنباله بسیاری از اوقات در دسته بندی سری زمانی مورد استفاده قرار می گیرد. اگرچه DTW معیاری همانند فاصله بین دو دنباله داده شده می یابد، تضمین نمی کند که نامساوی مثلث در مورد آن برقرار باشد.
فاصله لون اشتاین
این مثال پیاده سازی الگوریتم DTW را برای دو دنباله رشته ای s و t از نشانه های مجزا ترسیم می کند. برای نشانه های x، y و (d(x,y برابر فاصله بین نشانه ها است. برای مثال |d(x,y)=|x-y
int DTWDistance(s: array , t: array ) { DTW := array for i := 1 to n DTW := infinity for i := 1 to m DTW := infinity DTW := ۰ for i := 1 to n for j := 1 to m cost:= d(s, t) DTW := cost + minimum(DTW,// الحاق DTW,// حذف DTW)// تطبیق return DTW}گاهی اوقات ما قصد داریم که محدودیتی خاص اعمال نماییم. یعنی، نیاز داریم اگر [s[i با [t[j جورسازی شود، آنگاه |i-j| بیشتر از w نباشد، که w یک پارامتر پنجره ای است.ما می توانیم به سادگی الگوریتم بالا را برای اعمال محدودیت های خاص تغییر دهیم. با این حال، ویرایش داده شده در بالا تنها هنگامی کار می کند که |n-m| برگتر از w نباشد. یعنی نقطه انتهایی داخل طول قطری پنجره جای بگیرد. برای این که الگوریتم کار کند، بایستی پارامتر پنجره ای w طوری انتخاب شود که n - m| ≤ w|(خط علامتگذاری شده با (*) در کد را ببنید)
int DTWDistance(s: array , t: array , w: int) { DTW := array w := max(w, abs(n-m))// adapt window size (*) for i := 0 to n for j:= 0 to m DTW := infinity DTW := ۰ for i := 1 to n for j := max(1, i-w) to min(m, i+w) cost := d(s, t) DTW := cost + minimum(DTW,// الحاق DTW,// حذف DTW)// تطبیق return DTWمحاسبه سریعویرایشمحاسبه الگوریتم DTW در حالت کلی از مرتبه زمانی (O(N^2 است. از جمله تکنیک های سریع تر برای محاسبه DTW می توان به SparseDTW وFastDTW اشاره نمود. یکی از کارهای معمول در این زمینه، به دست آوردن سری های زمانی مشابه است که می تواند با استفاده از کران پایین هایی چون LB_Keogh و LB_Improved تسریع گردد. در یک بررسی، Wang et al. گزارش نموده است که به کمک کران پایین های LB_Improved نتایج بهتری از کران پایین LB_Keoghبه دست آورده و نشان داده است که تکنیک های دیگر بهینه نیستند.
فاصله لون اشتاین
این مثال پیاده سازی الگوریتم DTW را برای دو دنباله رشته ای s و t از نشانه های مجزا ترسیم می کند. برای نشانه های x، y و (d(x,y برابر فاصله بین نشانه ها است. برای مثال |d(x,y)=|x-y
int DTWDistance(s: array , t: array ) { DTW := array for i := 1 to n DTW := infinity for i := 1 to m DTW := infinity DTW := ۰ for i := 1 to n for j := 1 to m cost:= d(s, t) DTW := cost + minimum(DTW,// الحاق DTW,// حذف DTW)// تطبیق return DTW}گاهی اوقات ما قصد داریم که محدودیتی خاص اعمال نماییم. یعنی، نیاز داریم اگر [s[i با [t[j جورسازی شود، آنگاه |i-j| بیشتر از w نباشد، که w یک پارامتر پنجره ای است.ما می توانیم به سادگی الگوریتم بالا را برای اعمال محدودیت های خاص تغییر دهیم. با این حال، ویرایش داده شده در بالا تنها هنگامی کار می کند که |n-m| برگتر از w نباشد. یعنی نقطه انتهایی داخل طول قطری پنجره جای بگیرد. برای این که الگوریتم کار کند، بایستی پارامتر پنجره ای w طوری انتخاب شود که n - m| ≤ w|(خط علامتگذاری شده با (*) در کد را ببنید)
int DTWDistance(s: array , t: array , w: int) { DTW := array w := max(w, abs(n-m))// adapt window size (*) for i := 0 to n for j:= 0 to m DTW := infinity DTW := ۰ for i := 1 to n for j := max(1, i-w) to min(m, i+w) cost := d(s, t) DTW := cost + minimum(DTW,// الحاق DTW,// حذف DTW)// تطبیق return DTWمحاسبه سریعویرایشمحاسبه الگوریتم DTW در حالت کلی از مرتبه زمانی (O(N^2 است. از جمله تکنیک های سریع تر برای محاسبه DTW می توان به SparseDTW وFastDTW اشاره نمود. یکی از کارهای معمول در این زمینه، به دست آوردن سری های زمانی مشابه است که می تواند با استفاده از کران پایین هایی چون LB_Keogh و LB_Improved تسریع گردد. در یک بررسی، Wang et al. گزارش نموده است که به کمک کران پایین های LB_Improved نتایج بهتری از کران پایین LB_Keoghبه دست آورده و نشان داده است که تکنیک های دیگر بهینه نیستند.
wiki: تاب دادن زمان هوشمند