Dynamic Time Warping نے Python اور HAR ڈیٹاسیٹ کا استعمال کرتے ہوئے وضاحت کی۔

ماخذ نوڈ: 1123947

اس مضمون کے ایک حصے کے طور پر شائع کیا گیا تھا۔ ڈیٹا سائنس بلاگتھون

ڈائنامک ٹائم ریپنگ کا تعارف

ٹائم سیریز کی درجہ بندی ایک بہت عام کام ہے جہاں آپ کے پاس مختلف ڈومینز جیسے سگنل پروسیسنگ، IoT، انسانی سرگرمی اور بہت کچھ کا ڈیٹا ہوگا اور حتمی مقصد ایک مخصوص ماڈل کو تربیت دینا ہے تاکہ وہ کسی بھی ٹائم سیریز کی کلاس کی پیشین گوئی کر سکے۔ تقریبا کامل درستگی. دیئے گئے ڈیٹاسیٹ پر وقت کی ترتیب کا لیبل لگا ہونا چاہیے تاکہ ہمارا ماڈل ٹائم سیریز کی کلاس کی درست پیشین گوئی کر سکے۔

اس مسئلے کا ایک کلاسک حل K Nearest پڑوسی الگورتھم کا طریقہ استعمال کرنا ہے۔ یہاں اس مضمون میں، ہم Euclidean فاصلے کے معمول کے نقطہ نظر کو چھوڑنے جا رہے ہیں اور ہم استعمال کریں گے ڈائنامک ٹائم وارپنگ or DTW میٹرک. یہ طریقہ اس بات کو مدنظر رکھتا ہے کہ جب ہم دو مختلف ٹائم سیریز کا موازنہ کر رہے ہیں، تو وہ لمبائی اور رفتار میں مختلف ہو سکتے ہیں۔

کور تصویر | ڈائنامک ٹائم ریپنگ

نقطہ نظر اتنا پیچیدہ نہیں ہے لیکن کچھ ایسا ہے جو ڈی ٹی ڈبلیو یا ڈائنامک ٹائم وارپنگ الگورتھم کے لیے بالکل مخصوص ہے۔ کچھ عام غلطیوں میں KNN ماڈل پر ہائپر پیرامیٹرز کو ٹیوننگ کرنا اور DTW حصے کو صرف نظر انداز کرنا شامل ہو سکتا ہے لیکن ایسا نہیں کرنا چاہیے۔ الگورتھم کا ایک بڑا نقصان یہ ہے کہ وقت کی پیچیدگی بڑی ترتیب والے بڑے ڈیٹاسیٹس کے لیے تقریباً تیزی سے بڑھ جاتی ہے۔ اس طرح کے ماڈلز کو مناسب وقت میں تربیت دینا ممکن نہ ہو۔ اسے تیز کرنے کے لیے الگورتھم میں کچھ اضافی تبدیلیاں کرنے کی ضرورت پڑ سکتی ہے جس پر ہم بعد میں بات کریں گے۔

ڈائنامک ٹائم وارپنگ کیسے کام کرتی ہے؟

ڈی ٹی ڈبلیو یا ڈائنامک ٹائم وارپنگ پروگرامنگ الگورتھم کی ایک متحرک قسم ہے جہاں ایک بڑی قسم کے مسئلے کو مختلف ذیلی مسائل میں تقسیم کیا جاتا ہے، اگر ممکن ہو تو۔ پھر ذیلی مسائل کا حل دوبارہ کمپیوٹنگ کرنے کے بجائے بعد میں استعمال کے لیے محفوظ کیا جاتا ہے۔ یہ بالکل اسی طرح ہے۔ متحرک پروگرامنگ جو ڈیٹا سٹرکچرز اور الگورتھم میں استعمال ہوتا ہے اور اسی لیے الگورتھم کی بنیادی تعریف ہے۔

جو لوگ ماضی کو بھول جاتے ہیں ان پر اسے دہرانے کی مذمت کی جاتی ہے” – جارج سانتیانا

