الگوریتم جریان داده‌ها

در علم رایانه **الگوریتم جریان داده‌ها**  الگوریتمی ست برای پردازش جریان داده‌ها که به صورت توالی از آیتم‌ها به عنوان ورودی هستند و از یک یا تعداد محدودی گذرگاه می‌توانند مورد بررسی قرار بگیرند. در واقع این الگوریتم دنباله‌ای از داده را به عنوان ورودی دریافت کرده و یک سری تابع روی آن‌ها اعمال می‌کند. این الگوریتم حافظه مورد نیاز (کمتر از اندازه واقعی خود ورودی) و زمان پردازش هر آیتم را هم محدود می‌کند. این محدودیت‌ها به این معناست که این الگوریتم جواب تقریبی بر اساس یک خلاصه یا «طرحی» از جریان داده‌ها در حافظه تولید می‌کند.

## تاریخچه
اگرچه مطالعه الگوریتم جریان توسط مونرو و پاترسون دراوایل ۱۹۸۰ آغاز شد اما توسط Philippe Flajolet و نایجل مارتین در ۱۹۸۲–۱۹۸۳ باعث شد موضوعات مرتبط به الگوریتم‌های جریان برای اولین بار به رسمیت شناخته شود و در یک مقاله در سال ۱۹۹۶ توسط نوگا آلون، یوسی ماتیاس، و ماریو محبوب شد. نویسندگان این مقاله بعداً جایزه گودل در سال ۲۰۰۵ را «برای سهم بنیادی شان نسبت به الگوریتم‌های جریانی» کسب کردند. از آن زمان کار زیادی حول الگوریتم‌های جریان داده انجام شد که طیف متنوعی از زمینه‌های علوم کامپیوتر از قبیل تئوری، پایگاه داده، شبکه و پردازش زبان طبیعی را گسترش داد. الگوریتم‌های نیمه جریانی در سال ۲۰۰۵ به عنوان یک فرمت از الگوریتم‌های جریانی ارائه شد که برای تعداد ثابت یا لگاریتمی از گذرگاه‌ها روی مجموعهٔ داده‌ها امکان‌پذیر است.

## مدل‌ها
در مدل جریان داده‌ها، برخی یا همه داده‌های ورودی که قابل عملیات هستند، برای دسترسی تصادفی از روی دیسک یا حافظه در دسترس نیستند، اما به عنوان یک جریان داده پیوسته سریع تر می‌رسند. جریان را می‌توان به صورت دنباله‌ای از نقاط تعریف کرد که می‌تواند تنها یک بار یا تعداد کمی در دسترس قرار بگیرد. بسیاری از ادبیات جریانی با آمار کامپیوتری روی داده‌های توزیعی که برای ذخیره کردن بسیار بزرگ هستند، مرتبط است. برای این دسته از مشکلات یک بردار a = (a_1 , … , a_n) تعریف می‌کنیم که به صفر مقداردهی اولیه می‌کنیم که در یک جریان داده آمادهٔ به روزرسانی می‌باشد. هدف از این الگوریتم محاسبه توابعی از a با استفاده از فضای بسیار کمتری نسبت به فضایی که دقیقاً اشغال می‌کند، است. دو مدل رایج برای به روزرسانی هر جریان وجود دارد، به نام "مدل درخواست نقدی" (به انگلیسی:cash register) و "مدل گردان (به انگلیسی turnstile).
در مدل درخواست نقدی، هر به روزرسانی به فرم (i,c) می‌باشد به‌طوری‌که  a_1 توسط c عدد صحیح مثبت افزایش می‌یابد. در مدل گردان هیچ‌کدام ازa_iها منفی نیستند. چندین مقاله نیز مدل «پنجره کشویی» را مطرح گرده‌اند. در این مدل، تابع مورد نظربرای محاسبه بیش از یک پنجره با اندازه ثابت در جریان داده دارد. هنگامی که جریان داده پیشرفت کند، یک آیتم از انتهای این جریان حذف شده و یک آیتم جدید جای آن را می‌گیرد.