اس مضمون میں، ہم الگورتھم کے ڈیٹا سائنس حصے پر توجہ مرکوز کریں گے اور یہ سمجھنے کے لیے کہ الگورتھم کیسے کام کرتا ہے، ہم اپنی بنیادی زبان کے طور پر ازگر کا استعمال کریں گے۔ ہم لائبریری ماڈیول کا استعمال کریں گے جسے "dtaidanceجس سے ہمیں دو سائن لہروں کے درمیان فاصلے کا حساب لگانے میں مدد ملے گی جو ایک دوسرے سے مرحلہ وار منتقل ہوتی ہیں۔

پیکیج کو انسٹال کرنے کے لیے درج ذیل کوڈ کا استعمال کریں:

!pip install dtaidistance

نوٹ بک کے ماحول کے لیے یا اگر آپ کمانڈ پرامپٹ کے ذریعے انسٹال کر رہے ہیں تو فجائیہ کے نشان کو ہٹا دیں۔

کوڈ:

dtaidistance سے درآمد dtw سے dtaidistance درآمد سے dtw_visualisation dtwvis سے random import سیمپل امپورٹ numpy بطور np x = np.arange(0, 20, .5) s1 = np.sin(x) s2 = np.sin)(x) = dtw.warping_path(s1, s1) dtwvis.plot_warping(s2, s1, path) فاصلہ = dtw.distance(s2, s1)

آؤٹ پٹ:

2 سائن لہروں کے درمیان زیادہ سے زیادہ وارپنگ فاصلہ

مندرجہ بالا اعداد و شمار 2 سائن لہروں کے درمیان بہترین وارپنگ فاصلے کو ظاہر کرتا ہے۔

مندرجہ بالا اعداد و شمار 2 سائن لہروں کے درمیان تمام پوائنٹس کے درمیان بہترین فاصلہ دکھاتا ہے۔ ڈائنامک پروگرامنگ میٹرکس کو بھی پلاٹ کیا جا سکتا ہے یا اسے پروگرامنگ میٹرکس کے نام سے بھی جانا جاتا ہے۔ یہ تمام وارپنگ راستے دکھائے گا اور جیسا کہ نیچے کی تصویر میں دکھایا گیا ہے۔

کوڈ:

d, paths = dtw.warping_paths(s1, s2, window=20) best_path = dtw.best_path(paths) dtwvis.plot_warpingpaths(s1, s2, paths, best_path)

آؤٹ پٹ:

لاگت میٹرکس | ڈائنامک ٹائم ریپنگ

لاگت کا میٹرکس

اس قسم کا میٹرکس بھی بنایا گیا ہے جو ایک اور الگورتھم کو لاگو کرتا ہے جسے کہا جاتا ہے۔ Needleman-Wunsch الگورتھم. یہ الگورتھم بائیو انفارمیٹکس میں پروٹین اور نیوکلیوٹائڈ کی ترتیب کو سیدھ میں لانے کے لیے بھی استعمال ہوتا ہے۔ اس کے ساتھ، ایک اور الگورتھم استعمال کیا جاتا ہے جو ہے لیونشٹین فاصلہ. یہ دونوں الگورتھم ڈائنامک پروگرامنگ فیملی الگورتھم کی درجہ بندی سے تعلق رکھتے ہیں۔

دوسرے نمبر میں، ہر کال ایک ایسا نمبر ہے جو ڈیٹا کے کسی بھی دو متعلقہ پوائنٹس کے فاصلے کی نمائندگی کرتا ہے جن کا موازنہ کیا جاتا ہے۔ ہر ترتیب کے لیے ایک ڈیٹا پوائنٹ۔ ایک گہرا رنگ کم فاصلے کی نشاندہی کرتا ہے اور ہم سب سے زیادہ بہترین راستہ حاصل کر سکتے ہیں جسے تصویر میں دکھایا گیا ہے ایک سرخ لکیر کی صورت میں نکالا گیا ہے۔ اس کی وقت کی پیچیدگی بالکل O(m,n) ہے جہاں m اور n متعلقہ ترتیب ہیں اور ان کی چوکور قیمت ہے۔ حقیقی دنیا میں یہ عام ہے کہ ترتیب بڑے ہیں اور KNN ماڈل مکمل طور پر بہتر نہیں ہے، مجموعی ماڈل کو تربیت حاصل کرنے میں کافی وقت لگ سکتا ہے۔

ہمارے معاملے میں، ہم اپنے مسئلے کے سیاق و سباق سے پوری طرح واقف ہیں اور ہمارا ڈائنامک ٹائم وارپنگ الگورتھم کیسے کام کرے گا اور اس لیے ہم اس کی تربیت کے لیے لگنے والے کل وقت کو کم کرنے کے لیے ماڈل کو بھی بہتر بنائیں گے۔ زیادہ تر معاملات میں، ہمیں معلوم ہوتا ہے کہ بہترین راستہ میٹرکس کے اخترن سے ہوتا ہے جیسا کہ ہماری مثال کے لیے بھی ہے۔ حقیقی دنیا میں، بڑے پیمانے پر یا بہت بڑی فیز شفٹ بھی غیر معمولی ہے اور اس لیے یہ توقع کی جاتی ہے کہ فیز شفٹ ایک دوسرے کے قریب قریب ہو گا ورنہ لاگت بہت زیادہ ہو جائے گی۔ ان سب کا اندازہ ڈیٹاسیٹ ایکسپلوریشن کے مرحلے سے لگایا جا سکتا ہے اور فوئیر ٹرانسفارمیشن کے ساتھ اہم تعدد بھی نکالا جا سکتا ہے تاکہ یہ یقینی بنایا جا سکے کہ ڈیٹا میں کوئی دشواری نہیں ہے۔

آخری کوڈ میں، ہم نے 'warping_paths()' فنکشن کا استعمال کرتے ہوئے میٹرکس کو ظاہر کیا جو پہلے سے طے شدہ طور پر ایک دلیل 'use_pruning=True' استعمال کرتا ہے اور اس لیے اوپری دائیں اور نیچے بائیں کونوں کو اصلاح کے لیے کاٹا جاتا ہے۔ اس کا مطلب یہ ہے کہ ایک خاص لاگت کے بعد، قدروں کا حساب نہیں لگایا جاتا کیونکہ یہ CPU انٹینسیو ہوگا اور ہمیں اپنا مطلوبہ نتیجہ پہلے ہی مل گیا ہے۔ ماڈیول کے پرانے ورژن یا 2.3.2 سے پہلے کے ورژن میں، آپ کو واضح طور پر اس پیرامیٹر کو فنکشن میں منتقل کرنا تھا۔ اب ہم اپنے ماڈل کو استعمال کرنے کے لیے ایک حقیقی صورت حال پر جائیں گے۔

ڈائنامک ٹائم ریپنگ کو سمجھنے کے لیے اصلی کیس اسٹڈی

انسانی سرگرمی کی شناخت یا HAR ڈیٹاسیٹ وہی ہے جسے ہم یہاں استعمال کریں گے اور اسے سے ڈاؤن لوڈ کیا جا سکتا ہے۔ یو سی ایل لائبریری جس میں پہلے سے لیبل لگا ہوا ٹائم سیریز ڈیٹا ہوتا ہے۔ اس ڈیٹا کو انسان کے ذریعے لے جانے والے اسمارٹ فون کی مدد سے حاصل کیا گیا ہے اور اس عمل کو کچھ مخصوص سرگرمیوں جیسے بیٹھنا، چلنا، کھڑا ہونا، لیٹنا، واکنگ_نیچے یا اوپر چلنا۔ ان سب کا اندازہ زاویہ کی رفتار اور لکیری سرعت سے لگایا جا سکتا ہے جو اسمارٹ فون ہارڈ ویئر سے حاصل کیا جا سکتا ہے۔ ہر مشاہدہ وہ ڈیٹا ہوتا ہے جو وقت اور فریکوئنسی ڈومین متغیر کے ساتھ 561 ویکٹر خصوصیات پر مشتمل ہوتا ہے اور ایک مخصوص لیبل جو اس وقت کسی شخص کی سرگرمی کی نشاندہی کرتا ہے۔ یہاں ہمارا مقصد ایک ایسا ماڈل بنانا ہے جو اسمارٹ فون کے ڈیٹا کو استعمال کرکے انسان کی کسی بھی سرگرمی کا اندازہ لگا سکے۔