علاوه بر مشکلاتی که در فرکانس بالا ایجادمیشود، مشکلات دیگر نیز بررسی شده‌است. تعدادی از مسائل گراف، با  ماتریس همسایگی  یا  فهرست همسایگی  که به صورت جریانی تعریف شده باشند، حل شده‌است. تعدادی از مشکلات این حوزه نیز به order(حجم و ترتیب و تعداد آیتم‌ها) یک جریان بستگی دارد. (مثلاً توابع نامتقارن) به‌طور مثال شمارش تعداد  نابه جایی‌ها در یک توالی داده مثلاً یک آرایه و یافتن  طولانی‌ترین زیررشته صعودی . در واقع الگوریتم‌های مطرح برای رسیدن به این خواسته‌ها به طول رشته داده بستگی دارد و هرچه تعداد آیتم‌های این توالی داده‌ها بیشتر باشد، زمان اجرای الگوریتم و رسیدن به مطلوب سؤال یشتر می‌شود، در واقع مفهوم order به معنی میزان زمان اجرای الگوریتم و تعداد عملیات‌های انجام شده در یک الگوریتم و پیچیدگی الگوریتم می‌باشد. با توجه به حجم داده‌ها، مدل جریان داده‌ها در پیدا کردن نابه جایی‌ها یک محیط طبیعی برای طراحی کارآمد است. ما مجموعه‌ای از الگوریتم‌های جریانی کارآمد، برای تخمین تعداد نابه جایی‌ها در یک جایگشت به دست می‌آوریم. بهترین order برای این الگوریتم‌ها الگوریتم قطعی (deterministic) است که در O(log  n) انجام می‌شود (عبارت  O(log  n) به این مفهوم است که وقتی طول رشته داده ما n باشد زمان اجرای الگوریتم و همان order الگوریتم یک ضریبی از log  n  می‌باشد).

## تحلیل و ارزیابی
عملکرد یک الگوریتم در جریانی از داده‌ها توسط سه عامل اساسی اندازه‌گیری می‌شود:
* تعداد عملیات‌ها و گذرهایی که روی اعضای آن توالی داده انجام می‌شود.
* حافظه موجود.
* زمان اجرای الگوریتم

این الگوریتم‌ها شباهت‌های بسیاری با الگوریتم برخط دارند، زیرا هر دو نیاز به تصمیم‌گیری و پردازش و اجرای عملیات دارند قبل از اینکه تمام داده‌ها در دسترس باشند، یعنی در ابتدای شروع کار الگوریتم، ورودی این الگوریتم‌ها به‌طور کامل در اختیار الگوریتم نیست و به صورت ترتیبی و مرحله مرحله انجام می‌شود اما این شباهت به معنی یکسانی نیست. الگوریتم‌های جریان داده‌ها تنها حافظهٔ در دسترس را محدود کرده‌اند اما آن‌ها ممکن است انجام یک عمل را به تأخیر بیندازند تا یک گروه از نقاط برسند، در حالی که الگوریتم‌های برخط به محض اینکه نقطه‌ای برسد، عملیات را انجام می‌دهند. در واقع الگوریتم‌های جریانی حافظهٔ در دسترس شان را می‌توانند تغییر دهند و حافظه‌شان از  O(n) است اما حافظهٔ در دسترس الگوریتم‌های برخط ثابت و از  O(1) می‌باشد. در نتیجه این تفاوت‌ها داریم که الگوریتم‌های جریانی به‌طور نهایی می‌توانند اجرای درست عملیات خود را آزمایش کنند اما آزمایش کردن برای الگوریتم برخط هرمرحله انجام می‌شود
اگر الگوریتمی تقریبی باشد، دقت جواب فاکتور کلیدی می‌شود. دقت پاسخ اغلب به صورت ( \delta  ,  \epsilon ) بیان می‌شود که در آن اشتباه و خطای پاسخ از   \epsilon  با احتمال کمتر است.