کوڈ:

x_train_file = open(r'UCI HAR Dataset/train/X_train.txt', 'r') y_train_file = open(r'UCI HAR Dataset/train/y_train.txt', 'r') x_test_file = open(r'UCI HAR Dataset/test/X_test.txt', 'r') y_test_file = open(r'UCI HAR Dataset/test/y_test.txt', 'r') x_train = [] y_train = [] x_test = [] y_test = [] لیبل = {1:'چلنا'، 2:'اوپر چلنا'، 3:'نیچے چلنا'، 4:'بیٹھنا'، 5:'کھڑا'، 6:'لیٹنا'} x_train_file میں x کے لیے: x_train.append( x.split()] میں ts کے لیے [float(ts) x.split()]) میں ts کے لیے y_test_file میں y کے لیے: y_test.append(int(y.rstrip('n'))) x_train = np.array(x_train) y_train = np.array(y_train) x_test = np .array(x_test) y_test = np.array(y_test) رنگ = ['#D62728','#2C9F2C','#FD7F23','#1F77B4','#9467BD', '#8C564A','#7F7 ,'#7FBECF','#E1C377','#BCBD2']
idx=0

اس کے بعد ہم دو طریقوں کی جانچ کرنے والے ہیں اور یہ حصہ اہم ہے کیونکہ ایک حصہ اصلاح کے بغیر عمل درآمد کا وقت دکھائے گا اور دوسرا اس کے ساتھ ہوگا۔

اصلاح کے بغیر کوڈ:

رینج میں r کے لیے(len(x_test)): فاصلہ = dtw.distance(x_train[idx], x_test[r])

سیل کے نفاذ کا وقت:

وال ٹائم: 25 منٹ 16 سیکنڈ

اصلاح کے ساتھ کوڈ:

رینج میں r کے لیے(len(x_test)): فاصلہ = dtw.distance(x_train[idx], x_test[r], window=20, use_pruning='True')

سیل کے نفاذ کا وقت:

وال ٹائم: 1 منٹ 42 سیکنڈ

جیسا کہ آپ میرے لیپ ٹاپ پر I5 8th جنریشن چپ پر مقامی طور پر Jupyter نوٹ بک چلانے والے اہم فرق کو دیکھ سکتے ہیں۔ اس طرح ہم ڈائنامک ٹائم وارپنگ فنکشن کے لیے k=20 اور ونڈو سائز 20 کے ساتھ KNN الگورتھم استعمال کریں گے۔ 'idx' متغیر ہمارے ٹیسٹ سیٹ کے لیے ٹائم سیریز کے اشاریہ کو ذخیرہ کرنے میں مدد کرتا ہے۔

اب ہم اپنے ماڈل کے لیے ایک فنکشن کی وضاحت کریں گے اور KNN کے فراہم کردہ پڑوسیوں کی تعداد اور اپنے ٹیسٹ سیٹ کی متعلقہ ٹائم سیریز کے انڈیکس کی بنیاد پر نتیجہ واپس کریں گے اور پھر ان میں سے ایک لیبل واپس کریں گے جو ہو سکتا ہے:

لیبلز = { چلنا، چلنا_اوپر سیڑھی، چلنا_نیچے، بیٹھنا، کھڑا ہونا، لیٹنا }

فنکشنل کوڈ:

def classifyNN(k:int, idx:int) -> str: idxs=range(0,x_train.shape[0]) n=x_train.shape[0] فاصلے=[] counters={} c=1; max_value=0 r کے لیے رینج(n): Dtw.append(dtw.distance(x_test[idx], x_train[idxs[r]],window=10,use_pruning=True)) NN=sorted(range(len(distances) ))، key=lambda i: فاصلے[i]، reverse=False)[:k] l کے لیے labels.values(): کاؤنٹرز[l]=0 r کے لیے NN میں: l=labels[y_train[r]] کاؤنٹرز[l]+=1 if (counters[l])>max_value: max_value=counters[l] #print('NN(%d) پر %s' % (c,l)) c+=1 # لیبل ہے زیادہ سے زیادہ فریکوئنسی کیز = [کاؤنٹرز میں k کے لیے اگر کاؤنٹرز[k] == max_value] # ایک بے ترتیب نمونہ واپس کرنا اگر ایک سے زیادہ لیبلز کے درمیان ٹائی موجود ہو تو واپسی (sample(keys,1)[0]) 

ٹیسٹ کیسز۔

یہاں ہم نمونے کے ٹیسٹ کیسز میں سے کچھ کا مظاہرہ کریں گے لیکن آپ کسی بھی 'idx' قدر کے ساتھ تجربہ کرنے کے لیے آزاد محسوس کر سکتے ہیں اور اس ٹیسٹ کیس کے لیے متعلقہ لیبل تلاش کر سکتے ہیں۔

1. پہلا ٹیسٹ کیس: کھڑا ہونا

ڈیٹا کو ظاہر کرنے کے لیے کوڈ:

k=20 idx=3 plt.plot(x_test[idx], label=labels[y_test[idx]], color=colors[y_test[idx]-1], linewidth=2) plt.xlabel('Samples @50Hz' ) plt.legend(loc='اوپر بائیں') plt.tight_layout()

آؤٹ پٹ:

کھڑے متغیر کا تصور

ٹیسٹ لیبل تلاش کرنے کے لیے کوڈ:

%%time classifyNN(k,idx)

آؤٹ پٹ:

وال ٹائم: 3 منٹ 13 سیکنڈ 'اسٹینڈنگ' 

2. دوسرا ٹیسٹ کیس: بیٹھنا

ڈیٹا ڈسپلے کرنے کا کوڈ:

k=20 idx=200 plt.plot(x_test[idx], label=labels[y_test[idx]], color=colors[y_test[idx]-1], linewidth=2) plt.xlabel('Samples @50Hz' ) plt.legend(loc='اوپر بائیں') plt.tight_layout()

آؤٹ پٹ:

بیٹھنے کے متغیر کا تصور

ٹیسٹ لیبل تلاش کرنے کے لیے کوڈ:

%%time classifyNN(k,idx)

آؤٹ پٹ:

وال ٹائم: 3 منٹ 15 سیکنڈ 'بیٹھنا' 

3. تیسرا ٹیسٹ کیس: چلنا

ڈیٹا ڈسپلے کرنے کا کوڈ:

k=20 idx=401 plt.plot(x_test[idx], label=labels[y_test[idx]], color=colors[y_test[idx]-1], linewidth=2) plt.xlabel('Samples @50Hz' ) plt.legend(loc='اوپر بائیں') plt.tight_layout()

آؤٹ پٹ:

واکنگ ویری ایبل کا تصور | ڈائنامک ٹائم وارپنگ

ٹیسٹ لیبل تلاش کرنے کے لیے کوڈ:

%%time classifyNN(k,idx)

آؤٹ پٹ:

وال ٹائم: 3 منٹ 9 سیکنڈ 'واکنگ'

لہذا ان تمام مثالوں میں، ہم دیکھ سکتے ہیں کہ الگورتھم ٹائم سیریز کو صحیح طریقے سے لیبل کرنے کے قابل تھا اور اس میں بہت درستگی ہے۔ ونڈونگ کی فعالیت ماڈل کو تربیت حاصل کرنے میں لگنے والے وقت کو بھی بہت کم کرتی ہے اور اگر آپ کو مجھ پر یقین نہیں ہے، تو آپ دستی طور پر ونڈو آرگومنٹ کو تبدیل کر سکتے ہیں اور ماڈل کو تربیت دینے کے لیے درکار وقت میں فرق دیکھ سکتے ہیں۔

کیا ڈائنامک ٹائم ریپنگ کی اصلاح کا متوازی ہونا ممکن ہے؟