## کاربردها
الگوریتم جریان داده‌ها چندین کابرد در حوزه  شبکه رایانه‌ای  از قبیل کنترل پیوندهای شبکه برای  جریان‌های بزرگ داده، شمارش تعداد جریان‌های متمایز، برآورد توزیع اندازه جریان و غیره دارد. هم‌چنین تعدادی کابرد در زمینهٔ پایگاه داده دارد مانند تخمین اندازه  پیوندها.
به عنوان مثال در زمینه ارتباطات :۳ میلیارد تماس‌های تلفنی در آمریکا هر روز ۳۰ میلیارد ایمیل‌های روزانه، ۱ میلیارد اس‌ام‌اس وجود دارد که ذخیره تمام این داده‌ها در حافظه با دسترسی تصادفی برای پردازش غیرممکن است؛ که راه حل این مسئله پردازش داده‌ها به عنوان یک جریان و بردازش روی این داده‌ها می‌باشد.

## چندمسئله حل شده با الگوریتم جریان داده‌ها
### ممان فرکانسی

k مین ممان فرکانسی از مجموعه فرکانس‌ها به اسم a ایگونه تعریف می‌شود:   F_k (a) = \sum_{i=1}^n a_i^k 
اولین ممان  F_1 به سادگی مجموع فرکانس‌هاست (به عنوان مثال، تعداد کل). رخداد F_2 برای محاسبه خواص آماری از داده‌ها، مانند شاخص جینی مورد استفاده است.  F_\infty  به عنوان فرکانس عضو پرفرکانس‌ترین تعریف می‌شود.
مقاله بدوی از آلون، ماتیاس و Szegedy به مشکل برآورد لحظات فرکانس پرداخته است.

#### محاسبه ممان فرکانسی
یک روش مستقیم برای پیدا کردن ممان‌های فرکانس نیاز به حفظ یک ثبات  m_i برای همه عناصر متمایز a_i  که عضو (۱٬۲٬۳٬۴، …، N) می‌باشد که به حداقل حافظه با حدود \Omega(n)  نیاز دارند. اما ما باید محدودیت فضا مواجه هستیم و نیاز به یک الگوریتم است که در حافظه بسیار پایین‌تر محاسبه کند. به این می‌توان با استفاده از تقریب به جای ارزش‌های دقیق دست یافت. یک الگوریتمی که محاسبه می‌کند یک تقریب ( \delta  ,  \epsilon ) از  F_k  که  \epsilon   به عنوان پارامتر تقریب و   \delta  به عنوان پارامتر اطمینان است. .

##### محاسبه <math> F_0</math> عناصر متمایز در جریان داده
###### الگوریتم FM-Sketch
فلاجولت  وهمکاران در روش احتمالاتی از شمارش که از یک مقاله نوشتهٔ رابرت موریس الهام گرفته شده بود، شمارش تعداد زیادی از حوادث در ثبات‌های کوچک را معرفی کرد. موریس در مقاله خود می‌گوید که اگر نیاز به دقت، کاهش یافته‌است، یک شمارنده  n می‌تواند با یک شمارنده log  n جایگزین شود که در  loglog  n بیت ذخیره می‌شود. فلاجولت  وهمکاران این روش را با استفاده از تابع هش h که عناصر را به صورت یکنواخت در فضای هش توزیع می‌کند (یک رشته عدد باینری به طول  L)، بهبود بخشیدند.
h : [m] -> [0,2^L-1] 
فرض کنید bit(y,k) نشان‌دهنده بیت k ام در عدد باینری y است :   \sum_{k>=0} bit(y,k)*2^k 

فرض کنید \rho(y)  نشان‌دهنده کم ارزش‌ترین بیت ۱ در نمایش باینری عدد y_i با یک قرارداد و تعریف مناسب از \rho(0)
می‌باشد. \begin{cases} Min(bit(y,k)) \quad if\quad y>0  \\ L \qquad\qquad\qquad     if \quad y=0 \end{cases}
فرض کنید A یک دنباله‌ای از داده‌ها به طول M است که کاردینالیتی مورد نیاز را مشخص می‌کند. فرض کنید BITMAP[0..L-1] فضای هش می‌باشد که \rho(hashedvalues)  در آنجا ثبت می‌شود. الگوریتم زیر کاردینالیتی تقریبی A را مشخص می‌کند.

Procedure FM-Sketch:

  for i in 0 to L − 1 do
  BITMAP[i]:=0
  end for
  for x in A: do
  Index:=ρ(hash(x))
  i
  end if
  end for
  B:= Position of left most 0 bit of BITMAP[]
  return 2^B

اگر n عنصر متمایز و جدا در جریان داده وجود داشته باشد:

برای همه i\gg log n  ، در این صورت: BITMAP[i]=0
برای همه  i\ll log n  ، در این صورت: BITMAP[i] = 1
برای همه i\approx log n  ، در این صورت BITMAP[i] عددی اطراف ۰ و ۱ می‌شود.

###### الگوریتم ارزش k امین مینیمم
الگوریتم قبلی اولین تلاش و مرحله برای تقریب F_0  در جریان داده‌ها توسط فلاجولت و مارتین توصیف می‌کند. الگوریتم یک تابع هش تصادفی را انتخاب می‌کند که به‌طور یکنواخت مقادیر را به فضای هش می‌برد.
باریوسف و همکاران الگوریتم مقدار k امین مینیمم برای تعیین تعداد عناصر متمایز در جریان داده‌ها را معرفی کردند. آن‌ها از یک تابع هش مشابه استفاده کردند که مقادیر رو بین ۰ و ۱ می‌برد (عملیات نرمال کردن)h : [m] -> [0,1]  . اما آن‌ها یک مقدار محدود t را برای تعداد عناصر موجود در فضای هش یعنی بازه [۰٬۱] ثابت کردند. مقدار t از O(\dfrac{1}{\epsilon_2} )  می‌باشد. الگوریتم KVM مقدار هش شدهٔ کوچک‌ترین t را نگه می‌دارد. پس ازاینکه همه m مقدار داده دریافت شد ، v = Max(h(a_i))  تا بتواند به وسیله آن   F_0^\prime = \dfrac{t}{v}را حساب کند. در بازه فضای یکنواخت هش، آن‌ها انتظار دارند که کمترین مقدار t از O(\dfrac{t}{F_0} )  کمتر باشد.


```
Procedure 2 K-Minimum Value

Initialize first t values of KMV
for a in a1 to an do
if h(a) <Max(KMV) then
Remove Max(KMV) from KMV set
Insert h(a) to KMV
end if
end for
return t/Max(KMV)
```


###### تحلیل پیچیدگی الگوریتم KMV
الگوریتم یافتن مقدار k امین مینیمم می‌تواند در O((\dfrac{1}{\epsilon_2}).log(m)) )  از بیت‌های حافظه پیاده‌سازی شود. هش کردن هر مقدار O(log(m)) )  از بیت‌های حافظه را نیاز دارد؛ و تعداد هش کردن مقادیر نیز از O(\dfrac{1}{\epsilon_2} ) 
می‌باشد. اگر مقدار هش شده t در درخت باینری قرار داده شود، زمان دسترسی به آن به مقدار O(\dfrac{1}{\epsilon} )  کاهش یافته و به‌طور کلی الگوریتم به O((\dfrac{1}{\epsilon}).log(m)) )  کاهش می‌یابد.

##### محاسبه <math>F_k </math>
آلون و همکاران F_x  را با تعریف متغیری تصادفی که به وسیله فضا و زمان داده شده قابل محساسبه است، تخمین زدند. مقدار
E[x]  یعنی مقدار میانگین وزن‌دار این متغیر تصادفی بیانگر مقدار تقریبی F_k  می‌باشد.
طول داده m از قبل محاسبه شده‌است.
متغیر تصادفی X این‌گونه تعریف می‌شود:
* a_p  یک مقدار تصادفی از دنباله A با شماره p می‌باشد:a_p=l \in(1,2,3,\ldots, n) 
* فرض کنید r=|\{q:q\geq p,a_q=l\}| نشان‌دهنده تعداد رخداد* l* به عنوان عضوی از دنباله A با تعریف 
* متغیر تصادفی X با تعریف  X=m(r^k-(r-1)^k)  می‌باشد.
فرض کنید S_1  از  O( \dfrac{n^{1-\dfrac{1}{k}}}{\lambda^2} )   باشد و S_2  ازO(log(\dfrac{1}{\epsilon}) )  باشد، در این صورت الگوریتم S_2  را به عنوان یک متغیرتصادفی با مقادیر *Y*1*,Y*2*,... ,Y<sub>S</sub>*2 و مقدار میانگین *Y* درنطر می‌گیرد. به‌طوری‌که  مقدار متوسط  برای همه ۱ ≤ *j* ≤ *S*1 می‌باشد.
اکنون مقدارE[X]  را محاسبه می‌کنیم:

\begin{array}{lll}
E(X) &=& \sum_{i=1}^{n} \sum_{i=1}^{m_i} (j^k-(j-1)^k) \\
&=& \frac{m}{m} [(1^k+(2^k-1^k)+\ldots+ (m_{1}^{k} - (m_{1}-1)^{k})) \\
&&\;+\; (1^k+(2^k-1^k)+\ldots+ (m_{2}^{k} - (m_{2}-1)^{k}))+\ldots \\
&&\;+\; (1^k+(2^k-1^k)+\ldots+ (m_{n}^{k} - (m_{n}-1)^{k}))] \\
&=& \sum_{i=1}^{n} m_{i}^{k} = F_{k}
\end{array}

###### پیچیدگی<math>F_k </math>
باتوجه به الگوریتم بالا برای محاسبه F_k  که در آن متغیر تصادفی *X* دو مقدار a_p  و r  را ذخیره می‌کند پس متوجه می‌شویم برای محاسبه *X* به log(n) بیت برای ذخیره کردن a_p  و log(n) بیت برای ذخیره کردن r  نیازمندیم. تعداد کل متغیرتصادفی *X* از S_1 * S_2  محاسبه می‌شود؛ بنابراین کل الگوریتم از O\left(\dfrac{k\log{1 \over \varepsilon}}{\lambda^{2}}n^{1-{1 \over k}}\left(\log n + \log m\right)\right) می‌باشد.

###### روش مشابه برای محاسبه <math>F_k </math>
الگوریتم قبلی F_2  را در O( \sqrt{n}(\log m + \log n)) از حافظه محاسبه می‌کرد. آلون و همکاران ساده شده این الگوریتم را با استفاده از چهار متغیر تصادفی مستقل که مقادیر رو در بازه   [-1,1]   هش می‌کند. این کار پیچیدگی الگوریتم را به O\left(\dfrac{\log{1\over\varepsilon}}{\lambda^{2}}\left(\log n + \log m\right)\right) کاهش می‌دهد.

### بزرگان الگوریتم‌های جریان داده‌ها
برخی از الگوریتم‌های قابل توجه به جهت یافتن شایع‌ترین و محبوب‌ترین عناصر در یک جریان داده‌ها:
* Boyer–Moore majority vote algorithm
* Karp-Papadimitriou-Shenker algorithm
* تعداد مینمم‌های مطرح
* نمونه مهم شده
* شمارش‌سازی با اتلاف
* نمونه‌گیری و نگهداری
* چند مرحله فیلتر بلووم
* طرح شمارش
* نمونه‌گیری کمک‌کننده طرح

### تشخیص رویداد
تشخیص رویدادها در جریان داده اغلب با استفاده از یک الگوریتم بزرگان که در بالا ذکر شده‌است، انجام می‌شود. شایع‌ترین عناصر و میزان فرکانس و تکرار با استفاده یکی از این الگوریتمها تعیین می‌شود، سپس بیشترین افزایشی که در طول زمان گذشته رخ داده گزارش شود. این رویکرد می‌تواند با استفاده از میانگین متحرک نمایی و واریانس عادی و نرمال شده تصفیه شود.
.

### شمارش عناصر متمایز
شمارش تعداد عناصر متمایز در یک جریان (گاهی اوقات ممانF_0  خوانده می‌شود) مشکل دیگری است که به خوبی مورد مطالعه قرار گرفته‌است. اولین الگوریتم برای آن توسط فلاجولت و مارتین ارائه شده‌است. در سال ۲۰۱۰ کین، نلسون و ودراف یک الگوریتم مجانبی بهینه برای این مشکل پیدا کرده‌اند. این الگوریتم از  برای حافظه و فضا، بدترین حالت به روزرسانی و زمانش از ، هم‌چنین توابع هش جهانی و یک مجموعه از *r* هش مستقل به‌طوری کهاستفاده می‌کند.