ٹھیک ہے، اگلا عام سوال یہاں متوازی کے بارے میں ہے جب سے NumPy اور پانڈا ڈیٹا فریم بہت بڑے ڈیٹاسیٹ پر کام کر رہے تھے اور کچھ کم وقت میں کرنے کی ضرورت تھی، اسپارک کو دوسری وجوہات کے ساتھ بنایا گیا تھا تاکہ ایک سے زیادہ ہونے کے بہترین کیس کے منظر نامے کو استعمال کیا جا سکے۔ مشین میں پروسیسرز۔

اسی طرح یہاں ہم دیکھ سکتے ہیں کہ ڈائنامک ٹائم وارپنگ کی اس موجودہ شکل میں متوازی کرنا بہت مشکل ہے اور اگر مجھے کوئی طریقہ مل گیا تو میں اسے اگلے مضمون میں اپ ڈیٹ کروں گا لیکن آپ پیچیدگی کو کم کرنے کے لیے الگورتھم کو کچھ اور اصلاح فراہم کر سکتے ہیں لیکن اس سے ماڈل کی درستگی کو بھی متاثر کرتا ہے۔ لہذا ماڈل کی درستگی میں زیادہ کمی کے بغیر وقت کی پیچیدگی کو کم کرنا چیلنج باقی ہے۔

ایک امکان یہ ہے کہ اس عمل کو تیز کیا جائے اگر آپ ڈیٹاسیٹ میں تمام ٹائم سیریز کے ڈیٹا کے DTW جوڑے کے فاصلوں کا حساب لگاتے ہیں اور یہ تصور کے مطابق متوازی سطح کو حاصل کرتا ہے۔ اس سے ہمیں فاصلاتی میٹرکس کو تیزی سے بنانے میں مدد ملے گی اور کٹائی کے آپشن کو بڑھانے سے ٹریننگ کو مزید ڈیٹا پوائنٹس کو نظر انداز کرنے کا موقع ملے گا لیکن یہ ہر صورت میں بہترین حل نہیں ہو سکتا۔

نتیجہ

KNN اور DTW الگورتھم دونوں کے امتزاج کا استعمال کرکے ٹائم سیریز کی درجہ بندی کو بہت مؤثر بنایا جا سکتا ہے اور یہاں استعمال کیا گیا ڈیٹا سیٹ بہت سے ممکنہ منظرناموں میں سے ایک ہے جہاں آپ اس ماڈل کو ڈیٹا کو مختلف لیبلز میں درجہ بندی کرنے اور ان پٹ سورس کو تبدیل کر کے لائیو ڈیٹا یا ان پٹ ڈیٹا سٹریم، آپ اس بات کا تعین کر سکتے ہیں کہ صارف ریئل ٹائم میں کیا سرگرمی کر رہا ہے۔ بہت سی ایپلی کیشنز ہیں جو اسے ریئل ٹائم میں استعمال کرتی ہیں۔ اسٹیپ سیٹگو ایک ایسی ایپلی کیشن ہے جو آپ کو پیدل چلنے کے لیے ان کی کرنسی میں ادائیگی کرتی ہے۔ لہذا اگر آپ اس ماڈل کو استعمال کرتے ہیں اور اسمارٹ فون کے سینسرز سے براہ راست صارف کا ڈیٹا بازیافت کرتے ہیں، تو آپ اس وقت صارف کی سرگرمی کا تعین کر سکتے ہیں۔

آخر تک پڑھنے کا شکریہ۔ میرے اگلے مضمون میں ملیں گے۔

ارنب مونڈال

Python ڈویلپر اور ڈیٹا انجینئر | فری لانس ٹیک رائٹر

میرے دوسرے مضامین کا لنک

کولیب نوٹ بک سے لنک کریں۔

تصویری ذرائع:

  1. تصویر 1: https://unsplash.com/photos/BXOXnQ26B7o
  2. تصویر 2: https://unsplash.com/photos/ePAL0f6jjr0

اس مضمون میں دکھایا گیا میڈیا Analytics ودھیا کی ملکیت نہیں ہے اور مصنف کی صوابدید پر استعمال کیا جاتا ہے۔

ماخذ: https://www.analyticsvidhya.com/blog/2021/10/dynamic-time-warping-explained-using-python-and-har-dataset/

ٹائم اسٹیمپ:

سے زیادہ تجزیات ودھیا