### آنتروپی
با استفاده از آنتروپی توزیع ترافیک می‌توان نشان داد در طیف گسترده‌ای از برنامه‌های کاربردی نظارت بر شبکه مانند تشخیص ناهنجاری، خوشه بندی برای آشکار ساختن الگوهای جالب، و طبقه‌بندی ترافیک ازآن استفاده می‌شود. با این حال، تحقق این سود بالقوه در عمل نیاز به الگوریتم‌های دقیق است که بتوانند بر روی لینک‌های با سرعت بالا با پردازنده و حافظه مورد نیاز پایین عمل کنند. در این راستا دو الگوریتم وجود دارد که اولین الگوریتم برای برآورد آنتروپی توسط شباهت ساختاری با کار منی آلون و همکاران الهام گرفته‌است که برای برآورد ممان‌های فرکانس از آن استفاده می‌شود و الگوریتم دوم که در آن با مشاهدات عملکرد الگوریتم جریان به جدا کردن آیتم‌های فرکانس بالا (یا فیل‌ها) از موارد با فرکانس پایین می‌رسیم.

آنتروپی یک مجموعه از فرکانس‌های \mathbf{a} به صورت
F_k(\mathbf{a}) = \sum_{i=1}^n
\frac{a_i}{m}\log{\frac{a_i}{m}} تعریف می‌شود که در آن m = \sum_{i=1}^n a_i.
برآورد این مقدار در یک جریان توسط این افراد انجام شده‌است:
* McGregor و همکاران
* Do Ba و همکاران
* Lall و همکاران
* Chakrabarti و همکاران

### یادگیری آنلاین
مقاله اصلی: یادگیری آنلاین ماشین
یادگیری یک مدل (به عنوان مثال یک طبقه‌بندی آماری) از طریق گذراندن یک مجموعه آموزش:
* هش کردن ویژگی‌ها
* گرادیان نزولی تصادفی

## کران پایین
کران پایین برای بسیاری از مشکلات جریان داده که مطالعه شده‌اند محاسبه شده‌است. تا کنون، متداول‌ترین روش برای محاسبه این کران استفاده از پیچیدگی‌های ارتباطی است.

## بیشتر مطالعه کنید
** کاویدن جریانی از داده‌ها
* خوشه‌بندی جریانی از داده‌ها
* الگوریتم برخط
* پردازش جریانی
* الگوریتم ترتیبی

## پانویس

## منابع
* . First published as .
* .
* .
* .
* .
* .
* .
* Heath, D. , Kasif, S. , Kosaraju, R. , Salzberg, S. , Sullivan, G. , "Learning Nested Concepts With Limited Storage", Proceeding IJCAI'91 Proceedings of the 12th international joint conference on Artificial intelligence - Volume 2, Pages 777-782, Morgan Kaufmann Publishers Inc. San Francisco, CA, USA ©۱۹۹۱
* http://dl.acm.org

## پیوند به بیرون
* Princeton Lecture Notes
* Streaming Algorithms for Geometric Problems, by Piotr Indyk, MIT
* Dagstuhl Workshop on Sublinear Algorithms
* List of open problems in streaming (compiled by Andrew McGregor) from discussion at the IITK Workshop on Algorithms for Data Streams, 2006.
* StreamIt - programming language and compilation infrastructure by MIT CSAIL 
* IBM Spade - Stream Processing Application Declarative Engine
* IBM InfoSphere Streams

**آموزش و نظرسنجی**
* Data Stream Algorithms and Applications by S. Muthu Muthukrishnan
* Stanford STREAM project survey
* Network Applications of Bloom filters, by Broder and Mitzenmacher
* Xu's SIGMETRICS 2007 tutorial
* Lecture notes from Data Streams course at Barbados in 2009, by Andrew McGregor and S. Muthu Muthukrishnan

**وبگاه دروس**
* Dartmouth
* MIT
* Rice
* Rutgers
* University at Buffalo

رده:الگوریتم جریان داده‌ها
رده:الگوریتم‌ها