Dataplusscience - Ir Guide To Datamining

You might also like

You are on page 1of 449

‫داده‌کاوی‌برای‌برنامه‌نویسان ‌‬

‫هنر‌باستانیِ‌شمارش‬

‫تألیف‪‌:‬ران‌زاچارسکی‌(‪‌ )guidetodatamining.com‬‬
‫ترجمه‪‌:‬مسعود‌کاویانی‌(‪‌ )chistio.ir‬‬

‫‌‬
‫‌‌‬
‫‪ :‬زاخارسكي ‪ ,‬رون‬ ‫سرشناسه‬
‫‪Zacharski , Ron‬‬
‫[‬
‫‪ :‬داده كاوي براي برنامه نويسان‪ :‬هنر باستاني شمارش ‪ /‬تاليف رون زاخارسكي ; ترجمه مسعود كاوياني‬ ‫عنوان و نام پديدآور‬
‫‪ :‬تهران‪ :‬ناقوس‪.8931 ،‬‬ ‫مشخصات نشر‬
‫[‬
‫‪ 331 :‬ص‪ :.‬مصور‪ ،‬جدول‪ ,.‬نمودار‬ ‫[ ظاهري‬
‫‪978-600-473-225-3 :‬‬ ‫شابك‬
‫وضعيت فهرستنويسي ‪ :‬فيپا‬
‫‪ :‬عنوان اصلي ‪A Prorammers Gui to Data Mining: the Ancient Art of the Numeriati.‬‬ ‫يادداشت‬
‫‪ :‬هنر باستاني شمارش‬ ‫عنوان ديگر‬
‫‪ :‬داده كاوي‬ ‫موضوع‬
‫‪Data mining :‬‬ ‫موضوع‬
‫‪ :‬كاوياني ‪ ,‬مسعود ‪ , -8903 ,‬مترجم‬ ‫شناسه افزوده‬
‫‪Kaviani , masoud :‬‬ ‫شناسه افزوده‬
‫‪QA70 /3 :‬‬ ‫رده بندي كنگره‬
‫‪110 / 982 :‬‬ ‫رده بندي ديويي‬
‫شمارۀ كتابشناسي ملي ‪2202237 :‬‬
‫انتشارات ناقوس‬

‫براي خريد ‪ Online‬به آدرس زير‬


‫مراجعه كنيد‪:‬‬
‫‪www.naghoospress.ir‬‬ ‫انتشارات ناقوس‬

‫‪ :‬داده كاوي براي برنامه نويسان‪ :‬هنر باستاني شمارش‬ ‫نام كتاب‬
‫چاپ اول‬
‫‪ :‬انتشارات ناقوس‬ ‫ناشر‬
‫‪ :‬رون زاخارسكي‬ ‫نويسنده‬
‫‪ :‬مسعود كاوياني‬ ‫مترجم‬
‫‪8931 :‬‬ ‫چاپ اول‬
‫‪ :‬ده جلد (‪81‬نسخه )‬ ‫تيراژ‬
‫كليه حقوق براي سرمايه گذار محفوظ‬
‫‪ :‬برجسته‬ ‫چاپ و صحافي‬
‫است‪ .‬تكثير تمامي يا قسممتي از ايمن‬
‫اثر بهصمورت حروفيينمي يما چماپ‬ ‫‪ :‬ياسمن تجملي محدث‬ ‫حروفنگار و صفحهآرا‬
‫مجدد‪ ،‬چاپ افست‪ ،‬پليكپي‪ ،‬فتوكپي‬
‫‪ 1110111 :‬ريال‬ ‫قيمت‬
‫و انواع ديگر چماپ ممنموع اسمت و‬
‫پيگرد قانوني دارد‪.‬‬ ‫‪371 -011-379-222-9 :‬‬ ‫شابك‬
‫‪978-600-473-225-3 :‬‬ ‫‪ISBN‬‬

‫انتشارات ناقوس‬
‫بلوار كشاورز‪ -‬خيابان ‪80‬آذر‪ -‬كوچه پارسي‪ -‬پالك‪81‬‬
‫تلفاكس‪00371323 - 00371328 :‬‬
‫دیباچه‌ ‌‬
‫این‌کتاب‌با‌نام‌اصلیِ ‌‬
‫‪A Programmer’s Guide to Data Mining: The Ancient Art of the Numerati‬‬
‫در وبسایت ‪ guidetodatamining.com‬توسط ‪ Ron Zacharski‬تحت الیسنس‬
‫‪ Creative Commons Attribution Noncommercial 3.0‬به صورت رایگان تهیه شده‬
‫است‪.‬‬
‫ترجمهی این کتاب در وبسایت ‪ chistio.ir‬تحت همین الیسنس منتشر شده است‪ .‬به این‬
‫معنا که شما میتوانید کتاب را به صورت رایگان در اختیار داشته و آن را با رعایت لینک به‬
‫تولید کننده و مترجم‪ ،‬به صورت غیر تجاری‪ ،‬استفاده‪ ،‬توزیع و یا چاپ کنید‪.‬‬
‫منابع تمامیِ تصاویرِ استفاده شده در این کتاب در وبسایت ‪ guidetodataminig.com‬و‬
‫‪ chistio.ir‬همراه با ارجاع‪ ،‬موجود است‪.‬‬
‫در ترجمهی این کتاب سعی شده است تا به اندازهی ممکن قلم نویسنده حفظ شود‪ .‬با این‬
‫حال مترجم در چند قسمت به صورت مختصر توضیحاتی جهت شفافتر شدن موضوع‬
‫برای خوانندگانِ فارسی زبان اضافه کرده است‪.‬‬

‫ج‬
‫برنامهنویسان‬ ‫‌د‌■ ‌‬
‫دادهکاوی‌برای‌ ‌‬

‫(نویسنده)‌متشکرم‌از‪‌ ...‬‬

‫همسرم‬ ‫پسرم‬

‫‌‬
‫(مترجم)‌متشکرم‌از‪‌ ...‬‬
‫ادامهی‌این‌مسییر‌للمیی‪‌،‬‬
‫پدرم‪‌،‬مادرم‪‌،‬خواهرم‌و‌البته‌همسر‌نازنینم‪‌.‬امیدوارم‌که‌بتوانم‌در‌ ‌‬
‫بالث‌سرافرازی‌آنها‌شوم‪‌.‬همیشه‌قدردانتان‌بوده‪‌،‬هستم‌و‌خواهم‌بود‪‌ ...‬‬
‫‌‬

‫ه‬
‫فهرست‌مطالب‬
‫‪8‬‬ ‫فصل ‪ .8‬مقدمه‬
‫به‌قرن‌‪12‬خوش‌آمدید ‪3 ....................................................................................................‬‬
‫پیدا‌کردن‌چیزهای‌مرتبط‪5 ...............................................................................................‬‬
‫ولی‌چگونه‌این‌چیزها‌را‌پیدا‌کنیم؟ ‪5 ................................................................................‬‬
‫فقط‌این‌چیزها‌نیست‪7 ................................................................................................... ...‬‬
‫تِراماینینگ‌چیزِ‌خیلی‌لجیبی‌نیست ‪01 ............................................................................‬‬
‫ساختار‌این‌کتاب ‪03 ...........................................................................................................‬‬
‫تمامکردنِ‌این‌کتاب‌چه‌چیزی‌یاد‌خواهید‌گرفت ‪05 .....................................‬‬
‫با‌خواندن‌و‌ ‌‬
‫اصالً‌چرا؟‌‌چرا‌چیزهای‌موجود‌در‌این‌کتاب‌مهم‌هستند؟‪05 ...........................................‬‬
‫منظور‌از‌«هنر‌باستانی‌شمارش»‌‌در‌لنوان‌این‌کتاب‌چیست؟ ‪07 ....................................‬‬

‫‪83‬‬ ‫فصل ‪ .2‬سيستمهاي توصيهگر‬


‫فاصلهی‌مَنهَتَن‌(‪22 .................................................................)Manhattan Distance‬‬
‫‌‬
‫فاصلهی‌اقلیدسی‌(‪22 .................................................................)Euclidean Distance‬‬
‫‌‬
‫تئوریِ‌فیثاغورث ‪22 ............................................................................................................‬‬
‫تفکرِ‌چند‌بُعدی‌(‪22 ........................................................ )N-Dimensional Thinking‬‬
‫یک‌لیب‌اساسی ‪31 ............................................................................................................‬‬
‫یسازی‌(‪31 ......................................................................... )Generalization‬‬
‫یک‌لموم ‌‬
‫دادهها‌در‌زبان‌پایتون ‪33 ........................................................................................‬‬
‫نمایش‌ ‌‬
‫فاصلهی‌منهتن ‪35 ....................................................................‬‬
‫محاسبهی‌ ‌‬
‫‌‬ ‫کد‌پایتون‌برای‌‬
‫یک‌شرمساری‌برای‌کاربران ‪21 ...........................................................................................‬‬
‫ضریب‌همبستگی‌پیرسون‌(‪20 ......................... )Pearson Correlation Coefficient‬‬
‫ز‬
‫برنامهنویسان‬ ‫‌ح‌■ ‌‬
‫دادهکاوی‌برای‌ ‌‬

‫آخرین‌فرمول‌–‌شباهت‌کسینوسی‌(‪24 .........................................)Cosine Similarity‬‬


‫از‌کدام‌معیار‌شباهت‌استفاده‌کنیم؟ ‪53 .............................................................................‬‬
‫‪‌K‬نزدیکترین‌همسایه‌(‪21 ...................................................... )K-Nearest Neighbor‬‬
‫یک‌کالس‌(‪‌)Class‬توصی‌هگر‌با‌زبان‌پایتون ‪22 ..................................................................‬‬
‫دادهی‌جدید ‪24 ..........................................................................................‬‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫یک‌‬

‫‪78‬‬ ‫فصل ‪ .9‬پايش بر اساس اقالم‬


‫امتیازدهی‌صریح‌(‪70 ........................................................................... )Explicit Rating‬‬
‫امتیازدهی‌ضمنی‌(‪73 ......................................................................... )Implicit Rating‬‬
‫مشکالت‌امتیازدهیِ‌صریح ‪77 .............................................................................................‬‬
‫مشکل‌موفقیت‪22 ...............................................................................................................‬‬
‫پایشِ‌مبتنی‌بر‌کاربر‌(‪23 ........................................................ )User-based Filtering‬‬
‫پایش‌مبتنی‌بر‌اقالم‌(‪22 ........................................................ )Item-Based Filtering‬‬
‫شباهت‌کسینوسیِ‌تعدیل‌شده‌(‪27 ............................. )Adjusted Cosine Similarity‬‬
‫الگوریتم‌شیبِ‌یک‌(‪44 ................................................................................ )Slope One‬‬
‫حاال‌نوبت‌کد‌پایتون‌است ‪012 ...........................................................................................‬‬
‫وزندارد‌(‪‌:)Weighted Slope 1‬قسمت‌توصی‌هگر ‪002 .....................‬‬
‫الگوریتمِ‌شیبِ‌یکِ‌ ‌‬
‫دادهی‌‪007 ................................................................................. MovieLens‬‬
‫مجمولهی‌ ‌‬
‫‌‬

‫‪828‬‬ ‫فصل ‪ .3‬طبقهبندي‬


‫اهمیتِ‌انتخابِ‌مقادیرِ‌مناسب ‪025 ......................................................................................‬‬
‫یک‌مثال‌ساده ‪031 .............................................................................................................‬‬
‫برویم‌به‌سراغ‌کدهای‌پایتون ‪032 .......................................................................................‬‬
‫پاسخ‌به‌سوالِ‌«چرا؟»‪032 ..................................................................................................‬‬
‫اسهای‌متفاوت ‪032 .....................................................................................‬‬
‫مشکل‌در‌مقی ‌‬
‫نرمالسازی ‪021 ...................................................................................................................‬‬
‫‌‬
‫مشکلِ‌استفاده‌از‌امتیازِ‌استاندارد ‪025 ................................................................................‬‬
‫اصالحشده‌(‪025 .................................... )Modified Standard Score‬‬
‫‌‬ ‫امتیازِ‌استانداردِ‌‬
‫فهرست‌مطالب‌■‌ط‬

‫نرمالسازی‌را‌انجام‌بدهیم‌یا‌نه؟ ‪024 .................................................................................‬‬


‫‌‬
‫برگردیم‌به‌مثالِ‌پاندورا‌(‪‌–‌Pandora‬سایت‌پخش‌آنالین‌موسیقی) ‪050 ........................‬‬
‫طبقهبندیِ‌نزدیک‌ترین‌همسایه ‪052 ..........................................................‬‬
‫کد‌پایتون‌برای‌ ‌‬
‫مسئلهی‌«چه‌ورزشی؟»‪022 ...............................................................................................‬‬
‫‌‬
‫دادههای‌آزمون‌(‪022 ..................................................................................... )Test Data‬‬
‫‌‬
‫کد‌پایتون‪027 .....................................................................................................................‬‬
‫خطاهای‌‪‌Assertion‬و‌تابع‌‪‌Assert‬در‌پایتون ‪072 ..........................................................‬‬
‫گلهای‌زنبق‌(‪021 ........................................................... )Iris Dataset‬‬
‫دادهی‌ ‌‬
‫مجموله‌ ‌‬
‫مسئلهی‌مایل‌به‌ازای‌هر‌گالن ‪022 ....................................................................................‬‬
‫‌‬
‫ماندهی‌فصل ‪023 .............................................................................................................‬‬
‫ته ‌‬ ‫‌‬

‫‪817‬‬ ‫فصل ‪ .2‬كمي بيشتر در مورد طبقهبندي‬


‫مجمولهی‌آزمون‌(‪022 ...................... )Test Set‬‬
‫‌‬ ‫مجمولهی‌آموزشی‌(‪‌)Training Set‬و‌‬
‫‌‬
‫تکهای‌(‪040 ............................ )10-Fold Cross Validation‬‬
‫التبار‌سنجیِ‌متقابلِ‌‪‌ -21‬‬
‫تکهای‌(‪040 .................. )10-Fold Cross Validation‬‬
‫مثالِ‌‌التبار‌سنجیِ‌متقابلِ‌‪‌ -21‬‬
‫روش‌کنار‌گذاشتنِ‌یکی‌(‪042 ........................................................... )Leave-One-Out‬‬
‫معایب‌روشِ‌کنار‌گذاشتنِ‌یکی‌(‪042 ................................................ )Leave-One-Out‬‬
‫الی‌هبندی‌(‪047 ....................................................................................... )Stratification‬‬
‫ماتریس‌اغتشاش‌(‪044 .............................................................. )Confusion Matrices‬‬
‫برنامهنویسی ‪212 ..................................................................................................‬‬
‫یک‌مثال‌ ‌‬
‫تکهای‌(‪212 ................... )10-Fold Cross Validation‬‬
‫فرآیند‌التبارسنجیِ‌متقابلِ‌‪‌ -21‬‬
‫آمار‌کاپا‌(‪214 ..................................................................................... )Kappa Statistic‬‬
‫کترین‌همسایه‌(‪207 .....................................)Nearest Neighbor‬‬
‫بهبودِ‌الگوریتمِ‌نزدی ‌‬
‫کترین‌همسایه‌(‪204 .................................................................................... )KNN‬‬
‫‪‌K‬نزدی ‌‬
‫دادهی‌جدید‌و‌یک‌چالش ‪222 ...................................................................‬‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫یک‌‬
‫تمهای‌بهتر‌و‌یک‌اتوبوسِ‌خراب ‪231 ..............................................‬‬
‫دادههای‌بیشتر‪‌،‬الگوری ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‌ی‌■ ‌‬
‫دادهکاوی‌برای‌ ‌‬

‫‪299‬‬ ‫فصل ‪ .0‬بِيز ساده‬


‫احتماالت ‪235‬‬
‫یادگیری‌چند‌لبارت ‪234 ....................................................................................................‬‬
‫کارتِ‌خرید‌ماکروسافت ‪221 ...............................................................................................‬‬
‫تئوریِ‌بیز‌(‪222 ................................................................................. )Bayes Theorem‬‬
‫چرا‌به‌تئوری‌بیزین‌احتیاج‌داریم؟ ‪255 ..............................................................................‬‬
‫بیزین‌ساده‪252 ...................................................................................................................‬‬
‫مثالِ‌محصوالت‌‪‌i100‬و‌‪221 ................................................................................... i500‬‬
‫یدهیم ‪222 ..................................................................‬‬
‫حاال‌این‌کارها‌را‌در‌پایتون‌انجام‌م ‌‬
‫دموکراتها ‪270 .........................................................................‬‬
‫‌‬ ‫یخواهان‌در‌مقابل‌‬
‫جمهور ‌‬
‫تخمین‌احتماالت ‪272 .........................................................................................................‬‬
‫حل‌مشکل ‪272 ...................................................................................................................‬‬
‫رفع‌یک‌ابهام ‪222 ...............................................................................................................‬‬
‫‪223‬‬ ‫الداد‬
‫دستهبندی ‪222 ..........................................................................‬‬
‫طبقهها‌و‌ ‌‬
‫روش‌‪‌:2‬ساخت‌ ‌‬
‫عهای‌گوسی‌(‪225 ........................................................................ )Gussian‬‬
‫روش‌‪‌:1‬توزی ‌‬
‫انحراف‌استانداردِ‌جمعیت‌و‌انحراف‌استاندارد‌نمونه‪222 .....................................................‬‬
‫ادهسازی ‪242 ..................................................................................‬‬
‫یک‌سری‌نکات‌برای‌پی ‌‬
‫ادهسازی‌پایتون ‪247 ........................................................................................................‬‬
‫پی ‌‬
‫فاز‌یادگیری ‪247 .................................................................................................................‬‬

‫‪982‬‬ ‫فصل ‪ .7‬پردازش متون بدون ساختار‬


‫یک‌سیستم‌خودکار‌برای‌تشخیص‌مثبت‌یا‌منفی‌بودن‌متون ‪304 ....................................‬‬
‫فاز‌آموزش‪325 ....................................................................................................................‬‬
‫طبقهبندی‌بیز‌ساده‌(‪322 ................................................................... )Naïve Bayes‬‬
‫فاز‌ ‌‬
‫دادهی‌متون‌خبری‌(‪332 ......................................... )Newsgroup Corpus‬‬
‫مجمولهی‌ ‌‬
‫‌‬
‫کد‌بزنید‌–‌استایل‌پایتونی ‪332 ..........................................................................................‬‬
‫فهرست‌مطالب‌■‌ك‬

‫بیز‌ساده‌(‪‌)Naïve Bayes‬و‌تحلیل‌احساسات‌(‪322 ................ )Sentiment Analysis‬‬

‫‪923‬‬ ‫فصل ‪ .1‬خوشه بندي‬


‫خوشهبندی‌‪321 ................................................................................................ k-means‬‬
‫‌‬
‫سلسلهمراتبی‌(‪320 ................................................................ )Hierarchical‬‬
‫‌‬ ‫خوشهبندی‌‬
‫‌‬
‫خوشهبندی‌‪323 ..................................................................................... Single-linkage‬‬
‫‌‬
‫خوشهبندی‌‪323 ............................................................................. Complete-linkage‬‬
‫‌‬
‫خوشهبندی‌‪322 ................................................................................ Average-linkage‬‬
‫‌‬
‫الگوریتم ‪322‬‬
‫سلسلهمراتبی ‪373 ..............................................‬‬
‫‌‬ ‫خوشهبندی‌‬
‫‌‬ ‫کُد‌پایتون‌برای‌یک‌الگوریتم‌‬
‫دادهها‌از‌فایل ‪377 ..................................................................................................‬‬
‫خواندن‌ ‌‬
‫ایجاد‌صف‌اولویت‌اولیه ‪372 ................................................................................................‬‬
‫دادهها‌چه‌کار‌کنیم؟ ‪372 .................................‬‬
‫نکه‌با‌این‌ ‌‬
‫مسافتهای‌یکسان‌و‌ای ‌‬
‫‌‬ ‫مشکل‌‬
‫فاصلههای‌یکسان ‪374 ................................................................‬‬
‫نکتهی‌دیگر‌در‌مورد‌ ‌‬
‫یک‌ ‌‬
‫خوشهبندی‌‪342 ............................................................................................... K-means‬‬
‫‌‬
‫تپهنوردی‌(‪212 ........................................................................................ )Hill Climbing‬‬
‫‌‬
‫معیار‌‪‌SSE‬و‌پراکندگی ‪212 ................................................................................................‬‬
‫وقت‌کد‌زدنه! ‪212 ...............................................................................................................‬‬
‫‪204 .............................................................................................................. k-means++‬‬
‫خالصه ‪222‬‬
‫انرون‌(‪222 ............................................................................................................ )Enron‬‬
‫تحلیل‌لینک‌(‪230 .................................................................................. )Link Analysis‬‬
‫‌‬
‫‌‬

‫فصل ‪ .8‬مقدمه‬
‫مقدماتي دربارهي دادهكاوي و چگونگي مطالعهي اين كتاب‬
‫‌‬
‫‌‬
‫‌‬
‫زندگی ‌در ‌یک ‌شهرِ ‌کوچکِ ‌آمریکایی ‌در ‌‪‌ 251‬سال ‌را‌پیش ‌تصور ‌کنید‪‌.‬ساکنینِ ‌آن ‌شهر‪‌،‬‬
‫جعبهای ‌از ‌پارچه ‌به ‌یک ‌مغازه‌‬
‫یشناختند‪‌ .‬فرض ‌کنید ‌در ‌این ‌شهر ‌ ‌‬ ‫همگی ‌یکدیگر ‌را ‌م ‌‬
‫توپهای ‌پارچه‪‌ ،‬نظرِ ‌خانمِ ‌‪‌ Clancey‬را‌‬
‫یرسید‪‌.‬فروشنده ‌متوجه ‌می‌شود ‌که ‌طرحِ ‌یکی ‌از ‌ ‌‬ ‫م‌‬
‫طرحهای ‌گلدارِ ‌روشن‌‬‫یکند ‌چون ‌فروشنده ‌از ‌قبل ‌می‌دانست ‌که ‌خانم ‌‪‌ Clancey‬از ‌ ‌‬ ‫جلب ‌م ‌‬
‫یآید‪‌.‬این ‌فروشنده ‌یک ‌یادآوری ‌در ‌ذهن ‌خودش ‌حک ‌می‌کند ‌تا ‌یادش ‌باشد ‌که‌‬ ‫خوشش ‌م ‌‬
‫دفعهی ‌بعد ‌که ‌خانم ‌‪‌ Clancey‬به ‌فروشگاه ‌آمد‪‌ ،‬این ‌توپِ ‌پارچه ‌را ‌به ‌او ‌نشان ‌دهد‪‌.‬آقای‌‬
‫‌‬
‫‪‌ Chow Winkler‬به ‌آقای ‌‪‌ Wilson‬که ‌یک ‌ ‌‬
‫سالندار ‌است ‌می‌گوید ‌که ‌در ‌فکرِ ‌فروشِ ‌تفنگِ‌‬
‫یدکیِ ‌خود ‌با ‌مدل ‌«رمینگتن» ‌است‪‌.‬آقای ‌‪‌ Wilson‬هم ‌همین ‌اطاللات ‌را ‌به ‌آقای ‌ ‪Bud‬‬
‫یدهد‪‌ ،‬زیرا ‌می‌داند ‌که ‌آقای ‌‪‌ Barclay‬دنبال ‌خریدِ ‌یک ‌تفنگِ ‌باکیفیت ‌است‪‌.‬‬ ‫‪‌ Barclay‬م ‌‬
‫یدانند ‌که ‌باید ‌مراقب ‌‪‌ Lee Pye‬باشند ‌زیرا ‌این‌‬ ‫کالنتر ‌‪‌ Valquez‬و ‌سربازِ ‌زیردستش ‌م ‌‬
‫شخص ‌آدمی ‌قوی ‌بوده‌که ‌دوست ‌دارد ‌مست ‌کند ‌و ‌لالوه‌بر‌آن‪‌،‬اخالق ‌درست ‌و ‌حسابی‌‬
‫شدهاید‪‌ ،‬زندگی ‌در ‌یک ‌شهر ‌کوچک ‌در ‌‪‌ 211‬سال ‌پیش‌‬ ‫همانطور ‌که ‌متوجه ‌ ‌‬
‫هم ‌ندارد‪‌ ‌ .‬‬
‫تماماً‌حول‌و‌حوش‌ارتباطات‌جریان‌داشت‪‌ .‬‬
‫‌‬

‫‪0‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌1‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‌‬
‫آنها ‌از ‌وضعیتِ ‌سالمتیِ‌‬ ‫یدانستند‪‌ ،‬لالوه ‌بر ‌این‪‌ ‌ ،‬‬
‫آدمها ‌سالیقِ ‌شما ‌را ‌م ‌‬
‫در‌چنین‌شهری‌ ‌‬
‫یدانستند ‌که ‌شما ‌مجرد ‌هستید ‌یا ‌متاهل‪‌.‬چه ‌خوب ‌چه ‌بد‪‌،‬‬ ‫شما ‌نیز ‌با ‌خبر ‌بودند‪‌.‬حتی ‌م ‌‬
‫یشده‌‬ ‫یساز ‌‬ ‫یسازی‌شده ‌(‪‌)personalized‬بود ‌و ‌این ‌زندگیِ ‌شخص ‌‬ ‫تجربهی ‌شخص ‌‬
‫این ‌یک ‌ ‌‬
‫در‌اکثر‌نقاط‌جهان‌نیز‌صادق‌بود‪‌ .‬‬
‫سالها‪‌ ،‬روابطِ‌‬
‫ن ‌‬ ‫‌اجازه ‌بدهید ‌‪‌ 211‬سال ‌به ‌جلو ‌برویم‪‌ .‬نزدیکی ‌سال ‌‪2691‬میالدی‪‌ .‬در ‌ای ‌‬
‫در‌این‌سالها‪‌ ،‬یک ‌مشتریِ‌‬
‫‌‬ ‫کمتر ‌رخ ‌می‌داد ‌ولی ‌هنوز ‌هم ‌وجود ‌داشت‪‌ .‬‬ ‫یشده ‌ ‌‬ ‫یساز ‌‬ ‫شخص ‌‬
‫جملهی ‌«کتابِ ‌جدیدِ ‌ ‪James‬‬ ‫مغازهی ‌کتابفروشی ‌ممکن ‌بود ‌با ‌ ‌‬ ‫مراجعه ‌به ‌ ‌‬
‫‌‬ ‫لادی ‌با ‌‬
‫یدانست ‌که ‌معموالً‌‬ ‫‪‌ Michener‬موجود ‌است» ‌توسط ‌فروشنده ‌مواجه ‌شود‪‌.‬زیرا ‌فروشنده ‌م ‌‬
‫لالقهمند ‌است‪‌ .‬و ‌یا ‌اینکه ‌فروشنده‌‬‫کتابهای ‌‪‌ ‌ James Michener‬‬ ‫یک ‌مشتریِ ‌نولی ‌به ‌ ‌‬
‫معموالً ‌کتابِ ‌«وجدان ‌محتاط» ‌اثر ‌‪‌ Barry Goldwater‬را ‌به ‌مشتریان ‌پیشنهاد ‌می‌داد ‌زیرا‌‬
‫سادهتر‪‌ ،‬در‌همین‌‬
‫محافظهکار ‌هستند‪‌.‬یا ‌برای ‌مثالِ ‌ ‌‬‫‌‬ ‫یدانست ‌که ‌معموالً ‌مشتریانِ ‌نولی ‌‬ ‫م‌‬
‫شخدمت‌به‌‬ ‫یآید‌و‌پی ‌‬ ‫حول‌و‌حوشِ‌سال‌‪‌،2691‬یک‌مشتری‌برای‌صرف‌شام‌به‌رستوران‌م ‌‬
‫یگوید‪«‌:‬همان‌همیشگی؟» ‌‬ ‫او‌م ‌‬
‫یسازی ‌(‪‌ )personalization‬وجود ‌دارد‪‌.‬مثالً ‌فرض‌‬ ‫هنوز‌تکههایی‌از ‌آن‌شخص ‌‬
‫‌‬ ‫امروزه ‌نیز ‌‬
‫شخدمت‌‬ ‫یشاپِ ‌محلِ ‌خودم ‌در ‌مِسیال ‌(شهر ‌‪‌ )Mesilla‬می‌روم ‌و ‌پی ‌‬ ‫کنید ‌من ‌به ‌کاف ‌‬
‫شخدمت‌می‌داند‌که‌این‌همان‌چیزی‌‬ ‫یگوید‪«‌:‬یک‌قهوه‌الته‌با‌یک‌شاتِ‌اضافه؟»‌زیرا‌پی ‌‬ ‫م‌‬
‫‌فصل‌‪‌.2‬مقدمه‌■ ‪3‬‬

‫است ‌که ‌هر ‌روز ‌صبح ‌سفارش ‌می‌دهم‪‌.‬یا ‌برای ‌مثال‪‌ ،‬سگ ‌خانگیِ ‌خودم ‌را ‌نزدِ ‌آرایشگرِ‌‬
‫نحوهی ‌کوتاه ‌کردنِ ‌موهای‌‬ ‫دربارهی ‌ ‌‬
‫یبرم ‌و ‌آرایشگر ‌احتیاجی ‌ندارد ‌که ‌از ‌من ‌ ‌‬ ‫سگهایم ‌م ‌‬
‫‌‬
‫یداند ‌که ‌من ‌یک ‌مدلِ ‌خاص ‌(مثالٌ ‌مدلِ ‌گوش ‌آلمانی ‌بدون‌‬ ‫سگم ‌سوالی ‌بپرسد‪‌.‬او ‌دیگر‌م ‌‬
‫یپسندم‪‌ .‬‬ ‫زواید‌اسپرت)‌برای‌موهای‌سگم‌م ‌‬
‫اما‌چیزی‌که‌واضح‌است‌این‌است‌که‌اوضاع‌در‌مقایسه‌با‌آن‌شهر‌کوچکِ‌‪‌211‬سالِ‌پیش‌‬
‫یهای ‌محلی ‌و ‌دیگر‌‬ ‫فروشگاههای ‌حجیم ‌جایگزین ‌بقال ‌‬
‫‌‬ ‫تغییر ‌کرده ‌است‪‌.‬خوابارفروشی‌ها ‌و ‌‬
‫انتخابها ‌محدود ‌بودند‪(‌ Henry Ford‌.‬بنیان‌گذار‌‬‫‌‬ ‫شدهاند‪‌.‬در ‌آغازِ ‌این ‌تغییرات‪‌ ،‬‬
‫فروشندهها ‌ ‌‬
‫‌‬
‫یتواند ‌یک ‌ماشین ‌با ‌هر ‌رنگی ‌که ‌دلش‌‬ ‫یگفت‪«‌ :‬هر ‌مشتری ‌م ‌‬ ‫شرکت ‌فورد) ‌زمانی ‌م ‌‬
‫فروشگاههای ‌ضبط‌‬
‫‌‬ ‫یخواهد ‌داشته ‌باشد‪‌ ،‬البته ‌تا ‌زمانی ‌که ‌رنگ ‌انتخابی ‌سیاه ‌باشد»‪‌ .‬‬ ‫م‌‬
‫یها ‌یک ‌سری ‌کتاب ‌محدود ‌داشتند‪‌.‬‬ ‫کتابفروش ‌‬
‫صوتهای ‌محدودی ‌داشتند‪‌ ‌.‬‬ ‫صوت‪‌ ،‬ضبط ‌ ‌‬
‫توتفرنگی ‌بود‪‌ .‬ماشین‌‬ ‫انتخابها ‌بین ‌وانیلی‪‌ ،‬شکالتی ‌و ‌یا ‌شاید ‌ ‌‬
‫‌‬ ‫یخواستید؟ ‌‬ ‫بستنی ‌م ‌‬
‫یخواستید؟ ‌اگر ‌در ‌سال ‌‪‌ 2651‬یک ‌ماشین ‌لباسشویی ‌از ‌یک ‌فروشگاه ‌محلیِ‌‬ ‫لباسشوی ‌م ‌‬
‫یخواستید‪‌ ،‬دو ‌انتخاب ‌وجود ‌داشت‪‌:‬مدل‌‬ ‫‪(‌ Sears‬یک ‌برندِ ‌فروشگاه ‌زنجی ‌‬
‫رهای ‌در ‌آمریکا)‌م ‌‬
‫استاندارد‌با‌قیمت‌‪‌55‬دالر‌یا‌مدل‌لوکس‌با‌قیمت‌‪‌65‬دالر‪‌ .‬‬
‫‌‬

‫به‌قرن‌‪12‬خوش‌آمدید ‌‬
‫تهای ‌سابق ‌در ‌خرید‪‌ ،‬به ‌دست ‌فراموشی ‌سپرده ‌شده ‌است‪‌.‬فرض‌‬ ‫در ‌قرن ‌‪‌ ،12‬آن ‌محدودی ‌‬
‫یخواهم ‌یک ‌موسیقی ‌بخرم‪‌ .‬سایت ‌‪‌ iTunes‬حدود ‌‪‌ 22‬میلیون ‌قطعه ‌موسیقی‌‬ ‫کنید ‌من ‌م ‌‬
‫برای ‌انتخاب ‌دارد‪‌.‬این ‌فروشگاه‪‌ 29‌ ،‬میلیارد ‌قطعه ‌تا ‌اکتبر ‌‪‌ 1122‬فروخته ‌است‪‌.‬کم ‌است؟‌‬
‫یتوانم‌به‌اپلیکیشن‌اسپاتیفای‌(‪‌)Spotify‬که‌بیش‌از‌‪‌25‬‬ ‫یخواهم؟‌م ‌‬ ‫انتخابهای‌بیشتری‌م ‌‬
‫‌‬
‫قطعهی‌موسیقی‌دارد‌سر‌بزنم‪‌ ‌.‬‬ ‫میلیون‌ ‌‬
‫وبسایت‌آمازون‌بیش‌از‌‪‌1‬میلیون‌لنوان‌کتاب‌برای‌انتخاب‌دارد‪‌ .‬‬ ‫یخواهم‌کتابی‌بخرم؟‌ ‌‬ ‫م‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌4‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫انتخابهای‌زیادی‌وجود‌دارد‪‌ .‬‬
‫‌‬ ‫یخواهم‌یک‌فیلم‌تماشا‌کنم؟‌‬
‫م‌‬

‫‌‬
‫بیش‌از‌‪‌211‬هزار‌لنوان‌در‌‪‌Netflix‬موجود‌است ‌‬

‫‌‬
‫نزدیک‌‪‌51‬هزار‌لنوان‌در‌هولو‌(‪‌)Hulu‬موجود‌است ‌‬

‫‌‬
‫و‌بیشتر‌از‌‪‌211‬هزار‌لنوان‌در‌آمازون‌پرایم‌(‪‌ )AmazonPrime‬‬
‫‌‬
‫لپتاپ ‌را ‌در ‌قسمت ‌جستجوی ‌سایت ‌آمازون ‌تایپ‌‬‫یخواهم؟ ‌وقتی ‌لبارت ‌ ‌‬ ‫لپتاپ ‌م ‌‬‫یک ‌ ‌‬
‫یکنم‪‌ .‬‬‫یکنم‪‌3122‌،‬نتیجه‌پیدا‌م ‌‬ ‫م‌‬
‫تایپ ‌می‌کنم‪«‌:‬پلوپز» ‌و ‌بیشتر ‌از ‌‪‌ 2111‬انتخاب ‌جلوی ‌روی‌‬
‫من‌است‪‌ .‬‬
‫یآید‌‬
‫انتخابهای ‌بیشتری ‌هم ‌به ‌وجود ‌م ‌‬
‫‌‬ ‫ندهی ‌نزدیک‪‌ ،‬‬
‫در ‌آی ‌‬
‫قطعهی ‌موسیقی ‌به ‌صورت ‌آنالین ‌– ‌انواع‌‬ ‫– ‌میلیاردها ‌ ‌‬
‫لمها ‌– ‌وسائلی ‌که ‌م ‌‬
‫یتوانند ‌با ‌پرینترهای ‌‪‌3‬‬ ‫مختلفی ‌از ‌فی ‌‬
‫‌فصل‌‪‌.2‬مقدمه‌■ ‪5‬‬

‫یسازی‌شوند‪‌ .‬‬
‫بعدی‪‌،‬سفارش ‌‬
‫‌‬

‫پیدا‌کردن‌چیزهای‌مرتبط ‌‬
‫قطعهی ‌موسیقی ‌در‌‬
‫مسئله‪‌ ،‬در‌اصل ‌پیدا ‌کردن ‌چیزهای ‌مرتبط ‌است‪‌.‬در ‌میان ‌‪‌ 22‬میلیون ‌ ‌‬
‫یتونز‌(‪‌،)iTunes‬احتماالً‌فقط‌تعدادی‌قطعه‌وجود‌دارد‌که‌من‌قطعاً‌لاشقشان‌هستم‪‌،‬ولی‌‬ ‫آ ‌‬
‫آنها ‌را ‌پیدا ‌کنم؟ ‌می‌خواهم ‌یک ‌فیلم ‌را ‌امشب ‌از ‌سایت ‌‪‌ Netflix‬ببینم‪‌ ،‬کدام ‌را‌‬
‫چگونه ‌ ‌‬
‫یخواهم ‌فیلمی ‌توسط ‌‪‌ P2P‬دانلود ‌کنم‪‌ ،‬ولی ‌کدام ‌فیلم ‌را؟ ‌و ‌مسئله‌‬ ‫انتخاب ‌کنم؟ ‌م ‌‬
‫یشود‪‌.‬در ‌هر ‌دقیقه ‌چند ‌ترابایت ‌رسانه ‌(شامل ‌ویدیو‪‌ ،‬تصویر‪‌ ،‬اسناد ‌متنی‌‬ ‫دهتر ‌هم ‌م ‌‬
‫پیچی ‌‬
‫یشود‪‌ .‬در ‌هر ‌دقیقه ‌‪‌ 211‬فایل ‌جدید ‌در‌‬ ‫شبکهی ‌اینترنت) ‌اضافه ‌م ‌‬
‫و‪‌ )...‬به ‌شبکه ‌(مثالً ‌ ‌‬
‫یوزنت ‌(‪‌ )usenet‬در ‌دسترس ‌هستند‪‌ .‬در ‌هر ‌دقیقه‪‌ 14‌ ،‬سالت ‌ویدیو ‌در ‌یوتیوب‌‬
‫یشود‪‌ .‬هر ‌روز‌‬‫یشود‪‌ .‬در ‌هر ‌سالت ‌‪‌ 211‬کتابِ ‌جدید ‌منتشر ‌م ‌‬ ‫(‪‌ )youtube‬بارگزاری ‌م ‌‬
‫یشود‪‌.‬در ‌این ‌اقیانوسِ ‌امکانات‪‌ ،‬پیدا ‌کردن‌‬
‫انتخابها ‌برای ‌خریدن ‌اجناس ‌بیشتر ‌و ‌بیشتر ‌م ‌‬
‫‌‬
‫یشود‪‌ .‬‬‫سختتر‌م ‌‬
‫‌‬ ‫چیزهای‌مرتبط‌هر‌روز‌سخت‌و‌‬
‫رسانهای ‌مثل ‌موسیقی ‌باشید ‌‪‌ -‬مثالً ‌‪‌،Zee Avi‬‬ ‫کنندهی ‌محتوای ‌ ‌‬ ‫‌‬ ‫اگر ‌شما ‌یک ‌تولید ‌‬
‫خوانندهی‌مالزیایی ‌‪‌-‬خطر‌این‌نیست ‌که ‌کسی‌موسیقیِ‌شما‌را‌به ‌صورت‌غیرقانونی‌دانلود‌‬ ‫‌‬
‫کند‪‌.‬خطر‪‌،‬گمنامی‌است‪‌ .‬‬
‫‌‬

‫ولی‌چگونه‌این‌چیزها‌را‌پیدا‌کنیم؟ ‌‬
‫سالیانِ ‌قبل‪‌ ،‬در ‌آن ‌شهر ‌کوچک‪‌ ،‬دوستانمان ‌برای ‌پیدا ‌کردنِ ‌چیزهای ‌مختلف‪‌ ،‬ما ‌را ‌یاری‌‬
‫یکردند‪‌.‬آن‌توپِ‌پارچه‌که‌برای‌ما‌بسیار‌متناسب‌بود‪‌.‬آن‌رمانِ‌جدید‌در‌کتابفروشی‪‌.‬یک‌‬ ‫م‌‬
‫مغازهی‌موسیقی‪‌.‬و‌حتماً‌می‌دانید‌که‌حتی‌‬ ‫‪(‌LP‌3/2‌33‬یک‌نوع‌دیسک ‌قدیمی)‌جدید‌در‌ ‌‬
‫یکنیم‪‌ .‬‬
‫امروزه‌هم‌ما‌به‌دوستانمان‌برای‌پیدا‌کردن‌چیزهای‌مرتبط‪‌،‬اتکا‌م ‌‬
‫یکنند ‌تا ‌چیزهای ‌مختلف ‌را ‌پیدا ‌کنیم‪‌ .‬در ‌سالیان‌‬ ‫تجربهها ‌هستند ‌که ‌به ‌ما ‌کمک ‌م ‌‬ ‫‌‬
‫نهای ‌لباسشویی ‌را ‌که‌‬ ‫یتوانست ‌تمامی ‌ماشی ‌‬ ‫مصرفکنندگان‪‌ ،‬م ‌‬ ‫‌‬ ‫گزارشهای ‌‬
‫‌‬ ‫گذشته‪‌ ،‬‬
‫آنها‌را‌–‌یا‌تمامیِ‌پلوپزهای‌فروخته‌شده‌‬ ‫فروخته‌شده‌بودند‪‌،‬ارزیابی‌کند‌–‌تمامِ‌‪‌11‬تای‌ ‌‬
‫را ‌– ‌تمامیِ ‌‪‌ 21‬تای ‌ ‌‬
‫آنها ‌را ‌و ‌با ‌این ‌کار ‌پیشنهاد ‌مناسبی ‌ارائه‌دهد‪‌.‬اما ‌امروزه‪‌ ،‬صدها ‌نوع‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌9‬‬
‫دادهکاوی‌برای‌ ‌‬

‫پلوپزِ ‌مختلف ‌در ‌سایت ‌آمازون ‌وجود ‌دارد ‌و ‌احتمال ‌کمی ‌دارد ‌که ‌تنها ‌یک ‌منبعِ ‌تجربه‪‌،‬‬
‫رتبهبندی ‌کند‪‌ .‬سالیان ‌پیش‪(‌ Roger Ebert‌ ،‬از‌‬ ‫آنها ‌را ‌ارزیابی ‌کرده ‌و ‌ ‌‬
‫بتواند ‌تمامی ‌ ‌‬
‫لمهای ‌موجود ‌را ‌به ‌صورت ‌مجازی ‌در ‌اینترنت ‌نقد ‌و ‌بررسی‌‬ ‫منتقدان ‌سینما) ‌تمامی ‌فی ‌‬
‫یشود‪‌.‬لالوه‌بر‌‬ ‫یکرد‪‌.‬امروزه‌اما‪‌،‬نزدیک‌به‌‪‌15‬هزار‌فیلم‌در‌سال‌در‌سراسر‌جهان‌تولید‌م ‌‬ ‫م‌‬
‫این‪‌ ،‬ما ‌االن ‌به ‌ویدی‌وهای ‌مختلف‪‌ ،‬از ‌منابع ‌متفاوت ‌(مثل ‌یوتیوب)‌دسترسی ‌داریم‪Roger ‌.‬‬
‫لمهایی‌که‌امروزه‌در‌دسترسِ‌ما‌هست‌‬ ‫یتوانند‌تمامی‌فی ‌‬ ‫‪‌،Ebert‬یا‌هر‌متخصصِ‌دیگری‪‌،‬نم ‌‬
‫را‌نقد‌و‌بررسی‌کنند‪‌ .‬‬
‫با‌کمی‌بررسی‌و‌دقت‌می‌فهمیم‌که‌ما ‌از ‌خودِ ‌همان ‌چیزها ‌هم ‌جهت ‌پیدا ‌کردنِ ‌چیزها‌یا‌‬
‫یکنیم‪‌.‬برای ‌مثال‪‌ ،‬من ‌یک ‌ماشین ‌لباسشویی ‌مدل ‌‪‌Sears‬‬ ‫آیتمهای ‌دیگر ‌استفاده ‌م ‌‬
‫همان‌ ‌‬
‫دارم ‌که ‌‪‌ 31‬سال ‌برایم ‌کار ‌کرده ‌است‪‌ ،‬پس ‌احتماالً ‌باز ‌هم ‌مدل ‌‪‌ Sears‬را ‌برای ‌خریدِ‌‬
‫ماشین ‌لباسشوییِ ‌بعدی ‌انتخاب ‌خواهم ‌کرد‪‌.‬یا ‌یک ‌آلبوم ‌از ‌بیتلز ‌(‪‌ –‌ Beatles‬یک ‌گروه‌‬
‫یخریم ‌چون‌‬ ‫راك ‌انگلستانی)‌را ‌دوست ‌داشتم‪‌ ،‬پس ‌یک ‌آلبومِ ‌دیگر ‌از ‌این ‌گروه ‌را ‌هم ‌م ‌‬
‫احتمال‌می‌دهم‌آن‌دومی‌را‌هم‌دوست‌داشته‌باشم‪‌ .‬‬
‫‌‌‬
‫خود‌آن‌آیتمها‌–‌امروزه‌نیز‌‬
‫‌‬ ‫آیتمهای‌مرتبط ‌–‌دوستان‪‌ ‌،‬‬
‫تجربهها‌یا‌‬ ‫روشهای‌یافتن‌ ‌‬ ‫ای ن ‌ ‌‬
‫یشود ‌ولی ‌در ‌قرنِ ‌حاضر ‌نیاز ‌به ‌کمکِ ‌محاسبات‌‬ ‫آنها ‌استفاده ‌م ‌‬
‫موجود ‌هستند ‌و ‌از ‌ ‌‬
‫آنها‌را‌با‌قرن‌‪‌،12‬یعنی‌جایی‌که‌میلیاردها‌انتخاب‌وجود‌دارد‪‌،‬تطبیق‌‬ ‫کامپیوتر‌داریم‌تا‌ ‌‬
‫دهیم‪‌.‬‬

‫آنها‪‌،‬‬
‫سابقهی‌خرید‌ ‌‬
‫روشهای‌تجمیعِ‌لالیق‌و‌سلیقه‌های‌مردم‪‌ ‌،‬‬ ‫در‌این‌کتاب‌ما‌به‌بررسیِ‌ ‌‬
‫شبکههای ‌اجتمالی ‌(دوستان) ‌– ‌تا‌‬
‫بهرهگیری ‌از ‌قدرت ‌ ‌‬ ‫یپردازیم ‌– ‌با ‌ ‌‬ ‫دادههای ‌دیگر ‌م ‌‬
‫و‌ ‌‬
‫روشهای ‌دیگری ‌که ‌از‌‬
‫بتوانیم ‌چیزهای ‌مرتبط ‌را ‌شناسایی ‌و ‌استخراج ‌کنیم‪‌ .‬همچنین ‌ ‌‬
‫یکنیم‪‌.‬برای ‌مثال‪‌ ،‬من ‌گروه‌‬ ‫یکنند ‌را‌نیز‌بررسی ‌م ‌‬ ‫آیتمها ‌استفاده ‌م ‌‬
‫یهای ‌خودِ ‌آن ‌ ‌‬ ‫ویژگ ‌‬
‫فونیکس ‌(‪‌ –‌ Phoenix‬یک ‌گروه ‌راك ‌موسیقی)‌را ‌دوست ‌دارم‪‌.‬سیستم ‌کامپیوتری ‌ممکن‌‬
‫یهای ‌گروه ‌‪‌ Phoenix‬را ‌درك ‌کند ‌– ‌که ‌مثالً ‌این ‌گروه ‌از ‌آالتی ‌مانند ‌راك‌‬ ‫است ‌ویژگ ‌‬
‫یکنند‪‌ ،‬پانک ‌راك ‌(نولی ‌سبک ‌موسیقی ‌راك) ‌را‌‬ ‫آهنگهایشان ‌استفاده ‌م ‌‬
‫‌‬ ‫الکتریک ‌در ‌‬
‫گروههای‌‬
‫یبرند‪‌ .‬سیستم‪‌ ،‬ممکن ‌است ‌ ‌‬ ‫ینوازند ‌و ‌از ‌یک ‌هماهنگیِ ‌صوتیِ ‌ظریف ‌بهره ‌م ‌‬ ‫م‌‬
‫‌فصل‌‪‌.2‬مقدمه‌■ ‪7‬‬

‫یها ‌را ‌دارا ‌هستند‪‌ ،‬به ‌من ‌معرفی ‌کند‪‌ ،‬مثالً ‌گروه ‌‪(‌ Strokes‬یک‌‬
‫مشابهی ‌را ‌که ‌این ‌ویژگ ‌‬
‫گروه‌راك)‪‌ .‬‬
‫‌‬

‫فقط‌این‌چیزها‌نیست‪‌ ...‬‬
‫نکه‌به‌‬‫داده‌کاوی‌فقط‌منحصر‌به‌این‌نیست‌که‌یک‌سری‌آیتم‌را‌به‌ما‌پیشنهاد‌دهد‪‌،‬یا‌ای ‌‬
‫مثالهای‌زیر‌را‌در‌نظر‌بگیرید‪‌ :‬‬ ‫بازرگانان‌و‌تجار‌کمک‌کند‌که‌چیزهای‌بیشتری‌بفروشند‪‌ ‌.‬‬
‫یشناخت‪‌.‬هنگامی‌‬ ‫همهی ‌افراد ‌آن ‌شهر ‌را ‌م ‌‬
‫شهردار ‌یک ‌شهر ‌کوچک ‌در ‌‪‌ 211‬سال ‌پیش‪‌ ‌ ،‬‬
‫یدانست ‌که ‌به ‌هر ‌فرد‌‬‫یخواست ‌دوباره ‌برای ‌انتخابات ‌آماده ‌شود‪‌ ،‬دقیقاً ‌م ‌‬
‫که ‌این ‌شهردار ‌م ‌‬
‫از‌شهر‪‌،‬برای‌رای‌جمع‌کردن‌چه‌بگوید‪:‬‬
‫‌‬

‫‌‬

‫ندهی ‌اتحادیه ‌به‌‬


‫پدر ‌من ‌در ‌اتحادی‌هی ‌کارگران ‌خودرو ‌لضو ‌بود‪‌ .‬نزدیک ‌انتخابات‪‌ ،‬نمای ‌‬
‫خانهی‌ما‌آمد‌تا‌به‌پدرم‌خاطرنشان‌کند‌که‌به‌کدام‌کاندیدا‌رای‌دهد‪‌ :‬‬ ‫‌‬
‫بچههات ‌چطورن؟‪‌ ...‬حاال ‌اجازه ‌بده ‌بهت ‌بگم ‌چرا ‌بهتره ‌که ‌به ‌ ‪Frank‬‬
‫آهای‪‌ ،Syl‌ ،‬زن ‌و ‌ ‌‬
‫‪(‌Zeidler‬کاندیدای‌سوسیالیست‌شهرداری)‌رای‌بدی‪‌ ...‬‬
‫امهای ‌اختصاصیِ ‌سیاسی ‌که ‌به ‌هر ‌فرد ‌به ‌صورت‌‬ ‫همین ‌پی ‌‬
‫مستقیم ‌گفته ‌می‌شد‪‌ ،‬به ‌تبلیغات ‌همگن ‌در ‌زمان ‌رشد ‌تلویزیون‌‬
‫همهی ‌افراد ‌یک ‌پیامِ ‌دقیقاً ‌یکسان‌‬
‫تبدیل ‌شد‪‌ .‬با ‌رشد‌تلویزیون ‌ ‌‬
‫دریافت ‌می‌کردند‪‌.‬یک ‌مثال ‌خوب ‌از ‌این ‌مورد‪‌ ،‬آگهیِ ‌معروفی ‌بود‌‬
‫که‌‪‌Daisy‬در‌تلویزیون‌برای‌حمایت‌از ‌‪(‌Lyndon Johnson‬دختر‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌1‬‬
‫دادهکاوی‌برای‌ ‌‬

‫گلبرگهای ‌گلی ‌را ‌جدا ‌می‌کرد ‌در ‌حالی ‌که ‌یک ‌بمب ‌اتم ‌در ‌پشت ‌او ‌منفجر‌‬ ‫‌‬ ‫جوانی ‌که ‌‬
‫یشد)‌انجام ‌داد‪‌.‬حاال ‌امروزه‪‌ ،‬در ‌حالی ‌که ‌انتخابات ‌با ‌اختالفی ‌کم ‌نسبت ‌به ‌رقیب ‌تعیین‌‬ ‫م‌‬
‫یسازی‌‬ ‫انجام‌میشود‪‌ ،‬شخص ‌‬
‫‌‬ ‫دادهکاوی ‌‬
‫استفادهی‌روز‌افزون‌از‌ ‌‬
‫‌‬ ‫کننده‌شده‌است‌و‌همچنین‌‬
‫لالقهمند‌هستید؟‌ممکن‌است‌یک‌تماس‌تلفنی‌(توسط‌‬ ‫دوباره‌برگشته‌است‪‌.‬به‌حقوق‌زنان‌ ‌‬
‫ربات)‌در‌همین‌مورد‌داشته‌باشید‪‌ .‬‬
‫یداند‌چه‌کسانی‌در‌شهر‌دردسرسازند‪‌.‬اما‌امروزه‪‌،‬تهدیدات‌مخفی‌‬ ‫کالنترِ‌آن‌شهر‌کوچک‌م ‌‬
‫همهجا ‌باشند‪‌ .‬در ‌‪‌ 22‬اکتبر ‌‪‌ 1112‬دولت ‌آمریکا ‌قانون‌‬ ‫یتوانند ‌ ‌‬ ‫ستها ‌م ‌‬ ‫هستند‪‌ ،‬تروری ‌‬
‫پاترویت ‌(‪‌ )Patroit‬را ‌تصویب ‌کرد‪‌ .‬این ‌قانون‪‌ ،‬مخفف ‌لبارت ‌«ترکیب ‌و ‌تقویت ‌آمریکا ‌با‌‬
‫تامین ‌ابزارهای ‌مناسب ‌و ‌الزم ‌برای ‌رهگیری ‌و ‌انسداد ‌تروریسم» ‌است‪‌.‬بخشی ‌از ‌این ‌الیحه‌‬
‫یدهد ‌که ‌اطاللاتِ ‌مختلف ‌را ‌از ‌منابع ‌متفاوت ‌مانند‌‬ ‫به ‌سرمای‌هگذاران ‌این ‌توانایی ‌را ‌م ‌‬
‫هتلها‌(چه‌کسی‌و‌چه‌مقداری‌در‌کجا‌‬ ‫یخوانیم)‪‌ ‌،‬‬ ‫کتابهایی‌م ‌‬
‫نکه‌چه‌ ‌‬ ‫کتابخانهها‌(مثالً‌ای ‌‬
‫‌‬
‫جادهای ‌به‌دست‌بیاورند‪‌.‬در‌‬
‫کارتهای ‌التباری ‌و ‌لوارض ‌بین ‌ ‌‬‫شرکتهای ‌ ‌‬ ‫‌‬ ‫اقامت ‌می‌کند)‪‌ ،‬‬
‫دادههای ‌ما ‌استفاده ‌می‌کند‪‌.‬‬
‫جمعآوری ‌ ‌‬‫شرکتهای ‌خصوصی ‌جهت ‌ ‌‬ ‫‌‬ ‫اکثر ‌موارد‪‌ ،‬دولت ‌از ‌‬
‫همهی‌ما‌داده‌دارند‪‌.‬داده‌هایی‌مانند‌تصاویر‌مختلفِ‌ما‪‌،‬‬‫شرکتهایی‌مانند‌‪‌Seisint‬تقریباً‌از‌ ‌‬ ‫‌‬
‫یکنیم‪‌ ،‬اتومبیلمان‪‌ ،‬درآمد ‌ما‪‌ ،‬رفتار ‌خرید ‌و ‌همچنین ‌دوستان ‌ما‪‌.‬‬ ‫جایی ‌که ‌ما ‌زندگی ‌م ‌‬
‫شبینیِ ‌رفتار ‌مردم‌‬
‫روشهای‌داده‌کاوی ‌به ‌پی ‌‬ ‫‪‌ Seisint‬ابررای ‌‬
‫انههایی ‌را ‌دارد ‌که ‌با ‌استفاده ‌از ‌ ‌‬
‫آنها‌اسم‌جالبی‌هم‌دارد‪‌:‬ماتریکس ‌‬ ‫یپردازند‪‌.‬در‌ضمن‪‌،‬محصول‌ ‌‬ ‫م‌‬
‫‌‌‬

‫‌‬
‫‌فصل‌‪‌.2‬مقدمه‌■ ‪6‬‬

‫‌‬
‫یدهد! ‌‬ ‫یدهیم‌را‌توسعه‌م ‌‬ ‫دادهکاوی‪‌،‬کارهایی‌که‌در‌حال‌حاضر‌انجام‌م ‌‬ ‫‌‬
‫یکند‪‌ :‬‬
‫نگونه‌آغاز‌م ‌‬ ‫‪‌،Stephen Baker‬کتاب‌خود‌را‌با‌نام‌شمارش‌(‪‌)The Numerati‬ای ‌‬
‫یشاپِ ‌شلوغ ‌مثل ‌این ‌یکی ‌که ‌من‌‬ ‫فرض ‌کنید ‌در ‌یک ‌کافی ‌شاپ ‌هستید‪‌ ،‬احتماالً ‌یک ‌کاف ‌‬
‫لپتاپِ‌خود‌‬ ‫نشستهام‪‌.‬یک‌زن‌جوان‌در‌میز‌سمت‌راست‌در‌حال‌تایپ‌کردن‌با‌ ‌‬ ‫‌‬ ‫االن‌در‌آن‌‬
‫یکنید‪‌ .‬او ‌در ‌حال‌‬ ‫لپتاپ ‌او ‌نگاه ‌م ‌‬‫یگردانید ‌و ‌به ‌صفحه‌ی ‌ ‌‬ ‫است‪‌ .‬شما ‌سرتان ‌را ‌برم ‌‬
‫گشت‌وگذار‌در‌اینترنت‌است‪‌.‬شما‌نگاه‌می‌کنید‪‌ .‬‬ ‫‌‬
‫یشوید ‌که ‌او ‌در ‌حال‌‬ ‫یخواند‪‌ .‬متوجه ‌م ‌‬ ‫روزنامهی ‌آنالین ‌را ‌م ‌‬
‫‌‬ ‫سالتها ‌می‌گذرد‪‌ .‬او ‌یک ‌‬
‫‌‬
‫لمهای ‌جمعه ‌شب ‌را ‌نیز ‌مرور ‌می‌کند ‌و‌‬ ‫خواندنِ ‌‪‌ 3‬مقاله ‌در ‌مورد ‌چین ‌است‪‌ .‬او ‌فی ‌‬
‫فوکار‌را‌تماشا‌کرده‌و‌بعد‌از‌آن‌بر‌روی‌یک‌تبلیغ‌نیز‌کلیک‌‬ ‫شنمایشِ‌فیلم‌پاندای‌کونگ‌ ‌‬ ‫پی ‌‬
‫یتواند ‌هم‌کالسی‌های ‌دورانِ ‌دبیرستان ‌خود ‌را‌‬ ‫یدهد ‌که ‌م ‌‬ ‫یکند‪‌ ،‬تبلیغی ‌که ‌به ‌او ‌ولده ‌م ‌‬ ‫م‌‬
‫ینویسید‪‌ .‬هر ‌دقیقه‌ای ‌که‌‬ ‫نشستهاید ‌و ‌یادداشت ‌م ‌‬
‫‌‬ ‫پیدا ‌کرده ‌و ‌به ‌او ‌مرتبط ‌کند‪‌ .‬شما ‌‬
‫یتوانستید ‌‪‌ 251‬میلیون ‌نفر‌‬ ‫دربارهی ‌این ‌زن ‌بیشتر ‌می‌فهمید‪‌.‬حاال ‌فرض ‌کنید ‌م ‌‬ ‫یگذرد‪‌ ‌ ،‬‬ ‫م‌‬
‫کجا‌ببینید! ‌‬ ‫را‌در‌حال‌گردش‌در‌اینترنت‌ی ‌‬
‫دادهها ‌تمرکز ‌کرده ‌است‪‌ .‬در ‌مقیاسِ ‌کوچک‪‌ ،‬ما‌‬ ‫دادهکاوی ‌بر ‌روی ‌پیدا ‌کردنِ ‌الگوها ‌در ‌ ‌‬ ‫‌‬
‫یخواهم‌‬ ‫مدلهای ‌ذهنی ‌و ‌اُلگوها ‌هستیم‪‌.‬فرض‌کنید‌مثالً ‌م ‌‬ ‫آدمها‪‌ ،‬متخصصِ ‌پیدا ‌کردنِ ‌ ‌‬ ‫‌‬
‫نکه ‌همسرم ‌از‌چه‌‬ ‫امشب ‌با ‌همسرم ‌یک ‌فیلم ‌تماشا ‌کنم‪‌.‬طبیعتاً ‌من‌یک‌مدلِ‌ذهنی‪‌،‬از ‌ای ‌‬
‫یآید ‌(به‌‬‫لمهای ‌خشن ‌خوشش ‌نم ‌‬ ‫فیلمی ‌خوشش ‌می‌آید‪‌ ،‬دارم‪‌ .‬من ‌می‌دانم ‌که ‌او ‌از ‌فی ‌‬
‫لمهای ‌چارلی ‌کافمن ‌را ‌دوست ‌دارد‪‌.‬من‌‬ ‫همین ‌دلیل ‌از ‌فیلمِ ‌بلوك ‌‪‌ 6‬خوشش ‌نیامد)‪‌.‬او ‌فی ‌‬
‫شبینی ‌کنم ‌که ‌او‌‬ ‫قهی ‌او ‌سراغ ‌دارم‪‌ ،‬پی ‌‬ ‫یتوانم ‌با ‌استفاده ‌از ‌این ‌مدلِ ‌ذهنی ‌که ‌از ‌سلی ‌‬ ‫م‌‬
‫میپسندد‌و‌کدام‌فیلم‌را‌خیر‪.‬‬ ‫کدام‌فیلم‌را‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌21‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫یدانم ‌که ‌او ‌گیاه‌خوار ‌است ‌و ‌با ‌استفاده ‌از ‌این‌‬
‫دوستی ‌از ‌اروپا ‌به ‌دیدار ‌من ‌آمده ‌است‪‌.‬م ‌‬
‫مدلها ‌و‌‬
‫شبینی ‌کنم ‌که ‌او ‌مفصل ‌ران ‌دوست ‌ندارد‪‌.‬مردم ‌در ‌ساختنِ ‌ ‌‬ ‫یتوانم ‌پی ‌‬
‫اطاللات ‌م ‌‬
‫یها ‌توانا ‌هستند‪‌ .‬داده‌کاوی ‌این ‌امکان ‌را ‌بسط ‌و ‌گسترش ‌می‌دهد ‌و ‌ما ‌را ‌در‌‬ ‫شبین ‌‬
‫پی ‌‬
‫یسازد ‌– ‌مانند‪‌ 251‬میلیون ‌نفری ‌که ‌آقای ‌‪‌ Baker‬در‌‬ ‫بهکارگیریِ ‌اطاللاتِ ‌زیاد‪‌ ،‬توانمند ‌م ‌‬‫‌‬
‫نرمافزار‌پخش‌‬ ‫نقل‌وقولِ‌باال‌گفت‪‌.‬داده‌کاوی‌به‌سرویس‌موسیقی‌پاندورا‌(‪‌-‌‌Pandora‬یک‌ ‌‬ ‫‌‬
‫قهی‌‬‫آنالینِ ‌موسیقی) ‌این ‌امکان ‌را ‌می‌دهد ‌که ‌یک ‌کانالِ ‌موسیقی ‌را ‌متناسب ‌با ‌سلی ‌‬
‫موسیقیاییِ ‌مخصوصِ ‌خودتان‪‌ ،‬به ‌شما ‌پیشنهاد ‌دهد‪‌ .‬همچنین ‌به ‌‪‌ Netflix‬تواناییِ‌‬
‫یسازی‌برای‌توصیه‌ی‌فیلم‌به‌کاربرانی‌مانند‌شما‌را‌می‌دهد‪‌ .‬‬ ‫سفارش ‌‬

‫‌‬
‫تِراماینینگ‌چیزِ‌خیلی‌لجیبی‌نیست ‌‬
‫مجمولهی ‌داده ‌بزرگی ‌به‌‬
‫‌‬ ‫اواخر ‌قرن ‌‪‌ ،11‬یک ‌مجموله ‌داده ‌(‪‌)dataset‬با ‌‪‌ 2‬میلیون ‌کلمه‪‌ ،‬‬
‫یآمد‪‌.‬آن‌زمان‌که‌من‌یک‌دانشجوی‌تحصیالت‌تکمیلی‌در‌سال‌‪‌2661‬بودم‌(آره‪‌،‬‬ ‫حساب‌م ‌‬
‫برنامهنویس ‌در ‌شرکت ‌ ‪Geek New‬‬ ‫من ‌سنم ‌خیلی ‌زیاده!)‪‌ ،‬یکسال ‌به ‌لنوان ‌یک ‌ ‌‬
‫یکردم‪‌.‬فقط ‌در ‌حدود ‌‪‌ 111‬هزار ‌کلمه ‌برای ‌آنالیز ‌موجود ‌بود‪‌ ،‬اما ‌برای‌‬‫‪‌ Testment‬کار ‌م ‌‬
‫تکهتکه‌به‌‬
‫یآورد‌و‌ما‌مجبور‌بودیم‌نتایج‌را‌به‌صورت‌ ‌‬ ‫حافظهی‌اصلی‌کم‌م ‌‬
‫‌‬ ‫همین‌تعداد‌هم‌‬
‫دیسکِ‌مغناطیسی‌انتقال‌دهیم‪‌.‬برای‌همین‌من‌مجبور‌بودم‌دوباره‌درخواست‌دیسک‌دهم‪‌ .‬‬
‫‌فصل‌‪‌.2‬مقدمه‌■ ‪22‬‬

‫‌‬
‫‌‬
‫‌‬
‫کتابی ‌که ‌از ‌نتایجِ ‌این ‌کار ‌تولید ‌شد ‌با ‌نام‌‬
‫‪‌ Analytical Greek New Testament‬به‌‬
‫لهی ‌‪‌ Timothy‬و ‌‪‌ Barbara Friberg‬در‌‬ ‫وسی ‌‬
‫سایت ‌آمازون ‌موجود ‌است‪‌ .‬من ‌یکی ‌از ‌سه‌‬
‫برنامهنویسِ ‌آن ‌پروژه ‌بودم ‌که ‌در ‌دانشگاه‌‬ ‫‌‬
‫‪‌Minnesota‬انجام‌شد‪‌ .‬‬
‫‌‬
‫دادهکاوی ‌بر ‌روی ‌داده‌هایی ‌در ‌حد ‌ترابایت ‌خیلی ‌هم ‌غیر ‌معقول ‌نیست‪‌ .‬گوگل‌‬ ‫امروزه‪‌ ‌ ،‬‬
‫دادههای‌وب‌را‌در‌اختیار‌دارد‪‌.‬در‌سال‌‪‌،1119‬‬ ‫شاز‌‪‌5‬پتابایت‌(در‌حدود‌‪‌5‬هزار‌ترابایت)‌ ‌‬ ‫بی ‌‬
‫جامعهی ‌للمی‌‬
‫‌‬ ‫گوگل ‌یک ‌مجموله ‌داده ‌شامل ‌یک ‌تریلیون ‌کلمه ‌را ‌برای ‌استفاده ‌توسط ‌‬
‫انتشار ‌داد‪‌.‬آژانس ‌امنیت ‌ملی‪‌ ،‬اطاللاتِ ‌تماسِ ‌چند ‌تریلیون ‌ارتباط ‌تلفنی ‌را ‌نزد‌خود‌دارد‪‌.‬‬
‫شرکت ‌اَکسیوم ‌(‪‌ ،)Acxiom‬شرکتی ‌است ‌که ‌اطاللاتِ ‌مختلف ‌را ‌از ‌‪‌ 111‬میلیون ‌آمریکایی‌‬
‫تماسهای ‌تلفنی‪‌،‬‬
‫‌‬ ‫کارتهای ‌التباری‪‌ ،‬‬
‫جمع ‌آوری ‌می‌کند ‌(اطاللاتی ‌مانند‪‌ ،‬خرید ‌توسط ‌ ‌‬
‫اطاللات ‌پزشکی‪‌ ،‬خرید ‌و ‌فروش ‌و‌‬
‫انتقال ‌اتومبیل ‌و ‌غیره)‪‌ .‬این ‌شرکت‌‬
‫بیش ‌از ‌یک ‌پتابایت ‌داده ‌در ‌اختیار‌‬
‫دارد‪‌ .‬‬
‫رابرت ‌اهارو ‌(‪‌،)Robert O'Harrow‬‬
‫سندهی ‌کتاب ‌«هیچ ‌جایی ‌برای‌‬ ‫نوی ‌‬
‫مخفی ‌شدن ‌وجود ‌ندارد»‪‌ ،‬برای‌‬
‫نکه ‌به ‌ما ‌کمک ‌کند ‌که ‌بفهمیم‌‬ ‫ای ‌‬
‫یک ‌پتابایت ‌چقدر ‌اطاللات ‌دارد‌‬
‫یگوید‪‌:‬یک ‌پتابایت ‌از ‌اطاللات‪‌ ،‬مانند ‌این ‌است ‌که ‌کتابِ ‌مقدس ‌(لهدین ‌– ‌یعنی ‌لهد‌‬ ‫م‌‬
‫قدیم ‌و ‌جدید ‌شامل ‌‪‌ 99‬کتاب)‌را ‌به ‌اندازه ‌‪‌ 51111‬مایل ‌(تقریبا ‌‪‌ 11111‬کیلومتر)‌‌پشت‌‬
‫اندازهی ‌‪‌ 1111‬مایل ‌رانندگی‌‬
‫سر ‌هم ‌قرار ‌دهیم‪‌.‬من ‌معموالً ‌از ‌نیومکزیکو ‌تا ‌ویرجینیا ‌به ‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌21‬‬
‫دادهکاوی‌برای‌ ‌‬

‫اندازهی‌‬
‫یخواهم ‌تصور ‌کنم ‌کتاب ‌مقدس ‌در ‌تمامی ‌این ‌مسیر ‌به ‌ ‌‬ ‫یکنم‪‌ .‬هنگامی ‌که ‌م ‌‬
‫م‌‬
‫‪‌1111‬مایل‌قرار‌گرفته‌باشد‪‌،‬به‌نظرم‌مقدار‌بسیار‌زیاد‌و‌غیرقابل‌باوری‌از‌داده‌می‌رسد‪‌ .‬‬
‫‌‌‬

‫‌‬

‫یتوانید ‌تمامیِ‌‬‫دادهی ‌متنی ‌(‪‌)text data‬دارد‪‌.‬شما ‌م ‌‬‫کتابخانهی ‌گنکره‪‌ ،‬تقریباً ‌‪‌ 11‬ترابایت ‌ ‌‬
‫‌‬
‫والمارت‌‬
‫مجمولهی‌کتابخانه ‌کنگره‌را‌در‌یک‌هارد‌چند‌هزار‌دالری‌ذخیره‌کنید!‌برلکس‪‌ ‌،‬‬ ‫‌‬
‫شاز ‌‪‌ 571‬ترابایت ‌داده ‌در ‌اختیار ‌دارد‪‌ .‬تمام‌‬
‫رهی ‌بزرگ ‌آمریکایی) ‌بی ‌‬ ‫(یک ‌فروشگاه ‌زنجی ‌‬
‫یشود‪‌،‬‬‫آنها ‌انجام ‌م ‌‬ ‫کجا ‌نیستند ‌– ‌به ‌طور ‌مداوم ‌لملیات ‌ ‌‬
‫دادهکاوی ‌بر ‌روی ‌ ‌‬ ‫دادهها ‌ی ‌‬
‫‌‬
‫یشوند‪‌ .‬این ‌همان‌‬ ‫رابطههای ‌جدید ‌کشف ‌و ‌ایجاد ‌شده‪‌ ،‬و ‌در ‌نتیجه ‌الگوها ‌شناسایی ‌م ‌‬‫‌‬
‫تِراماینینگ‌(‪‌)Tera-mining‬است‪‌ .‬‬
‫دادههای‌کوچک‌سروکار‌داریم‪‌.‬چیز‌خوبی‌هم‌است‪‌.‬با‌استفاده‌‬ ‫در‌این‌کتاب‪‌،‬ما‌با‌مجموله‌ ‌‬
‫هفتهها ‌اجرا ‌شود ‌و ‌تازه ‌بعد ‌از ‌آن‌‬
‫دادههای ‌کوچکتر‪‌ ،‬الگوریتمِ ‌ما ‌احتیاج ‌ندارد ‌ ‌‬
‫از ‌مجموله ‌ ‌‬
‫دادهای ‌که ‌ما ‌استفاده‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬ ‫بزرگترین ‌‬
‫متوجه ‌شویم ‌چند ‌خطای ‌منطقی ‌داریم‪‌ ‌ .‬‬
‫خواهیم‌کرد‌کمتر‌از‌‪‌211‬مگابایت‌است‪‌.‬کمترین‌آن‌هم‌فقط‌چند‌ده‌خط‌داده‌است‪‌ .‬‬
‫‌‬
‫‌فصل‌‪‌.2‬مقدمه‌■ ‪23‬‬

‫ساختار‌این‌کتاب ‌‬
‫این‌کتاب‌یک‌مسیر‌آموزشِ‌لملی‌مبتنی‌بر‌انجام‌‬
‫(‪‌ ،)learn-by-doing‬را ‌دنبال ‌می‌کند‪‌ .‬به ‌جای‌‬
‫نکه ‌به ‌صورت ‌منفعل ‌کتاب ‌را ‌بخوانید‪‌،‬‬ ‫ای ‌‬
‫نها ‌را ‌انجام ‌دهید ‌و‌‬‫یکنم ‌تمری ‌‬‫تشویقتان ‌م ‌‬
‫تجربهی ‌کار ‌کردن ‌با ‌کدهای ‌زبان ‌پایتون‌‬ ‫‌‬
‫(‪‌ )python‬را ‌که ‌برایتان ‌آماده ‌ ‌‬
‫کردهام ‌به ‌دست‌‬
‫بیاورید‪‌ .‬تجربه ‌کنید‪‌ ،‬با ‌کدها ‌بازی ‌کنید ‌و‌‬
‫دادههای‌‬
‫روشهای ‌مختلف ‌همراه ‌با ‌مجموله ‌ ‌‬ ‫‌‬
‫نکارها‌کلید‌اصلیِ ‌فهم‌‬
‫متفاوت‌را‌امتحان ‌کنید‪‌.‬ای ‌‬
‫روشهای‌مختلفِ‌آموزش‌داده‌شده‌در‌این‌کتاب‌هستند‪‌ .‬‬ ‫و‌درك‌ ‌‬
‫‌‌‬

‫‌‬
‫‌‬
‫یهایی ‌که ‌در‌‬ ‫دادهکاوی ‌و ‌تئور ‌‬
‫من ‌سعی ‌دارم ‌تعادلی ‌خوب ‌بین ‌کدهای ‌پایتون ‌در ‌زمینه ‌ ‌‬
‫نکه ‌مغز ‌در ‌هنگام ‌خواندنِ‌‬ ‫دادهکاوی ‌هست ‌برقرار ‌کنم‪‌ .‬برای ‌ای ‌‬
‫کهای ‌ ‌‬
‫پسزمینه‌ی ‌تکنی ‌‬
‫‌‬
‫یها‪‌ ،‬ریاضیات ‌و ‌کدهای ‌پایتون ‌قفل ‌نکند‪‌ ،‬سعی ‌کردم ‌قسمتِ ‌دیگری ‌از ‌مغزِ ‌شما ‌را ‌با‌‬
‫تئور ‌‬
‫رسم‌تصاویر‌و‌اشکال‌مختلف‌به‌کار‌بیندازم‪‌ .‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌24‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دورهی‌آموزشیِ‌لالیِ‌خود‌در‌‬ ‫‪‌،Peter Norvig‬مدیر‌تحقیقات‌شرکت‌گوگل‪‌،‬این‌گفته‌را‌در‌ ‌‬


‫نرمافزارِ‌کامپیوتری‌گفته‌است‪‌ :‬‬ ‫سایت‌‪‌Udacity‬در‌مورد‌طراحی‌یک‌ ‌‬
‫‌‬
‫راهحل‌‬‫راهحلِ ‌خودم ‌را ‌نشان ‌خواهم ‌داد‪‌.‬حتماً ‌توجه ‌دارید ‌که ‌بیشتر ‌از ‌یک ‌ ‌‬ ‫من ‌به ‌شما ‌ ‌‬
‫راهحلی‌که‌من‌ارائه‌می‌دهم‌‬ ‫برای‌حلِ‌یک‌مسئله‌وجود ‌دارد‪‌.‬و‌منظورِ‌من‌این‌نیست‌که‌ ‌‬
‫یگویم‌تا‌به‌شما‌کمک ‌کنم‌یک‌‬ ‫راهحلِ‌خودم‌را‌م ‌‬ ‫راهحل‌است‪‌.‬من‌ ‌‬ ‫راهحل‌و‌بهترین‌ ‌‬ ‫تنها‌ ‌‬
‫برنامههای ‌کامپیوتری ‌را ‌یاد ‌بگیرید‪‌.‬اگر ‌جور ‌دیگری‌‬ ‫حالت ‌و ‌چند ‌تکنیک ‌برای ‌نوشتن ‌ ‌‬
‫مسئلهها‌را‌حل‌کردید‪‌،‬خیلی‌هم‌خوب‌است‪‌.‬خوش‌به‌حالتان‪‌ .‬‬ ‫‌‬
‫یافتد‪‌.‬نه ‌در ‌ذهن ‌من‪‌.‬در ‌نتیجه ‌مهم‌‬ ‫تمام ‌چیزی ‌که ‌یاد ‌می‌گیرید ‌در ‌ذهن ‌شما ‌اتفاق ‌م ‌‬
‫نوشتهام‪‌ ،‬ارتباط ‌پیدا ‌کنید‪‌،‬‬
‫‌‬ ‫نوشتهاید ‌و ‌کُدی ‌که ‌من ‌‬
‫‌‬ ‫است ‌که ‌شما ‌بین ‌کُدی ‌که ‌خودتان ‌‬
‫به ‌این ‌صورت ‌که ‌پاسخِ ‌درست ‌را ‌با ‌نوشتنِ ‌پاسخ ‌خودتان ‌به ‌دست ‌آورده ‌و ‌بعد ‌از ‌آن‌‬
‫کهایی‌را‌‬ ‫یتوانید‌نکاتی‌را‌پیدا‌کرده‌و‌تکنی ‌‬ ‫یتوانید‌کُد‌من‌را‌امتحان‌کنید‪‌.‬با‌این‌کار‌م ‌‬ ‫م‌‬
‫یاد‌بگیرید‌که‌بعداً‌از‌آن‌استفاده‌کنید‪‌ ‌.‬‬
‫‌‬
‫یتوانم‌موافق‌این‌موضوع‌باشم! ‌‬ ‫شتر‌از‌این‌نم ‌‬‫بی ‌‬
‫کتابهایی‌‬
‫دادهکاوی‌نیست‪‌ ‌.‬‬ ‫کها‌ ‌‬ ‫روشها‌و‌تکنی ‌‬
‫این‌کتاب‌یک‌کتاب‌کامل‌و‌جامع‌در‌مورد‌ ‌‬
‫مقدمهای ‌بر ‌داده‌کاوی‪‌ ،‬اثر ‌‪‌ Michael Steinbach‌ ،Pang-Ning Tan‬و ‌ ‪Vipin‬‬ ‫‌‬ ‫مانند‪«‌ ،‬‬
‫دادهکاوی‌را ‌پوشش‌داده‌‬ ‫روشهای‌مختلفِ‌ ‌‬ ‫‪‌»Kumar‬در‌بازار‌موجود‌هستند‌که‌بسیار‌بهتر‌ ‌‬
‫دادهاند‪‌.‬‬
‫قتر‌توضیح‌ ‌‬ ‫روشهای‌مختلف‌را‌نیز‌به‌صورت‌لمی ‌‬ ‫و‌ریاضیاتِ‌پایه‌برای‌فهمِ‌و‌دركِ‌ ‌‬
‫یخواهد ‌یک ‌مقدمه‌ی ‌سریع‪‌،‬‬ ‫یخوانید ‌– ‌م ‌‬
‫ولی ‌این ‌کتاب ‌– ‌همین ‌کتابی ‌که ‌االن ‌دارید ‌م ‌‬
‫واقعگرایانه‪‌ ،‬کاربردی ‌و ‌دم‌دستی ‌را ‌ارائه ‌کند ‌تا ‌بتواند ‌ساختاری ‌پایه ‌در ‌مورد ‌داده‌کاوی‌‬ ‫‌‬
‫جامعتر ‌برای ‌پرکردنِ ‌خالهایی ‌که ‌دارید ‌را‌‬ ‫یتوانید ‌یک ‌کتابِ ‌ ‌‬ ‫برایتان ‌ایجاد ‌کند‪‌ .‬بعداً‪‌ ،‬م ‌‬
‫مطالعه‌کنید‪‌ .‬‬
‫قسمتهای ‌مفیدِ ‌این ‌کتاب‪‌ ،‬کُدهای ‌زبان ‌پایتون ‌در ‌کنار ‌متون ‌است‪‌ .‬فکر ‌کنم‌‬ ‫‌‬ ‫یکی ‌از ‌‬
‫گنجاندنِ ‌این ‌دو ‌در ‌کنار ‌هم‪‌ ،‬بالث ‌تسهیلِ ‌یادگیریِ ‌خواننده ‌برای ‌درك ‌مفاهیم ‌کلیدی‌‬
‫پتهای‌پایتون‌‬ ‫یشود‪‌،‬ولی‌این‌کار‌بالث‌می‌شود‌که‌خواننده‌فقط‌به‌بررسی‌کُدها‌و‌اسکری ‌‬ ‫م‌‬
‫یها‌را‌نیز‌یاد‌بگیرد‪‌ .‬‬ ‫نپرداخته‌و‌متون‌و‌تئور ‌‬
‫‌‬
‫‌فصل‌‪‌.2‬مقدمه‌■ ‪25‬‬

‫تمامکردنِ‌این‌کتاب‌چه‌چیزی‌یاد‌خواهید‌گرفت ‌‬
‫با‌خواندن‌و‌ ‌‬
‫وقتی‌که‌این‌کتاب‌را‌تمام‌کنید‪‌،‬قادر‌خواهید‌بود‌یک‌سیستم‌توصیه‌گر‌( ‪recommender‬‬
‫ادهسازی ‌کنید‪‌.‬برای ‌مثال‪‌،‬‬ ‫تها ‌توسط ‌پایتون ‌یا ‌هر ‌زبانِ ‌دیگری ‌پی ‌‬ ‫‪‌ )system‬برای ‌ ‌‬
‫وبسای ‌‬
‫یدهید‪‌،‬‬ ‫وقتی ‌یک ‌محصول ‌در ‌آمازون ‌را ‌مشاهده ‌می‌کنید‪‌ ،‬یا ‌یک ‌آهنگ ‌در ‌پاندورا ‌گوش ‌م ‌‬
‫آنجاهایی‌که‌نوشته‌است‪«‌:‬همچنین‌‬ ‫یشوید‌(مثالً‌ ‌‬ ‫مجمولهای‌از‌پیشنهادها‌مواجه‌م ‌‬
‫‌‬ ‫شما‌با‌‬
‫ستمها ‌را‌‬
‫یگیرید ‌که ‌چگونه ‌این ‌دست ‌سی ‌‬ ‫محصوالت ‌زیر ‌را ‌احتماالً ‌دوست ‌دارید»)‪‌.‬یاد ‌م ‌‬
‫توسعه ‌دهید‪‌.‬به ‌لالوه‪‌ ،‬این ‌کتاب ‌یک ‌سری ‌کلماتِ ‌ضروری ‌و ‌کلیدی ‌را ‌به ‌شما ‌یاد ‌خواهد‌‬
‫دادهکاوی‌کار‌کنید‪‌ .‬‬
‫حوزهی‌ ‌‬‫مهای‌توسعه‌بر‌روی‌مسائلِ‌ ‌‬ ‫داد‌تا‌بتوانید‌در‌تی ‌‬
‫ستمهای‌‬‫به ‌لنوانِ ‌قسمتی ‌از ‌این ‌هدف‪‌ ،‬کتابِ ‌جاری ‌کمک ‌می‌کند ‌تا ‌پرده ‌از ‌راز ‌سی ‌‬
‫دادهکاویِ ‌دیگر‪‌ ،‬بردارد‪‌.‬‬
‫ستمهای ‌شناسایی ‌ترورسیم ‌و ‌سیستم‌های ‌ ‌‬ ‫پیشنهاددهنده‪‌ ،‬سی ‌‬
‫ستمها‌چگونه‌کار‌می‌کنند‌داشته‌باشید‪‌ .‬‬ ‫دهای‌از‌این‌که‌این‌سی ‌‬ ‫یتوانید‌ای ‌‬‫حداقل‌م ‌‬
‫‌‬

‫اصالً‌چرا؟‌‌چرا‌چیزهای‌موجود‌در‌این‌کتاب‌مهم‌هستند؟ ‌‬
‫دادهکاوی‌کنید؟‌در‌ابتدای‌این‌فصل‪‌،‬‬ ‫وقتتان‌را‌صرف‌خواندن‌و‌تمرینِ‌این‌کتابِ‌ ‌‬ ‫چرا‌باید‌ ‌‬
‫یآورم‪‌ .‬‬
‫مثالهایی‌در‌مورد‌اهمیت‌داده‌کاوی‌آوردم‌که‌خالصه‌ی‌آن‌را‌در‌زیر‌م ‌‬ ‫‌‬
‫کتابها‪‌ ،‬پلوپزها)‪‌.‬‬
‫یها‪‌ ‌ ،‬‬ ‫لمها‪‌ ،‬موسیق ‌‬
‫چیزهای ‌مختلفِ ‌زیادی ‌در ‌دور ‌و ‌برمان ‌وجود ‌دارد ‌(فی ‌‬
‫تنوع ‌و ‌تعداد ‌این ‌چیزها ‌در ‌حال ‌رشد ‌است‪‌.‬مسئله ‌این ‌است ‌که ‌ما ‌در ‌میان ‌این ‌همه ‌چیز‪‌،‬‬
‫لمهایی‌که‌موجود‌است‪‌،‬کدام‌‬ ‫آیتمهای‌مرتبط‌با‌خودمان‌می‌گردیم‪‌.‬از‌تمام‌این‌فی ‌‬ ‫به‌دنبال‌ ‌‬
‫آیتمهای‌‬
‫مسئلهی‌پیدا‌کردن‌و‌کشف‌ ‌‬ ‫‌‬ ‫را‌باید‌ببینم؟‌کتاب‌بعدی‌که‌باید‌بخوانم‌کدام‌است؟‌‬
‫تها ‌یک ‌قسمت‌‬ ‫وبسای ‌‬
‫دادهکاوی ‌به ‌شما ‌می‌رود‪‌.‬اکثر ‌ ‌‬
‫مرتبط ‌همان ‌چیزی ‌است ‌که ‌مقصدِ ‌ ‌‬
‫کتابها ‌و ‌البته‌‬
‫یا ‌ماژولی ‌برای ‌پیدا ‌کردنِ ‌این ‌چیزها ‌دارند‪‌ .‬لالوه ‌بر ‌فیلم‌ها‪‌ ،‬موسیقی‪‌ ‌ ،‬‬
‫دنبالکردن‌‬
‫پلوپزها‪‌ ،‬احتماالً ‌به ‌دنبال ‌پیشنهادهایی ‌جهت ‌پیدا ‌کردنِ ‌دوستانی ‌برای ‌ ‌‬
‫شبکههای ‌اجتمالی ‌هستید‪‌.‬نظرتان ‌در ‌مورد ‌یک ‌روزنامه‌ی ‌شخصی ‌چیست؟‌‬ ‫(‪‌)follow‬در ‌ ‌‬
‫آنها‌‬
‫روزنامهای ‌که ‌فقط ‌اخباری ‌را ‌به ‌شما ‌نمایش ‌دهد ‌که ‌بیشتر ‌به ‌ ‌‬
‫‌‬ ‫دربارهی ‌‬
‫یا ‌نظرتان ‌ ‌‬
‫دهندهی ‌وب ‌باشید‪‌،‬‬
‫‌‬ ‫‌‬
‫توسعه‬ ‫برنامهنویس ‌و ‌به ‌طور ‌خاص ‌یک ‌‬
‫لالقه ‌دارید‪‌ ،‬چیست؟ ‌اگر ‌یک ‌ ‌‬
‫یخورد‪‌ .‬‬
‫روشهای‌آن‌به‌دردتان‌م ‌‬ ‫دادهکاوی‌و‌ ‌‬‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌29‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دادهکاوی ‌کنید‪‌.‬ولی ‌حاال ‌چرا‌‬


‫خب‪‌ ،‬االن ‌فهمیدید ‌که ‌چرا ‌باید ‌زمانتان ‌را ‌صرف ‌یادگیریِ ‌ ‌‬
‫دادهکاوی‌‬
‫کتابهای‌مختلفی‌وجود‌دارند‌که‌به‌صورت‌غیر‌فنی‌در‌مورد‌ ‌‬ ‫این‌کتاب؟‌ببینید‪‌ ‌،‬‬
‫کتابها ‌را‌‬
‫دادهکاوی ‌را ‌ترسیم ‌کنند‪‌.‬این ‌ ‌‬
‫توانستهاند ‌یک ‌شِمای ‌کلی ‌از ‌ ‌‬
‫‌‬ ‫دادهاند ‌و ‌‬
‫توضیح ‌ ‌‬
‫لذتبخش‌‬ ‫یتوانید ‌خیلی ‌سریع ‌و ‌ ‌‬ ‫م‌‬
‫کتابها ‌ارزان ‌هستند ‌و‌‬
‫بخوانید‪‌ .‬این ‌ ‌‬
‫آنها ‌را ‌قبل ‌از ‌خواب ‌هم‌‬ ‫یتوانید ‌ ‌‬‫م‌‬
‫مطالعه ‌کنید‪‌ .‬یک ‌مثالِ ‌لالی ‌از ‌این‌‬
‫کتابها‪‌ ،‬کتاب ‌«شمارش» ‌( ‪The‬‬ ‫‌‬
‫‪‌)Numerati‬اثر‌‪‌Stephen Baker‬است‌که‌پیشنهاد‌خود‌من‌هم‌این‌است‌که‌این‌کتاب‌را‌‬
‫نسخهی ‌صوتیِ ‌این ‌کتاب ‌را ‌در ‌حال ‌رانندگی ‌از ‌ویرجینیا ‌به ‌نیومکزیکو ‌گوش‌‬
‫بخوانید‪‌.‬من ‌ ‌‬
‫حوزهی‌داده‌کاوی‌نیز‌‬
‫کتابهای‌دانشگاهی‌در‌ ‌‬ ‫دادم‪‌.‬انصافاً‌جذاب‌بود‪‌.‬این‌در‌حالی‌است‌که‌ ‌‬
‫یتوانند ‌یک ‌دید ‌لمیق ‌و‌‬
‫کتابها ‌معموالً ‌کامل ‌و ‌جامع ‌هستند ‌و ‌م ‌‬
‫وجود ‌دارند‪‌.‬این ‌دست ‌ ‌‬
‫کتابها‌را‌هم‌پیشنهاد‌‬
‫دادهکاوی‌به‌شما‌بدهند‪‌.‬این‌ ‌‬ ‫یها‌و‌کاربردهای‌ ‌‬ ‫تحلیلی‌در‌مورد‌تئور ‌‬
‫یدهم‪‌ .‬ولی ‌من ‌این ‌کتاب ‌را ‌نوشتم ‌تا ‌جای ‌خالیِ ‌موجود ‌را ‌پر ‌کنم‪‌ .‬این ‌کتاب ‌برای‌‬ ‫م‌‬
‫برنامهنویسی‌طراحی‌شده‌است‪‌ .‬‬ ‫لاشقانِ‌ ‌‬
‫این ‌کتاب ‌برای ‌این ‌طراحی ‌شده ‌است ‌که ‌پشت ‌کامپیوتر ‌مطالعه ‌شود‪‌ ،‬و ‌خواننده ‌در‌‬
‫کدها‌شود‪‌ .‬‬ ‫نها‌شرکت‌کرده‌و‌درگیر‌ ‌‬ ‫تمری ‌‬
‫‌‬
‫یک‌نکته! ‌‬
‫این ‌کتاب ‌یک ‌سری ‌فرمول ‌و ‌معادالت ‌ریاضی‌‬
‫فرمولها ‌و‌‬
‫‌‬ ‫هم ‌دارد ‌و ‌من ‌سعی ‌دارم ‌این ‌‬
‫گونهای ‌توضیح ‌دهم ‌که ‌برای‌‬ ‫معادالت ‌را ‌به ‌ ‌‬
‫برنامهنویسِ ‌لادی ‌قابل ‌فهم ‌باشد‪‌.‬‬ ‫یک ‌ ‌‬
‫زخمهایی ‌را ‌که ‌از ‌ریاضیات‌‬
‫برنامهنویسانی ‌که ‌ ‌‬
‫‌‬
‫کردهاند! ‌‬
‫خوردهاند‪‌،‬فراموش‌ ‌‬
‫‌‬ ‫در‌دانشگاه‌‬
‫صحبتها ‌در ‌مورد ‌استفاده ‌از ‌این‌‬‫‌‬ ‫اگر ‌این ‌‬
‫کتاب‪‌،‬شما ‌را ‌قانع ‌نکرد‪‌ ،‬باید‌بگویم‌که ‌این ‌کتاب ‌مجانی ‌هم ‌هست‪‌.‬مجانی ‌هم ‌در ‌خرید ‌و‌‬
‫اشتراكگذاریِ‌آن‌با‌دیگران! ‌‬
‫‌‬ ‫هم‌در‌‬
‫‌فصل‌‪‌.2‬مقدمه‌■ ‪27‬‬

‫‌‬

‫منظور‌از‌«هنر‌باستانی‌شمارش»‌‌در‌لنوان‌این‌کتاب‌چیست؟ ‌‬
‫ماه ‌ژون ‌سال ‌‪‌ 1121‬بود ‌که ‌دنبال ‌لنوانی ‌برای ‌این ‌کتاب ‌می‌گشتم‪‌.‬لناوین ‌هوشمندانه ‌را‌‬
‫مقالهای‌با‌لنوان‌«غواصی‌در‌‬ ‫دوست‌دارم‪‌،‬اما‌متاسفانه‪‌،‬استعدادی‌در‌این‌زمینه‌ندارم‪‌.‬اخیراً‌ ‌‬
‫حوزهی‌‬
‫طبقهبندیِ ‌جغرافیاییِ ‌زبان ‌لربی» ‌(بله‪‌ ،‬یک ‌مقاله ‌در ‌ ‌‬
‫یهای ‌زبانی‪‌ ‌ :‬‬ ‫به ‌هم ‌ریختگ ‌‬
‫نکه‌‬ ‫داشتم‪‌ ،‬هوشمندانه ‌به ‌خاطر ‌ای ‌‬
‫‌‬ ‫دادهکاوی) ‌نوشتم‪‌.‬من ‌این ‌لنوانِ ‌هوشمندانه ‌را ‌دوست ‌‬ ‫‌‬
‫این ‌لنوان ‌به ‌صورت ‌بسیار ‌خوبی ‌متناسب ‌با ‌محتوای ‌مقاله ‌بود‪‌ ،‬ولی ‌خوب‪‌ ،‬باید ‌به ‌همسرم‌‬
‫مقالهی ‌دیگر ‌نیز ‌با ‌کمکِ ‌شخصی ‌دیگر‌‬
‫یگفتم ‌تا ‌او ‌هم ‌با ‌این ‌لنوان ‌کنار ‌بیاید‪‌.‬یک ‌ ‌‬‫هم ‌م ‌‬
‫نوشتم ‌و ‌لنوانش ‌این ‌بود‪«‌:‬حال ‌و ‌حوصله ‌و ‌چگونگی ‌آن‌‪‌ :‬خارج ‌از ‌تئوری ‌و ‌وارد ‌معرکه»‪‌.‬‬
‫سندهی ‌همکار ‌من‪‌ Marjorie McShane‌ ،‬با ‌لنوانش ‌کنار ‌آمد‪‌.‬به ‌هر ‌حال‪‌ ،‬برگردیم ‌به‌‬ ‫نوی ‌‬
‫هوشمندانهام ‌خیلی ‌مبهم ‌بود‪‌ .‬اینقدر ‌مبهم ‌که‌‬
‫‌‬ ‫دههای ‌‬‫ماهِ ‌جونِ ‌‪‌ ،1121‬تمامی ‌ای ‌‬
‫یتوانستید ‌سرنخی ‌از ‌کتاب ‌را ‌با ‌خواندنِ ‌لنوانِ ‌آن ‌بگیرید‪‌ .‬لنوان ‌«آموزش ‌داده‌کاوی‌‬ ‫نم ‌‬
‫برنامهنویسان» ‌را‌در ‌قسمتی ‌از ‌لنوان ‌قرار ‌دادم‪‌.‬معتقدم ‌این ‌تکه ‌به ‌صورت ‌مختصر‌‬ ‫برای ‌ ‌‬
‫یدهد‌–‌قصد‌دارم‌این‌کتاب‌یک‌راهنما‌برای‌ ‌‬
‫برنامهنویسانی‌‬ ‫توضیح‌محتوای‌این‌کتاب‌را‌م ‌‬
‫یکنند‪‌.‬احتماالً‌معنای‌لبارت‌بعد‌از‌نقل‌و‌قول‪‌،‬شما‌‬ ‫برنامهنویسی‌م ‌‬
‫باشد‌که‌االن‌دارند‌کارِ‌ ‌‬
‫شگفتزده‌کرده‌باشد‪‌ :‬‬
‫‌‬ ‫را‌‬
‫‌‬
‫برنامهنویسان‪:‬‬
‫دادهکاوی‌برای‌ ‌‬ ‫راهنمای‌ ‌‬
‫هنر‌باستانی‌شمارش‬
‫‪A Programmer's Guide to Data Mining:‬‬
‫‪The Ancient Art of the Numerati‬‬
‫‌‬
‫شمارهها» ‌و‌یا‌حتی‌«لددی»‌‬ ‫‌‬ ‫کلمهی ‌«شمارش» ‌(‪‌ –‌)Numerati‬که ‌م ‌‬
‫یتوانیم ‌آن ‌را ‌به ‌«‬ ‫‌‬
‫نیز ‌ترجمه ‌کنیم ‌‪‌-‬توسط ‌‪‌ Stephen Baker‬ابداع ‌شد‪‌.‬هر ‌کدام ‌از ‌ما‪‌ ،‬حجم ‌بسیار ‌زیادی ‌از‌‬
‫نوشتههای‌‬
‫‌‬ ‫کارتهای ‌التباری‪‌ ،‬‬
‫دادههای ‌دیجیتالی ‌را ‌هر ‌روز ‌تولید ‌می‌کنیم‪‌ .‬خری‌دهای ‌با ‌ ‌‬
‫‌‬
‫تهای‌‬ ‫نوشتههای ‌گواال ‌(‪‌ –‌ Gowalla‬یک ‌شبکه‌ی ‌اجتمالی ‌مبتنی ‌بر ‌مکان)‪‌ ،‬فعالی ‌‬‫‌‬ ‫توییتر‪‌ ،‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌21‬‬
‫دادهکاوی‌برای‌ ‌‬

‫امهای‌‬ ‫تماسهای ‌تلفنی‪‌ ،‬پی ‌‬


‫‌‬ ‫نرمافزار ‌جستجوی ‌مکان)‪‌ ،‬‬ ‫فوراسکویرز ‌(‪‌ –‌ Foursquare‬یک ‌ ‌‬
‫امکها‌و‌غیره‪‌ .‬‬
‫ایمیل‪‌،‬پی ‌‬
‫فرض‌کن‌بیدار‌شد‌های‪‌.‬ماتریکس‪‌،‬می‌داند‌که‌تو‌در‌سالت‌‪‌7:21‬سوار‌مترو‌ایستگاه‌ ‪Foggy‬‬
‫شدهای‪‌ .‬ماتریکس‪‌،‬‬ ‫‪‌ Bottom‬شده ‌و ‌از ‌مترو ‌ایستگاه ‌‪‌ Westside‬در ‌سالت ‌‪‌ 7:31‬خارج ‌ ‌‬
‫تمشکآبی ‌در ‌استارباکس ‌در ‌تاریخ ‌پنجم ‌ماه‌‬ ‫‌‬ ‫یداند ‌یک ‌قهوه ‌الته ‌و ‌یک ‌بیسکوییتِ ‌‬ ‫م‌‬
‫کردهای‪‌.‬از ‌گواال ‌(‪‌)Gowalla‬برای ‌ثبت ‌موقعیتِ‌‬ ‫سفارش ‌داد‌های‪‌.‬در ‌‪‌ 7:45‬شروع ‌به ‌حرکت ‌ ‌‬
‫یدی ‌برنامه‌‬ ‫یو ‌‬
‫میکنی‪‌.‬یک ‌مجموله‌ی ‌‪‌ 23‬تایی ‌د ‌‬ ‫خود ‌سر ‌کار ‌در ‌سالت ‌‪‌ 1:15‬استفاده ‌ ‌‬
‫تمرینی ‌تناسب ‌اندام ‌خانگی ‌‪‌ P90X Extreme‬همراه ‌با ‌یک ‌بارفیکس ‌در ‌سالت ‌‪‌ 6:35‬از‌‬
‫دادهای‪‌.‬در‌«فالفل‌طالیی»‌ناهار‌خوردی‪‌ ‌.‬‬ ‫سایت‌آمازون‌سفارش‌ ‌‬
‫ینویسد‪‌ :‬‬‫‪‌Stephen Baker‬م ‌‬
‫دانهای ‌خبره‪‌،‬‬ ‫ی ‌‬ ‫یسازیم ‌را ‌درك ‌کنند‪‌ ،‬ریاض ‌‬ ‫دادههایی ‌که ‌ما ‌م ‌‬
‫یتوانند ‌ ‌‬ ‫تنها ‌قومی ‌که ‌م ‌‬
‫دربارهی ‌ما‪‌ ،‬با‌‬
‫شمارهها ‌چه ‌چیزهایی ‌ ‌‬ ‫‌‬ ‫دانشمندان ‌للومِ ‌کامپیوتر ‌و ‌مهندسان ‌هستند‪‌.‬این ‌‬
‫آنها‌‬
‫نکه ‌ ‌‬ ‫جکننده ‌و ‌مرکب ‌الداد ‌می‌آموزند؟ ‌اول ‌ای ‌‬ ‫هدایت ‌کردنِ ‌ما ‌به ‌دنیای ‌گی ‌‬
‫یخواهند ‌ما ‌را ‌پیدا ‌کنند‪‌ .‬فرض ‌کنید ‌شما ‌یک ‌خریدار ‌بالقوه ‌از ‌فروشگاه ‌‪‌ SUV‬در‌‬ ‫م‌‬
‫یرود‌یا‌لضو‌گروه‌‬ ‫حومهی‌شمالی‌نیویورك‌هستید‪‌،‬یا‌یک‌شخص‌مذهبی‌که‌به‌کلیسا‌م ‌‬ ‫‌‬
‫ضد‌سقط‌جنین‌در‌آلبوکرك‌(از‌شهرهای‌نیومکزیکو‌در‌آمریکا)‌هستید‪‌.‬ممکن‌است‌یک‌‬
‫برنامهنویس‌جاوا‌باشید‌که‌آماده‌نقل‌مکان‌به‌حیدرآباد‌(در‌هند)‌است‪‌،‬یا‌یک‌لشق‌جاز‪‌،‬‬ ‫‌‬
‫نههای ‌استکهلم‌‬ ‫یک ‌متولد ‌برج ‌قوس‪‌ ،‬که ‌به ‌دنبال ‌پیاده‌روی ‌در ‌روستا ‌و ‌بازدید ‌شومی ‌‬
‫است‪‌ ،‬یا ‌– ‌خدا ‌کمکان ‌کند ‌– ‌ممکن ‌است ‌لالقه ‌داشته ‌باشید ‌که ‌یک ‌کمربند ‌انتحاری‌‬
‫مجمولهای‌از‌‬
‫‌‬ ‫ببندید‌و‌داخل‌یک‌اتوبوس‌شوید‪‌.‬هر‌چه‌هستید‌–‌که‌البته‌هر‌کدام‌از‌ما‌‬
‫یخواهند ‌شما ‌را ‌شناسایی ‌و ‌ردیابی‌‬ ‫دولتها ‌م ‌‬
‫شرکتها ‌و ‌ ‌‬‫‌‬ ‫چیزهای ‌مختلف ‌هستیم ‌– ‌‬
‫کنند‪.‬‬
‫‪Baker‬‬
‫‌‬
‫زدهاید‪‌،‬من‌این‌لبارتِ‌«شمارش‌(‪‌»)Numerati‬و‌طرز‌تشریح‌‬
‫همانطور‌که‌احتماالً‌حدس‌ ‌‬
‫‌‬
‫آن‌توسط‌‪‌Stephen Baker‬را‌دوست‌دارم‪‌ .‬‬
‫فصل ‪ .2‬سيستمهاي توصيهگر‬
‫سيستمهاي توصيهگر يا همان سيستمهاي پيشنهاددهنده‬
‫پايش مشاركتي (‪ )Collaborative Filtering‬يا همان پايش با همكاري‬
‫من چيزي را كه تو دوست داشته باشي‪ ،‬دوست دارم‬

‫ستمهای ‌توصی‌هگر ‌( ‪recommendation‬‬


‫شروعِ ‌کندوکاو ‌در ‌داده‌کاوی ‌را ‌با ‌نگاهی ‌بر ‌سی ‌‬
‫همهجا‌هستند‌–‌از‌آمازون‌گرفته‪‌ :‬‬
‫ستمهای‌توصی‌هگر‌ ‌‬ ‫‪‌)systems‬آغاز‌م ‌‬
‫یکنیم‪‌.‬سی ‌‬
‫‌‬

‫‌‬
‫‌‬
‫یدهد‪‌ :‬‬ ‫‌تا‌سایت‌‪‌last.fm‬که‌کنسرت‌یا‌موسیق ‌‬
‫یهای‌مختلف‌را‌پیشنهاد‌م ‌‬
‫‌‌‬

‫‪04‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌11‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬
‫‌‬
‫در‌مثالِ‌آمازون‌که‌در‌باال‌گفته‌شد‪‌،‬آمازون‌دو‌تِکه‌از‌اطاللات‌را‌برای‌ساختِ‌یک‌پیشنهاد‌‬
‫آنجا ‌گرفته ‌می‌شود ‌که ‌مثالً ‌من ‌کتاب ‌ ‪The‬‬ ‫جدید ‌با ‌هم ‌ترکیب ‌می‌کند‪‌.‬اولین ‌تِکه‪‌ ،‬از ‌ ‌‬
‫یشود‌‬ ‫آنجا ‌گرفته ‌م ‌‬
‫تکهی ‌دوم‪‌ ،‬از ‌ ‌‬
‫یبینیم‪‌.‬و‌ ‌‬ ‫ترجمهی ‌‪‌ Gene Reeves‬را ‌م ‌‬‫‌‬ ‫‪‌ Lotus Sutra‬‬
‫ترجمههای ‌دیگری ‌را ‌نیز ‌دیده ‌باشند‌‬
‫‌‬ ‫دهاند‪‌ ،‬‬
‫که ‌برای ‌مثال ‌مشتریانی ‌که ‌همین ‌ترجمه ‌را ‌دی ‌‬
‫ترجمههای‌مختلف‌را‌در‌مرورگر‌باز‌کرده‌باشند)‪‌ .‬‬ ‫‌‬ ‫(مثالً‌‬
‫یکنیم‪‌ ،‬پایشِ ‌مشارکتی ‌( ‪collaborative‬‬ ‫روشی ‌که ‌در ‌این ‌فصل ‌در ‌مورد ‌آن ‌صحبت ‌م ‌‬
‫کلمهی ‌مشارکتی ‌در ‌این‌‬ ‫نکه ‌از ‌ ‌‬ ‫‪‌ )filtering‬یا ‌همان ‌پایش ‌با ‌همکاری ‌نام ‌دارد‪‌ .‬دلیل ‌ای ‌‬
‫شنهادهای ‌ارائه ‌شده ‌در ‌این‌‬
‫‌‬ ‫لبارت ‌استفاده ‌شده ‌است ‌به ‌خاطر ‌این ‌موضوع ‌است ‌که ‌پی‬
‫یشود‌–‌در‌واقع‪‌،‬افراد‌با‌یکدیگر‌همکاری‌می‌کنند‌تا‌بتوانند‌‬ ‫روش‪‌،‬بر‌اساسِ‌افراد‌طراحی‌م ‌‬
‫روشنتر ‌کنیم‪‌ ،‬مثالی‌‬
‫‌‬ ‫توصیهگر ‌بسازند‪‌ .‬اگر ‌بخواهیم ‌با ‌یک ‌مثال‪‌ ،‬مسئله ‌را ‌‬‫‌‬ ‫یک ‌سیستمِ ‌‬
‫تواند‌کمککننده‌باشد‪‌ :‬‬
‫‌‬ ‫مانند‌مسئلهی‌زیر‌ ‌‬
‫می‬ ‫‌‬
‫فهی ‌من ‌این ‌است ‌که ‌یک ‌کتاب ‌به ‌شما ‌معرفی ‌کنم‪‌.‬من ‌در ‌میان ‌کاربرانِ‌‬ ‫فرض ‌کنید‪‌ ،‬وظی ‌‬
‫سایت ‌جستجو ‌کرده ‌تا ‌بتوانم ‌کسی ‌که ‌لالیقش ‌در ‌زمینه‌ی ‌کتاب ‌مشابه ‌شما ‌باشد ‌را ‌پیدا‌‬
‫یتوانم‌ببینم‌آن‌شخص‌به‌چه‌کتابی‌‬ ‫کنم‪‌.‬به‌محضِ‌این‌که‌آن‌شخصِ‌مشابه‌را‌پیدا‌کردم‪‌،‬م ‌‬
‫یهگر‌■ ‪12‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫لالقه‌دارد‌و‌آن‌کتاب‌را‌به‌شما‌پیشنهاد‌دهم‌–‌مثالً‌شاید‌‪‌The Windup Girl‬اثر‌ ‪Paolo‬‬


‫‪‌ .Bacigalupi‬‬
‫ولی‌چگونه‌یک‌فرد‌مشابه‌را‌پیدا‌کنم؟ ‌‬
‫خب! ‌پس ‌اولین ‌قدم ‌پیدا ‌کردنِ ‌یک‌‬
‫فردِ‌مشابه‌است‪‌.‬شکل‌روبرو‌یک‌مثالِ‌‬
‫دو ‌بُعدی ‌(‪‌ )2D‬است‪‌ .‬فرض ‌کنید‪‌،‬‬
‫کتابها ‌را ‌در ‌یک ‌سیستمِ ‌‪‌5‬‬
‫کاربران‪‌ ‌ ،‬‬
‫یدهند ‌(یعنی‌‬ ‫ستارهای ‌امتیاز ‌م ‌‬‫‌‬
‫یتوانند‌از‌‪‌2‬تا‌‪‌5‬به‌یک‌کتاب‌امتیاز‌‬ ‫م‌‬
‫دهند) ‌– ‌امتیاز ‌صفر ‌به ‌معنیِ ‌این‌‬
‫است ‌که ‌کتاب ‌واقعاً ‌افتضاح ‌بوده ‌و‌‬
‫امتیاز‌‪‌5‬به‌معنیِ‌لالی‌بودنِ‌آن‌کتاب‌‬
‫است‪‌.‬چون‌اولِ‌این‌پاراگراف‌گفتم‌که‌‬
‫ما ‌مسئله ‌را ‌در ‌یک ‌مثالِ ‌دو ‌بُعدی ‌(‪‌ ‌ )2D‬‬
‫سادهسازی ‌کردیم‪‌ ،‬پس ‌فعالً ‌دو ‌کتاب ‌را ‌مورد‌‬
‫یدهیم‪‌:‬کتابِ‌‪‌Snow Crash‬اثر‌‪‌Neal Stephenson‬و‌کتابِ‌ ‪The Girl with‬‬ ‫بررسی‌قرار‌م ‌‬
‫‪‌the Dragon Tattoo‬اثر‌‪‌ .Steig Larsson‬‬
‫دادهاند‌را‌در‌جدول‌زیر‌‬‫ابتدا‪‌،‬تعداد‌‪‌3‬کاربر‌که‌هر‌کدام‌به‌این‌دو‌کتاب‌امتیازهای‌مختلفی‌ ‌‬
‫یدهیم‌(‪‌Bill‌،Amy‬و‌‪‌Jim‬کاربران‌ما‌هستند)‪‌ :‬‬ ‫نمایش‌م ‌‬
‫‌‌‬

‫‌‬
‫‌‬
‫یخواهم ‌یک ‌کتاب ‌به ‌خانم ‌‪(‌ X‬یک ‌خانمِ ‌فرضی)‌پیشنهاد ‌دهم‪‌.‬این ‌خانمِ ‌‪‌ X‬کتابِ‌‬ ‫حاال ‌م ‌‬
‫‪‌ Snow Crash‬را ‌با ‌امتیاز ‌‪‌ 4‬و ‌کتابِ ‌‪‌ The Girl with the Dragon Tattoo‬را ‌با ‌امتیاز ‌‪‌،1‬‬
‫ارزیابی‌کرده‌است‪‌.‬اولین‌کار‌این‌است‌که‌شخصی‌را‌پیدا‌کنیم‌که‌بیشترین‌شباهت‌به‌این‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌11‬‬
‫دادهکاوی‌برای‌ ‌‬

‫کتر ‌باشد‪‌ .‬من ‌این ‌کار ‌را ‌با‌‬


‫خانم ‌داشته ‌باشد‪‌ .‬یا ‌بهتر ‌است ‌بگوییم ‌به ‌این ‌خانم ‌نزدی ‌‬
‫یدهم‪‌ .‬‬
‫محاسبهی‌فاصله‌انجام‌م ‌‬
‫‌‬
‫‌‬

‫فاصلهی‌مَنهَتَن‌(‪‌ )Manhattan Distance‬‬


‫‌‬
‫رانندهی ‌تاکسی»‌‬
‫فاصلهی ‌« ‌‬‫فاصلهی ‌منهتن ‌است ‌که ‌به ‌ ‌‬‫محاسبهی ‌فاصله‪‌ ‌ ،‬‬
‫‌‬ ‫سادهترین ‌معیارِ ‌‬
‫‌‬
‫نقطهی‌‬
‫نیز‌شهرت‌دارد‪‌.‬در‌این‌مثال‌که‌دو‌بُعد‌داشت‪‌،‬هر‌کدام‌از‌افرادِ‌امتیاز‌دهنده‪‌،‬با‌یک‌ ‌‬
‫یشوند‪‌.‬برای ‌مشخص ‌کردنِ ‌افرادِ ‌خاص‪‌ ،‬از ‌یک ‌زیرنویس ‌برای ‌‪‌ x‬و ‌‪‌y‬‬‫(‪‌)x, y‬نمایش ‌داده ‌م ‌‬
‫یتواند ‌‪(‌ Amy‬در ‌جدولِ ‌باال) ‌باشد ‌و ‌یا‌‬ ‫‌م ‌‬ ‫یکنم‪‌ .‬پس ‌برای ‌مثال‌‬ ‫استفاده ‌م ‌‬
‫یتواند‌خانم‌‪‌X‬باشد‪‌ .‬‬ ‫‌م ‌‬
‫یشود‪‌ :‬‬
‫خب‪‌،‬برویم‌سراغِ‌منهتن‪‌.‬فاصله‌ی‌منهتن‌به‌صورت‌زیر‌محاسبه‌م ‌‬

‫‌‬
‫(یعنی ‌قدر ‌مطلقِ ‌اختالفِ ‌‪x‬ها ‌و ‌قدر ‌مطلق ‌اختالف ‌‪y‬ها ‌را ‌باید ‌با ‌هم ‌جمع ‌ ‌‬
‫میکنیم)‪‌.‬‬
‫فاصلهی ‌منهتن ‌بین ‌‪‌ Amy‬و ‌خانم ‌‪‌ X‬برابر ‌‪‌ 4‬است‪‌.‬‬
‫سرانجام ‌با ‌استفاده ‌از ‌همین ‌فرمول‪‌ ‌ ،‬‬
‫چیزی‌مانند‌شکل‌زیر‪‌ :‬‬
‫‌‬
‫یهگر‌■ ‪13‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫‌‬
‫‌‬
‫فاصلهی ‌خانمِ ‌‪‌ X‬با ‌افراد ‌مختلفِ ‌جدول‌باال ‌یعنی‌‪‌ Bill‌ ،Amy‬و ‌‪‌ Jim‬نمایش‌‬
‫در ‌جدول ‌زیر‪‌ ‌ ،‬‬
‫داده‌شده‌است‪‌ :‬‬
‫‌‌‬

‫‌‬
‫‌‬
‫یکنید‌که‌‪‌Amy‬بیشترین‌شباهت‌را‌به‌خانمِ‌‪‌X‬دارد‌یعنی‌به‌خانم‌‬ ‫در‌این‌جدول‌مشاهده‌م ‌‬
‫سابقهی ‌‪‌ Amy‬نگاه ‌کنیم ‌و ‌ببینیم ‌برای ‌مثال‪‌Amy‌ ،‬‬
‫یتوانیم ‌به ‌ ‌‬ ‫‪‌ X‬نزدی ‌‬
‫کتر ‌است‪‌.‬حاال ‌ما ‌م ‌‬
‫به‌کتاب ‌‪‌The Windup Girl‬اثر‌‪‌،Paolo Bacigalupi‬امتیاز‌‪‌5‬را‌داده‌است‪‌،‬پس‌این ‌کتاب‌‬
‫یدهیم‪‌ .‬‬‫را‌به‌خانمِ‌‪‌X‬هم‌پیشنهاد‌م ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌14‬‬
‫دادهکاوی‌برای‌ ‌‬

‫فاصلهی‌اقلیدسی‌(‪‌ )Euclidean Distance‬‬


‫‌‬
‫فاصلهی ‌منهتن‪‌ ،‬سرلت ‌باالی ‌محاسب‌هی ‌آن ‌است‪‌ .‬اگر ‌ما ‌مثالً ‌سایت‌‬
‫تهای ‌ ‌‬ ‫یکی ‌از ‌مزی ‌‬
‫سبوك‌باشیم‌و‌بخواهیم‌یکی‌از‌افرادِ‌مشابهِ‌‪‌Danny‬در‌شهرِ‌‪‌Kalamazoo‬را‌از‌بین‌یک‌‬ ‫فی ‌‬
‫برایمان‌مهم‌میشود‪‌ .‬‬
‫‌‬ ‫میلیون‌کاربر‌پیدا‌کنیم‪‌،‬سرلت‌محاسبات‌‬
‫‌‬

‫تئوریِ‌فیثاغورث ‌‬
‫نجا ‌به ‌جای‌‬
‫احتماالً ‌تئوریِ ‌فیثاغورت ‌را ‌از ‌ریاضیاتِ ‌دوران ‌دبیرستان ‌به ‌یاد ‌دارید‪‌ .‬در ‌ای ‌‬
‫یخواهیم‌خط‌مستقیم‌‬ ‫یشد‪‌،‬م ‌‬ ‫فاصلهی‌منهتن‌بین ‌‪‌Amy‬و‌خانم ‌‪‌X‬که‌برابر‌‪‌4‬م ‌‬ ‫محاسبهی ‌ ‌‬
‫‌‬
‫(مانند‌پرواز‌مگس)‌را‌محاسبه‌کنیم‪‌ :‬‬
‫‌‌‬

‫‌‬
‫‌‬
‫یگوید‌که‌چگونه‌این‌فاصله‌را‌محاسبه‌کنیم‪‌ :‬‬
‫تئوری‌فیثاغورت‌به‌ما‌م ‌‬
‫‌‬
‫یهگر‌■ ‪15‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫‌‬
‫‌‬
‫فاصلهی‌اقلیدسی‌است‌(‪‌c‬در‌شکلِ‌باال)‪‌.‬فرمول‌زیر‌‬
‫خط‌مستقیم‪‌،‬مانند ‌پرواز‌مگس‪‌،‬همان ‌ ‌‬
‫را‌مشاهده‌کنید‪‌ :‬‬

‫√‬

‫شمارهی‌‪‌،2‬چقدر ‌کتاب ‌ ‪Dragon‬‬


‫‌‬ ‫یداد‌شخصِ‌‬
‫یآید‌که‌ ‌لددی‌بود ‌که‌نشان‌م ‌‬
‫یادتان‌م ‌‬
‫شمارهی ‌‪‌ ،1‬این ‌کتاب ‌را‌‬
‫‌‬ ‫‪‌ ‌ Tattoo‬را ‌دوست ‌داشت ‌و‌ ‌نشان ‌می‌داد ‌که ‌چقدر ‌شخصِ ‌‬
‫شمارهی ‌‪‌ 2‬چقدر ‌کتاب‌‬
‫‌‬ ‫دوست ‌داشت‪‌ .‬به ‌همین ‌ترتیب‌ ‌بیان‌گر ‌این ‌است ‌که ‌شخصِ ‌‬
‫شمارهی‌‪‌1‬چقدر‌این‌کتاب‌‬ ‫‌‬ ‫‪‌Snow Crash‬را‌دوست‌دارد‌و‌ ‌بیان‌گر‌این‌است‌که‌شخص‌‬
‫را‌دوست‌دارد‪‌ .‬‬
‫‪‌ Amy‬به ‌هر ‌دو ‌کتابِ ‌‪‌ Snow Crash‬و ‌‪‌ Dragon Tattoo‬امتیازِ ‌‪‌ 5‬داده ‌بود‪‌.‬خانم ‌‪‌ X‬به ‌این‌‬
‫آنها ‌به ‌صورت ‌زیر‌‬
‫کتابها ‌به ‌ترتیب ‌امتیاز ‌‪‌ 1‬و ‌‪‌ 4‬داده ‌است‪‌.‬پس ‌فاصله ‌ی ‌اقلیدسی ‌بین ‌ ‌‬
‫‌‬
‫محاسبه‌می‌شود‪‌ :‬‬
‫‌‬

‫√‬ ‫√‬
‫‌‬
‫یرسیم‪‌ :‬‬
‫فاصلهها‌به‌جدول‌زیر‌م ‌‬
‫با‌محاسبه‌ی‌بقی‌هی‌ ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌19‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬

‫تفکرِ‌چند‌بُعدی‌(‪‌ )N-Dimensional Thinking‬‬


‫مسئلهی ‌دو ‌کتاب ‌(به ‌صورت ‌دوبُعدی)‌خارج ‌شویم ‌و‌‬
‫‌‬ ‫اجازه ‌بدهید ‌کمی ‌از ‌نگاه ‌کردن ‌به ‌‬
‫دهتر ‌است ‌برسیم‪‌.‬تصور ‌کنید ‌ما ‌برای ‌یک ‌سرویسِ ‌پخش‌‬ ‫بتوانیم ‌به ‌چیزی ‌که ‌کمی ‌پیچی ‌‬
‫گروههای‌موسیقی‌را‌به‌کاربرانِ‌مختلف‌پیشنهاد‌‬ ‫یخواهیم‌ ‌‬ ‫آنالین‌موسیقی‌کار‌می‌کنیم‌و ‌م ‌‬
‫نکار‌‬‫تجربهها ‌ترغیب ‌کنیم‪‌ .‬برای ‌ای ‌‬
‫دهیم ‌و ‌به ‌این ‌طریق ‌کاربران ‌را ‌به ‌استفاده ‌از ‌این ‌ ‌‬
‫گروههای ‌موسیقی ‌را ‌در ‌یک ‌سیستمِ ‌امتیازدهی ‌بین ‌‪‌ 2‬تا ‌‪‌ 5‬امتیاز ‌دهند‌‬
‫یتوانند ‌ ‌‬ ‫کاربران ‌م ‌‬
‫یتواند‌به‌صورت‌‪‌1.5‬امتیاز‌هم‌باشد‌–‌مثال‌‪‌1.5‬امتیاز)‪‌.‬در‌جدول‌زیر‌‪‌1‬کاربر‌‬ ‫(این‌امتیاز‌م ‌‬
‫ستونها ‌مانند ‌‪‌Angelica‬‬
‫آنها ‌به ‌‪‌ 1‬گروه ‌موسیقی ‌نمایش ‌داده ‌شده ‌است ‌( ‌‬ ‫به ‌همراه ‌امتیازِ ‌ ‌‬
‫گروههای‌موسیقی‌هستند)‪‌ :‬‬ ‫را‌تشکیل‌میدهند‌و‌سطرها‌مانند‌‪‌ ‌Blues Traveler‬‬‫‌‬ ‫کاربران‌‬
‫‌‌‬

‫‌‬
‫‌‬
‫خط ‌تیره ‌به ‌معنیِ ‌این ‌است ‌که ‌یک ‌کاربر‪‌ ،‬به ‌یک ‌گروهِ ‌موسیقی ‌امتیاز ‌نداده ‌است‪‌.‬فعالً‪‌،‬‬
‫آنها ‌امتیاز ‌داده ‌باشند‌‬
‫گروههای ‌موسیقی ‌که ‌هر ‌دو ‌نفر ‌به ‌ ‌‬
‫یخواهیم ‌فاصله ‌را ‌بر ‌مبنای ‌ ‌‬ ‫م‌‬
‫محاسبه ‌کنیم‪‌.‬پس ‌برای ‌مثال‪‌ ،‬اگر ‌بخواهیم ‌فاصله ‌را ‌بین ‌‪‌ Angelica‬و ‌‪‌ Bill‬محاسبه ‌کنیم‪‌،‬‬
‫گروههای‌‪‌Slightly Stoopid‌ ،Phoenix‌ ،Broken Bells‌ ،Blues Traveler‬‬ ‫باید ‌امتیازهای ‌ ‌‬
‫یهگر‌■ ‪17‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫دادهاند‪‌ ،‬را ‌در ‌محاسباتِ ‌خود‌‬ ‫و ‌‪‌ Vampire Weekend‬که ‌هر ‌دوی ‌این ‌افراد ‌به ‌ ‌‬
‫آنها ‌امتیاز ‌ ‌‬
‫یشود‪‌ :‬‬‫فاصلهی‌منهتن‌بین‌‪‌Angelica‬و‌‪‌Bill‬به‌صورت‌زیر‌محاسبه‌م ‌‬ ‫المال‌کنیم‪‌.‬پس‌ ‌‬
‫‌‬

‫‌‬
‫‌‌‬
‫فاصله‌ی ‌منهتن ‌(‪‌ Manhattan Distance‬در ‌سطر ‌پایانی)‪‌ ،‬حاصل ‌جمع ‌تمامی ‌تفری ‌‬
‫قها‌‬
‫(ستون ‌‪‌)Diffrence‬بین ‌امتیازاتِ ‌متناظرِ ‌‪‌ Bill‬و ‌‪‌ Angelica‬بود ‌(‪‌)2‌+‌ 1‌+‌ 3‌+‌ 2.5‌+‌ 2.5‬‬
‫که‌برابر‌با‌‪‌6‬شده‌است‪‌ .‬‬
‫گروههای ‌موسیقی ‌را ‌در‌‬
‫فاصلهی ‌اقلیدسی ‌نیز ‌به ‌همین ‌صورت ‌است ‌(فقط ‌آن ‌ ‌‬ ‫محاسبهی ‌ ‌‬
‫‌‬
‫دادهاند)‪‌ :‬‬ ‫یگیریم‌که‌هر‌دو‌–‌‪‌Angelica‬و‌‪‌–‌Bill‬به‌ ‌‬
‫آنها‌امتیاز‌ ‌‬ ‫محاسبات‌در‌نظر‌م ‌‬
‫‌‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌11‬‬
‫دادهکاوی‌برای‌ ‌‬

‫های‌گروههای‌مشتركِ‌‪‌Angelica‬و‌‪‌Bill‬است‪‌.‬و‌ستون‌‬
‫‌‬ ‫‌‬
‫گر‌تفریق‬ ‫(ستون‌‪‌Diffrence‬که‌بیان‌‬
‫رسیده‪‌.‬از‌این‌ستون‌برای‌محاسبهی‌‬
‫‌‬ ‫‌همان‌ستونِ‌قبلی‌است‌که‌به‌توان‌‪‌1‬‬
‫در‌سطر‌یکی‌مانده‌به‌آخر‌و‌همچنین‌محاسبهی‌‬
‫‌‬ ‫«جمع‌مربعات‌–‌‪‌Sum of Squares‬‬
‫در‌سطر‌آخر‌استفاده‌میکنیم) ‌‬
‫‌‬ ‫فاصله‌ی‌اقلیدسی‌–‌‪‌Euclidean Distance‬‬
‫‌‬
‫یشود‪‌ :‬‬
‫اگر‌بخواهیم‌شکل‌باال‌را‌به‌صورت‌ریاضی‌بنویسیم‪‌،‬چیزی‌مانند‌زیر‌م ‌‬
‫‌‬

‫√‬
‫√‬

‫‌‬
‫‌‬
‫گرفتید‌چی‌شد؟ ‌‬
‫حاال‌مثال‌زیر‌را‌خودتان‌انجام‌دهید‪‌ ...‬‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‌‬
‫‌‌‬
‫‌‌ ‌‬
‫یهگر‌■ ‪16‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید ‌‬
‫با‌توجه‌به‌جدولِ‌باال‪‌ ،‬‬
‫فاصله‌ی‌اقلیدسی‌بین‌‪‌Hailey‬و‌‪‌Veronica‬را‌محاسبه‌کنید‪‌ :‬‬
‫فاصله‌ی‌اقلیدسی‌بین‌‪‌Hailey‬و‌‪‌Jordyn‬را‌محاسبه‌کنید‪‌ :‬‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌ ‌‬
‫راهحل ‌‬
‫با‌توجه‌به‌جدولِ‌باال‪‌ ،‬‬
‫فاصله‌ی‌اقلیدسی‌بین‌‪‌Hailey‬و‌‪‌Veronica‬را‌محاسبه‌کنید‪‌ :‬‬
‫‌‬
‫√‬ ‫√‬
‫‌‬
‫فاصله‌ی‌اقلیدسی‌بین‌‪‌Hailey‬و‌‪‌Jordyn‬را‌محاسبه‌کنید‪‌ :‬‬
‫‌‬
‫√‬
‫√‬
‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌31‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یک‌لیب‌اساسی ‌‬
‫یخوریم‪‌.‬‬ ‫یرسد ‌که ‌در ‌هنگام ‌استفاده ‌از ‌این ‌معیارهای ‌فاصله ‌به ‌یک ‌مشکل ‌برم ‌‬‫به ‌نظر ‌م ‌‬
‫فاصلهی ‌بین ‌‪‌ Hailey‬و ‌‪‌ Veronica‬را ‌محاسبه ‌کردیم‪‌ ،‬متوجه ‌شدیم ‌که ‌ ‌‬
‫آنها‌‬ ‫هنگامی ‌که ‌ ‌‬
‫فقط ‌در ‌دو ‌گروه ‌موسیقی ‌با ‌هم ‌مشترك ‌هستند ‌(‪‌ Norah Jones‬و ‌‪‌ )Ther Strokes‬در‌‬
‫فاصلهی ‌بین ‌‪‌ Hailey‬و ‌‪‌ Jordyn‬را ‌محاسبه ‌کردیم‪‌ ،‬متوجه ‌شدیم ‌ ‌‬
‫آنها ‌‪‌5‬‬ ‫حالی‌که ‌وقتی ‌ ‌‬
‫کردهاند‪‌.‬با ‌این ‌اوصاف ‌به ‌نظر ‌می‌رسد ‌که ‌که ‌معیار‌‬
‫گروه ‌را ‌به ‌صورت ‌مشترك ‌امتیازدهی ‌ ‌‬
‫آنجایی ‌نشات‌‬ ‫محاسبهی ‌ما ‌دچار ‌مشکلِ ‌چولگی ‌(‪‌ )skew‬شده ‌است‪‌ ،‬و ‌این ‌اِشکال ‌از ‌ ‌‬‫‌‬
‫فاصلهی ‌بین ‌‪‌ Haily‬و ‌‪‌ Veronica‬در ‌دو ‌بُعد ‌مورد ‌محاسبه ‌قرار ‌گرفته‌است ‌(به‌‬
‫یگیرد ‌که ‌ ‌‬ ‫م‌‬
‫آنها‌فقط‌‪‌1‬گروه‌موسیقی‌را‌به‌صورت‌مشترك‌امتیاز‌داده‌بودند)‌در‌حالی‌که‌‬ ‫نکه‌ ‌‬ ‫خاطر‌ای ‌‬
‫فاصله‌ی‌بین‌‪‌haily‬و‌‪‌Jordyn‬در‌‪‌5‬بعد‪‌،‬مورد‌محاسبه‌قرار‌گرفته‌است‪‌ ‌.‬‬
‫فاصلههای‌منهتن‌و‌‬
‫اقلیدسی‌هنگامی‌که‌هیچ‌داده‌ی‌گم‌شده‌یا‌مفقودی‌موجود‌نباشد‪‌،‬بهترین‌کارایی‌را‌دارند‌‬
‫دادههای ‌گم ‌شده ‌یا‌مفقود‌‬
‫دادههای ‌مفقود ‌شده ‌داشتیم‪‌.‬مواجهه ‌با ‌ ‌‬‫نجا ‌در ‌واقع ‌ ‌‬
‫ولی ‌در ‌ای ‌‬
‫حوزهی ‌تحقیقاتیِ ‌فعال ‌در ‌بین ‌محققان ‌است‪‌ .‬بعداً ‌در ‌همین ‌کتاب ‌در ‌مورد‌‬‫شده ‌یک ‌ ‌‬
‫برخورد ‌و ‌مواجهه ‌با ‌این ‌مسئله ‌صحبت ‌خواهیم ‌کرد‪‌ .‬ولی ‌برای ‌االن ‌فقط ‌از ‌این ‌مشکل‌‬
‫گوشهی‌ذهنتان‌به‌آن‌توجه‌کنید‪‌ .‬‬ ‫مطلع‌باشید‌و‌در‌ ‌‬
‫‌‬

‫یسازی‌(‪‌ )Generalization‬‬
‫یک‌لموم ‌‬
‫یسازی‪‌ ،‬معیار‌‬
‫یسازی ‌کنیم‪‌ .‬به ‌این ‌لموم ‌‬‫فاصلهی ‌منهتن ‌و ‌اقلیدسی ‌را ‌لموم ‌‬
‫یتوانیم ‌ ‌‬
‫م‌‬
‫یشود‪:‬‬‫فاصلهی‌مینکوسفکی‌(‪‌)Minkowski‬گفته‌م ‌‬
‫‌‬

‫∑‬

‫که‌در‌آن‌اگر‪‌ :‬‬
‫یهگر‌■ ‪32‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫یشود ‌‬ ‫‪‌r‬برابر‌‪‌2‬باشد‪‌:‬فرمول‌تبدیل‌به‌ ‌‬
‫فاصلهی‌منهتن‌م ‌‬
‫یشود ‌‬ ‫‪‌r‬برابر‌‪‌1‬باشد‪‌:‬فرمول‌تبدیل‌به‌ ‌‬
‫فاصلهی‌اقلیدسی‌م ‌‬
‫یشود ‌‬‫ینهایت‌باشد‪‌:‬فرمول‌تبدیل‌به‌فاصله‌سوپرمم‌(‪‌)supermum‬م ‌‬ ‫‪‌r‬برابر‌ب ‌‬
‫‌‬
‫اوووووه‌ریاضیات! ‌‬
‫وقتی ‌که ‌با ‌فرمولی ‌مانند ‌فرمول ‌باال‌‬
‫یشوید‪‌ ،‬چند ‌راه ‌جلوی ‌پای‌‬ ‫مواجه ‌م ‌‬
‫راهها ‌این ‌است ‌که‌‬‫شماست‪‌ .‬یکی ‌از ‌ ‌‬
‫هنگامی ‌که ‌به ‌یک ‌فرمول ‌ریاضی ‌رسیدید ‌به ‌آن ‌نگاه‌‬
‫یشوند ‌و ‌می‌گویند‪‌ :‬این‌‬ ‫کنید ‌– ‌ ‌‬
‫نورونهای ‌مغز ‌فعال ‌م ‌‬
‫یک ‌فرمول ‌ریاضی ‌است ‌– ‌و ‌سریعاً ‌از ‌روی ‌آن ‌رد ‌شوید ‌تا ‌به ‌متنِ ‌بعدی ‌برسید‪‌.‬باید ‌قبول‌‬
‫پرشکنندگان ‌بودم ‌(و ‌منِ ‌مترجم ‌هم!)‪‌.‬ولی ‌راهِ ‌دیگر ‌این‌‬‫کنم ‌که ‌من ‌هم ‌زمانی ‌یکی ‌از ‌ ‌‬
‫آنرا‌کالبدشکافی‌و‌واکاوی‌کنید‪‌.‬در‌بسیاری‌از‌‬ ‫است‌که‌فرمول‌را‌نگاه‌کنید‪‌،‬مکث‌کنید‪‌،‬و‌ ‌‬
‫موارد‪‌،‬فرمول‌را‌خیلی‌قابل‌درك‌خواهید‌یافت‪‌ .‬‬
‫اجازه ‌بدهید ‌همین ‌االن ‌این‌یکی ‌را ‌کالبدشکافی ‌کنیم‪‌.‬در ‌همان ‌فرمول ‌باال ‌هنگامی ‌که ‌‪‌r‬‬
‫یشود‪‌ :‬‬ ‫فاصلهی‌منهتن‌م ‌‬
‫برابر‌‪‌2‬باشد‪‌،‬فرمول‌تبدیل‌به‌ ‌‬
‫‌‬

‫∑‬
‫‌‬
‫در ‌موردِ ‌مثالِ ‌سیستمِ ‌موسیقی ‌و ‌امتیازها ‌که ‌در ‌این ‌فصل ‌از ‌آن ‌استفاده ‌می‌کنیم‪‌ x‌ ،‬و ‌‪‌y‬‬
‫آنهاست‪‌ n‌.‬تعداد ‌ ‌‬
‫گروههای‌‬ ‫ندهی ‌دو ‌شخص ‌هستند ‌و ‌)‪‌ d(x, y‬بیان‌گر ‌ ‌‬
‫فاصلهی ‌میان ‌ ‌‬ ‫نمای ‌‬
‫دادهاند‪‌.‬محاسبات ‌را‌‬
‫یای ‌است ‌که ‌این ‌دو ‌شخص ‌به ‌صورت ‌مشترك ‌به ‌آن‌ها ‌امتیاز ‌ ‌‬ ‫موسیق ‌‬
‫در‌چند‌پاراگراف‌باالتر‌انجام‌دادیم‪‌ :‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌31‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫در ‌ستون ‌اختالف ‌(‪‌)Difference‬میزان ‌قدر ‌مطلق ‌اختالف ‌(تفریق)‌بین ‌امتیازات‪‌ ،‬مشخص‌‬
‫آنها‌را‌محاسبه‌کردیم‌که‌لدد‌‪‌6‬به‌دست‌آمد‪‌ .‬‬ ‫شده‌است‌و‌در‌آخر‌جمعِ‌ ‌‬
‫هنگامی‌که‌‪‌r‬برابر‌‪‌1‬باشد‪‌،‬به‌ ‌‬
‫فاصلهی‌اقلیدسی‌می‌رسیم‪‌ :‬‬
‫‌‬

‫∑√‬

‫‌‬
‫قالدهی‌کلی‌در‌مورد‌فرمولِ‌مینکوفسکی‌به‌این‌صورت‌است‪‌ :‬‬ ‫‌‬
‫هر‌چه‌‪‌ ‌r‬‬
‫بزرگتر‌باشد‪‌،‬اختالفِ‌(حاصل‌تفریقِ)‌بیشتر‌در‌یک‌بُعد‪‌،‬تاثیر‌بیشتری‌بر‌نتیجه‌ی‌‬
‫نهایی‌دارد‪‌ .‬‬
‫‌‌‬
‫یهگر‌■ ‪33‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫‌‬
‫‌‬

‫دادهها‌در‌زبان‌پایتون ‌‬
‫نمایش‌ ‌‬
‫گروههای ‌موسیقی ‌و ‌امتیاز ‌کاربران ‌به‌‬
‫دادههای ‌جدول ‌باال ‌( ‌‬
‫روشهای ‌مختلفی ‌برای ‌نمایش ‌ ‌‬ ‫‌‬
‫یها‌در‌پایتون‌استفاده‌کنم‌(دیکشنری‌‬ ‫یخوام‌از‌دیکشنر ‌‬ ‫آنها)‌در‌پایتون‌وجود‌دارد‪‌.‬من‌م ‌‬ ‫‌‬
‫یها‪‌ ،‬به ‌اسم ‌آرای‌ههای ‌انجمنی ‌یا‌‬
‫یکی ‌از ‌انواع ‌متغیرها ‌در ‌پایتون ‌هستند)‪‌ .‬این ‌دیکشنر ‌‬
‫یشوند‪‌ .‬‬‫درهمساز‌(‪‌)hash table‬نیز‌شناخته‌م ‌‬
‫جدولِ‌ ‌‬
‫‌‬
‫یادآوری ‌‬
‫تمامی‌کدها‌در‌سایت‌‪‌guidetodatamining.com‬و‌همچنین‌سایت‌‪‌chistio.ir‬موجود‌‬
‫است‪‌ .‬‬
‫‌‌‬
‫{ = ‪users‬‬
‫{ ‪'Angelica':‬‬
‫‪'Blues Traveler': 3.5,‬‬
‫‪'Broken Bells': 2.0,‬‬
‫‪'Norah Jones': 4.5,‬‬
‫‪'Phoenix': 5.0,‬‬
‫‪'Slightly Stoopid': 1.5,‬‬
‫‪'The Strokes': 2.5,‬‬
‫‪'Vampire Weekend': 2.0,‬‬
‫‪},‬‬
‫{ ‪'Bill':‬‬
‫‪'Blues Traveler': 2.0,‬‬
‫برنامهنویسان‬ ‌ ■‌34
‌ ‌‫دادهکاوی‌برای‬

'Broken Bells': 3.5,


'Deadmau5': 4.0,
'Phoenix': 2.0,
'Slightly Stoopid': 3.5,
'Vampire Weekend': 3.0,
},
'Chan': {
'Blues Traveler': 5.0,
'Broken Bells': 1.0,
'Deadmau5': 1.0,
'Norah Jones': 3.0,
'Phoenix': 5,
'Slightly Stoopid': 1.0,
},
'Dan': {
'Blues Traveler': 3.0,
'Broken Bells': 4.0,
'Deadmau5': 4.5,
'Phoenix': 3.0,
'Slightly Stoopid': 4.5,
'The Strokes': 4.0,
'Vampire Weekend': 2.0,
},
'Hailey': {
'Broken Bells': 4.0,
'Deadmau5': 1.0,
'Norah Jones': 4.0,
'The Strokes': 4.0,
'Vampire Weekend': 1.0,
},
'Jordyn': {
'Broken Bells': 4.5,
'Deadmau5': 4.0,
'Norah Jones': 5.0,
'Phoenix': 5.0,
'Slightly Stoopid': 4.5,
'The Strokes': 4.0,
'Vampire Weekend': 4.0,
},
'Sam': {
'Blues Traveler': 5.0,
'Broken Bells': 2.0,
'Norah Jones': 3.0,
'Phoenix': 5.0,
'Slightly Stoopid': 4.0,
'The Strokes': 5.0,
35 ■‌‫یهگر‬
‌ ‫یستمهای‌توص‬
‌ ‫‌س‬.1‌‫‌فصل‬

},
'Veronica': {
'Blues Traveler': 3.0,
'Norah Jones': 5.0,
'Phoenix': 4.0,
'Slightly Stoopid': 2.5,
'The Strokes': 3.0,
},
}

‌ :‫گروههای‌موسیقی‌را‌به‌صورت‌زیر‌به‌دست‌بیاوریم‬
‌ ‌‫یتوانیم‌امتیازاتِ‌یک‌شخص‌به‬
‌‫م‬
‌‌

‌ ‫فاصلهی‌منهتن‬
‌ ‌‫محاسبهی‬
‌ ‌‫کد‌پایتون‌برای‬
‌ :‫فاصلهی‌منهتن‌را‌محاسبه‌کند‬
‌ ‌‫میخواهم‌تابعی‌مانند‌تابعِ‌زیر‌بنویسم‌تا‬


def manhattan(rating1, rating2):
"""Computes the Manhattan distance. Both rating1 and
rating2 are
dictionaries of the form
{'The Strokes': 3.0, 'Slightly Stoopid': 2.5 ..."""

distance = 0
for key in rating1:
if key in rating2:
distance += abs(rating1[key] - rating2[key])
return distance

‌ :‫یتوانید‌به‌این‌صورت‌لمل‌کنید‬
‌ ‫برای‌تستِ‌این‌تابع‌م‬
‌‌
‫برنامهنویسان‬ ‫‪‌ ■‌39‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫کترین ‌فرد ‌را ‌به ‌یک ‌فردِ ‌دیگر ‌(با ‌توجه ‌به‌‬
‫یرویم ‌که ‌بتواند ‌نزدی ‌‬
‫حاال ‌به ‌سراغ ‌تابعی ‌م ‌‬
‫گروههای ‌موسیقی) ‌پیدا ‌کند‪‌ .‬البته ‌در ‌واقع ‌این ‌تابع ‌یک ‌لیستِ‌‬ ‫امتیازات ‌داده ‌شده ‌به ‌ ‌‬
‫کترین‌فرد‌به‌فردِ‌مورد‌نظر‌است‪‌ :‬‬ ‫خانهی‌آن‪‌،‬نزدی ‌‬
‫یگرداند‌که‌اولین‌ ‌‬ ‫مرتبشده‌را‌برم ‌‬
‫‌‬
‫‌‬
‫‪def computeNearestNeighbor(username, users):‬‬
‫‪"""creates a sorted list of users based on their dis‬‬
‫‪tance to‬‬
‫"""‪username‬‬

‫][ = ‪distances‬‬
‫‪for user in users:‬‬
‫‪if user != username:‬‬
‫‪distance = manhattan(users[user], users[user‬‬
‫)]‪name‬‬
‫))‪distances.append((distance, user‬‬

‫‪# sort based on distance -- closest first‬‬

‫)(‪distances.sort‬‬
‫‪return distances‬‬
‫‌‬
‫و‌یک‌تست‌از‌این‌تابع‪‌ :‬‬
‫‌‌‬

‫‌‬
‫در ‌آخر‪‌ ،‬تمامیِ ‌کدها ‌را ‌کنار ‌هم ‌قرار ‌می‌دهیم ‌تا ‌پیشنهادها ‌را ‌آماده ‌کنیم‪‌ .‬بیایید ‌یک‌‬
‫کترین‌همسایه‌را‌به‌او‌پیدا‌کنم‌–‌که‌در‌این‌‬ ‫یخواهم‌نزدی ‌‬ ‫پیشنهاد‌برای‌‪‌Hailey‬بسازیم‪‌.‬م ‌‬
‫گروههایی‌خواهم‌گشت‌که‌‪‌Veronica‬به‌ ‌‬
‫آنها‌‬ ‫یشود‪‌.‬بعد‌از‌آن‌به‌دنبال‌ ‌‬ ‫مورد‌‪‌Veronica‬م ‌‬
‫یکنم ‌که ‌‪‌ ‌ ،Haily‬‬
‫گروههای ‌موسیقی ‌را‌‬ ‫امتیاز ‌داده ‌است ‌ولی ‌‪‌ Haily‬خیر‪‌.‬همچنین‪‌ ،‬فرض ‌م ‌‬
‫میدهد‪‌.‬برای‌مثال‪‌Hailey‌،‬به‌گروه‌موسیقیِ‌‬ ‫مانند‌‪(‌‌Veronica‬یا‌خیلی‌شبیه‌به‌او)‌امتیاز‌ ‌‬
‫دادهاست‪‌.‬پس ‌فرض‌‬ ‫‪‌ Phoenix‬امتیازی ‌نداده ‌است ‌ولی ‌‪‌ Veronica‬به ‌این ‌گروه ‌امتیاز ‌‪‌ ‌ 4‬‬
‫یکنیم‌که‌‪‌Hailey‬هم‌احتماالً‌این‌گروه‌موسیقی‌را‌مانند‌‪‌Veronica‬دوست‌دارد‪‌ .‬‬ ‫م‌‬
37 ■‌‫یهگر‬
‌ ‫یستمهای‌توص‬
‌ ‫‌س‬.1‌‫‌فصل‬

‌ :‫در‌زیر‌تابعی‌که‌برای‌این‌پیشنهاد‌نوشتم‌را‌مشاهده‌می‌کنید‬

def recommend(username, users):
"""Give list of recommendations"""

# first find nearest neighbor

nearest = computeNearestNeighbor(username, users)[0]


[1]
recommendations = []

# now find bands neighbor rated that user didn't

neighborRatings = users[nearest]
userRatings = users[username]
for artist in neighborRatings:
if not artist in userRatings:
recommendations.append((artist, neighborRati
ngs[artist]))

# using the fn sorted for variety - sort is more eff


icient

return sorted(recommendations, key=lambda artistTupl


e: \
artistTuple[1], reverse=True)

‌ ‫‌م‬Hailey‌‫و‌حاال‌برای‌ایجادِ‌یک‌یا‌چند‌پیشنهاد‌به‬
‌ :‫یتوانید‌مانند‌شکل‌زیر‌لمل‌کنید‬
‌‌


‌‫کترین‬‌ ‫ ‌نزدی‬،‫یکنیم‬ ‌ ‫همانطور ‌که ‌در ‌شکلِ‌باال ‌مشاهده ‌م‬
‌ ‌.‫که ‌نتیجه ‌مطابق ‌انتظار ‌ما ‌بود‬
‌‫ ‌داده‬4‌ ‫ ‌امتیاز‬Phoenix‌ ‫ ‌به ‌گروه ‌موسیقی‬Veronica‌ ‫ ‌است ‌و‬Veronica‌ ،Haily‌ ‫همسایه ‌به‬
‌ :‫‌اجازه‌بدهید‌چند‌مورد‌دیگر‌را‌امتحان‌کنیم‬.‫است‬
‌‌
‫برنامهنویسان‬ ‫‪‌ ■‌31‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬
‫یکنیم ‌که ‌‪‌ Chan‬گروه ‌موسیقیِ ‌‪‌ Strokes‬را ‌دوست ‌خواهد ‌داشت‪‌ .‬همچنین‌‬‫پس ‌فکر ‌م ‌‬
‫یکنیم‌که‌‪‌،Sam‬گروه‌موسیقی‌‪‌Deadmau5‬را‌دوست‌نخواهد‌داشت‪‌ .‬‬ ‫شبینی‌م ‌‬‫پی ‌‬
‫‌‌‬

‫‌‬
‫خب!‌برای ‌‪‌ Angelica‬نتیجه ‌خالی ‌بود‪‌.‬در ‌واقع ‌چیزی ‌برای ‌پیشنهاد ‌به ‌او ‌نداشتیم‪‌.‬اجازه‌‬
‫بدهید‌ببینیم‌مشکل‌از‌کجاست‪‌ :‬‬
‫‌‌‬

‫‌‬
‫کترین ‌همسایه ‌به ‌‪‌ Veronica‌ ،Angelica‬است‪‌.‬هنگامی ‌که ‌به ‌امتیازاتِ ‌این ‌دو ‌نگاه‌‬
‫نزدی ‌‬
‫یکنیم‌–‌شکل‌زیر‪‌ :‬‬ ‫م‌‬
‫‌‌‬

‫‌‬
‫‌‬
‫یهگر‌■ ‪36‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫یای ‌امتیاز ‌داده ‌است ‌که‌‬ ‫یکنیم ‌که ‌‪‌ Angelica‬به ‌تمامیِ ‌ ‌‬
‫گروههای ‌موسیق ‌‬ ‫مشاهده ‌م ‌‬
‫‪‌ Veronica‬هم ‌امتیاز ‌داده‪‌.‬در ‌واقع ‌ما ‌امتیازِ ‌جدیدی ‌در ‌این ‌بین ‌نداشتیم‪‌ ،‬پس ‌پیشنهادی‌‬
‫نههای‌ما‌نبود‪‌ .‬‬
‫هم‌برای‌او‌در‌میان‌گزی ‌‬
‫یتوان ‌سیستم ‌را ‌تقویت ‌کرد ‌تا ‌به ‌یک‌‬
‫قسمتهای ‌آینده‪‌ ،‬نشان ‌خواهیم ‌داد ‌چگونه ‌م ‌‬ ‫‌‬ ‫در ‌‬
‫همچین‌مشکالتی‌برنخورد‪‌ .‬‬
‫‌‌‬
‫‌تمرین‪‌ :‬‬
‫ادهسازی‌کنید‪‌ :‬‬
‫فاصلهی‌مینکوفسکی‌با‌زبان‌پایتون‌پی ‌‬ ‫‪‌-2‬تابعی‌برای‌ ‌‬
‫فاصلهی‌‬ ‫‪‌ -1‬تابع ‌‪‌ computeNearestNeighbor‬را ‌در ‌باال ‌تغییر ‌دهید ‌به ‌ ‌‬
‫گونهای ‌که ‌از ‌ ‌‬
‫مینکوفسکی‌استفاده‌کند‪‌ :‬‬
‫‌‬
‫تمرین‌–‌ ‌‬
‫راهحل‪‌ :‬‬
‫ادهسازی‌کنید‪‌ :‬‬
‫فاصلهی‌مینکوفسکی‌با‌زبان‌پایتون‌پی ‌‬ ‫‪‌-2‬تابعی‌برای‌ ‌‬
‫‌‬
‫‪def minkowski(rating1, rating2, r):‬‬
‫‪"""Computes the Minkowski distance.‬‬
‫‪Both rating1 and rating2 are dictionaries of the f‬‬
‫‪orm‬‬
‫"""}‪{'The Strokes': 3.0, 'Slightly Stoopid': 2.5‬‬

‫‪distance = 0‬‬
‫‪commonRatings = False‬‬
‫‪for key in rating1:‬‬
‫‪if key in rating2:‬‬
‫‪distance += pow(abs(rating1[key] - rating2‬‬
‫)‪[key]), r‬‬
‫‪commonRatings = True‬‬
‫‪if commonRatings:‬‬
‫)‪return pow(distance, 1 / r‬‬
‫‪else:‬‬
‫‪return 0 # Indicates no ratings in common‬‬

‫فاصلهی‌‬ ‫‪‌ -1‬تابع ‌‪‌ computeNearestNeighbor‬را ‌در ‌باال ‌تغییر ‌دهید ‌به ‌ ‌‬
‫گونهای ‌که ‌از ‌ ‌‬
‫مینکوفسکی‌استفاده‌کند‪‌ :‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌41‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫)‪distance = minkowski(users[user], users[username], 2‬‬
‫‌‬
‫فاصلهی‌اقلیدسی‌هستیم‪‌ .‬‬
‫ناست‌که‌به‌دنبال‌ ‌‬
‫لددِ‌‪‌1‬در‌ورودیِ‌تابع‌باال‪‌،‬به‌معنای‌ای ‌‬
‫‌‬
‫‌‬

‫یک‌شرمساری‌برای‌کاربران ‌‬
‫یکنیم ‌که ‌کاربران‪‌،‬‬
‫قتر ‌به ‌امتیازاتِ ‌کاربران ‌نگاه ‌کنیم‪‌ .‬مشاهده ‌م ‌‬
‫اجازه ‌بدهید ‌کمی ‌دقی ‌‬
‫دادهی‌ما‌دارند‪‌ :‬‬
‫گروههای‌موسیقی‌در‌پایگاه‌ ‌‬‫رفتارهای‌بسیار‌متفاوتی‌برای‌امتیاز‌دادن‌به‌ ‌‬
‫‌‬

‫‌‬
‫یهگر‌■ ‪42‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫‌‬
‫خب ‌پس ‌چگونه ‌ما ‌‪‌ Hailey‬را ‌با ‌‪‌ Jordan‬مقایسه ‌کنیم؟ ‌آیا ‌اگر ‌‪‌ Hailey‬به ‌یک ‌گروه‌‬
‫موسیقی‌امتیاز‌‪‌4‬داده‌باشد‪‌،‬مانند‌این‌است‌که‌‪‌Jordyn‬به‌آن‌گروه‌امتیاز‌‪‌4‬داده‌است؟‌یا‌‬
‫خیر‪‌،‬مانند‌این‌است‌که‌‪‌Jordyn‬به‌آن‌گروه‌امتیاز‌‪‌5‬داده‌است؟‌به‌نظر‌من‪‌،‬اگر‌‪‌Hailey‬به‌‬
‫گروهی ‌امتیاز ‌‪‌ 4‬داده ‌باشد ‌مانند ‌این ‌است ‌که ‌‪‌ Jordyn‬به ‌آن ‌گروه ‌امتیاز ‌‪‌ 5‬داده ‌است ‌(در‌‬
‫واقع‌امتیاز‌‪‌4‬برای ‌‪‌Hailey‬به‌نولی‌معادلِ‌امتیاز‌‪‌5‬برای ‌‪‌Jordyn‬است)‪‌.‬این‌تنوع‌م ‌‬
‫یتواند‌‬
‫توصیهگر‌شود‪‌ .‬‬
‫‌‬ ‫منجر‌به‌ایجاد‌مشکالتی‌در‌یک‌سیستمِ‌‬
‫‌‬

‫‌‬
‫‌‬

‫ضریب‌همبستگی‌پیرسون‌(‪‌ )Pearson Correlation Coefficient‬‬


‫راههای ‌غلبه ‌بر ‌این ‌مشکل ‌(تنوع ‌در ‌امتیازدهی)‪‌ ،‬استفاده ‌از ‌ضریب ‌همبستگیِ‌‬
‫یکی ‌از ‌ ‌‬
‫دادههای ‌زیر ‌را ‌در ‌نظر‌‬
‫دهی ‌کلی ‌را ‌مطرح ‌کنیم‪‌ ‌ .‬‬
‫پیرسون ‌است‪‌ .‬اجازه ‌بدهید ‌اول ‌یک ‌ای ‌‬
‫دادههای‌قبلی‌متفاوت‌هستند)‌(در‌شکل‌زیر‌سطرها‪‌،‬اشخاص‌هستند‌‬ ‫دادهها‌با‌ ‌‬
‫بگیرید‌(این‌ ‌‬
‫گروهها‌یا‌هنرمندان‌موسیقی)‪‌ :‬‬
‫ها‌بیانگر‌ ‌‬
‫‌‬ ‫‌‬
‫و‌ستون‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌41‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫دادهکاوی‌است‪‌.‬در‌جدول‌باال‪‌،‬‬ ‫این‌مثالی‌از‌«تورم‌درجه‌–‌‌‪‌»grade inflation‬در‌ ‌‬
‫حوزهی‌ ‌‬
‫کمترین ‌امتیازِ ‌‪‌ 4‌ ،Clara‬است ‌– ‌در ‌واقع ‌تمامی ‌امتیازاتی ‌که ‌او ‌به ‌ ‌‬
‫گروههای ‌موسیقی‌‬
‫بودهاند‪‌.‬اگر ‌جدول ‌باال ‌را ‌بر ‌روی ‌یک ‌گراف ‌رسم ‌کنیم‪‌ ،‬چیزی ‌مانند‌‬
‫دادهاست‪‌ ،‬بین ‌‪‌ 4‬و ‌‪‌ ‌ 5‬‬
‫‌‬
‫یشود‪‌ :‬‬ ‫شکل‌زیر‌م ‌‬
‫‌‌‬

‫‌‬
‫‌‬
‫خط‌مستقیم‌=‌تفاهم‌کامل!!! ‌‬
‫دهندهی ‌تفاهمِ‌‬
‫‌‬ ‫واقعیت ‌این ‌است ‌که ‌خط ‌مستقیمی ‌که ‌در ‌گراف ‌باال ‌رسم ‌شده ‌است‪‌ ،‬نشان‌‬
‫آنها‪‌ ،‬گروه ‌موسیقیِ ‌‪‌ Phoenix‬را ‌به ‌لنوانِ‌‬ ‫کامل ‌بین ‌‪‌ Clara‬و ‌‪‌ Robert‬است‪‌ .‬هر ‌دوی ‌ ‌‬
‫کردهاند‪‌،‬بعد‌از‌آن‌گروه‌‪‌Blues Traveler‬و‌بعد‌‪‌Norah Jones‬‬ ‫بهترین‌امتیازِ‌خود‌محاسبه‌ ‌‬
‫گروههای ‌موسیقی‌‬ ‫و ‌الی ‌آخر‪‌.‬هر ‌چقدر ‌که ‌‪‌ Clara‬و ‌‪‌ Robert‬کمتر ‌با ‌هم ‌در ‌امتیازدهی ‌به ‌ ‌‬
‫یگیرند‪‌ ‌.‬‬‫دادهها‌در‌گراف‌باال‪‌،‬کمتر‌در‌یک‌خط‌راست‌قرار‌م ‌‬ ‫تفاهم‌داشته‌باشند‪‌ ‌،‬‬
‫یهگر‌■ ‪43‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫یدهد‪‌ :‬‬
‫برای‌مثال‪‌،‬شکل‌زیر‌یک‌تفاهم‌تقریبی‌را‌بین‌دو‌کاربر‌نشان‌م ‌‬
‫‌‌‬

‫‌‬
‫‌‬
‫یدهد‪‌ :‬‬
‫و‌شکل‌زیر‌تفاهمِ‌کمتر‌از‌شکل‌های‌قبلی‌را‌نمایش‌م ‌‬
‫‌‌‬

‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌44‬‬
‫دادهکاوی‌برای‌ ‌‬

‫پس ‌اگر ‌بخواهیم ‌بر ‌اساس ‌نمودارها ‌صحبت ‌کنیم‪‌ ،‬تفاهمِ ‌کامل ‌با ‌یک ‌خط ‌مستقیم ‌نشان‌‬
‫محاسبهی ‌همبستگی ‌بین ‌دو ‌متغیر‌‬‫‌‬ ‫یشود‪‌.‬ضریب ‌همبستگی ‌پیرسون‪‌ ،‬معیاری ‌برای ‌‬ ‫داده ‌م ‌‬
‫است ‌(در ‌مثال ‌ما‪‌ ،‬همبستگی ‌بین ‌‪‌ Angelica‬و ‌‪‌.)Bill‬ضریب ‌همبستگیِ ‌پیرسون ‌لددی ‌در‌‬
‫یشود)‌است‪‌.‬لددِ‌‪‌2‬به‌معنای‌تفاهم‌و‌همبستگی‌‬ ‫بازهی‌‪‌-2‬تا‌‪(‌2‬شامل‌خود‌‪‌-2‬و‌‪‌2‬هم‌م ‌‬ ‫‌‬
‫نکه ‌یک ‌درك ‌کلی ‌از‌‬ ‫کامل ‌بین ‌دو ‌متغیر ‌است ‌و ‌‪‌ -2‬به ‌معنای ‌لدم ‌تفاهم ‌کامل‪‌.‬برای ‌ای ‌‬
‫ماجرا ‌داشته ‌باشید‪‌ ،‬در ‌نمودارهای ‌باال‪‌ ،‬نمودار ‌اولی ‌که ‌یک ‌خط ‌مستقیم ‌داشت‪‌ ،‬ضریب‌‬
‫همبستگی‌پیرسون‌در‌آن‌برابر‌‪‌2‬بود‪‌.‬نمودار‌بعدی‌(دومی)‌دارای‌ضریب‌هبستگیِ‌پیرسون‌‬
‫برابر ‌‪‌ 1.62‬بود ‌و ‌آخری ‌(سومی)‌هم ‌ضریب ‌همبستگی ‌پیرسون ‌‪‌ 1.12‬را ‌داشت‪‌.‬بنابراین ‌از‌‬
‫یتوانیم‌برای‌پیدا‌کردنِ‌افرادی‌که‌به‌فرد‌مورد‌نظر‌ما‌شبی‌هتر‌هستند‪‌،‬استفاده‌‬ ‫این‌معیار‌م ‌‬
‫کنیم‪‌ .‬‬
‫فرمول‌اصلی‌برای‌ضریب‌همبستگی‌پیرسون‌به‌صورت‌زیر‌است‪‌ :‬‬
‫‌‬
‫∑‬ ‫̅‬ ‫̅‬
‫∑√‬ ‫̅‬ ‫∑√‬ ‫̅‬
‫‌‬
‫‌دوباره‌ریاضیات! ‌‬
‫یک ‌التراف ‌شخصی‪‌.‬من ‌مدركِ ‌کارشناسیِ ‌هنرهای‌‬
‫زیبا ‌در ‌رشته ‌موسیقی ‌دارم‪‌ .‬هنگامی ‌که ‌دروسی‌‬
‫یداشتم‌حتی‌یک‌‬ ‫درباره‌رقص‌باله‪‌،‬رقص‌مدرن‌و‌طراحی‌لباس‌بر‌م ‌‬
‫درس‌ریاضی‌هم‌به‌لنوان‌یک‌دانشجو‌نداشتم‪‌.‬قبل‌از‌آن‪‌،‬وارد‌یک‌‬
‫لولهکشی ‌و‌‬
‫حوزهی ‌ ‌‬
‫پسرانهی ‌تجارت ‌شدم ‌و ‌دروسی ‌در ‌ ‌‬ ‫‌‬ ‫دبیرستان ‌‬
‫تعمیر ‌خودرو ‌را ‌برداشتم‪‌ ،‬ولی ‌بازهم ‌هیچ ‌درسی ‌در ‌مورد ‌ریاضیات‌‬
‫شزمینه ‌و ‌یا ‌به ‌للت ‌ساختار‌‬ ‫(البته ‌به ‌جز ‌دروس ‌پایه) ‌برنداشتم‪‌ .‬پس ‌یا ‌به ‌للت ‌این ‌پی ‌‬
‫یخواندم‪‌،‬تمایل‌‬ ‫فرمولهایی‌شبیه‌به‌فرمول‌باال‌را‌م ‌‬
‫‌‬ ‫داخلیِ‌ذهنی‪‌،‬هنگامی‌که‌کتابی‌شامل‌‬
‫فرمولها ‌پرش ‌کنم ‌و ‌به ‌جمالت ‌پایین ‌آن‌ها ‌برسم‪‌.‬اگر ‌شما ‌هم ‌شبیه ‌به‌‬
‫‌‬ ‫داشتم ‌که ‌از ‌روی ‌‬
‫من ‌هستید ‌باید ‌اصرار ‌کنم ‌که ‌با ‌این ‌حالت ‌در ‌خود ‌مبارزه ‌کنید ‌و ‌به ‌فرمول ‌نگاه ‌کنید ‌و‌‬
‫یهگر‌■ ‪45‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫یرسند‪‌،‬در‌‬ ‫فرمولهایی‌که‌با‌یک‌نگاه‌جزئی‪‌،‬بسیار‌پیچیده‌به‌نظر‌م ‌‬
‫‌‬ ‫پرش‌نکنید‪‌.‬بسیاری‌از‌‬
‫واقع‌کامالً‌قابل‌درك‌و‌فهم‌هستند‪‌ .‬‬
‫یخواهد‌فرمولِ‌‬ ‫جدای‌از‌پیچدگی‌ظاهری‪‌،‬مشکل ‌فرمول‌باال‪‌،‬این‌است ‌که‌الگوریتمی‌که‌م ‌‬
‫دادهها ‌رد ‌شود ‌(اصطالحاً ‌به ‌این‌‬
‫ادهسازی ‌کند‪‌ ،‬نیاز ‌دارد ‌تا ‌چند ‌بار ‌از ‌روی ‌ ‌‬
‫باال ‌را ‌پی ‌‬
‫یگویند)‪‌ .‬خوشبختانه ‌برای ‌ما ‌آدم‌های ‌الگوریتمی‪‌ ،‬یک ‌فرمولِ‌‬ ‫مها ‌‪‌ multi pass‬م ‌‬ ‫الگورتی ‌‬
‫جایگزین‌وجود‌دارد‌که‌تقریبی‌از‌همان‌پیرسون‌است‪‌ :‬‬
‫‌‬
‫∑‬ ‫∑‬
‫∑‬

‫∑√‬ ‫∑‬ ‫∑√‬ ‫∑‬

‫‌‬
‫نکه ‌در ‌ابتدا ‌بسیار‌‬
‫فرمولها ‌پرش ‌کنید!)‌این ‌فرمول‪‌ ،‬لالوه ‌بر ‌ای ‌‬
‫‌‬ ‫(یادتان ‌باشد ‌که ‌نباید ‌از ‌‬
‫پیچیده ‌به ‌نظر ‌می‌رسد‪‌ ،‬مهمتر ‌از ‌آن‪‌،‬از‌لحاظِ‌لددی ‌غیرپایدار ‌(‪‌ )unstable‬است‪‌ ،‬به ‌این‌‬
‫معنی ‌که ‌اگر ‌چیزی ‌بالثِ ‌خطا ‌شود‪‌ ،‬در ‌این ‌اصالحِ ‌فرمول‪‌ ،‬تشدید ‌خواهد ‌شد‪‌.‬ولی ‌مزیت‌‬
‫دادهها‌(به‌‬
‫آنرا‌با‌یک‌بار‌رد‌شدن‌از‌روی‌ ‌‬ ‫یتوانیم‌ ‌‬‫بزرگی‌که‌این‌فرمول‌دارد‌این‌است‌که‌م ‌‬
‫ادهسازی ‌کنیم‪‌.‬ولی ‌اول ‌اجازه ‌دهید ‌این ‌فرمول ‌را ‌کالبدشکافی‌‬ ‫اصطالح ‌‪‌ )single pass‬پی ‌‬
‫کرده‌و‌با‌مثالی‌که‌چند‌پاراگراف‌باالتر‌گفته‌بودیم‪‌،‬تشریح‌کنیم‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫برای‌شروع‪‌،‬اجازه‌دهید‌فرمول‌زیر‌را‌محاسبه‌کنیم‪‌ :‬‬

‫∑‬
‫برنامهنویسان‬ ‫‪‌ ■‌49‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یشد‪‌.‬در ‌این‌جا ‌برای ‌مثال ‌‪‌ x‬و ‌‪‌ y‬به ‌ترتیب‌‬


‫این ‌فرمول‪‌ ،‬در ‌صورتِ ‌کسرِ ‌فرمول ‌اول ‌دیده ‌م ‌‬
‫نمایان‌گر‌‪‌Clara‬و‌‪‌Robert‬هستند‪‌ .‬‬
‫‌‌‬

‫‌‬
‫‌‬
‫دادهشده ‌توسط ‌ ‌‪‌ Clara‬و ‌‪‌ Robert‬را ‌به‌‬
‫گروههای ‌موسیقی‪‌ ،‬امتیازات ‌ ‌‬
‫برای ‌هر ‌کدام ‌از ‌ ‌‬
‫ضربها ‌را ‌با ‌هم ‌جمع ‌می‌کنیم‪‌.‬‬
‫صورت ‌نظیر ‌به ‌نظیر ‌با ‌هم ‌ضرب ‌می‌کنیم ‌و ‌حاصلِ ‌این ‌ ‌‬
‫چیزی‌مانند‌شکل‌زیر‪‌ :‬‬
‫‌‬

‫‪19 13.5 25 8.5 4 70‬‬


‫‌‬
‫فرمولها‌در‌صورت‌کسر‌را‌محاسبه‌کنیم‪‌ :‬‬
‫‌‬ ‫خوب‌شد‪‌.‬حاال‌اجازه‌دهید‌بقی‌هی‌‬

‫∑‬ ‫∑‬

‫در‌این‌فرمول‪‌،‬لبارت ‌‬

‫∑‬

‫یشود‪‌.‬‬‫دادهاست‪‌ ،‬که ‌برابر ‌‪‌ 11.5‬م ‌‬ ‫جمع ‌امتیازاتی ‌است ‌که ‌‪‌ Clara‬به ‌ ‌‬
‫گروههای ‌موسیقی ‌ ‌‬
‫جمع ‌امتیازات ‌‪‌ Robert‬نیز ‌‪‌ 25‬شده ‌است ‌و ‌ ‌‬
‫آنها ‌هر ‌کدام ‌به ‌‪‌ 5‬گروهِ ‌موسیقی‪‌ ،‬امتیاز‌‬
‫دادهاند‪‌ .‬‬
‫‌‬
‫یهگر‌■ ‪47‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫یشود‪:‬‬
‫پس‌صورت‌کسر‌به‌صورت‌زیر‌محاسبه‌م ‌‬
‫‌‬
‫‌‬

‫خب!‌حاال‌اجازه‌دهید‌مخرج‌کسر‌را‌محاسبه‌کنیم‪‌ :‬‬

‫∑‬
‫∑√‬

‫اول‪‌،‬مانندِ‌زیر‌محاسبات‌را‌انجام‌می‌دهیم‪‌ :‬‬
‫‌‬

‫‌‬
‫دادهشده‌توسط ‌‪‌Clara‬را‌با‌هم‌جمع‌کردیم‌که‌‪‌11.5‬شد‪‌.‬مجذور‌آن‌برابر‌‬ ‫االن‌ما‌امتیازاتِ‌ ‌‬
‫آنها‌‬
‫گروههایی ‌که ‌هر ‌دوی ‌این ‌اشخاص ‌به ‌ ‌‬
‫آنرا ‌تقسیم ‌بر ‌تعداد ‌ ‌‬
‫‪‌ 519.15‬می ‌شود‪‌.‬حاال ‌ ‌‬
‫یشود‪‌ .‬‬ ‫دادهاند‌(که‌‪‌5‬گروه‌بودند)‌می‌کنیم‌و‌نتیجه‌برابر‌‪‌212.15‬م ‌‬
‫امتیاز‌ ‌‬
‫یکنیم‪‌ :‬‬
‫نها‌را‌با‌توجه‌به‌فرمول‌قبلی‌محاسبه‌م ‌‬ ‫همهی‌ای ‌‬
‫حاال‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌41‬‬
‫دادهکاوی‌برای‌ ‌‬

‫√‬ ‫√‬

‫نکار‌را‌برای‌‪‌Robert‬نیز‌باید‌انجام‌دهیم‪‌ :‬‬
‫همی ‌‬

‫∑‬
‫∑√‬ ‫√‬

‫همهی‌الداد‌را‌در‌فرمول‌اصلی‌می‌گذاریم‪‌ :‬‬
‫حاال‌ ‌‬

‫یشود‌و‌این‌لددِ‌‪‌2‬به‌معنی‌این‌است‌که‌تفاهم‌کاملی‌بین‌‪‌Clara‬و‌‬
‫که‌نتیجه‌برابر‌‪‌2‬م ‌‬
‫‪‌Robert‬وجود‌دارد‪‌ .‬‬
‫‌‬
‫حاال‌کمی‌استراحت‌کنید‪‌،‬تا‌ادامه‌دهیم!! ‌‬
‫‌‌‬

‫‌‬
‫‌‌‬
‫یهگر‌■ ‪46‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫آخرین‌فرمول‌–‌شباهت‌کسینوسی‌(‪‌ )Cosine Similarity‬‬


‫حوزهی ‌پردازش ‌متن ‌معروف ‌است ‌را ‌معرفی ‌کنم‪‌.‬‬ ‫یخواهیم ‌آخرین ‌فرمول‪‌ ،‬که ‌بسیار ‌در ‌ ‌‬‫م‌‬
‫یشود ‌–‌‬‫این‌فرمول‌همچنین‌در ‌پایشِ ‌مشارکتی‌(‪‌)collaborative filtering‬نیز‌استفاده‌م ‌‬
‫نکه ‌ببینیم ‌چه ‌موقع ‌باید ‌از ‌این ‌فرمول‌‬
‫یگویند‪‌.‬برای ‌ای ‌‬
‫به ‌این ‌فرمول ‌شباهت ‌کسینوسی ‌م ‌‬
‫استفاده ‌کنیم‪‌ ،‬اجازه ‌دهید ‌مثالِ ‌قبلی ‌را ‌کمی ‌تغییر ‌دهیم‪‌ .‬ما ‌تعداد ‌دفعاتی ‌را ‌که ‌یک‌‬
‫یداریم ‌و ‌از ‌این ‌اطاللات ‌برای ‌سیستمِ‌‬ ‫شخص‪‌ ،‬موسیقیِ ‌خاصی ‌را ‌پخش ‌می‌کند ‌نگه ‌م ‌‬
‫یکنیم‪‌ .‬‬
‫پیشنهاده‌دهنده‌استفاده‌م ‌‬
‫‌‌‬

‫‌‬
‫‌‬
‫فرمولهای ‌گفته ‌شده ‌در ‌این‌‬
‫‌‬ ‫فقط ‌با ‌نگاهِ ‌چشمی ‌به‌جدولِ ‌باال ‌(و ‌با ‌استفاده ‌از ‌هر ‌کدام ‌از ‌‬
‫قهی ‌موسیقیایی ‌بیشتر ‌شبیهِ ‌‪‌ Ann‬است ‌تا‌‬ ‫یتوانیم ‌بفهمیم ‌که ‌‪‌ Sally‬در ‌موردِ ‌سلی ‌‬ ‫فصل)‌م ‌‬
‫‪‌ .Ben‬‬
‫خب‪‌،‬مشکل‌کجاست؟ ‌‬
‫قطعهی‌موسیقی‌در‌‪‌iTunes‬دارم‪‌.‬شکل‌زیر‪‌،‬تصویری‌از‌تعدادی‌از‌این‌‬ ‫من‌حدود‌چهارهزار‌ ‌‬
‫شدهاند‪‌ :‬‬
‫قطعات‌است‌که‌بر‌اساس‌میزانِ‌پخش‌مرتب‌ ‌‬
‫‌‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌51‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫بهترین ‌موسیقیِ ‌من‪‌ ،‬آهنگ ‌‪‌ Moonlight Sonata‬اثر ‌‪‌ Marcus Miller‬است ‌که ‌‪‌ 15‬مرتبه‌‬
‫شدهاست‪‌.‬این ‌احتمال ‌وجود ‌دارد ‌که ‌شما ‌این ‌آهنگ ‌را ‌اصالً ‌پخش ‌نکرده ‌باشید‪‌.‬در‌‬ ‫پخش ‌ ‌‬
‫لالقهی ‌من ‌را ‌اصالً‌‬
‫واقع‪‌ ،‬احتمالِ ‌زیادی ‌وجود ‌دارد ‌که ‌شما ‌هیچ ‌کدام ‌از‌آهنگ‌های ‌مورد ‌ ‌‬
‫قطعهی ‌موسیقی ‌در ‌‪‌iTunes‬‬ ‫نکه‪‌ ،‬بیش ‌از ‌‪‌ 25‬میلیون ‌ ‌‬ ‫لالوهی ‌ای ‌‬
‫گوش ‌نکرده ‌باشید‪‌ .‬به ‌ ‌‬
‫دادهها ‌برای ‌یک ‌فرد ‌در ‌این‌‬
‫آنها ‌را ‌دارم‪‌.‬بنابراین ‌ ‌‬ ‫موجود ‌است ‌و ‌من ‌فقط ‌چهارهزارتای ‌ ‌‬
‫سایت‪‌ ،‬تُنُک ‌(‪‌)sparse‬است ‌(یعنی ‌تعداد ‌کمی ‌از ‌آن ‌دارای ‌لدد ‌هستند ‌و ‌تعداد ‌زیادی ‌از‌‬
‫یهای ‌غیر‌‬ ‫دادهها ‌تعداد ‌نسبتاً ‌کمی ‌ویژگ ‌‬
‫آنها ‌صفر ‌هستند)‌و ‌به ‌این ‌دلیل ‌است ‌که ‌این ‌ ‌‬ ‫‌‬
‫قطعهی‌‬
‫نجا‪‌ ،‬تعداد ‌دفعات ‌پخش ‌ ‌‬ ‫یها ‌– ‌‪‌ -‌ attributes‬در ‌ای ‌‬ ‫صفر ‌دارند ‌(منظور ‌از ‌ویژگ ‌‬
‫موسیقی‌است)‪‌.‬هنگامی‌که‌ما‌دو‌شخص‌را‌با‌توجه‌به‌تعداد‌دفعات‌پخشِ‌قطعاتِ‌موسیقی‌‬
‫آنها ‌هیچ‌‬ ‫قطعهی ‌موسیقیِ ‌موجود ‌مقایسه ‌می‌کنیم‪‌ ،‬در ‌بیشتر ‌مواقع ‌ ‌‬ ‫در ‌میان ‌‪‌ 25‬میلیون ‌ ‌‬
‫نحال‪‌،‬‬ ‫آنها ‌صفرها ‌هستند‪‌ .‬باای ‌‬ ‫نقطهی ‌اشتراکی ‌ندارند ‌و ‌در ‌واقع ‌بیشترین ‌اشتراك ‌ ‌‬ ‫‌‬
‫یخواهیم‌این‌صفرها‌در‌محاسباتمان‌نقش‌داشته‌باشند‪‌ ‌.‬‬ ‫نم ‌‬
‫یتواند ‌هنگامی ‌باشد ‌که ‌بخواهیم ‌اسنادِ ‌متنی ‌(‪‌)documents‬را ‌با ‌استفاده ‌از‌‬ ‫مورد ‌مشابه ‌م ‌‬
‫کلمات‪‌ ،‬با ‌هم ‌مقایسه ‌کنیم‪‌.‬فرض ‌کنید‪‌ ،‬ما ‌یک ‌کتاب ‌خاص ‌را ‌دوست ‌داریم‪‌ ،‬مثالً ‌کتاب‌‬
‫یخواهیم ‌یک ‌کتابِ ‌مشابه ‌به ‌آن ‌پیدا ‌کنیم‪‌.‬‬ ‫«پیشگامان ‌فضا» ‌اثر ‌‪‌ ،Carey Rockwell‬و ‌م ‌‬
‫یها‪‌ ،‬کلماتِ‌‬ ‫نجا‪‌ ،‬ویژگ ‌‬
‫راهها ‌این ‌است ‌که ‌از ‌تعداد ‌تکرار ‌کلمات ‌استفاده ‌کنیم‪‌.‬در ‌ای ‌‬‫یکی ‌از ‌ ‌‬
‫آنها ‌در ‌کتاب ‌هستند‪‌ 9.23‌ .‬درصد ‌از‌‬ ‫یها‪‌ ،‬تعدادِ ‌تکرارِ ‌ ‌‬
‫یکتا ‌هستند ‌و ‌مقدارِ ‌این ‌ویژگ ‌‬
‫کلمات ‌در ‌کتابِ ‌«پیشگامان ‌فضا»‪‌ ،‬کلمه‌ی ‌«این ‌– ‌‪‌ »the‬هستند‪‌ 1.16‌ ،‬درصد ‌ ‌‬
‫کلمهی‌‬
‫یتوانم ‌شباهتِ ‌این ‌کتاب ‌را ‌به‌‬ ‫کلمهی ‌«‪‌ .»space‬من ‌م ‌‬ ‫«‪‌ »Tom‬هست ‌و ‌‪‌ 1.15‬درصد ‌ ‌‬
‫کتابها ‌با ‌استفاده ‌از ‌این ‌تعداد ‌تکرار ‌کلمات ‌محاسبه ‌کنم‪‌.‬ولی‪‌ ،‬مشکلِ ‌تُنُک ‌بودن‌‬ ‫بقی‌هی ‌ ‌‬
‫یهگر‌■ ‪52‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫کلمهی ‌یکتا ‌در ‌کتاب‌‬


‫یافتد‪‌ .‬تعداد ‌‪‌ ‌ 9916‬‬ ‫(‪‌ )sparseness‬در ‌ ‌‬
‫دادهها‪‌ ،‬این‌جا ‌هم ‌اتفاق ‌م ‌‬
‫کلمهی ‌یکتا ‌در ‌زبان ‌انگلیسی ‌موجود ‌است‪‌.‬‬
‫شاز ‌‪‌ 2‬میلیون ‌ ‌‬ ‫«پیشگامان ‌فضا» ‌وجود ‌دارد‪‌.‬بی ‌‬
‫یهای ‌ما ‌کلمات ‌انگلیسی ‌باشند‪‌ ،‬تقریباً ‌تعداد ‌کمی ‌ویژگیِ ‌غیر ‌صفر ‌در ‌کتاب‌‬‫پس ‌اگر ‌ویژگ ‌‬
‫یکنم‌که‌هر‌معیار‌شباهتی‪‌،‬‬ ‫«پیشگامان‌فضا»‌یا‌هر‌کتاب‌دیگری‌وجود‌دارد‪‌.‬دوباره‌تکرار‌م ‌‬
‫بهتر‌است‌که‌وابسته‌به‌صفرهای‌مشترك‌نباشند‪‌ .‬‬
‫اشتراكهای ‌‪‌ 1-1‬را ‌نادیده ‌می‌گیرد‪‌ .‬این ‌معیار ‌به ‌صورت ‌زیر ‌تعریف‌‬
‫‌‬ ‫شباهت ‌کسینوسی‪‌ ،‬‬
‫یشود‪‌ :‬‬ ‫م‌‬
‫‌‬

‫|‬ ‫|‬
‫‌‬
‫در‌این‌فرمول‪(‌.‌،‬نقطه‌یا‌همان‌‪‌)dot‬به‌معنای‌ضرب‌داخلی‌است‌و‌||‪‌ ‌،||x‬‬
‫اندازهی‌بردار‌‪‌x‬‬
‫یشود‪:‬‬
‫است‪‌.‬اندازه‌بردار‌به‌صورت‌زیر‌محاسبه‌م ‌‬

‫∑√‬

‫دادههای ‌زیر ‌را‌‬


‫اجازه ‌بدهید ‌برای ‌این ‌معیار ‌با ‌همان ‌مثال ‌باال‪‌ ،‬یک ‌امتحان ‌انجام ‌دهیم‪‌ ‌ .‬‬
‫مانند‌باال‌در‌نظر‌بگیرد‪‌ :‬‬
‫‌‌‬

‫‌‬
‫‌‬
‫نجا‌دو‌بردار‌به‌صورت‌زیر‌هستند‪‌ :‬‬
‫در‌ای ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌51‬‬
‫دادهکاوی‌برای‌ ‌‬

‫)‪x (4.75,4.5,5,4.25,4‬‬
‫)‪y (4,3,5,2,1‬‬
‫‌‬
‫پس‪‌ :‬‬
‫‌‬
‫√‬
‫√‬
‫‌‬
‫ضرب‌داخلی‌به‌صورت‌زیر‌است‪:‬‬

‫‪x y (4.75 ×4) (4.5 ×3) (5 ×5) (4.25 ×2) (4 ×1) 70‬‬

‫یشود‪:‬‬
‫و‌در‌نهایت‪‌،‬شباهت‌کسینوسی‌به‌صورت‌زیر‌محاسبه‌م ‌‬

‫بازهی ‌‪‌ 2‬به ‌لنوان ‌شباهتِ ‌مثبت ‌حداکثر ‌تا ‌‪‌ -2‬به‌‬
‫شباهت ‌کسینوسی ‌مقداری ‌است ‌که ‌در ‌ ‌‬
‫لنوان‌شباهت‌منفیِ‌حداکثری‌قرار‌دارد‪‌ .‬‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید ‌‬
‫رهها‌را ‌صفر‌در‌‬‫شباهت‌کسینوسی‌را‌بین‌‪‌ Angelica‬و‌‪‌ Veronica‬محاسبه ‌کنید‌(خط‌تی ‌‬
‫نظر‌بگیرید)‪‌ :‬‬

‫‌‬
‫‌‬
‫‌‬
‫‌مدادتان‌را‌تیز‌کنید‌–‌ ‌‬
‫راهحل ‌‬
‫یهگر‌■ ‪53‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫شباهت‌کسینوسی‌را‌بین‌‪‌Angelica‬و‌‪‌Veronica‬محاسبه‌کنید‌(خط‌تی ‌‬
‫رهها‌را‌صفر‌در‌‬
‫نظر‌بگیرید)‪‌ :‬‬

‫‌‬
‫‌‬
‫(‪x = (3.5,2,0,4.5,5,1.5,2.5,2‬‬
‫)‪y = (3,0,0,5,4,2.5,3,0‬‬

‫|‬ ‫|‬ ‫√‬


‫|‬ ‫|‬ ‫√‬

‫یشود‪‌ :‬‬
‫ضرب‌داخلی‌هم‌به‌صورت‌زیر‌محاسبه‌م ‌‬
‫‌‬
‫‪x.y = (3.5 × 3) + (2 × 0) + (0 × 0) + (4.5 × 5) + (5 × 4) + (1.5 × 2.5) + (2.5 × 3) + (2‬‬
‫‪× 0) = 64.25‬‬

‫یشود‪‌ :‬‬
‫شباهت‌کسینوسی‌هم‌به‌صورت‌زیر‌محاسبه‌م ‌‬
‫‌‬

‫‌‬
‫‌‬

‫از‌کدام‌معیار‌شباهت‌استفاده‌کنیم؟ ‌‬
‫نکتهی‌‬
‫پاسخ‌به‌این‌سوال‌را‌در‌سراسر‌این‌کتاب‌بررسی‌خواهیم‌کرد‌ولی‌برای‌االن‪‌،‬چند‌ ‌‬
‫یآوریم‪‌ :‬‬
‫کوچک‌م ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌54‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫یها‌‬
‫دادهها ‌غلیظ ‌باشند ‌(یعنی ‌تُنُک ‌نباشند‪‌ ،‬به ‌این ‌معنی ‌که ‌تقریباً ‌تمامی ‌ویژگ ‌‬
‫پس ‌اگر ‌ ‌‬
‫نههای‌معقولی‌برای‌استفاده‌‬ ‫ارهای‌منهتن‌و‌اقلیدسی‌گزی ‌‬ ‫مقادیرِ‌غیر‌صفر‌داشته‌باشند)‌معی ‌‬
‫دادهها ‌غلیظ ‌نباشند ‌(یعنی ‌تنک ‌باشند) ‌چه؟ ‌یک ‌سیستم‌‬ ‫یرسند‪‌ .‬ولی ‌اگر ‌ ‌‬ ‫به ‌نظر ‌م ‌‬
‫گستردهی‌موسیقی ‌را‌تصور‌کنید‪‌.‬سه‌نفر‌در‌این ‌سایت‌هستند‌و‌هر‌کدام‌‪‌211‬‬ ‫‌‬ ‫امتیازدهیِ ‌‬
‫کردهاند‪‌ :‬‬
‫یهای‌ما‌را‌امتیازدهی‌ ‌‬ ‫قطعه‌از‌موسیق ‌‬
‫یهگر‌■ ‪55‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫‌‌‬

‫‌‬
‫‌‬
‫آنها‪‌11‌،‬‬‫قهی‌موسیقیاییِ ‌شبیه‌به‌هم ‌دارند‪‌.‬در‌واقع‪‌،‬در‌میان‌امتیازات‌ ‌‬‫‪‌Linda‬و ‌‪‌Eric‬سلی ‌‬
‫آنها ‌در ‌میان ‌این ‌‪‌ 11‬قطعه‌‬
‫مشاهده‌میشود‌و ‌تفاوتِ ‌امتیازیِ ‌ ‌‬
‫‌‬ ‫قطعهی ‌موسیقیِ ‌مشترك ‌‬
‫‌‬
‫فاصلهی ‌منهتن ‌بین ‌این ‌دو ‌نفر‌‬
‫بازهی ‌‪‌ 2‬تا ‌‪‌)5‬به ‌طور ‌میانگین ‌فقط ‌‪‌ 1.5‬امتیاز ‌است!!‌ ‌‬
‫(در ‌ ‌‬
‫فاصلهی ‌اقلدیسی ‌برای ‌این ‌دو ‌به ‌صورت ‌زیر ‌محاسبه‌‬‫یشود‪‌ ‌ .‬‬ ‫برابر ‌‪‌ 11‌ ×‌ 1.5‌ =‌ 21‬م ‌‬
‫یگردد‪‌ :‬‬
‫م‌‬
‫‌‬
‫√‬
‫‌‬
‫داشتهاند‪‌:‬‬
‫‌‬ ‫قطعهی‌موسیقی‌به‌صورت‌مشترك‌‬ ‫این‌در‌حالی‌است‌که‌‪‌Linda‬و‌‪‌Eric‬فقط‌یک‌ ‌‬
‫قطعهی ‌«چه ‌روز ‌زیبایی» ‌اثر ‌‪ ‌ .Chris Cagle‬در ‌این‌جا ‌‪‌ Lind‬فکر ‌کرد ‌که ‌این ‌موسیقیِ‌‬
‫‌‬
‫خارقالعاده‌‬
‫قطعهی‌موسیقی ‌ ‌‬ ‫جالبی ‌است ‌و ‌امتیاز ‌‪‌ 3‬را ‌به ‌آن ‌داد‪‌ Jake‌ ،‬فکر ‌کرد ‌که ‌این ‌ ‌‬
‫فاصلهی ‌منهتن ‌بین ‌‪‌ Jake‬و ‌‪‌ Linda‬برابر ‌‪‌ 1‬و ‌ ‌‬
‫فاصلهی‌‬ ‫است ‌و ‌امتیاز ‌‪‌ 5‬را ‌به ‌آن ‌داد‪‌.‬پس ‌ ‌‬
‫یشود‪‌ :‬‬‫اقدلیدسی‌نیز‌به‌صورت‌زیر‌محاسبه‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌59‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫√‬
‫‌‬
‫کتر ‌است ‌تا ‌‪‌.Eric‬‬
‫پس ‌هر ‌دو ‌معیار ‌منهتن ‌و ‌اقلیدسی ‌نشان ‌دادند ‌که ‌‪‌ Jake‬به ‌‪‌ Linda‬نزدی ‌‬
‫یگیریم ‌که ‌در ‌این ‌مورد ‌هر ‌دوی ‌این ‌معیارها ‌(منهتن ‌و ‌اقلیدسی)‌نتایج ‌ضعیفی ‌را‌‬ ‫نتیجه ‌م ‌‬
‫تولید‌کردند‪‌ .‬‬
‫‌‬
‫دهای‌دارم‌که‌احتمالً‌بتونه‌مشکل‌را‌حل‌کنه‪‌ .‬‬ ‫اهان‪‌،‬ای ‌‬
‫کردهاند‪‌.‬حاال ‌من ‌آن‌‬
‫بازهی ‌‪‌ 2‬تا ‌‪‌ 5‬امتیازدهی ‌ ‌‬
‫االن‪‌ ،‬افرادِ ‌مختلف‪‌ ،‬قطعات ‌موسیقی ‌را ‌در ‌ ‌‬
‫ندادهاند ‌را ‌‪‌ 1‬در ‌نظر ‌می‌گیرم‪‌.‬به ‌این ‌صورت‪‌ ،‬مشکل‌‬
‫آنها ‌امتیازی ‌ ‌‬ ‫قطعاتی ‌را ‌که ‌افراد ‌به ‌ ‌‬
‫تها‌‬‫یها‌در‌تمام‌موجودی ‌‬ ‫یکنیم ‌چون‌با‌این‌کار‪‌،‬هر ‌کدام‌از‌ویژگ ‌‬ ‫دادههای‌تُنُک ‌را‌حل‌م ‌‬ ‫‌‬
‫دارای‌مقدار‌هستند‪‌ .‬‬
‫‌‬
‫نکه‌ببینیم‌چرا‌کاربردی‌‬ ‫فکر‌خوبیه‪‌،‬ولی‌کاربردی‌نیست‪‌.‬برای‌ای ‌‬
‫نامهی ‌خودمان‌‬
‫ش ‌‬ ‫نیست‪‌ ،‬احتیاج ‌داریم ‌تا ‌چند ‌شخصیت ‌به ‌نمای ‌‬
‫آنها) ‌اضافه ‌کنیم‪‌:‬‬
‫(همان ‌قطعات ‌موسیقی ‌و ‌امتیاز ‌کاربران ‌به ‌ ‌‬
‫‪‌ Cooper‬و ‌‪‌ .Kelsey‬حاال‪‌ Cooper‌ ،Jake‌ ،‬و ‌‪‌ Kelsey‬سلی ‌‬
‫قهی‌‬
‫موسیقیاییِ ‌بسیار ‌شبیه ‌به ‌هم ‌دارند‪‌ .‬فرض ‌کنید ‌‪‌15‌ ،Jake‬‬
‫کردهاست‪‌ .‬‬
‫وبسایت‌ما‌امتیازدهی‌ ‌‬ ‫قطعهی‌موسیقی‌را‌در‌ ‌‬ ‫‌‬
‫یهگر‌■ ‪57‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫آنها ‌همان ‌قطعاتی‌‬‫کردهاست ‌که ‌‪‌ 15‬تای ‌ ‌‬


‫قطعهی ‌موسیقی ‌را ‌امتیازدهی ‌ ‌‬ ‫‪‌ ‌ 19‌ ،Cooper‬‬
‫یهای ‌شبیه ‌به ‌هم ‌را ‌دوست ‌دارند ‌و‌‬ ‫است ‌که ‌‪‌ Jake‬امتیازدهی ‌کرده ‌است‪‌ ‌ .‬‬
‫آنها ‌موسیق ‌‬
‫آنها‌‪‌1.15‬است!! ‌‬ ‫فاصلهی‌امتیازات‌ ‌‬
‫میانگینِ‌ ‌‬
‫وبسایت‌ماست‌و‌هم‌لاشق‌‬ ‫‪‌Kelsey‬هم‌لاشق‌ ‌‬
‫آهنگها‪‌ ،‬بنابراین ‌‪‌ 251‬قطعه‌ی ‌موسیقی ‌را‌‬ ‫‌‬
‫کردهاست‪‌ 15‌ .‬تا ‌از ‌این ‌‪‌251‬‬ ‫امتیازدهی ‌ ‌‬
‫همانهایی ‌هستند ‌که‌‬ ‫قطعهی ‌موسیقی‪‌ ‌ ،‬‬ ‫‌‬
‫دادهاند‪‌.‬‬
‫آنها ‌نیز ‌امتیاز ‌ ‌‬ ‫‪‌ Cooper‬و ‌‪‌ Jake‬به ‌ ‌‬
‫فاصلهی ‌بین ‌‪‌ Kelsey‬و ‌‪‌ Jake‬نیز‌‬ ‫میانگین ‌ ‌‬
‫‪‌1.15‬است!! ‌‬
‫حسِ‌درونیِ‌ما‌می‌گوید‌که‌‪‌Cooper‬و‌‪‌Kelsey‬‬
‫به‌یک‌اندازه‌به‌‪‌Jake‬شباهت‌دارند‪‌ .‬‬
‫فاصلهی‌منهتن‌‬‫حاال‌تصور‌کنید‪‌،‬تغییری‌که‌در‌ ‌‬
‫و ‌اقلیدسی ‌دادیم ‌را ‌المال ‌کنیم‪‌.‬این ‌تغییر ‌به‌‬
‫این ‌معنی ‌بود ‌که ‌به ‌هر ‌قطعه‌ی ‌موسیقی ‌که‌‬
‫ندادهاست‪‌ ،‬امتیاز ‌‪‌ 1‬را‌‬
‫یک ‌شخص ‌به ‌آن ‌امتیاز ‌ ‌‬
‫اختصاص‌دهیم‪‌ .‬‬
‫با ‌این ‌حساب‪‌ Cooper‌ ،‬به ‌نسبت ‌‪‌Kelsey‬‬
‫کتر‌است‪‌ .‬‬ ‫خیلی‌بیشتر‌به‌‪‌Jake‬نزدی ‌‬
‫ولی‌چرا؟ ‌‬
‫برای ‌پاسخ ‌به ‌چراییِ ‌این ‌موضوع‪‌ ،‬اجازه ‌دهید‌‬
‫سادهشده ‌نگاهی ‌بیندازیم ‌(لدد ‌‪‌1‬‬ ‫به ‌این ‌مثال ‌ ‌‬
‫قطعهی‌‬
‫به ‌معنای ‌این ‌است ‌که ‌یک ‌فرد ‌به ‌یک ‌ ‌‬
‫ندادهاست) ‌‬
‫موسیقی‌امتیاز‌ ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌51‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‌‬
‫دادهاند‌(قطعات‌موسیقیِ‌‬
‫آنها‌امتیاز‌ ‌‬
‫همهی‌این‌افراد‌به‌ ‌‬
‫یای‌که‌ ‌‬ ‫با‌نگاهی‌به‌قطعاتِ‌موسیق ‌‬
‫یرسد ‌که ‌‪‌ Cooper‬و ‌‪‌‌ Kelsey‬به ‌صورت ‌یکسان ‌به ‌‪‌Jake‬‬
‫شمارهی ‌‪‌ 4‬و ‌‪‌ 5‬و ‌‪‌ ،)9‬به ‌نظر ‌م ‌‬
‫‌‬
‫دادهشده‪‌ ،‬چیز ‌دیگری‌‬
‫فاصلهی ‌منهتن ‌با ‌احتساب ‌صفرهای ‌قرار ‌ ‌‬
‫نحال‪‌ ‌ ،‬‬ ‫شباهت ‌دارند‪‌.‬با ‌ای ‌‬
‫یگوید‪‌ :‬‬
‫م‌‬
‫‌‌‬

‫‌‬
‫نجاست ‌که ‌مقادیرِ ‌صفر‪‌ ،‬تمایل ‌دارند ‌که ‌بر ‌هر ‌معیاری ‌از ‌فاصله‪‌ ،‬سایه ‌بیفکنند‪‌.‬‬ ‫مشکل ‌ای ‌‬
‫راهحل‌دیگری‌که‌‬ ‫پس‌این‌راه‌حلِ‌اضافه‌کردنِ‌صفر‪‌،‬بهتر‌از‌همان‌فرمولِ‌اصلی‌نیست‪‌.‬یک‌ ‌‬
‫محاسبهی ‌یک ‌«میانگینِ» ‌فاصله ‌است ‌که‌‬
‫‌‬ ‫برخی ‌افراد ‌از ‌آن ‌استفاده ‌می‌کنند ‌–‌به ‌نولی ‌–‌‬
‫آنها‌‬
‫یای ‌که ‌افراد ‌به ‌صورت ‌مشترك ‌به ‌ ‌‬ ‫محاسبهی ‌فاصله ‌از ‌قطعات ‌موسیق ‌‬
‫‌‬ ‫در ‌آن ‌برای ‌‬
‫دادهاند‪‌،‬استفاده‌‬
‫دادهاند‌تقسیم‌بر‌تعدادِ‌قطعات‌موسیقی‌که‌به‌صورت‌مشترك‌امتیاز‌ ‌‬ ‫امتیاز‌ ‌‬
‫یکنند‪‌ .‬‬
‫م‌‬
‫دادهها‌غلیظ‌(با‌تعداد‌صفر‌‬
‫فاصلههای‌منهتن‌و‌اقلیدسی‌در‌مواقعی‌که‌ ‌‬ ‫دوباره‌تکرار‌می‌کنم‪‌ ‌،‬‬
‫دادهها ‌تُنُک ‌باشند‪‌ ،‬بهتر ‌است ‌از ‌معیار‌‬
‫یکنند‪‌ ،‬ولی ‌اگر ‌ ‌‬ ‫کم) ‌باشد‪‌ ،‬بسیار ‌لالی ‌لمل ‌م ‌‬
‫شباهت‌کسینوسی‌استفاده‌کنیم‪‌ .‬‬
‫یک‌چیز‌لجیب ‌‬
‫یهگر‌■ ‪56‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫یخواهیم ‌پیشنهادهایی ‌برای ‌‪‌ Amy‬آماده ‌کنیم‪‌ Amy‌ .‬لاشق ‌ ‌‬


‫گروههای‌‬ ‫فرض ‌کنید‪‌ ،‬م ‌‬
‫کترین ‌فرد ‌به ‌او‪‌،‬‬‫موسیقی ‌‪‌ Passion Pit‌ ،Phoenix‬و ‌‪‌ Vampire Weekend‬است‪‌ .‬نزدی ‌‬
‫‪‌ Bob‬است ‌که ‌او ‌هم ‌لاشق ‌‪‌ Passion Pit‌ ،Phoenix‬و ‌‪‌ Vampire Weekend‬است‪‌ .‬پدر‌‬
‫نوازندهی ‌آکاردئون ‌(نولی ‌ساز ‌موسیقی)‌در ‌گروه ‌موسیقی ‌‪‌ Walpter Ostanek‬است‌‬ ‫‌‬ ‫‪‌ Bob‬‬
‫مسابقهی ‌موسیقی)‌در ‌گروه ‌پولکا ‌(نولی‌‬
‫‌‬ ‫مسابقهی ‌گرامی ‌(‪‌ –‌ Grammy‬یک ‌‬
‫‌‬ ‫که ‌امسال ‌در ‌‬
‫شدهاند‪‌.‬به ‌دلیلِ ‌تعهدات ‌خانوداگی‪‌ ،Bob‌ ،‬به ‌گروه ‌موسیقی‌‬
‫موسیقی‪-‬رقص ‌لهستانی)‌برنده ‌ ‌‬
‫دهندهی ‌فعلی‪‌ ،‬فکر‌‬
‫‌‬ ‫یدهد‪‌ .‬براساس ‌سیستمِ ‌پیشنهاد‌‬‫‪‌ Walpter Ostanek‬امتیازِ ‌‪‌ 5‬م ‌‬
‫یکنیم ‌که ‌‪‌ Amy‬حتماً‪‌ ،‬گروهِ ‌موسیقیِ ‌‪(‌ Walpter Ostanek‬که ‌پدر ‌‪‌ Bob‬در ‌آن ‌نوازده‌‬ ‫م‌‬
‫نطور‌نیست‪‌ .‬‬ ‫است)‌را‌دوست‌خواهد‌داشت‪‌.‬ولی‌لقل‌سلیم‌به‌ما‌می‌گویند‌که‌احتماالً‌ای ‌‬
‫‌‌‬

‫‌‬
‫‌‬
‫کتابهای ‌داده‌کاوی ‌و ‌للمی ‌تخیلی‌‬
‫مطالعهی ‌ ‌‬
‫‌‬ ‫یا ‌مثال ‌پروفسور ‌‪‌ Billy Bo Olivera‬که ‌لاشق ‌‬
‫دادهکاوی ‌و‌‬
‫کتابهای ‌ ‌‬
‫کترین ‌فرد ‌به ‌او ‌من ‌هستم ‌که ‌مانند ‌او ‌ ‌‬ ‫هست ‌را ‌تصور ‌کنید‪‌.‬نزدی ‌‬
‫پودلها ‌(‪‌ -‌ poodles‬نولی ‌سگ)‌را ‌هم‌‬‫نها‪‌ ،‬من ‌ ‌‬ ‫للمی ‌تخیلی ‌را ‌دوست ‌دارم‪‌.‬در ‌کنار ‌ای ‌‬
‫کردهام‪‌.‬‬
‫پودلهای‌استاندارد»‌را‌با‌امتیازِ‌باال‪‌،‬امتیازدهی‌ ‌‬
‫دوست‌دارم‌و‌کتابِ‌«زندگیِ‌پنهانیِ‌ ‌‬
‫دهندهی‌فعلی‪‌،‬احتماالً‌این‌کتاب‌را‌هم‌به‌پروفسور‌پیشنهاد‌خواهد‌داد‪‌ .‬‬ ‫‌‬ ‫سیستمِ‌پیشنهاد‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌91‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫یشود ‌که ‌ما ‌فقط ‌به ‌یک ‌فرد ‌به ‌لنوان ‌«شبی‌هترین ‌فرد» ‌اتکا‌‬ ‫آنجایی ‌ناشی ‌م ‌‬ ‫مشکل ‌از ‌ ‌‬
‫کردهایم‪‌.‬هر ‌گونه ‌تناقض ‌یا ‌تغییر ‌جهتِ ‌ناگهانی ‌که ‌آن ‌فرد ‌داشته ‌باشد‪‌ ،‬به ‌لنوان ‌پیشنهاد‌‬
‫‌‬
‫یتوان ‌بر ‌این ‌تناقضات ‌فائق ‌آمد‪‌ ،‬این ‌است‌‬‫راههایی ‌که ‌م ‌‬
‫یشود‪‌.‬یکی ‌از ‌ ‌‬ ‫در ‌سیستم ‌لحاظ ‌م ‌‬
‫که ‌پیشنهادهایمان ‌را ‌نه ‌بر ‌اساس ‌یک ‌نفر‪‌ ،‬بلکه ‌بر ‌اساس ‌چندین ‌نفر ‌از ‌شبی‌هترین ‌افراد ‌به‌‬
‫کترین‌همسایه‌‬ ‫یتوانیم‌از‌رهیافتِ‌‪‌k‬نزدی ‌‬‫نکار‌م ‌‬‫شخص‌مورد‌نظر‪‌،‬پای‌هگذاری‌کنیم‪‌.‬برای‌ای ‌‬
‫(‪‌)k-nearest neighot‬استفاده‌کنیم‪‌ .‬‬
‫‌‬

‫کترین‌همسایه‌(‪‌ )K-Nearest Neighbor‬‬


‫‪‌K‬نزدی ‌‬
‫کترین ‌همسایه ‌برای ‌پایشِ ‌مشارکتی ‌(‪‌)collaborative filtering‬از ‌تعدادِ‌‬ ‫در ‌روش ‌‪‌ k‬نزدی ‌‬
‫‪‌ k‬فرد‪‌ ،‬که ‌بیشتر ‌از ‌همه ‌به ‌فردِ ‌مورد ‌نظرِ ‌ما ‌شبیه ‌باشند‪‌ ،‬جهت ‌شناساییِ ‌پیشنهادهای‌‬
‫یکنیم‪‌ .‬بهترین ‌مقدار ‌برای ‌‪‌ k‬به ‌مسئله ‌بستگی ‌دارد ‌– ‌بایستی‌‬ ‫مناسب ‌استفاده ‌م ‌‬
‫شهای ‌مختلفی ‌را ‌برای ‌به ‌دست ‌آوردنِ ‌بهترین ‌‪‌ k‬انجام ‌دهید‪‌ .‬در ‌زیر ‌یک ‌مثال‌‬ ‫آزمای ‌‬
‫دهی‌اولی‌هی‌این‌روش‌را‌درك‌کنید‪‌ .‬‬ ‫یآوریم‌تا‌ای ‌‬
‫م‌‬
‫یهگر‌■ ‪92‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫نکار ‌از ‌روش ‌‪‌k‬‬


‫یخواهم ‌یک ‌سری ‌پیشنهاد ‌برای ‌‪‌ Ann‬آماده ‌کنم‪‌ .‬برای ‌ای ‌‬ ‫فرض ‌کنید ‌م ‌‬
‫یکنم‪‌ .‬در ‌جدول ‌زیر‪‌ 3‌ ،‬همسای‌هی ‌نزدیک ‌(ستون‌‬ ‫کترین ‌همسایه ‌با ‌‪‌ k=3‬استفاده ‌م ‌‬‫نزدی ‌‬
‫آنها‌(ستون‌‪‌)Pearson‬نسبت‌به‌‪‌،Ann‬آورده‌شده‌است‪‌ :‬‬ ‫‪‌)Person‬و‌مقدار‌پیرسونِ‌ ‌‬
‫‌‬

‫‌‬
‫‌‌‬
‫جهی‌پیشنهادها‌اثر‌بگذارند‪‌.‬سوال‌این‌است‌که‌‬ ‫یخواهند‌بر‌نتی ‌‬ ‫هر‌کدام‌از‌این‌‪‌3‬شخص‪‌،‬م ‌‬
‫ارائهی ‌پیشنهاد ‌به ‌‪‌Ann‬‬
‫چگونه ‌تعیین ‌کنم ‌که ‌هر ‌کدام ‌از ‌این ‌افراد‪‌ ،‬چه ‌مقدار ‌تاثیری ‌بر ‌ ‌‬
‫رهای‌تاثیرات‌(‪‌)Pie of InfluenceTM‬وجود‌داشته‌باشد‪‌،‬هر‌‬ ‫داشته‌باشند‪‌.‬اگر‌یک‌نمودارِ‌دای ‌‬
‫اندازهای ‌باشند؟ ‌در ‌جدولِ ‌باال‪‌ ،‬مقادیر ‌پیرسون ‌(‪‌ )Pearson‬را ‌با‌‬
‫قسمتها ‌باید ‌چه ‌ ‌‬
‫‌‬ ‫کدام ‌از ‌‬
‫هم ‌جمع ‌کردم ‌که ‌برابر ‌‪‌ 1‬شد‪‌.‬در ‌همان ‌جدول‪‌ ،‬سهم ‌‪‌ Sally‬برابر ‌‪‌ 1.1‬تقسیم ‌بر ‌‪(‌ 1‬برابر‌‬
‫یشود‪‌ .‬سهم ‌‪‌ Eric‬برابر ‌‪‌ 1.7‬تقسیم ‌بر ‌‪(‌ 1‬برابر ‌‪‌ )%35‬و ‌سهم ‌‪‌ Amanda‬نیز ‌برابر‌‬ ‫‪‌ )%41‬م ‌‬
‫یشود‪‌ ‌.‬‬
‫‪‌%15‬م ‌‬
‫‌‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌91‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫حاال ‌فرض ‌کنید ‌‪‌ Eric‌ ،Amanda‬و ‌‪‌ Sally‬گروه ‌موسیقیِ ‌‪‌ Grey Wardens‬را ‌به ‌صورت ‌زیر‌‬
‫امتیاز ‌داده ‌باشند ‌(ستون ‌‪‌ Person‬همان ‌افراد ‌هستند ‌و ‌ستون ‌‪‌،Grey Wardens Rating‬‬
‫امتیازی‌است‌که‌هر‌شخص‌به‌این‌گروه‌موسیقی‌داده‌است)‪‌ :‬‬
‫‌‌‬

‫‌‬
‫‌‬
‫پس ‌با ‌احتسابِ ‌ضریب ‌تاثیری ‌که ‌در ‌باال ‌حساب ‌شد ‌چیزی ‌مانند ‌جدول ‌زیر ‌برای ‌تاثیرِ ‌هر‌‬
‫یتوانید ‌تاثیر ‌هر ‌کدام ‌را ‌مشاهده‌‬‫یآید ‌(در ‌ستون ‌‪‌ ،Influence‬م ‌‬‫کدام ‌از ‌افراد ‌به ‌دست ‌م ‌‬
‫کنید)‪‌ :‬‬
‫‌‌‬

‫‌‬
‫‌‌ ‌‬
‫مدادتان‌را‌تیز‌کنید ‌‬
‫نبار ‌در ‌روش‌‬
‫دادههای ‌جدول ‌باال ‌استفاده ‌کنم‪‌ ،‬ولی ‌ای ‌‬
‫دادههایی ‌مانند ‌ ‌‬
‫فرض ‌کنید ‌من‪‌ ،‬از ‌ ‌‬
‫کترین ‌همسایه ‌(‪‌ k‌ ،)knn‬را ‌برابر ‌‪‌ 1‬قرار ‌دهم‪‌ .‬تاثیر ‌امتیازات ‌برای ‌گروه ‪Grey‬‬ ‫‪‌ k‬نزدی ‌‬
‫یشود؟ ‌‬‫‪‌Wardens‬چقدر‌م ‌‬
‫‌‬
‫یهگر‌■ ‪93‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫‌‬
‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید ‌‬
‫نبار ‌در ‌روش‌‬
‫دادههای ‌جدول ‌باال ‌استفاده ‌کنم‪‌ ،‬ولی ‌ای ‌‬
‫دادههایی ‌مانند ‌ ‌‬
‫فرض ‌کنید ‌من‪‌ ،‬از ‌ ‌‬
‫کترین ‌همسایه ‌(‪‌ k‌ ،)knn‬را ‌برابر ‌‪‌ 1‬قرار ‌دهم‪‌ .‬تاثیر ‌امتیازات ‌برای ‌گروه ‪Grey‬‬ ‫‪‌ k‬نزدی ‌‬
‫یشود؟ ‌‬‫‪‌Wardens‬چقدر‌م ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌94‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬

‫توصیهگر‌با‌زبان‌پایتون ‌‬
‫‌‬ ‫یک‌کالس‌(‪‌)Class‬‬
‫نجا ‌در ‌یک ‌کالسِ‌‬ ‫این ‌چند‌بخشی‌را‌که‌پیش‌از‌این‌در ‌فصلِ‌جاری‌پوشش ‌دادیم‪‌ ،‬در ‌ای ‌‬
‫یآورم‌‬
‫نجا‌م ‌‬‫شدهاست‌ولی‌تمامیِ‌کد‌را‌ای ‌‬ ‫پایتون‌با‌هم‌ترکیب‌کرد‌هام‪‌.‬اگرچه‌کمی‌طوالنی‌ ‌‬
‫وبسایت ‌‪‌chistio.ir‬‬ ‫یتوانید ‌در ‌سایت ‌‪‌ guidetodatamining.com‬و ‌ ‌‬ ‫(کدها ‌را ‌همچنین ‌م ‌‬
‫نیز‌دانلود‌کنید)‪.‬‬
95 ■‌‫یهگر‬
‌ ‫یستمهای‌توص‬
‌ ‫‌س‬.1‌‫‌فصل‬

import codecs
from math import sqrt

users = {"Angelica": {"Blues Traveler": 3.5, "Broken Bells": 2.0,


"Norah Jones": 4.5, "Phoenix": 5.0,
"Slightly Stoopid": 1.5,
"The Strokes": 2.5, "Vampire Weekend": 2.0},

"Bill":{"Blues Traveler": 2.0, "Broken Bells": 3.5,


"Deadmau5": 4.0, "Phoenix": 2.0,
"Slightly Stoopid": 3.5, "Vampire Weekend": 3.0},

"Chan": {"Blues Traveler": 5.0, "Broken Bells": 1.0,


"Deadmau5": 1.0, "Norah Jones": 3.0, "Phoenix": 5,
"Slightly Stoopid": 1.0},

"Dan": {"Blues Traveler": 3.0, "Broken Bells": 4.0,


"Deadmau5": 4.5, "Phoenix": 3.0,
"Slightly Stoopid": 4.5, "The Strokes": 4.0,
"Vampire Weekend": 2.0},

"Hailey": {"Broken Bells": 4.0, "Deadmau5": 1.0,


"Norah Jones": 4.0, "The Strokes": 4.0,
"Vampire Weekend": 1.0},

"Jordyn": {"Broken Bells": 4.5, "Deadmau5": 4.0,


"Norah Jones": 5.0, "Phoenix": 5.0,
"Slightly Stoopid": 4.5, "The Strokes": 4.0,
"Vampire Weekend": 4.0},

"Sam": {"Blues Traveler": 5.0, "Broken Bells": 2.0,


"Norah Jones": 3.0, "Phoenix": 5.0,
"Slightly Stoopid": 4.0, "The Strokes": 5.0},

"Veronica": {"Blues Traveler": 3.0, "Norah Jones": 5.0,


"Phoenix": 4.0, "Slightly Stoopid": 2.5,
"The Strokes": 3.0}
}

class recommender:

def __init__(self, data, k=1, metric='pearson', n=5):


""" initialize recommender
currently, if data is dictionary the recommender is initialized
to it.
For all other data types of data, no initialization occurs
k is the k value for k nearest neighbor
metric is which distance formula to use
n is the maximum number of recommendations to make"""
self.k = k
self.n = n
self.username2id = {}
self.userid2name = {}
self.productid2name = {}
# for some reason I want to save the name of the metric
self.metric = metric
‫برنامهنویسان‬ ‌ ■‌99
‌ ‌‫دادهکاوی‌برای‬

if self.metric == 'pearson':
self.fn = self.pearson
#
# if data is dictionary set recommender data to it
#
if type(data).__name__ == 'dict':
self.data = data

def convertProductID2name(self, id):


"""Given product id number return product name"""
if id in self.productid2name:
return self.productid2name[id]
else:
return id

def userRatings(self, id, n):


"""Return n top ratings for user with id"""
print ("Ratings for " + self.userid2name[id])
ratings = self.data[id]
print(len(ratings))
ratings = list(ratings.items())
ratings = [(self.convertProductID2name(k), v)
for (k, v) in ratings]
# finally sort and return
ratings.sort(key=lambda artistTuple: artistTuple[1],
reverse = True)
ratings = ratings[:n]
for rating in ratings:
print("%s\t%i" % (rating[0], rating[1]))

def loadBookDB(self, path=''):


"""loads the BX book dataset. Path is where the BX files are
located"""
self.data = {}
i = 0
#
# First load book ratings into self.data
#
f = codecs.open(path + "BX-Book-Ratings.csv", 'r', 'utf8')
for line in f:
i += 1
#separate line into fields
fields = line.split(';')
user = fields[0].strip('"')
book = fields[1].strip('"')
rating = int(fields[2].strip().strip('"'))
if user in self.data:
currentRatings = self.data[user]
else:
currentRatings = {}
currentRatings[book] = rating
self.data[user] = currentRatings
f.close()
#
# Now load books into self.productid2name
# Books contains isbn, title, and author among other fields
97 ■‌‫یهگر‬
‌ ‫یستمهای‌توص‬
‌ ‫‌س‬.1‌‫‌فصل‬

#
f = codecs.open(path + "BX-Books.csv", 'r', 'utf8')
for line in f:
i += 1
#separate line into fields
fields = line.split(';')
isbn = fields[0].strip('"')
title = fields[1].strip('"')
author = fields[2].strip().strip('"')
title = title + ' by ' + author
self.productid2name[isbn] = title
f.close()
#
# Now load user info into both self.userid2name and
# self.username2id
#
f = codecs.open(path + "BX-Users.csv", 'r', 'utf8')
for line in f:
i += 1
#print(line)
#separate line into fields
fields = line.split(';')
userid = fields[0].strip('"')
location = fields[1].strip('"')
if len(fields) > 3:
age = fields[2].strip().strip('"')
else:
age = 'NULL'
if age != 'NULL':
value = location + ' (age: ' + age + ')'
else:
value = location
self.userid2name[userid] = value
self.username2id[location] = userid
f.close()
print(i)

def pearson(self, rating1, rating2):


sum_xy = 0
sum_x = 0
sum_y = 0
sum_x2 = 0
sum_y2 = 0
n = 0
for key in rating1:
if key in rating2:
n += 1
x = rating1[key]
y = rating2[key]
sum_xy += x * y
sum_x += x
sum_y += y
sum_x2 += pow(x, 2)
sum_y2 += pow(y, 2)
if n == 0:
return 0
# now compute denominator
denominator = (sqrt(sum_x2 - pow(sum_x, 2) / n)
* sqrt(sum_y2 - pow(sum_y, 2) / n))
‫برنامهنویسان‬ ‌ ■‌91
‌ ‌‫دادهکاوی‌برای‬

if denominator == 0:
return 0
else:
return (sum_xy - (sum_x * sum_y) / n) / denominator

def computeNearestNeighbor(self, username):


"""creates a sorted list of users based on their distance to
username"""
distances = []
for instance in self.data:
if instance != username:
distance = self.fn(self.data[username],
self.data[instance])
distances.append((instance, distance))
# sort based on distance -- closest first
distances.sort(key=lambda artistTuple: artistTuple[1],
reverse=True)
return distances

def recommend(self, user):


"""Give list of recommendations"""
recommendations = {}
# first get list of users ordered by nearness
nearest = self.computeNearestNeighbor(user)
#
# now get the ratings for the user
#
userRatings = self.data[user]
#
# determine the total distance
totalDistance = 0.0
for i in range(self.k):
totalDistance += nearest[i][1]
# now iterate through the k nearest neighbors
# accumulating their ratings
for i in range(self.k):
# compute slice of pie
weight = nearest[i][1] / totalDistance
# get the name of the person
name = nearest[i][0]
# get the ratings for this person
neighborRatings = self.data[name]
# get the name of the person
# now find bands neighbor rated that user didn't
for artist in neighborRatings:
if not artist in userRatings:
if artist not in recommendations:
recommendations[artist] = (neighborRatings[artist]
* weight)
else:
recommendations[artist] = (recommendations[artist]
+ neighborRatings[artist]
* weight)
# now make list from dictionary
recommendations = list(recommendations.items())
recommendations = [(self.convertProductID2name(k), v)
for (k, v) in recommendations]
# finally sort and return
recommendations.sort(key=lambda artistTuple: artistTuple[1],
‫یهگر‌■ ‪96‬‬
‫یستمهای‌توص ‌‬
‫‌فصل‌‪‌.1‬س ‌‬

‫)‪reverse = True‬‬
‫‪# Return the first n items‬‬
‫]‪return recommendations[:self.n‬‬
‫‌‬

‫دادهی‌جدید ‌‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫یک‌‬
‫یتر‌بیندازیم‪Cai-Nicolas ‌.‬‬
‫دادهی‌واقع ‌‬
‫خب!‌حاال‌وقت‌آن‌است‌که‌نگاهی‌به‌یک‌مجموله‌ ‌‬
‫مبادلهی ‌کتاب‌‬
‫‌‬ ‫‪‌ Zeigler‬نزدیک ‌به ‌یک ‌میلیون ‌مورد ‌از ‌امتیازدهی ‌به ‌کتاب‌ها ‌را ‌از ‌سایت ‌‬
‫جمعآوری ‌کرده ‌است‪‌ .‬این ‌امتیازات ‌از ‌‪‌ 171151‬کاربر ‌که ‌مجمولاً‌‬ ‫(‪‌ ‌ )Book Crossing‬‬
‫دادههای ‌ناشناس ‌شده‌‬ ‫آمدهاست‪‌.‬این ‌ ‌‬ ‫‪‌ 172376‬کتاب ‌را ‌امتیازدهی ‌کرده ‌بودند‪‌ ،‬به ‌دست ‌ ‌‬
‫‌‪http://www2.informatik.uni-‬‬ ‫وبسایت‬‫‌ ‌‬ ‫‌در‬ ‫(‪)anonymized‬‬
‫‪‌ /freiburg.de/~cziegler/BX‬به ‌صورت ‌خروجیِ ‌‪‌ SQL‬و ‌همچنین ‌فایل ‌متنیِ ‌‪‌ CSV‬در‌‬
‫دادهها‌در‌زبانِ‌پایتون‪‌،‬مشکالتی‌به‌دلیل‌اینکودینگ‌‬ ‫دسترس‌است‪‌.‬در‌هنگام‌بارگزاریِ‌این‌ ‌‬
‫وبسایت ‌خودم‌‬ ‫دادهها ‌در ‌ ‌‬‫شدهی ‌‪‌ CSV‬این ‌ ‌‬ ‫اصالح ‌‬
‫‌‬ ‫(‪‌ )encoding‬کاراکترها ‌داشتم‪‌ ‌.‬‬
‫نسخهی ‌‬
‫‪‌guidetodatamining.com‬و‌همچنین‌‪‌chistio.ir‬موجود‌است‪‌ .‬‬
‫فایل‌‪‌CSV‬شامل‌سه‌جدول‌می‌شود‪‌ :‬‬
‫جدول ‌‪‌ ،BX-Users‬که ‌مانند ‌اسمش‪‌ ،‬حاوی ‌اطاللاتِ ‌کاربران ‌است‪‌ .‬در ‌این ‌جدول‪‌ ،‬یک‌‬
‫شناسهی‌کاربران‪‌،‬یک‌ستون‌برای‌مکانِ‌جغرافیایی‌کاربران‌(مثال‌شهر‌‬ ‫‌‬ ‫ستون‌‪‌user-id‬برای‌‬
‫‪‌ Albuquerque‬یا ‌‪‌)NM‬و ‌یک ‌ستون ‌مربوط ‌به ‌سن ‌کاربران ‌موجود ‌است‪‌.‬نام ‌کاربران ‌به‌‬
‫ناشناسسازی‌(‪‌)anonymizition‬حذف‌شده‌است‪‌ .‬‬ ‫‌‬ ‫دلیل‌‬
‫شناسهی ‌‪‌،ISBN‬‬
‫‌‬ ‫کتابها ‌با ‌‬
‫کتابها ‌است‪‌ ‌.‬‬ ‫جدول ‌‪‌ BX-Books‬که ‌حاوی ‌اطاللات ‌مربوط ‌به ‌ ‌‬
‫یشوند‪‌ .‬‬‫لنوان‌کتاب‪‌،‬نویسنده‪‌،‬سال‌انتشار‌و‌انتشارات‌آن‪‌،‬در‌این‌جدول‌شناخته‌م ‌‬
‫یا‌همان‌شناسهی ‌هر ‌کاربر‪‌ ISBN‌ ،‬کتاب ‌و‌‬
‫‌‬ ‫جدول ‌‪‌ BX-Book-Ratings‬که ‌شامل ‌‪‌ user-id‬‬
‫یک ‌امتیاز ‌بین ‌‪‌ 1‬تا ‌‪‌ 21‬است ‌که ‌مشخص ‌می‌کند ‌یک ‌کاربر ‌چه ‌امتیازی ‌به ‌یک ‌کتاب ‌داده‌‬
‫است‪‌ .‬‬
‫یکند‪‌ .‬‬
‫لها‌بارگزاری‌م ‌‬ ‫تابع‌‪‌loadBookDB‬در‌کالس‌‪‌ ‌،recommender‬‬
‫دادهها‌را‌از‌این‌فای ‌‬
‫کتابها ‌را ‌بارگزاری ‌کنم‪‌ .‬آرگومانی ‌که ‌به‌‬ ‫دادهی ‌مربوط ‌به ‌ ‌‬ ‫یخواهم ‌این ‌مجموله ‌ ‌‬ ‫حاال ‌م ‌‬
‫لهای ‌‪‌ BX book‬است ‌که ‌در ‌این‌جا‌‬ ‫یشود‪‌ ،‬مسیر ‌فای ‌‬ ‫‪‌ loadBookDB‬داده ‌م ‌‬
‫‪‌/Users/raz/Downloads/BX-Dump‬است‪‌ .‬‬
‫‌‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌71‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫نکته‬
‫دادهی‌حجیم‌است‌و‌ممکن‌است‌بارگزاریِ‌آن‌کمی‌‬‫مجمولهی‌ ‌‬
‫‌‬ ‫مجمولهی‌داده‪‌،‬یک‌‬
‫‌‬ ‫ای ن ‌‬
‫زمان‌ببرد‪‌.‬در‌هکینتاشِ‌من‌(‪‌1.5‬گیگاهرتز‪‌Core i7 860‌،‬با‌‪1‬گیگابایت‌‪‌14‌،RAM‬ثانیه‌‬
‫پرس‌وجو‌(‪‌)query‬زمان‌برد‪.‬‬
‫مجمولهی‌داده‌و‌‪‌31‬ثانیه‌اجرای‌ ‌‬
‫‌‬ ‫بارگزاریِ‌‬
‫‌‬
‫شمارهی ‌‪‌ 272221‬که ‌فردی ‌از ‌تورنتو ‌است‪‌ ،‬به‌‬
‫‌‬ ‫یتوانم ‌پیشنهاداتی ‌را ‌برای ‌کاربرِ ‌‬
‫حاال‪‌ ،‬م ‌‬
‫دست‌بیاورم‪‌ :‬‬
‫‌‌‬

‫‌‬
‫پروژهها‬
‫‌‬
‫مگراینکه ‌با ‌کدها ‌سر ‌و ‌کله ‌بزنید‪‌.‬‬
‫یتوانید ‌مباحثِ ‌این ‌فصل ‌را ‌کامالً ‌درك ‌کنید‪‌ ‌ ،‬‬‫طبیعتاً ‌نم ‌‬
‫روشهای‌‬‫آنها‌به‌دركِ‌بهتری‌از‌ ‌‬ ‫آوردهام‌که‌احتماالً‌بتوانید‌با‌انجام‌ ‌‬
‫در‌ادامه‌چند‌پیشنهاد‌ ‌‬
‫ارائه‌شده‌در‌این‌فصل‌برسید‪.‬‬
‫روشها ‌را ‌با‌‬
‫ادهسازی ‌کنید ‌و ‌نتایجِ ‌این ‌ ‌‬
‫فاصلهی ‌اقلیدسی ‌را ‌پی ‌‬
‫فاصلهی ‌منهتن ‌و ‌ ‌‬‫‌ ‌‬ ‫‪.2‬‬
‫یکدیگر‌مقایسه‌کنید‪.‬‬
‫وبسایت ‌این ‌کتاب ‌فایلی ‌حاویِ ‌امتیازِ ‌کاربران ‌به ‌‪‌ 15‬فیلم ‌دارد‪‌.‬تابعی ‌بنویسید‌‬ ‫‌ ‌‬ ‫‪.1‬‬
‫طبقهبندی ‌بارگزاری ‌کند‪‌ .‬تابع ‌‪‌ recommend‬که ‌در ‌باال‌‬ ‫دادهها ‌را ‌به ‌الگوریتمِ ‌ ‌‬
‫که ‌این ‌ ‌‬
‫لمهایی‌را‌به‌شخصِ‌خاصی‌پیشنهاد‌دهد‪‌ .‬‬ ‫توضیح‌داده‌شد‪‌،‬باید‌بتواند‌فی ‌‬
‫فصل ‪ .9‬پايش بر اساس اقالم‬
‫امتيازدهيِ ضمني (‪ )Implicit rating‬و پايش براساس اقالم (‪)Item based filtering‬‬

‫‌‬
‫‌‬
‫توصیهگر‌‬
‫‌‬ ‫در ‌فصل ‌‪‌ ،1‬مقدمات ‌پایش ‌مشارکتی ‌(‪‌)collaborative filtering‬و ‌سی ‌‬
‫ستمهای ‌‬
‫تمهای ‌تشریح ‌شده ‌در ‌آن ‌فصل‪‌،‬‬ ‫(‪‌ )recommendation systems‬را ‌فرا ‌گرفتیم‪‌ .‬الگوری ‌‬
‫دادههای ‌مختلفی ‌مورد ‌استفاده ‌قرار ‌بگیرند‪‌.‬‬
‫یتوانستند ‌با ‌ ‌‬ ‫همهکاره ‌بودند ‌و ‌م ‌‬
‫تمهای ‌ ‌‬‫الگوری ‌‬
‫تمها‪‌،‬‬
‫یکردند ‌و ‌الگوری ‌‬
‫بازهی ‌‪‌ 1‬تا ‌‪‌ 5‬یا ‌‪‌ 1‬تا ‌‪‌ 21‬امتیازدهی ‌م ‌‬
‫کاربران‪‌ ،‬اقالمِ ‌مختلف ‌را ‌در ‌ ‌‬
‫یکردند‪‌.‬‬‫تمها ‌را ‌امتیازدهی ‌کرده ‌بودند‪‌ ،‬شناسایی ‌م ‌‬
‫کاربران ‌دیگری ‌که ‌به ‌صورتِ ‌مشابهی ‌آی ‌‬
‫همانطور‌که‌قبالً‌گفته‌شد‪‌،‬در‌برخی‌از‌موارد‪‌،‬کاربران‌یک‌همچین‌نتایج‌خوبی‌را‌مشاهده‌‬ ‫‌‬
‫یکنند‌و‌به‌جای‌آن‌ممکن‌است‌اقالمی‌را‌ببینند‌که‌بیشترین‌امتیاز‌یا‌کمترین‌امتیاز‌را‌‬ ‫نم ‌‬
‫کردهاند‪‌.‬این‌استراتژیِ‌همه‌یا‌هیچ‪‌،‬ممکن‌است‌در‌بعضی‌مواقع‌به‌نتایجِ‌غیرپایدار‌و‌‬ ‫کسب‌ ‌‬
‫لهی‌‬‫روشهایی ‌را ‌امتحان ‌می‌کنیم ‌که ‌به ‌وسی ‌‬
‫با ‌کیفیتی ‌پایین ‌منجر ‌شود‪‌.‬در ‌این ‌فصل‪‌ ‌ ،‬‬
‫روشهای‌‬
‫قتری ‌را ‌با ‌ ‌‬ ‫آنها ‌بتوانیم ‌پایشِ ‌مشارکتی ‌را ‌بهبود ‌بخشیده ‌و ‌پیشنهاداتِ ‌دقی ‌‬ ‫‌‬
‫کارآمد‌تولید‌کنیم‪‌ .‬‬
‫‌‬

‫امتیازدهی‌صریح‌(‪‌ )Explicit Rating‬‬


‫آنها ‌صریح‌هستند‌یا‌‬ ‫ناست‌که‌ببینیم‌آیا‌ ‌‬ ‫یهای ‌کاربران‪‌،‬ای ‌‬‫لالقهمند ‌‬
‫راههای‌تمایز‌ ‌‬ ‫یکی‌از‌ ‌‬
‫ضمنی‪‌.‬منظور ‌از ‌صریح ‌بودنِ ‌امتیازها‪‌ ،‬این ‌است ‌که ‌کاربر ‌به ‌صورتِ ‌صریح ‌به ‌یکی ‌از ‌اقالم‪‌،‬‬
‫دکمههای ‌تایید‌‬
‫امتیاز ‌داده ‌باشد‪‌.‬یکی ‌از ‌مثال‌های ‌امتیازِ ‌صریح‪‌ ،‬موقعی ‌است ‌که ‌کاربران‪‌ ‌ ،‬‬

‫‪70‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌71‬‬
‫دادهکاوی‌برای‌ ‌‬

‫نشانهی‌انگشت‌شصت‌به‌‬
‫نشانهی‌انگشت‌شصت‌به‌سمت‌باال)‌یا‌لدم‌تایید‌(مثالً‌با‌ ‌‬
‫(مثالً‌با‌ ‌‬
‫تهایی‌مانند‌پاندورا‌(‪‌)Pandora‬یا‌یوتیوب‌کلیک‌م ‌‬
‫یکنند‪‌ .‬‬ ‫وبسای ‌‬
‫سمت‌پایین)‌را‌در‌ ‌‬
‫‌‌‬

‫‌‬

‫‌‬
‫‌‌‬
‫و‌یا‌سیستمِ‌ستاره‌دهی‌در‌سایت‌آمازون‪‌ :‬‬
‫‌‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪73‬‬

‫‌‬
‫‌‬

‫امتیازدهی‌ضمنی‌(‪‌ )Implicit Rating‬‬


‫یکنیم ‌تا ‌به ‌صورت ‌مستقیم‌‬ ‫برای ‌انجامِ ‌لملیاتِ ‌امتیازدهیِ ‌ضمنی‪‌ ،‬از ‌کاربر ‌تقاضا ‌نم ‌‬
‫امتیازدهی ‌را ‌انجام ‌دهد ‌– ‌فقط ‌رفتار ‌او ‌را ‌مشاهده ‌می‌کنیم‪‌ .‬مثالی ‌از ‌این ‌حالت ‌(یعنی‌‬
‫کهای ‌یک ‌کاربر ‌(جایی ‌که ‌کاربر ‌کلیک ‌می‌کند) ‌در‌‬ ‫امتیازدهی ‌ضمنی) ‌ردیابیِ ‌کلی ‌‬
‫وبسایت‌‪‌New York Times‬است‪‌ .‬‬ ‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫یتوانیم‌‬
‫نکه ‌مشاهده ‌کردیم ‌هر ‌کاربر ‌در ‌طول ‌چند ‌هفته‪‌ ،‬کجاها ‌را ‌کلیک ‌کرد‪‌ ،‬م ‌‬‫بعد ‌از ‌ای ‌‬
‫نکه‪‌،‬این‌کاربر‌ورزش‌را‌دوست‌ندارد‌‬ ‫یک‌پروفایلِ‌قابلِ‌قبول‌از‌کاربر‌توسعه‌دهیم‌–‌مثالً‌ای ‌‬
‫مقالهای‌با‌‬
‫لالقهمند‌باشد‪‌.‬اگر ‌کاربر‌بر‌روی‌ ‌‬ ‫حوزهی‌تکنولوژی ‌ ‌‬‫یرسد‌به‌اخبارِ‌ ‌‬ ‫ولی‌به‌نظر‌م ‌‬
‫حرفهای»‌کلیک‌کرده‌باشد‌و‌‬ ‫عترین‌راهِ‌کاهش‌وزن‌شناخته‌شده‌توسط‌مربیانِ‌ ‌‬ ‫لنوانِ‌«سری ‌‬
‫همانطور‌‬
‫مقالهی ‌«آرام ‌و ‌مطمئن‪‌ :‬چگونه ‌وزن ‌کم ‌کنیم ‌و ‌آن ‌را ‌ ‌‬ ‫همچنین ‌بر ‌روی ‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌74‬‬
‫دادهکاوی‌برای‌ ‌‬

‫نگهداریم» ‌نیز ‌کلیک ‌کرده ‌باشد‪‌،‬‬ ‫‌‬


‫احتماالً ‌به ‌دنبال ‌کم ‌کردن ‌وزن‌‬
‫است‪‌ .‬اگر ‌این ‌کاربر ‌بر ‌روی ‌یک‌‬
‫یفون ‌کلیک ‌کرد‪‌ ،‬احتماالً‌‬ ‫تبلیغ ‌از ‌آ ‌‬
‫به ‌آن ‌محصول ‌لالقه ‌دارد ‌(به ‌این‌‬
‫کار ‌– ‌یعنی ‌کلیک ‌کردن ‌یک ‌کاربر‌‬
‫بر ‌روی ‌یک ‌تبلیغ ‌‪‌ -‬در ‌اصالح‌‬
‫یشود)‪‌ .‬‬ ‫«‪‌»click through‬گفته‌م ‌‬
‫ککردنِ‌کاربران ‌بر‌روی‌محصوالت‪‌،‬در‌سایت‌‬ ‫یتوان‌از ‌کلی ‌‬ ‫تصور‌کنید‌که‌چه‌اطاللاتی‌را ‌م ‌‬
‫یسازی ‌شده‌‬
‫وبسایت ‌آمازون ‌که ‌برای ‌شما ‌شخص ‌‬
‫صفحهی ‌اصلیِ ‌ ‌‬‫‌‬ ‫آمازون ‌به ‌دست ‌آورد‪‌.‬در ‌‬
‫یآید‪‌ :‬‬ ‫است‪‌،‬این‌اطاللات‌به‌نمایش‌درم ‌‬
‫‌‬

‫‌‬
‫‌‬
‫یکند‪‌.‬آمازون ‌می‌داند ‌که‌‬
‫نگهداری ‌و ‌پیگیری ‌م ‌‬
‫کهای ‌کاربران ‌را ‌ ‌‬‫در ‌این ‌مثال‪‌ ،‬آمازون ‌کلی ‌‬
‫برای‌مثال‪‌،‬فردی‌که‌کتاب‌«‌ ‪Jupiter’s Travels: Four years around the world on a‬‬
‫یدیِ ‌«‪‌ »Long Way Round‬را ‌هم ‌مشاهده ‌کرده ‌است‪‌.‬‬ ‫یو ‌‬ ‫‪‌ »Triumph‬را ‌دی ‌‬
‫دهاست‪‌ ،‬د ‌‬
‫خچهی ‌بازیگری ‌به ‌نام ‌‪‌ Ewan McGregor‬است ‌که‌‬ ‫ویدیِ‌«‪‌»Long Way Round‬تاری ‌‬ ‫دی ‌‬
‫‌‬
‫همانطور ‌که ‌در‌شکلِ‌‬
‫یکرد‪‌ ‌.‬‬ ‫لهی ‌موتورسیکلت‪‌ ،‬به ‌سراسر ‌جهان ‌سفر ‌م ‌‬‫با ‌همسرش ‌به ‌وسی ‌‬
‫باال ‌از ‌سایت ‌آمازون ‌مشخص ‌است‪‌ ،‬این ‌اطاللات ‌در ‌قسمتِ ‌«مشتریانی ‌که ‌این ‌محصول ‌را‌‬
‫دهاند ‌( ‪Customers who viewed this‬‬ ‫کردهاند ‌همچنین ‌محصوالت ‌زیر ‌را ‌هم ‌دی ‌‬
‫مشاهده ‌‬
‫‌‬
‫‪‌»)also viewed‬مورد‌استفاده‌قرار‌می‌گیرد‪‌ .‬‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪75‬‬

‫یکند‪‌ .‬آمازون‪‌،‬‬
‫مورد ‌دیگری ‌از ‌امتیازدهیِ ‌ضمنی ‌چیزهایی ‌است ‌که ‌یک ‌کاربر ‌خرید ‌م ‌‬
‫آنها ‌برای ‌پیشنهادهایی ‌که ‌به ‌کاربر ‌می‌دهد‌‬
‫حواسش ‌به ‌این ‌اطاللات ‌هم ‌هست ‌و ‌از ‌ ‌‬
‫شدهاند ‌( ‪Frequently Bought‬‬ ‫یکند‪‌ :‬مانند ‌«اقالمی ‌که ‌معموالً ‌با ‌هم ‌خریده ‌ ‌‬
‫استفاده ‌م ‌‬
‫دهاند‌‬ ‫‪‌ »)Together‬و ‌یا ‌«مشتریان ‌که ‌این ‌قلم ‌را ‌دی ‌‬
‫دهاند‪‌ ،‬همچنین ‌اقالم ‌زیر ‌را ‌خری ‌‬
‫(‪‌ :»)Customers Who Viewed This Item Also Bought‬‬
‫‌‬

‫‌‬

‫‌‬
‫‌‬
‫شدهاند ‌( ‪Frequently‬‬
‫ممکن ‌است ‌فکر ‌کنید ‌که ‌قسمتِ ‌«اقالمی ‌که ‌معموالً ‌با ‌هم ‌خریده ‌ ‌‬
‫‪‌،»)Bought Together‬به‌پیشنهادهای‌غیرمتعارفی‌منجر‌خواهد‌شد‌ولی‌ای ‌‬
‫نطور‌نیست‌و‌‬
‫یکند‪‌ .‬‬‫خارقالعاده‌ای‌خوب‌کار‌م ‌‬
‫این‌روش‌به‌صورتی‌ ‌‬
‫برنامهی‌کامپیوتری‪‌،‬با‌مشاهده‌و‌نظارت‌بر‌رفتار‌شما‌در‌سایت‌‪‌،iTunes‬‬ ‫تصور‌کنید‌که‌یک‌ ‌‬
‫یتواند‌کسب‌کند‪‌ :‬‬ ‫چه‌اطاللاتی‌را‌م ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌79‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫اول‪‌ ،‬من ‌آهنگی ‌را ‌به ‌سایت ‌‪‌ iTunes‬اضافه ‌کردم‪‌.‬این ‌حداقل ‌به ‌این ‌معناست ‌که ‌من ‌این‌‬
‫آهنگ ‌را ‌دوست ‌داشتم‪‌ .‬همچنین ‌اطاللاتی ‌راجع ‌به ‌تعداد ‌دفعات ‌پخش ‌(ستونِ ‌‪‌)Plays‬‬
‫موجود ‌است‪‌.‬در ‌شکلِ ‌باال‪‌ ،‬به ‌آهنگِ ‌‪‌ Anchor‬از ‌‪‌ 51‌ ،Zee Avi‬مرتبه ‌گوش ‌ ‌‬
‫کردهام‪‌.‬این‌‬
‫نطور‌بوده‌است)‪‌.‬اگر‌‬ ‫بدین‌معناست‌که‌من‌این‌آهنگ‌را‌دوست‌داشتم‌(و‌در‌واقع‌هم‌همی ‌‬
‫کبار ‌به ‌آن‌‬
‫کتابخانهی ‌دیجیتالم ‌داشتم ‌و ‌فقط ‌ی ‌‬
‫‌‬ ‫قطعهی ‌موسیقی ‌را ‌در ‌‬
‫برای ‌مدتی ‌یک ‌ ‌‬
‫گوش‌می‌کردم‪‌،‬احتماالً‌به‌این‌معنا‌بود‌که‌من‌این‌آهنگ‌را‌دوست‌ندارم‪‌ .‬‬
‫‌‬
‫ورزش‌ذهنی‬
‫قتر‌باشد؟‬‫یکنید‌که‌امتیاز‌دادنِ‌صریحِ‌یک‌کاربر‌به‌یک‌قلم‌جنس‪‌،‬دقی ‌‬ ‫فکر‌نم ‌‬
‫یدهد ‌(برای ‌مثال‪‌ ،‬تعداد‌‬‫یخرد ‌و ‌یا ‌کاری ‌که ‌انجام ‌م ‌‬‫یا ‌برلکس‪‌ ،‬چیزی ‌که ‌یک ‌کاربر ‌م ‌‬
‫لالقهی‌یک‌کاربر‌باشد؟ ‌‬
‫دهندهی‌ ‌‬ ‫‌‬ ‫یتواند‌بیشتر‌ ‌‬
‫نشان‬ ‫دفعات‌پخش)‪‌،‬م ‌‬
‫کدام‌یک‌دقیقتر‌است؟‬
‫‌‬
‫‌‬

‫مثالی‌از‌امتیازدهی‌صریح‪‌ :‬‬
‫بیوگرافی‌افراد‌در‌سایت‌‪‌ :match.com‬‬
‫یآید‪‌،‬‬
‫نوشابهی‌خاصی‌خوشم‌م ‌‬
‫‌‬ ‫اهخوار‌هستم‪‌.‬از‌‬
‫من‌یک‌گی ‌‬
‫به ‌قدم ‌زدن ‌در ‌جنگل ‌هم ‌لالقه ‌دارم‪‌ .‬همچنین ‌خواندن‌‬
‫لمهای ‌فرانسوی‪‌،‬‬
‫آتش‪‌ ،‬فی ‌‬
‫کتابهای ‌چخوف ‌در ‌کنار ‌ ‌‬ ‫‌‬
‫یهای ‌«شومان‌‬‫موزهی ‌هنر ‌و ‌موسیق ‌‬ ‫آخرهفتهها ‌در ‌ ‌‬
‫‌‬
‫نوازندهی‌پیانو)»‌را‌هم‌دوست‌دارم‪‌ .‬‬
‫‌‬ ‫(‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪77‬‬

‫مثالی‌از‌امتیازدهی‌ضمنی‌(غیر‌صریح)‪‌ :‬‬
‫چیزهایی‌که‌در‌جیب‌‪‌Jim‬پیدا‌م ‌‬
‫یکنیم!‌ ‌‬
‫قبضهای‌مختلفی‌را‌مشاهده‌می‌کنیم‪‌ :‬‬ ‫در‌جیب‌او‪‌ ‌،‬‬
‫دوناتها‪‌ ،‬قبض‌‬
‫‌‬ ‫یهای ‌‪‌ ،Ben and Jerry‬پیتزا ‌و ‌‬‫‪‌ 21‬بسته ‌آبجو‪‌ ،‬فست ‌فود ‌واتابرگر‪‌ ،‬بستن ‌‬
‫کرای‌هی ‌‪‌ DVD‬مربوط ‌به ‌فیلم‌‬
‫اقامتگاه ‌شیطان‪‌:‬‬‫انتقامجویان‪‌ ‌ ،‬‬‫‌‬
‫مجازات‌و‌اونگ‌باك‌‪‌ 3‬‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬

‫مشکالت‌امتیازدهیِ‌صریح ‌‬
‫شمارهی ‌‪‌ :2‬مردم ‌تنبل ‌هستند ‌و ‌اقالم ‌را ‌امتیازدهی‌‬ ‫‌‬ ‫مشکل ‌‬
‫یکنند ‌‬ ‫نم ‌‬
‫یدهند ‌تا ‌اقالم ‌را ‌امتیازدهی‌‬
‫اول ‌اینکه‪‌ ،‬کاربران ‌به ‌خود ‌زحمت ‌نم ‌‬
‫کنند‪‌.‬فرض ‌می‌کنم ‌که ‌اکثر ‌شما‪‌ ،‬اقالمِ ‌متعددی ‌را ‌از ‌سایت ‌آمازون‌‬
‫کردهاید‪‌ .‬مانند ‌من‪‌ .‬در ‌ماهِ ‌گذشته‪‌ ،‬من ‌یک‌‬ ‫خریداری ‌ ‌‬
‫میکروهلیکوپتر‪‌،‬یک‌هارد‌‪‌2‬ترابایتی‪‌،‬یک‌مبدل‌‪‌USB‬به‌‪‌،SATA‬یک‌‬
‫بسته ‌ویتامین‪‌ ،‬دو ‌کتابِ ‌کیندل ‌(‪‌ Murder City‬و ‌ ‪Ready Player‬‬
‫نامهای‌«هیچ‌جایی‌برای‌مخفی‌شدن‌‬ ‫‪‌)One‬و ‌ ‌‬
‫کتابهای ‌کاغذی‌به‌ ‌‬
‫نیست»‪‌ 1«‌ ،‬هفته ‌برای ‌رسیدن ‌به ‌سالمتی» ‌از ‌دکتر ‌ویل‪«‌ ،‬ضد‌‬
‫سرطان‪‌:‬یک‌سبک‌جدید‌زندگی»‌و‌کتاب‌«باز‌انجام‌(‪‌»)Rework‬را‌‬
‫آنها ‌را‌‬
‫یشود‪‌ .‬ولی ‌چندتا ‌از ‌ ‌‬‫دهام‪‌ .‬همه ‌با ‌هم ‌‪‌ 21‬قلم ‌کاال ‌م ‌‬
‫خری ‌‬
‫کردهام؟ ‌هیچ ‌کدام ‌را! ‌تصورِ ‌من ‌این ‌است ‌که ‌شما ‌هم‌‬‫امتیازدهی ‌ ‌‬
‫یدهید‪‌ .‬‬‫یخرید‌امتیاز‌نم ‌‬ ‫نطور‌هستید‪‌.‬شما‌به‌چیزهایی‌که‌م ‌‬ ‫همی ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌71‬‬
‫دادهکاوی‌برای‌ ‌‬

‫من ‌درد ‌زانو ‌دارم‪‌.‬دوست ‌دارم ‌کوهنوردی ‌کنم ‌و ‌به ‌همین ‌دلیل ‌چند ‌لدد ‌لصای ‌دستی‌‬
‫دهام‌‬
‫آنها ‌که ‌ارزان ‌هم ‌هستند ‌را ‌از ‌سایت ‌آمازون ‌خری ‌‬ ‫مخصوص ‌راهپیمایی ‌دارم‪‌.‬بعضی ‌از ‌ ‌‬
‫جشنوارهی‌‬
‫‌‬ ‫که ‌مشکالتِ ‌زیادی ‌هم ‌داشتند‪‌ .‬سال ‌پیش ‌برای ‌سه ‌روز ‌جهتِ ‌شرکت ‌در ‌‬
‫موسیقی ‌به ‌شهر ‌«آستن ‌(‪‌»)Austin‬رفتم‪‌.‬مشکل ‌درد ‌زانوهایم ‌به ‌خاطر ‌پروازهای ‌متعدد‌‬
‫تشدید ‌شد ‌و ‌سرانجام ‌به ‌فروشگاهِ ‌‪‌ REI‬رفتم ‌تا ‌یک ‌لصای ‌دستیِ ‌تقریبا ‌گران‌قیمت ‌با ‌برند‌‬
‫ادهروی‌در‌سطح‌چمن‌در‌پاركِ‌شهر‪‌،‬این‌‬ ‫‪‌REI‬خریداری ‌کنم‪‌.‬در‌لرض ‌کمتر‌از‌یک ‌روز‌پی ‌‬
‫استفادهی‌‬
‫‌‬ ‫لصای ‌دستی ‌شکست‪‌.‬من ‌لصاهای ‌دستی ‌ارزان ‌قیمتِ ‌‪‌ 21‬دالری ‌داشتم ‌که ‌با ‌‬
‫یشکست‪‌ ،‬ولی ‌این ‌مدلِ ‌گران‌قیمت‪‌ ،‬بر ‌روی‌‬ ‫سخرهها ‌نم ‌‬
‫‌‬ ‫ممتد ‌در ‌کوهستان ‌در ‌میان ‌‬
‫چمنهای ‌مسطح ‌شکست‪‌.‬در ‌زمانِ ‌جشنواره‪‌ ،‬در ‌حالی‌که ‌لصبانی ‌بودم‪‌ ،‬با ‌خودم ‌گفتم ‌که‌‬ ‫‌‬
‫آنها‌‬
‫یکنم‌و‌یک‌خالصه‌و‌نظر‌راجع‌به‌ ‌‬ ‫بعداً‌حتماً‌لصاهای‌دستیِ‌برندِ‌‪‌REI‬را‌امتیازدهی‌م ‌‬
‫ینویسم‪‌.‬آیا ‌من ‌این ‌کار ‌را ‌انجام ‌دادم؟ ‌خیر!‌من‪‌،‬خیلی ‌خیلی ‌تنبل ‌هستم‪‌.‬حتی ‌در ‌این‌‬ ‫م‌‬
‫آدمهای ‌تنبل ‌مثل ‌من ‌زیاد‌‬ ‫یکنم ‌که ‌ ‌‬ ‫آنها ‌را ‌امتیازدهی ‌نکردم‪‌ .‬فکر ‌م ‌‬ ‫شرایطِ ‌بسیار ‌بد‪‌ ‌ ،‬‬
‫یانگیزه ‌هستند ‌که ‌بخواهند ‌محصوالت ‌را‌‬ ‫هستند‪‌ .‬مردم ‌به ‌طور ‌کل‪‌ ،‬خیلی ‌تنبل ‌یا ‌ب ‌‬
‫امتیازدهی‌کنند‪‌ .‬‬
‫‌‬
‫نکه‌اطاللات‌ناقص‌بدهند ‌‬ ‫شمارهی‌‪‌:1‬مردم‌ممکن‌است‌دروغ‌بگویند‌و‌یا‌ای ‌‬ ‫‌‬ ‫مشکل‌‬
‫فرض‌کنیم‌بالخره‌فردی‌بر‌مشکلِ‌تنبلی‌غلبه‌کرده‌باشد‌و‌یک‌محصول‌را‌امتیازدهی‌کند‪‌.‬‬
‫این‌شخص‌ممکن‌است‌دروغ‌بگوید‪‌.‬مردم‌ممکن‌است‌به‌صورتِ‌مستقیم‌دروغ‌بگویند‌–‌با‌‬
‫یشود ‌اطاللات ‌به ‌صورت ‌ناقص‌‬ ‫یدقتی ‌امتیاز ‌دهند ‌یا ‌سهواً ‌دروغ ‌بگویند ‌– ‌که ‌بالث ‌م ‌‬ ‫ب‌‬
‫یروند ‌تا ‌یک ‌فیلم ‌تایلندی ‌به ‌نام ‌« ‪Uncle‬‬ ‫ایجاد ‌شود‪‌ .‬مثالً ‌‪‌ Ben‬با ‌‪‌ Ann‬به ‌سینما ‌م ‌‬
‫آنها‪‌،‬با‌دوستِ‌‌‪‌Ben‬که‌‪‌Dan‬نام‌دارد‌و‌همچنین‌دوستِ‌‪‌Dan‬که‌‬ ‫‪‌»Boonmee‬را‌ببینند‪‌ ‌.‬‬
‫‪‌ Clara‬نام ‌دارد ‌به ‌سینما ‌می‌روند‪‌ Ben‌ .‬بعد ‌از ‌دیدنِ ‌فیلم‪‌ ،‬فکر ‌می‌کند ‌که ‌این ‌بدترین‌‬
‫فیلمی‌است‌که‌تا‌به‌حال‌دیده‌است‪‌.‬ولی‌بقی‌هی‌همراهانِ‌‪‌Ben‬لاشق‌این‌فیلم‌شده‌بودند‌‬
‫یخندیدند‪‌ .‬طبیعتاً ‌خیلی‌‬ ‫و ‌بعد ‌از ‌فیلم ‌در ‌رستوران ‌در ‌مورد ‌آن ‌صحبت ‌می‌کردند ‌و ‌م ‌‬
‫رتبهبندیِ‌فیلم‪‌،‬باالتر‌‬
‫تهای‌ ‌‬ ‫غیرلادی‌نیست‌که‌‪‌،Ben‬رایِ‌خود‌را‌در‌مورد‌این‌فیلم‌در‌سای ‌‬
‫از‌تصور‌خودش‌بزند‪‌ .‬‬
‫‌‬
‫یکنند ‌‬
‫بههنگام‌(آپدیت)‌نم ‌‬ ‫دادهاند‌را‌ ‌‬
‫شمارهی‌‪‌:3‬مردم‌امتیازهایی‌که‌ ‌‬ ‫‌‬ ‫مشکل‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪76‬‬

‫فرض ‌کنید ‌من ‌بعد ‌از ‌نوشتنِ ‌این ‌فصل ‌از ‌کتاب‪‌ ،‬انگیزه ‌پیدا ‌کردم ‌تا ‌محصوالتی ‌که ‌از‌‬
‫آمازون ‌خریدم ‌را ‌در ‌این ‌سایت ‌امتیازدهی ‌کنم‪‌ .‬آن ‌هارد ‌دیسکِ ‌‪‌ 2‬ترابایتی ‌خوب ‌کار‌‬
‫یصداست‪‌ .‬من ‌به ‌این ‌هارد ‌دیسک ‌پنج ‌ستاره‌‬ ‫یکند ‌– ‌سرلتِ ‌خوبی ‌دارد ‌و ‌خیلی ‌ب ‌‬ ‫م‌‬
‫یدهم‪‌.‬آن‌میکروهلیکوپتر‌نیز‌لالی‌است‪‌.‬پرواز‌آن‌راحت‌است‌و‌بسیار‌سرگرم‌کننده‌هست‌‬ ‫م‌‬
‫و ‌همچنین ‌از ‌چندین ‌تصادف ‌و ‌برخورد‪‌ ،‬جان ‌سالم ‌به ‌در ‌برده‪‌.‬یک ‌پنج ‌ستاره ‌هم ‌به ‌این‌‬
‫یشود ‌و ‌در ‌نتیجه ‌من ‌تمام‌‬‫یگذرد‪‌.‬هارد ‌دیسک ‌خراب ‌م ‌‬ ‫یدهم‪‌.‬یک ‌ماه ‌م ‌‬
‫میکروهلیکوپتر ‌م ‌‬
‫یهایی ‌که ‌دانلود ‌کرده ‌بودم ‌را ‌از ‌دست ‌می‌دهم ‌– ‌و ‌این ‌خیلی ‌آزاردهنده‌‬
‫لمها ‌و ‌موسیق ‌‬
‫فی ‌‬
‫است‪‌ .‬آن ‌میکروهلیکوپتر ‌ناگهان ‌کار ‌نمی‌کند ‌– ‌انگار ‌موتورش ‌خراب ‌شده‪‌ .‬االن ‌که ‌فکر‌‬
‫یخود ‌هستند‪‌ .‬ولی ‌به ‌احتمالِ ‌زیاد‪‌ ،‬به ‌سایت ‌آمازون‌‬ ‫یکنم‪‌ ،‬هر ‌دوی ‌این ‌محصوالت‪‌ ،‬ب ‌‬ ‫م‌‬
‫بههنگام‌(آپدیت)‌نمی‌کنم‌‬ ‫دادهام‌را‌ ‌‬
‫نخواهم‌رفت‌و‌این‌یعنی‌امتیازی‌که‌قبالً‌به‌محصوالت‌ ‌‬
‫یکنند ‌که ‌نظرِ ‌من‪‌ ،‬همان ‌‪‌ 5‬ستاره ‌به ‌هر ‌کدام ‌از‌‬ ‫(دوباره ‌تنبلی!)‪‌ .‬مردم ‌هنوز ‌فکر ‌م ‌‬
‫نهاست! ‌‬ ‫ای ‌‬
‫‌‬

‫‌‬
‫‌‬
‫‪‌Mary‬را‌در‌نظر‌بگیرید‌که‌یک‌دانشجو‌است‪‌.‬به‌دالیلی‪‌،‬او‌دوست‌دارد‌تا‌در‌سایت‌آمازون‌‬
‫لالقهاش ‌را ‌با ‌‪‌ 5‬ستاره‌‬
‫به ‌محصوالت ‌امتیاز ‌دهد‪‌ .‬ده ‌سال ‌پیش‪‌ ،‬او ‌آلبومِ ‌موسیقیِ ‌مورد ‌ ‌‬
‫امتیاز ‌داده ‌است‪‌ .‬آلبوم ‌«‪‌ »Giggling and Laughing: Silly Songs for Kids‬و ‌آلبوم‌‬
‫«‪‌ !»Sesame Songs: Sing Yourself Silly‬اخیراً ‌نیز ‌او ‌چند ‌آلبوم ‌موسیقی ‌را ‌‪‌ 5‬ستاره‪‌،‬‬
‫آلبومهای ‌«‪‌»Wolfgang Amadeus Phoenix‬و ‌« ‪The Twilight Saha:‬‬ ‫دادهاست‪‌ ‌.‬‬ ‫امتیاز ‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌11‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‪‌.»Eclipse Sourdtrack‬بر ‌اساس ‌این ‌امتیازاتِ ‌اخیر‪‌ Mary‌ ،‬به ‌یک ‌دانشجوی ‌دیگر ‌به ‌نام‌‬
‫یزنید‪‌ ،‬کار‌‬‫همانطور ‌که ‌حدس ‌م ‌‬
‫کترین ‌همسایه‪‌،‬انتخاب‌شده‌است‪‌ ‌.‬‬ ‫‪‌ Jen‬به‌لنوانِ‌نزدی ‌‬
‫لجیبیست ‌اگر ‌آلبومِ ‌«‪‌ »Giggling and Laughing: Silly Songs for Kids‬را ‌به ‌‪‌Jen‬‬
‫بههنگام ‌نبودن ‌امتیازات ‌و ‌سالیق‌‬ ‫مسئلهی ‌ ‌‬
‫‌‬ ‫پیشنهاد ‌دهیم‪‌.‬این ‌مشکل ‌نیز‪‌ ،‬یک ‌نوعِ ‌دیگر ‌از ‌‬
‫است‪‌ .‬‬
‫‌‬
‫ورزش‌ذهنی‪:‬‬
‫به‌نظر‌شما‪‌،‬مشکالتِ‌امتیازدهی‌به‌صورت‌ضمنی‌(غیر‌صریح)‌چیست؟‬
‫(راهنمایی‪‌:‬در‌مورد‌خریدهایتان‌از‌سایتی‌مانند‌آمازون‌فکر‌کنید)‬
‫‌‬
‫در ‌چند ‌پاراگرافِ ‌باالتر‪‌ ،‬لیستی ‌از ‌خریدهای ‌خودم ‌در ‌یک ‌ماهِ ‌گذشته ‌از ‌سایت ‌آمازون ‌را‌‬
‫گذاشتم‪‌.‬فرض‌کنید‌من‌دو‌تا‌از‌این‌اجناس‌را‌برای‌شخص‌دیگری‌خریده‌باشم‪‌.‬مثالً‌کتابِ‌‬
‫«ضد ‌سرطان» ‌را ‌برای ‌پسر ‌لمویم ‌و ‌کتابِ ‌«باز ‌انجام ‌(‪‌»)Rework‬را ‌برای ‌پسرم ‌خریدم‪‌.‬‬
‫یتواند ‌منجر ‌به ‌مشکل ‌شود‪‌ ،‬اجازه ‌بدهید ‌مثالی‌‬ ‫نکه ‌نشان ‌دهم ‌چرا ‌این ‌موضوع ‌م ‌‬ ‫برای ‌ای ‌‬
‫سابقهی‌خریدهای‌‬ ‫لقبتر ‌برگردیم‌و‌ ‌‬ ‫نکار‌باید‌به ‌کمی ‌ ‌‬ ‫متقالدکنندهتر‌برایتان‌بزنم‪‌.‬برای‌ای ‌‬
‫‌‬
‫من‌را‌نگاه ‌کنیم‪‌.‬من‌چند‌وزنه‌ی‌ورزشی ‌(‪‌)kettlebells‬را‌همراهِ‌کتاب‌«شروع ‌کار‌با‌وزنه‪‌:‬‬
‫سوپرمنهای ‌شوروی» ‌به ‌لنوان ‌هدیه ‌برای ‌پسرم ‌خریدم‪‌.‬همراه ‌این ‌دو ‌قلم ‌جنس‪‌،‬‬ ‫‌‬ ‫رازهای ‌‬
‫یک‌سگِ‌پشمالوی‌جدید‌برای‌همسرم‌خریدم‪‌،‬چون‌سگِ‌قبلی‌ما‌در‌‪‌24‬سالگی‌فوت‌کرد‪‌.‬‬
‫یتواند‌معیاری‌برای‌این‌باشد‌که‌مردم‌چه‌چیزهایی‌دوست‌‬ ‫سابقهی‌خرید‌م ‌‬
‫اگر‌فرض‌کنیم‌ ‌‬
‫وزنهی ‌ورزشی ‌دوست ‌دارند‪‌،‬‬ ‫دارند‪‌ ،‬احتماالً ‌در ‌این ‌مثال ‌باید ‌فرض ‌کنیم‪‌ ،‬افرادی ‌که ‌ ‌‬
‫کتابهای ‌ضدسرطان ‌و ‌نیز ‌کتابِ‌‬ ‫اسباببازی‪‌ ،‬میکروهلیکوپترها‪‌ ‌ ،‬‬ ‫‌‬ ‫همچنین ‌به ‌حیواناتِ ‌‬
‫یتواند ‌بین‌‬ ‫سابقهی ‌خریدهای ‌آمازون‪‌ ،‬نم ‌‬‫شمارهی ‌یک» ‌نیز ‌لالقه ‌دارند‪‌ ‌ .‬‬ ‫‌‬ ‫«قهرمان ‌‬
‫یدهم‌و‌خریدهایی ‌که‌به ‌لنوان‌هدیه‌برای‌دیگران‌انجام‌‬ ‫خریدهایی ‌که‌برای‌خودم‌انجام‌م ‌‬
‫دادهام‪‌،‬تمایزی‌قائل‌شود‪‌.‬آقای‌‪‌،Stephen Baker‬یک‌مثالِ‌مرتبط‌در‌این‌زمینه‌دارد‪‌ :‬‬ ‫‌‬
‫تصور ‌کنید ‌در ‌قدمِ ‌اول‪‌ ،‬یک ‌کامپیوتر ‌بایستی ‌بفهمد ‌که ‌یک ‌بلوزِ ‌سفیدِ ‌خاص‪‌ ،‬به ‌دردِ ‌یک‌‬
‫یخورد‪‌.‬مهمترین ‌کار ‌این ‌است ‌که ‌یک ‌پروفایل ‌برای ‌شخصی ‌که ‌این ‌بلوز ‌را‌‬ ‫نوزادِ ‌دختر ‌م ‌‬
‫خریداری ‌کرده ‌است ‌درست ‌کنیم‪‌.‬فرض ‌کنید ‌این ‌شخص‪‌ ،‬همسر ‌من ‌است‪‌.‬او ‌به ‌سایت‌‬
‫لباسهای‌‬
‫یخرد‪‌ ‌ .‬‬ ‫یرود ‌و ‌چهار ‌یا ‌پنج ‌قلم ‌جنس ‌م ‌‬ ‫‪(‌ Macy‬سایتی ‌جهت ‌خرید ‌لباس) ‌م ‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪12‬‬

‫مختلفی ‌مانند ‌شلوار ‌و ‌بلوز ‌و ‌کمربند‪‌.‬تمامیِ ‌این ‌اقالم‪‌ ،‬متناسب ‌با ‌یک ‌شخصی ‌مانند ‌او‌‬
‫یآیند‌‬‫هستند‪‌.‬سپس ‌در ‌هنگامِ ‌اتمامِ ‌خرید‪‌ ،‬یادش ‌م ‌‬
‫سالهاش‪‌،‬‬
‫برادرزادهی ‌شانزده ‌ ‌‬‫‌‬ ‫که ‌باید ‌برای ‌تولدِ ‌‬
‫برادرزادهاش ‌را ‌دیده‌‬
‫‌‬ ‫هدی‌های ‌بخرد‪‌.‬آخرین ‌باری ‌که ‌‬
‫نوشتههای ‌زیادی ‌بر‌‬
‫‌‬ ‫بودیم‪‌ ،‬یک ‌لباس ‌مشکلی ‌با ‌‬
‫نوشتههای‌‬
‫‌‬ ‫نوشتهها‪‌،‬‬
‫‌‬ ‫روی‌آن‌پوشیده‌بود‪‌.‬بیشترِ‌این‌‬
‫خشمگینی ‌بود! ‌خودِ ‌او ‌به ‌ما ‌گفته ‌بود ‌که ‌خود ‌را‌‬
‫یداند‪‌ .‬برای‌‬‫یک ‌گُت ‌(‪‌ –‌ goth‬یک ‌نژاد ‌آلمانی) ‌م ‌‬
‫همین ‌همسر ‌من‪‌ ،‬به ‌یک ‌قسمتِ ‌دیگر ‌رفت ‌و ‌یک‌‬
‫خهای‌تیز‌برداشت!!! ‌‬ ‫دستبند‌با‌می ‌‬
‫‌‬

‫اگر ‌بخواهیم ‌پروفایل ‌یک ‌کاربر ‌– ‌برای ‌مثال ‌همین ‌همسر ‌آقای ‌‪‌ –‌ Stephen Baker‬را‌‬
‫مشکلساز‌خواهد‌بود‪‌ .‬‬
‫‌‬ ‫خهای‌تیز‪‌،‬‬ ‫دستبند‌با‌می ‌‬
‫بسازیم‪‌،‬این‌ ‌‬
‫برای ‌مثالِ ‌آخر‪‌ ،‬فرض ‌کنید ‌یک ‌زن ‌و ‌شوهر‪‌ ،‬از ‌یک ‌اکانتِ ‌‪‌ Netflix‬استفاده ‌کنند‪‌.‬مرد ‌از‌‬
‫یآید‪‌ .‬اما ‌خانم‪‌،‬‬ ‫نها ‌است ‌خوشش ‌م ‌‬ ‫لمهای ‌اکشن‪‌ ،‬که ‌دارای ‌انفجار ‌و ‌هلیکوپتر ‌و ‌ای ‌‬ ‫فی ‌‬
‫مشاهدهی‌‬
‫‌‬ ‫خچهی ‌‬
‫لمهای ‌فکری ‌و ‌رمانتیک‪-‬کمدی ‌را ‌دوست ‌دارد‪‌ .‬اگر ‌ما ‌فقط ‌به ‌تاری ‌‬ ‫فی ‌‬
‫دستهی ‌کامالً‌‬
‫لمها ‌نگاه ‌کنیم‪‌ ،‬با ‌پروفایلی ‌مواجه ‌خواهیم ‌شد ‌که ‌انگار ‌یک ‌شخص‪‌ ،‬به ‌دو ‌ ‌‬ ‫فی ‌‬
‫لمها‪‌،‬لالقه‌دارد‪‌ .‬‬‫متفاوت‌از‌فی ‌‬
‫یادتان ‌بیاید ‌که ‌قبال ‌گفتم ‌کتابِ ‌«ضد ‌سرطان‪‌:‬یک ‌سبک ‌جدید ‌برای ‌زندگی» ‌را ‌به ‌لنوان‌‬
‫سابقهی ‌خریدِ ‌من ‌را ‌کمی ‌بیشتر ‌واکاوی ‌کنیم‪‌،‬‬ ‫هدیه ‌برای ‌پسرلمویم ‌خریده ‌بودم‪‌ .‬اگر ‌ ‌‬
‫یبینیم‌که‌من ‌قبالً‌این‌کتاب‌را‌باز‌هم‌خریده‌بودم‪‌.‬در‌واقع‪‌،‬چندین‌کپی‌از‌از‌سه ‌کتاب‌‬ ‫م‌‬
‫نگونه ‌فکر ‌کند ‌که ‌خریدهای ‌متوالیِ ‌من‪‌ ،‬به ‌خاطر ‌گم‌‬ ‫یتواند ‌ای ‌‬
‫را ‌خریدم‪‌ .‬حال ‌فردی ‌م ‌‬
‫کردهام‪‌،‬‬
‫کتابها ‌را ‌قبالً ‌خریداری ‌ ‌‬
‫کردهام ‌که ‌این ‌ ‌‬
‫نکه ‌فراموش ‌ ‌‬ ‫شدنِ ‌کتاب ‌و ‌یا ‌به ‌خاطر ‌ای ‌‬
‫یترین ‌استدالل‪‌ ،‬این ‌است ‌که ‌این ‌شخص ‌با ‌خود ‌بگوید ‌که ‌من ‌این‌‬ ‫نبوده ‌است‪‌ .‬منطق ‌‬
‫و‌فرستادهام‪‌.‬‬
‫‌‬ ‫کتابها ‌را ‌اینقدر ‌دوست ‌داشتم ‌که ‌به ‌لنوان ‌هدیه ‌برای ‌چندین ‌نفر ‌خریده ‌‬ ‫‌‬
‫سابقهی ‌خرید ‌افراد ‌به ‌دست‌‬
‫یتوانیم ‌اطاللاتِ ‌بسیار ‌زیادی ‌را ‌از ‌ ‌‬ ‫یشویم ‌که ‌م ‌‬ ‫پس ‌متوجه ‌م ‌‬
‫آوریم‪.‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌11‬‬
‫دادهکاوی‌برای‌ ‌‬

‫ورزش‌ذهنی‬
‫مشاهدهی ‌رفتارِ ‌یک ‌فرد ‌با ‌یک‌‬
‫‌‬ ‫یتوان ‌از ‌‬
‫دادههای ‌ضمنی) ‌م ‌‬
‫استفادهای ‌(به ‌لنوان ‌ ‌‬
‫‌‬ ‫چه ‌‬
‫کامپیوتر‌کرد؟‌‬
‫‌‬
‫دادههای‌ضمنی‪‌ :‬‬‫‌‬
‫صفحات‌وب‪‌ :‬‬
‫کلیک‌کردن‌بر‌روی‌یک‌لینک‌از‌یک‌صفحه ‌‬
‫زمانی‌سپری‌شده‌در‌هنگام‌خواندنِ‌یک‌صفحه ‌‬
‫بارهی‌یک‌صفحه ‌‬
‫مشاهدهی‌چندین‌ ‌‬
‫‌‬
‫دادهی‌یک‌صفحه‌به‌صفحات‌دیگر ‌‬ ‫ارجاع‌ ‌‬
‫دهاست ‌‬ ‫اینکه‌یک‌شخص‌چه‌صفحاتی‌را‌در‌سایت‌‪‌ (‌Hulu‬‬
‫وبسایت‌پخش‌ویدیو)‌دی ‌‬
‫‌‬
‫کنندهی‌موسیقی‪‌ :‬‬
‫‌‬ ‫‌‬
‫پخش‬
‫یها‌را‌پخش‌کرده‌است ‌‬‫نکه‌یک‌شخص‌کدام‌موسیق ‌‬ ‫ای ‌‬
‫یها‌بدون‌گوش‌دادن‌لبور‌کرده‌است ‌‬ ‫از‌کدام‌موسیق ‌‬
‫تعداد‌دفعاتی‌که‌یک‌موسیقیِ‌تکراری‌را‌گوش‌داده‌است ‌‬
‫‌‬
‫دادههای‌ضمنی‌بودند! ‌‬
‫مثالهای‌سطحی‌از‌ ‌‬
‫نها‌فقط‌ ‌‬ ‫البته‌ای ‌‬
‫‌‬
‫تمهای ‌معرفی ‌شده ‌در ‌فصلِ ‌دوم‪‌ ،‬بدون ‌توجه ‌به ‌صریح ‌یا‌‬‫توجه ‌داشته ‌باشید ‌که ‌الگوری ‌‬
‫یتوانند‌مورد‌استفاده‌قرار‌گیرند‪‌ .‬‬
‫دادهها‪‌،‬م ‌‬
‫ضمنی‌بودنِ‌ ‌‬
‫‌‬

‫مشکل‌موفقیت ‌‬
‫شنهاددهندهی‌‬
‫‌‬ ‫فرض‌کنید‪‌،‬شما‌یک‌سرویس‌آنالین‌موسیقی‌دارید‌که‌دارای‌یک‌سیستم‌پی‬
‫یتواند‌اتفاق‌بیوفتد؟ ‌‬ ‫داخلی‌است‪‌.‬مشکل‌کجا‌م ‌‬
‫فرض ‌کنید ‌این ‌سیستم ‌یک ‌میلیون ‌کاربر ‌دارد‪‌.‬هر ‌بار‌که ‌بخواهید ‌یک ‌پیشنهاد ‌برای ‌یک‌‬
‫فاصلهی‌این‌شخص‌را‌با‌‪‌666666‬نفرِ‌دیگر‌مقایسه‌کنید‪‌.‬حاال‌‬ ‫شخص‌آماده‌کنید‪‌،‬بایستی‌ ‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪13‬‬

‫فرض ‌کنید ‌که ‌بخواهیم ‌چندین ‌پیشنهاد ‌را ‌در ‌هر ‌ثانیه ‌به ‌افرادِ ‌مختلف ‌بدهیم‪‌ .‬به ‌این‌‬
‫صورت ‌محاسبات ‌بسیار ‌پیچیده ‌و ‌سخت ‌خواهد ‌شد‪‌.‬به ‌جز ‌در ‌حالتی ‌که ‌خرجِ ‌زیادی ‌برای‌‬
‫یتر‪‌ ،‬تاخیر‌‬‫خریدِ ‌سرورها ‌(‪‌ )servers‬انجام ‌دهید‪‌ ،‬سیستم ‌کُند ‌خواهد ‌شد‪‌ .‬به ‌بیانِ ‌رسم ‌‬
‫ستمهای‌پیشنهاددهنده‌مبتنی‌بر‌همسایگی‌‬ ‫یتواند‌یک‌مشکلِ‌اساسی‌در‌سی ‌‬ ‫(‪‌،)latency‬م ‌‬
‫(‪‌)neighbor-based‬باشد‪‌.‬البته‌که‌خوشبخاته‌یک‌راه‌حل‌وجود‌دارد‪‌ .‬‬
‫‌‬

‫‌‬
‫یک‌مزرلهی‌سرور‌(‪‌ )server farm‬‬
‫‌‬
‫‌‬

‫پایشِ‌مبتنی‌بر‌کاربر‌(‪‌ )User-based Filtering‬‬


‫نجای ‌کار‪‌ ،‬ما ‌پایشِ ‌مبتی ‌بر ‌کاربران ‌به ‌صورت ‌مشارکتی ‌را ‌مد ‌نظر ‌قرار ‌می‌دادیم‪‌.‬‬
‫تا ‌به ‌ای ‌‬
‫کترین‌‬‫نکار‌بایستی‌یک‌کاربر‌را‌با‌تمامیِ‌کاربرانِ‌دیگر‌مقایسه‌کنیم‌تا‌بتوانیم‌نزدی ‌‬ ‫برای‌ای ‌‬
‫افراد‌را‌شناسایی‌کنیم‪‌.‬دو‌مشکل‌اصلی‌در‌این‌روش‌وجود‌دارد‪‌ :‬‬
‫اسپذیری ‌(‪‌ ‌ .)scalability‬‬
‫همانطور ‌که ‌گفتیم‪‌ ،‬با ‌زیاد ‌شدنِ ‌کاربران‪‌ ،‬محاسبات ‌نیز‌‬ ‫‪‌.2‬مقی ‌‬
‫روشهای ‌مبتنی ‌بر ‌کاربر ‌(‪‌ ،)user-based‬ممکن ‌است ‌با ‌هزاران ‌کاربر ‌خوب‌‬ ‫یشود‪‌ ‌.‬‬ ‫زیاد ‌م ‌‬
‫یخورد‪‌ .‬‬‫آنها‌به‌مشکل‌برم ‌‬ ‫کار‌کنند‪‌،‬ولی‌با‌کاربران‌میلیونی‪‌،‬مقیاس‌پذیریِ‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌14‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‪‌ .1‬تنک ‌بودن ‌(‪‌ .)sparsity‬بسیاری ‌از ‌سی ‌‬


‫ستمهای ‌پیشنهاددهنده‪‌ ،‬تعداد ‌زیادی ‌کاربر ‌و‌‬
‫محصول ‌دارند‪‌ .‬ولی ‌هر ‌کاربر ‌به ‌صورت ‌میانگین‪‌ ،‬درصدِ ‌کمی ‌از ‌محصوالت ‌را ‌امتیازدهی‌‬
‫ونها‌کتاب‌دارد‌ولی‌به‌طور‌میانگین‪‌،‬کاربران‪‌،‬تعداد‌‬
‫یکند‪‌.‬برای‌مثال‪‌،‬سایت‌آمازون‪‌،‬میلی ‌‬ ‫م‌‬
‫تمهایی ‌که ‌در‌‬
‫کردهاند‪‌.‬به ‌همین ‌دلیل‪‌ ،‬الگوری ‌‬
‫کتابها ‌را ‌امتیازدهی ‌ ‌‬
‫انگشتشماری ‌از ‌این ‌ ‌‬
‫‌‬
‫فصل ‌دوم ‌گفته ‌شد‪‌ ،‬ممکن ‌است ‌نتوانند ‌هیچ ‌همسای‌هی ‌نزدیکی ‌را ‌برای ‌یک ‌شخص ‌پیدا‌‬
‫کنند‪‌ .‬‬
‫به‌خاطرِ‌وجود‌این‌دو‌مشکل‪‌،‬بهتر‌است‌از‌پایش‌مبتنی‌بر‌اقالم‌(‪‌)item-based filtering‬‬
‫استفاده‌کنیم‪‌ .‬‬
‫‌‬

‫پایش‌مبتنی‌بر‌اقالم‌(‪‌ )Item-Based Filtering‬‬


‫یتواند ‌محصوالتی ‌که ‌بیشتر ‌شبیه ‌به ‌هم‌‬ ‫فرض ‌کنید ‌من ‌الگوریتمی ‌در ‌اختیار ‌دارم ‌که ‌م ‌‬
‫یببرد‌‬‫یتواند‌به‌این‌موضوع‌پ ‌‬ ‫هستند‌را‌شناسایی‌کند‪‌.‬برای‌مثال‪‌،‬یک‌همچین‌الگوریتمی‌م ‌‬
‫که ‌آلبوم ‌‪‌ Wolfgang Amadeus Phoenix‬به ‌آلبوم ‌‪‌ Manners‬شباهت ‌دارد‪‌ .‬بر ‌همین‌‬
‫اساس‪‌ ،‬اگر ‌کاربری‪‌ ،‬آلبومِ ‌‪‌ Wolfgang Amadeus Phoenix‬را ‌با ‌امتیازِ ‌باالیی ‌امتیازدهی‌‬
‫یتوانیم ‌آلبوم ‌‪‌ Manners‬را ‌به ‌او ‌پیشنهاد ‌دهیم‪‌.‬توجه ‌کنید ‌که ‌این ‌روش‪‌ ،‬با ‌روشِ‌‬ ‫کرد‪‌ ،‬م ‌‬
‫مبتنی ‌بر ‌کاربر ‌(‪‌)user-based‬متفاوت ‌است‪‌.‬در ‌روشِ ‌مبتنی ‌بر ‌کاربر‪‌ ،‬ما ‌یک ‌کاربر ‌را ‌در‌‬
‫نظر‌داشتیم ‌و ‌به ‌دنبال ‌پیدا ‌کردنِ ‌شبی‌هترین ‌شخص ‌به ‌او ‌در ‌میان ‌کاربرانِ ‌دیگر ‌بودیم ‌تا‌‬
‫بتوانیم ‌توسطِ ‌امتیازاتِ ‌دیگران‪‌ ،‬پیشنهادهایی ‌را ‌برای ‌این ‌کاربر ‌پیدا ‌کنیم‪‌.‬ولی ‌در ‌پایشِ‌‬
‫آنها‌را‌‬
‫مبتنی‌بر‌اقالم‪‌،‬قبل‌از‌زمانِ‌پیشنهاد‪‌،‬شبی‌هترین‌اقالم‌را‌به‌یکدیگر‌پیدا‌می‌کنیم‌و‌ ‌‬
‫یا‌توصیههایی‌را‌شکل‌دهیم‪‌ .‬‬
‫‌‬ ‫با‌امتیازاتِ‌کاربران‌ترکیب‌کرده‌تا‌بتوانیم‌پیشنهادها‌‬
‫یتوانی‌مثالی‌از‌این‌موضوع‌به‌من‌بگویی؟ ‌‬ ‫م‌‬
‫فرض ‌کنید ‌سایتِ ‌موسیقیِ ‌ما‪‌ ،‬دارای ‌‪‌ m‬کاربر ‌و ‌‪‌ n‬گروه ‌موسیقی ‌باشد ‌که ‌در ‌این ‌سایت‪‌،‬‬
‫یکنند‪‌ .‬در ‌شکلِ ‌زیر ‌این ‌امتیازدهی ‌مشخص‌‬ ‫گروههای ‌موسیقی ‌را ‌امتیازدهی ‌م ‌‬
‫کاربران‪‌ ‌ ،‬‬
‫گروههای ‌موسیقی‌‬ ‫دهندهی ‌ ‌‬‫‌‬ ‫ستونها ‌ ‌‬
‫نشان‬ ‫‌‬ ‫انگرِ ‌کاربران ‌بوده ‌و ‌‬
‫است‪‌.‬مانند ‌قبل‪‌ ،‬سطرها ‌بی ‌‬
‫هستند‪‌ .‬‬
‫‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪15‬‬

‫‌‬
‫‌‬
‫یخواهیم‌شباهتِ‌ببین‌گروه‌موسیقیِ‌‪‌Phoenix‬را‌با‌گروه‌موسیقیی‌‪‌Passion Pit‬مقایسه‌‬ ‫م‌‬
‫دادهاند ‌استفاده‌‬
‫کنیم‪‌ .‬برای ‌انجام ‌این ‌کار ‌از ‌کاربرانی ‌که ‌به ‌هر ‌دو ‌گروهِ ‌موسیقی ‌امتیاز ‌ ‌‬
‫همانطور ‌که ‌متوجه ‌شدید‪‌ ،‬در ‌روشِ ‌پایش ‌مبتنی ‌بر‌‬
‫لهای ‌آبی ‌رنگ)‪‌ ‌.‬‬ ‫یکنیم ‌(مستطی ‌‬ ‫م‌‬
‫گروههای ‌موسیقی ‌– ‌را‌‬
‫نجا ‌ ‌‬ ‫ستونها ‌– ‌در ‌ای ‌‬
‫اقالم ‌(‪‌ ،)item-based filtering‬شباهتِ ‌بینِ ‌ ‌‬
‫یکنیم‪‌ .‬‬ ‫با‌یکدیگر‌مشخص‌م ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌19‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪17‬‬

‫شباهت‌کسینوسیِ‌تعدیل‌شده‌(‪‌ )Adjusted Cosine Similarity‬‬


‫محاسبهی ‌شباهتِ ‌بین ‌اقالم‪‌ ،‬ما ‌از ‌معیارِ ‌شباهتِ ‌کسینوسی ‌که ‌در ‌فصل ‌دوم ‌معرفی‌‬ ‫‌‬ ‫برای ‌‬
‫یکنیم‪‌ .‬همان‌طور ‌که ‌خاطرتان ‌هست‪‌ ،‬در ‌مورد ‌تورم ‌درجه ‌( ‪grade‬‬ ‫شد‪‌ ،‬استفاده ‌م ‌‬
‫کردهایم‪‌.‬تورم ‌درجه ‌به ‌این ‌معناست ‌که ‌کاربری ‌امتیاز ‌باالتری ‌را‌‬‫‪‌)inflation‬نیز ‌صحبت ‌ ‌‬
‫نسبت ‌به ‌چیزی ‌که ‌از ‌او ‌انتظار ‌داریم‪‌ ،‬به ‌محصولی ‌می‌دهد‪‌ .‬برای ‌جبران ‌این ‌تورم‪‌ ،‬ما‌‬
‫یکنیم‪‌.‬این ‌کار‪‌ ،‬به ‌ما ‌مقدار ‌شباهتِ‌‬
‫میانگین ‌امتیازاتِ ‌کاربر ‌را ‌از ‌هر ‌کدام ‌از ‌امتیازات ‌کم ‌م ‌‬
‫یدهد‪‌ .‬‬‫لشده‌را‌م ‌‬ ‫کسینوسیِ‌تعدی ‌‬

‫∑‬ ‫(‬ ‫)̅̅̅̅‬ ‫̅̅̅̅‬

‫∑√‬ ‫(‬ ‫∑√ )̅̅̅̅‬ ‫(‬ ‫)̅̅̅̅‬


‫برنامهنویسان‬ ‫‪‌ ■‌11‬‬
‫دادهکاوی‌برای‌ ‌‬

‫مجمولهی ‌تمامیِ ‌کاربرانی ‌است ‌که ‌هر ‌دو ‌آیتمِ ‌‪‌ i‬و ‌‪‌ j‬را ‌امتیازدهی‌‬
‫‌‬ ‫در ‌فرمولِ ‌باال‪‌ ،U‌ ،‬‬
‫کردهاند‪‌ .‬‬
‫‌‬
‫مقالهی ‌اصلیِ ‌پایش ‌مشارکتی ‌استخراج ‌شده ‌است‪‌ .‬این ‌مقاله ‌با ‌لنوان‌‬ ‫فرمول ‌باال ‌از ‌ ‌‬
‫نوشتهی‌ ‪Badrul‬‬
‫‌‬ ‫تمهای‌توصیه‌گر‌جهت‌پایش‌مبتنی‌بر‌اقالم‌به‌صورت‌مشارکتی»‌‬ ‫«الگوری ‌‬
‫‪‌ Joseph Konstan‌ ،George Karypis‌ ،Sarwar‬و ‌ ‪‌ Jon Reidl‬در‌‬
‫(‪‌ (http://www.grouplens.org/papers/pdf/www10_sarwar.pdf‬انتشار ‌داده ‌شده‌‬
‫است‪‌ .‬‬
‫در‌فرمولِ‌باال ‌‬
‫‌‬
‫(‬ ‫)̅̅̅̅‬
‫‌‬
‫یشود‪‌:‬امتیازِ ‌‪‌ R‬توسط ‌کاربرِ ‌‪‌ u‬به ‌آیتمِ ‌‪‌ ،i‬منهای ‌میانگین ‌تمامیِ ‌امتیازاتی‌‬ ‫نگونه ‌تفسیر‌م ‌‬ ‫ای ‌‬
‫که ‌کاربر ‌‪(‌ u‬همین ‌کاربر)‌به ‌تمامیِ ‌اقالم ‌داده ‌است‪‌.‬که ‌در ‌واقع ‌امتیازِ ‌ ‌‬
‫نرمالشده ‌را ‌به ‌ما‌‬
‫یآوریم‪‌.‬در‌‬ ‫یدهد‪‌.‬در ‌فرمولِ ‌باال‪‌ ،‬برای ‌هر ‌)‪‌ ،s(i, j‬شباهتِ ‌اقالمِ ‌‪‌ i‬و ‌‪‌ j‬را ‌با ‌هم ‌به ‌دست ‌م ‌‬ ‫م‌‬
‫فرمولِ ‌اصلی‪‌ ،‬صورتِ ‌کسر ‌می‌گوید‪‌:‬برای ‌هر ‌کاربر ‌که ‌هر ‌دو ‌محصولِ ‌‪‌ i‬و ‌‪‌ j‬را ‌امتیازدهی‌‬
‫یکنیم‪‌،‬و‌نتایج‌را‌‬ ‫شدهی‌آن‌دو‌قلم‌جنس‪‌،‬ضرب‌م ‌‬ ‫نرمال ‌‬
‫این‌امتیاز‌را‌در‪‌،‬امتیازِ‌ ‌‬
‫‌‬ ‫کردهاست‪‌،‬‬
‫‌‬
‫نرمالشده ‌را‌‬
‫با ‌یکدیگر ‌جمع ‌خواهیم ‌کرد‪‌.‬در ‌مخرجِ ‌کسر‪‌ ،‬ما ‌جمع ‌مربعاتِ ‌تمامیِ ‌امتیازاتِ ‌ ‌‬
‫یگیریم‪‌.‬همین‌کار ‌را ‌هم ‌برای ‌قلمِ ‌‪‌j‬‬ ‫برای ‌قلمِ ‌‪‌ i‬محاسبه ‌کرده ‌و ‌سپس ‌جذرِ ‌این ‌نتایج ‌را ‌م ‌‬
‫یکنیم‌تا‌مخرج‌کسر‌به‌دست‌آید‪(‌.‬اقالم‌همان‌‬ ‫یدهیم‌و‌نتایج‌را‌در‌یکدیگر‌ضرب‌م ‌‬ ‫انجام‌م ‌‬
‫آیتمها‌هستند) ‌‬‫‌‬
‫دادههای ‌زیر ‌کمک‌‬ ‫لشده ‌را ‌تصور ‌کنیم‪‌ ،‬از ‌ ‌‬ ‫نکه ‌بتوانیم ‌شباهتِ ‌کسینوسیِ ‌تعدی ‌‬ ‫برای ‌ای ‌‬
‫ستونها)‌را‌امتیازدهی‌‬ ‫دادهها‪‌،‬پنج‌دانشجو‌(سطرها)‪‌،‬پنج‌گروه‌موسیقی‌( ‌‬ ‫یگیریم‪‌.‬در‌این‌ ‌‬ ‫م‌‬
‫کردهاند‪‌ .‬‬
‫‌‬
‫‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪16‬‬

‫‌‬
‫‌‬
‫لشده ‌انجام ‌دهیم ‌این‌‬
‫محاسبهی ‌معیارِ ‌شباهتِ ‌کسینوسیِ ‌تعدی ‌‬
‫‌‬ ‫اولین ‌کاری ‌که ‌باید ‌برای ‌‬
‫است‌که‌میانگینِ‌امتیازاتِ‌هر‌کاربر‌را‌محاسبه‌کنیم‪‌ .‬‬
‫‌‬

‫‌‬
‫‌‬
‫یکنیم‪‌.‬اجازه‌‬ ‫آنها‌را‌محاسبه‌م ‌‬
‫حاال‌برای‌هر‌جفت‌گروهِ‌موسیقی‌(هنرمندان)‪‌،‬شباهت‌بینِ‌ ‌‬
‫دهید ‌با ‌‪‌ Kacey Musgraves‬و ‌‪‌ Imaging Dragons‬شروع ‌کنیم‪‌ .‬در ‌جدول ‌باال‪‌ ،‬دورِ‌‬
‫دهام‪‌.‬پس‌مقدارِ‌‬ ‫دادهاند ‌خطِ‌آبی ‌کشی ‌‬
‫گروههای‌موسیقی‌امتیاز ‌ ‌‬
‫کاربرانی ‌که‌به‌هر‌دوی‌این‌ ‌‬
‫یشود‪‌ :‬‬‫لشده‌برای‌این‌دو‌گروهِ‌موسیقی‌به‌صورت‌زیر‌محاسبه‌م ‌‬‫شباهت‌کسینوسیِ‌تعدی ‌‬
‫‌‬
‫∑‬ ‫(‬ ‫)̅̅̅̅‬ ‫̅̅̅̅‬

‫∑√‬ ‫(‬ ‫∑√ )̅̅̅̅‬ ‫(‬ ‫)̅̅̅̅‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌61‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫پس ‌مقدار ‌شباهت ‌بین ‌‪‌ Kacey Musgraves‬و ‌‪‌ Imagine Dragons‬برابر ‌‪‌ 1.5191‬است‪‌.‬‬
‫کردهام ‌و ‌در ‌جدول ‌زیر‌‬
‫گروههای ‌موسیقیِ ‌دیگر ‌را ‌نیز ‌با ‌یکدیگر ‌محاسبه ‌ ‌‬
‫من ‌شباهتِ ‌ ‌‬
‫دادهام‪‌ :‬‬
‫نمایش‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید ‌‬
‫بقی‌هی‌مقادیر‌را‌در‌جدول‌باال‌محاسبه‌کنید ‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل ‌‬
‫بقی‌هی‌مقادیر‌را‌در‌جدول‌باال‌محاسبه‌کنید ‌‬
62 ■‌‫‌پایش‌بر‌اساس‌اقالم‬.3‌‫‌فصل‬



‌ :‫‌یک‌اسکریپت‌کوچک‌پایتون‌نوشتم‬،‫محاسبهی‌این‌مقادیر‬
‌ ‌‫برای‬

def computeSimilarity(band1, band2, userRatings):
averages = {}
for (key, ratings) in userRatings.items():
averages[key] = (float(sum(ratings.values()))
/ len(ratings.values()))
num = 0 # numerator
dem1 = 0 # first half of denominator
dem2 = 0
for (user, ratings) in userRatings.items():
if band1 in ratings and band2 in ratings:
avg = averages[user]
num += (ratings[band1] - avg) * (ratings[band
2] - avg)
dem1 += (ratings[band1] - avg)**2
dem2 += (ratings[band2] - avg)**2
return num / (sqrt(dem1) * sqrt(dem2))

‌ :‫‌آورده‌شده‌است‬userRatings‌‫در‌زیر‌فرمت‬

users3 = {"David": {"Imagine Dragons": 3, "Daft Punk":
5,
"Lorde": 4, "Fall Out Boy": 1},
"Matt": {"Imagine Dragons": 3, "Daft Punk": 4,
"Lorde": 4, "Fall Out Boy": 1},
"Ben": {"Kacey Musgraves": 4, "Imagine Dragons": 3,
"Lorde": 3, "Fall Out Boy": 1},
"Chris": {"Kacey Musgraves": 4, "Imagine Dragons": 4,
"Daft Punk": 4, "Lorde": 3, "Fall Out Boy": 1},
‫برنامهنویسان‬ ‌ ■‌61
‌ ‌‫دادهکاوی‌برای‬

"Tori": {"Kacey Musgraves": 5, "Imagine Dragons": 4,


"Daft Punk": 5, "Fall Out Boy": 3}}



‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪63‬‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌64‬‬
‫دادهکاوی‌برای‌ ‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪65‬‬

‫‌‬
‫‌‬
‫رنرمالسازی ‌(‪‌)denormalize‬یعنی ‌فرمولی ‌که ‌داده‌ها ‌را ‌از ‌ ‌‬
‫بازهی ‌نرمال ‌شده ‌به‌‬ ‫‌‬ ‫فرمول ‌غی‬
‫یکند‌به‌صورت‌زیر‌است‪‌ :‬‬ ‫بازهی‌اصلی‌(در‌مثالِ‌ما‌‪‌2‬تا‌‪‌)5‬تبدیل‌م ‌‬
‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌69‬‬
‫دادهکاوی‌برای‌ ‌‬

‫نرمالشده ‌به ‌صورت‌‬ ‫فرض ‌کنید ‌یک ‌نفر‪‌ Fall Out Boy‌ ،‬را ‌امتیازِ ‌‪‌ 1‬داده ‌است‪‌.‬پس‌ ‌‬
‫دادهی ‌ ‌‬
‫زیر‌است‪‌ :‬‬
‫‌‬

‫رنرمالسازی ‌(‪‌ )denormalize‬کنیم‪‌ ،‬به ‌صورت ‌زیر‌‬


‫‌‬ ‫و ‌حاال ‌اگر ‌بخواهیم ‌همین ‌داده ‌را ‌غی‬
‫لمل‌میکنیم‪‌ :‬‬
‫‌‬
‫‌‬

‫نرمالسازی‌را‌در‌مُشتِ‌خودمان‌داریم‪‌ .‬‬
‫خب!‌االن‌لملیات‌ ‌‬

‫‌‬
‫اولین‌کار‌این‌است‌که‌امتیازات‌‪‌David‬را‌ ‌‬
‫نرمالسازی‌کنیم‪‌ :‬‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪67‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌61‬‬
‫دادهکاوی‌برای‌ ‌‬

‫شبینی‌کردیم‌که‌‪‌،David‬به‌گروه‌‪‌Kacey Musgraves‬امتیاز‌‪(‌1.753‬در‌‬ ‫نجا‌پی ‌‬‫پس‌در‌ای ‌‬


‫رنرمالسازی‌(‪‌)denormalize‬کنیم‪‌ :‬‬
‫‌‬ ‫یدهد‪‌.‬حاال‌بایستی‌این‌لدد‌را‌غی‬‫بازهی‌‪‌-2‬تا‌‪‌)2‬م ‌‬
‫‌‬

‫‌‬
‫شبینی ‌کردیم ‌که ‌‪‌ David‬به ‌‪‌ Kacey Musgraves‬امتیاز‌‬
‫فرمولهای ‌باال‪‌ ،‬پی ‌‬
‫‌‬ ‫پس ‌با ‌توجه ‌به ‌‬
‫یدهد‪.‬‬ ‫‪‌4.519‬م ‌‬

‫شباهت ‌کسینوسیِ ‌تعدیل ‌شده ‌یک ‌مدلِ ‌پایشِ ‌مشارکتیِ ‌مبتنی ‌بر ‌مدل ‌(‪Model-‬‬
‫تهای ‌این ‌روش ‌نسبت ‌به ‌روش‌‬ ‫‪‌)Based‬است‪‌ ‌.‬‬
‫همانطور ‌که ‌قبالً ‌گفته ‌شد‪‌ ،‬یکی ‌از ‌مزی ‌‬
‫مبتنی ‌بر ‌حافظه ‌(‪‌)memory-based‬این ‌است ‌که ‌این ‌روش‪‌ ،‬مقیاس‌پذیریِ ‌بهتری ‌دارد‪‌.‬‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪66‬‬

‫عتر ‌بوده ‌و‌‬


‫روشهای ‌مبتنی ‌بر ‌مدل‪‌ ،‬نیاز ‌دارند ‌تا ‌سری ‌‬
‫بزرگتر‪‌ ‌ ،‬‬
‫دادههای ‌ ‌‬
‫مجموله ‌‬
‫‌‬ ‫برای ‌‬
‫حافظهی‌کمتری‌مصرف‌کنند‪.‬‬
‫‌‬
‫‌‬
‫اسهای ‌امتیازی ‌را ‌متفاوت ‌استفاده ‌می‌کنند‪‌.‬مثالً ‌من ‌ممکن ‌است ‌گروه‌‬ ‫معموالً ‌افراد‪‌ ،‬مقی ‌‬
‫یای ‌را ‌که ‌دوستش ‌دارم ‌با‌‬‫یای ‌را ‌که ‌دوست ‌ندارم ‌با ‌امتیاز ‌‪‌ 3‬و ‌آن ‌گروه ‌موسیق ‌‬
‫موسیق ‌‬
‫یای ‌که ‌به ‌آن ‌لالقه‌‬‫امتیاز ‌‪‌ ،4‬امتیازدهی ‌کنم‪‌ ‌ .‬اما ‌شما ‌ممکن ‌است ‌به ‌گروه ‌موسیق ‌‬
‫ندارید‪‌ ،‬امتیاز ‌‪‌ 2‬داده ‌و ‌به ‌گروهی ‌که ‌به ‌آن ‌لالقه ‌دارید ‌امتیاز ‌‪‌ 5‬بدهید‪‌ .‬شباهت‌‬
‫کسینوسیِ ‌تعدیل ‌شده‪‌ ،‬این ‌مشکل ‌را ‌با ‌تفریقِ ‌میانگین ‌امتیاز ‌کاربر ‌از ‌هر ‌کدام ‌از‌‬
‫یکند‪‌ .‬‬
‫امتیازها‪‌،‬حل‌م ‌‬
‫‌‬

‫الگوریتم‌شیبِ‌یک‌(‪‌ )Slope One‬‬


‫تمهای ‌موجود‪‌ ،‬برای ‌انجام ‌لملیاتِ ‌پایش ‌مبتنی ‌بر ‌اقالم ‌به ‌صورت‌‬ ‫یکی ‌دیگر ‌از ‌الگوری ‌‬
‫مشارکتی ‌(‪‌ )iterm-based collaborative filtering‬الگوریتمِ ‌شیبِ ‌یک ‌(‪‌)Slope One‬‬
‫ادهسازیِ ‌آسانِ ‌آن ‌است‪‌.‬الگوریتم ‌شیبِ‌‬ ‫است‪‌.‬مزیتِ ‌اصلیِ ‌این ‌روش‪‌ ،‬سادگی ‌و ‌بنابراین ‌پی ‌‬
‫یهای ‌شیبِ ‌یک ‌برای ‌پایش ‌مبتنی ‌بر ‌امتیاز ‌به ‌صورت ‌مشارکتی‌‬ ‫شبین ‌‬
‫مقالهی ‌«پی ‌‬
‫یک‪‌ ،‬در ‌ ‌‬
‫و ‌برخط» ‌توسط ‌‪‌ Daniel Lemire‬و ‌‪‌ Anna Machlachlan‬در ‌‪http://www.daniel-‬‬
‫‪‌ lemire.com/fr/abstracts/SDM2005.html‬نوشته ‌شده ‌است‪‌ .‬این ‌مقاله‪‌ ،‬یکی ‌از‌‬
‫مقاالت‌لالی‌در‌این‌زمینه‌است‌و‌حتماً‌ارزش‌خواندن‌را‌دارد‪‌ .‬‬
‫دهی ‌اصلی ‌به ‌این ‌صورت ‌است‪‌ :‬فرض ‌کنید ‌‪‌ Amy‬امتیاز ‌‪‌ 3‬را ‌به ‌گروه ‌موسیقیِ ‌‪‌PSY‬‬ ‫ای ‌‬
‫یاست ‌که ‌‪‌ Ben‬امتیاز ‌‪‌ 4‬را ‌به‌‬
‫دادهاست ‌و ‌امتیاز ‌‪‌ 4‬را ‌به ‌‪‌.Whitney Houston‬این ‌در ‌حال ‌‬‫‌‬
‫شبینی‌کنیم‌که‌‪‌Ben‬چه‌امتیازی‌را‌به‌‪‌Whitney Houston‬‬ ‫یخواهیم‌پی ‌‬‫‪‌PSY‬داده‪‌.‬حاال‌م ‌‬
‫یتوان‌برای‌نمایشِ‌این‌مسئله‌رسم‌کرد‪‌،‬چیزی‌مانندِ‌جدول‌زیر‌است‌‬ ‫یدهد‪‌.‬جدولی‌که‌م ‌‬ ‫م‌‬
‫گروههای‌موسیقی)‪‌ :‬‬ ‫ستونها‌ ‌‬
‫‌‬ ‫(سطرها‪‌،‬افراد‌هستند‌و‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌211‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫نکه ‌بتوانیم ‌حدس ‌بزنیم ‌که ‌‪‌ Ben‬احتماالً ‌چه ‌امتیازی ‌به ‌‪‌Whitney Houston‬‬ ‫برای ‌ای ‌‬
‫یکنیم‪‌ :‬‬ ‫خواهد‌داد‪‌،‬به‌صورت‌زیر‌استدالل‌م ‌‬
‫شبینی‌‬‫یتوانیم ‌پی ‌‬ ‫‪‌ Amy‬به ‌‪‌ Whitney Houston‬یک ‌امتیاز ‌بهتر ‌از ‌‪‌ ‌ PSY‬‬
‫دادهاست‪‌.‬حاال ‌م ‌‬
‫دادهاست‪‌ ،‬به ‌ ‪Whitney‬‬ ‫کنیم ‌که ‌‪‌ Ben‬نیز‪‌ ،‬یک ‌امتیاز ‌بیشتر ‌از ‌امتیازی ‌که ‌به ‌‪‌ ‌ PSY‬‬
‫دادهاست‪‌ ،‬احتماالً ‌به ‌ ‪Whitney‬‬
‫‪‌ Houston‬خواهد ‌داد‪‌.‬پس ‌چون ‌‪‌ Ben‬به ‌‪‌ ،PSY‬امتیاز ‌‪‌ ‌ 4‬‬
‫‪‌Houston‬امتیاز‌‪(‌5‬یکی‌بیشتر)‌را‌خواهد‌داد‪‌ .‬‬
‫وزندار‌‬
‫در‌واقع‌چندین‌نوع‌از‌الگوریتمِ‌شیبِ‌یک‌موجود‌است‪‌.‬در‌ادامه‪‌،‬الگوریتمِ‌شیبِ‌یکِ‌ ‌‬
‫(‪‌ )weighted slop one‬را ‌توضیح ‌خواهم ‌داد‪‌ .‬یادتان ‌باشد ‌که ‌مزیتِ ‌اصلیِ ‌این ‌روش‪‌،‬‬
‫سادگیِ ‌آن ‌است‪‌.‬چیزی ‌که ‌قرار ‌است ‌توضیح ‌دهم‪‌ ،‬ممکن ‌است ‌پیچیده ‌به ‌نظر ‌برسد‪‌ ،‬ولی‌‬
‫یتوانید‌‬
‫یگوییم ‌برایتان ‌روشن ‌و‌واضح ‌خواهند ‌شد‪‌.‬م ‌‬ ‫به ‌من ‌التماد ‌کنید‪‌ ،‬چیزهایی ‌که ‌م ‌‬
‫نکه‌زمان‌محاسبه‌فرا‌برسد‌‬ ‫الگوریتمِ‌شیبِ‌یک‌را‌به ‌دو‌مرحله‌تقسیم‌کنید‪‌.‬اول‪‌،‬قبل‌از‌ای ‌‬
‫محاسبهی ‌انحراف‌‬
‫‌‬ ‫دستهای‪‌ ،‬مثالً ‌در ‌نصف ‌شب ‌یا ‌هر ‌زمان ‌دیگر)‪‌ ،‬به ‌سراغ ‌‬ ‫(در ‌حالتِ ‌ ‌‬
‫یرویم‪‌.‬در‌مثال‌باال‪‌،‬این‌مرحله‌به‌این‌معنی‌است‌که‌‬ ‫(‪‌)deviation‬بین‌هر‌جفت‌از‌اقالم‌م ‌‬
‫بفهمیم ‌‪‌ Whitney Houston‬یکی ‌بیشتر ‌از ‌‪‌ PSY‬امتیازدهی ‌شده ‌است ‌(این ‌کار ‌توسط‌‬
‫مرحلهی ‌دوم‪‌،‬‬
‫‌‬ ‫‪‌ Amy‬انجام ‌شده)‪‌.‬حاال ‌یک ‌پای ‌‬
‫گاهداده ‌از ‌انحرافات ‌در ‌میان ‌اقالم ‌داریم‪‌.‬در ‌‬
‫یآید‪‌ .‬تا ‌به ‌حال‪‌ ،‬آهنگی ‌از‌‬‫یدهیم‪‌ .‬کاربری ‌مانند ‌‪‌ Ben‬م ‌‬ ‫شبینی ‌را ‌انجام ‌م ‌‬
‫لملیاتِ ‌پی ‌‬
‫شبینی ‌کنیم ‌که ‌‪‌ ،Ben‬چه ‌امتیازی ‌به‌‬ ‫یخواهیم ‌پی ‌‬ ‫‪‌ Whitney Houston‬نشنی ‌‬
‫ده ‌است ‌و ‌م ‌‬
‫یای ‌که ‌‪‌ Ben‬امتیازدهی ‌کرده ‌است‪‌،‬‬ ‫گروههای ‌موسیق ‌‬ ‫یدهد‪‌.‬با ‌استفاده ‌از ‌تمام ‌ ‌‬ ‫این ‌گروه ‌م ‌‬
‫شبینی ‌را ‌انجام‌‬
‫مرحلهی ‌اول ‌ساخته ‌بودیم‪‌ ،‬پی ‌‬
‫‌‬ ‫انحرافهایی ‌که ‌در ‌‬
‫‌‬ ‫گاهداده‌ی ‌‬
‫همراه ‌با ‌پای ‌‬
‫یدهیم‪‌ .‬‬ ‫م‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪212‬‬

‫‌‬

‫محاسبهی‌انحراف‌(‪‌ )deviation‬‬
‫‌‬ ‫قسمت‌اول‪‌:‬‬
‫دهتر ‌کنیم‪‌.‬برای ‌این ‌کار ‌دو ‌کاربرِ ‌جدید ‌و ‌یک ‌گروهِ‌‬
‫اجازه ‌دهید‪‌ ،‬مثالِ ‌قبلی ‌را ‌کمی ‌پیچی ‌‬
‫موسیقی‌(یا‌همان‌هنرمندان)‌جدید‌به‌جدول‌اضافه‌می‌کنیم‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫انحرافها‌بود‪‌.‬میانگینِ‌انحراف‪‌،‬بین‌قلمِ‌‪‌i‬با‌توجه‌به‌قلم‌‪‌j‬برابر‌است‌با‪‌ :‬‬
‫‌‬ ‫محاسبهی‌‬
‫‌‬ ‫قدم‌اول‪‌،‬‬
‫‌‬

‫‌‬
‫‌‬
‫که ‌در ‌آن ‌)‪‌ card(S‬تعداد ‌اِلمان‌هایی ‌است ‌که ‌در ‌‪‌ S‬موجود ‌است ‌و ‌‪‌ X‬برابرِ ‌تعدادِ ‌تمامیِ‌‬
‫‌برابر ‌تعداد ‌افرادی ‌است ‌که ‌هر ‌دو ‌قلم ‌‪‌ i‬و ‌‪‌ j‬را‌‬ ‫امتیازات ‌است‪‌ .‬پس‌‬
‫کردهاند‪‌.‬برای ‌مثال‪‌ ،‬اجازه ‌دهید ‌انحرافِ ‌‪‌ PSY‬را ‌نسبت ‌به ‌‪‌ Taylor Swift‬اندازه‌‬
‫امتیازدهی ‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌211‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌برابر ‌‪‌ 1‬است ‌– ‌دو ‌شخص ‌وجود ‌دارند ‌که ‌هر ‌دوی‌‬ ‫بگیریم‪‌.‬در ‌این ‌مورد‪‌،‬‬
‫‌در‌‬ ‫گروههای‌موسیقی ‌(‪‌ Taylor Swift‬و ‌‪‌)PSY‬را ‌امتیازدهی ‌ ‌‬
‫کردهاند‪‌.‬لبارت‌‬ ‫ای ن ‌ ‌‬
‫صورتِ ‌کسر‪‌ ،‬برابر ‌است ‌با ‌امتیازِ ‌کاربر ‌برای ‌‪‌ Taylor Swift‬منهای ‌امتیاز ‌کاربر ‌برای ‌‪‌.PSY‬‬
‫یشود‪‌ :‬‬
‫نطور‌محاسبه‌م ‌‬ ‫پس‌انحراف‌به‌صورت‌کلی‪‌،‬ای ‌‬
‫‌‬

‫‌‬
‫‌‬
‫پس ‌انحراف ‌از ‌‪‌ PSY‬تا ‌‪‌ Taylor Swift‬برابر ‌‪‌ 1‬است‪‌ ،‬به ‌این ‌معنی ‌که ‌به ‌طور ‌میانگین‪‌،‬‬
‫دادهاند‪‌.‬حاال ‌انحراف ‌از ‌ ‪Taylor‬‬
‫کاربران ‌‪‌ 1‬امتیاز ‌بیشتر ‌به ‌‪‌ Taylor Swift‬نسبت ‌به ‌‪‌ ‌ PSY‬‬
‫‪‌Swift‬تا‌‪‌PSY‬چقدر‌است؟ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید ‌‬
‫بقی‌هی‌مقادیر‌را‌در‌جدول‌زیر‌محاسبه‌و‌تکمیل‌کنید‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل ‌‬
‫بقی‌هی‌مقادیر‌را‌در‌جدول‌زیر‌محاسبه‌و‌تکمیل‌کنید‪‌ :‬‬
213 ■‌‫‌پایش‌بر‌اساس‌اقالم‬.3‌‫‌فصل‬



‌ :Whitney Houston‌‫‌با‌توجه‌به‬Taylor Swift

‌ :Whitney Houston‌‫‌با‌توجه‌به‬PSY




‌ ‫ورزش‌ذهنی‬
‫برنامهنویسان‬ ‫‪‌ ■‌214‬‬
‫دادهکاوی‌برای‌ ‌‬

‫وبسایت‌پخش‌آنالین‌موسیقی‌با‌یک‌میلیون‌کاربر‌و‌‪‌111‬هزار‌امتیاز‌به‌‬ ‫تصور‌کنید‌یک‌ ‌‬
‫وبسایت ‌اضافه ‌شود ‌و ‌این ‌کاربر ‌‪‌ 21‬هنرمند ‌را‌‬
‫هنرمندان ‌داریم‪‌.‬اگر ‌یک ‌کاربرِ ‌جدید ‌به ‌ ‌‬
‫امتیازدهی ‌کند‪‌ ،‬آیا ‌بایستی ‌دوباره ‌الگوریتم ‌را ‌برای ‌بدست ‌آوردن ‌‪‌ 111‬هزار ‌ضربدر ‌‪‌111‬‬
‫سادهتری‌هم‌موجود‌است؟‬‫هزار‌‌انحراف‪‌،‬اجرا‌کنیم؟‌یا‌راه‌حل‌ ‌‬
‫(برای‌جواب‌با‌ما‌همراه‌باشید!)‬
‫‌‬
‫ورزش‌ذهنی‌–‌راه‌حل ‌‬
‫وبسایت‌پخش‌آنالین‌موسیقی‌با‌یک‌میلیون‌کاربر‌و‌‪‌111‬هزار‌امتیاز‌به‌‬ ‫تصور‌کنید‌یک‌ ‌‬
‫وبسایت ‌اضافه ‌شود ‌و ‌این ‌کاربر ‌‪‌ 21‬هنرمند ‌را‌‬‫هنرمندان ‌داریم‪‌.‬اگر ‌یک ‌کاربرِ ‌جدید ‌به ‌ ‌‬
‫امتیازدهی ‌کند‪‌ ،‬آیا ‌بایستی ‌دوباره ‌الگوریتم ‌را ‌برای ‌بدست ‌آوردن ‌‪‌ 111‬هزار ‌ضربدر ‌‪‌111‬‬
‫سادهتری‌هم‌موجود‌است؟ ‌‬ ‫راهحل‌ ‌‬ ‫هزار‌‌انحراف‪‌،‬اجرا‌کنیم؟‌یا‌ ‌‬
‫‌‬
‫مجمولهی ‌داده ‌اجرا ‌کنید‪‌.‬زیباییِ ‌این‌‬
‫‌‬ ‫احتیاجی ‌نیست ‌الگوریتم ‌را ‌دوباره‪‌ ،‬برای ‌تمامیِ ‌‬
‫نجاست ‌که ‌برای ‌هر ‌جفت ‌از ‌اقالم‪‌ ،‬ما ‌فقط ‌باید ‌انحراف ‌در ‌بین ‌این ‌دو ‌و‌‬ ‫روش ‌در ‌ای ‌‬
‫نگهداری‌کنیم‪‌ .‬‬
‫کردهاند‪‌ ‌،‬‬
‫همچنین‌تعداد‌افرادی‌که‌که‌هر‌دوی‌این‌اقالم‌را‌امتیازدهی‌ ‌‬
‫برای‌مثال‪‌،‬فرض‌کنید‌من‌انحراف‌بین‌‪‌Taylor Swift‬را‌با‌توجه‌به‌‪‌PSY‬را‌دارم‌که‌برابر‌‬
‫آمدهاست‪‌.‬یک ‌کاربر‌‬‫یشود ‌و ‌این ‌انحراف‪‌ ،‬بر ‌اساس ‌امتیازِ ‌‪‌ 6‬نفر ‌از ‌کاربران ‌به ‌دست ‌ ‌‬‫‪‌ 1‬م ‌‬
‫میدهد‪‌.‬حاال‪‌،‬انحراف‌را‌به‌‬ ‫یآید‌و‌به‌‪‌ Taylor Swift‬امتیاز‌‪‌5‬و‌به‌‪‌ PSY‬امتیازِ‌‪‌ ‌2‬‬ ‫جدید‌م ‌‬
‫یکنیم‪‌ :‬‬ ‫بهروزرسانی‌م ‌‬
‫صورت‌زیر‌ ‌‬
‫‪((9 × 2) + 4 ) / 10 = 2.2‬‬

‫‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪215‬‬

‫‌‬
‫‌‬
‫وزندار‌(‪‌ )Weighted Slope One‬‬ ‫شبینی‌با‌استفاده‌از‌الگوریتمِ‌شیبِ‌یکِ‌ ‌‬‫مرحلهی‌‪‌:1‬پی ‌‬
‫‌‬
‫یتوانیم‌از‌این‌‬
‫انحرافها‌در‌اختیار‌داریم‪‌.‬اما‌چگونه‌م ‌‬
‫‌‬ ‫مجمولهی‌بزرگی‌از‌‬
‫‌‬ ‫خب‪‌،‬حاال‌ما‌یک‌‬
‫همانطور ‌که ‌گفتم‪‌ ،‬ما ‌از ‌الگوریتم ‌شیبِ‌‬
‫یها ‌استفاده ‌کنیم؟ ‌ ‌‬ ‫شبین ‌‬
‫مجموله ‌برای ‌ساخت ‌پی ‌‬
‫محاسبهی‌‬
‫‌‬ ‫‌استفاده ‌می‌کنیم‪‌.‬فرمول ‌‬ ‫وزندار ‌(‪‌)Weighted Slope One‬یا ‌همان‌‬ ‫یکِ ‌ ‌‬
‫این‌الگوریتم‌به‌صورت‌زیر‌است‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫که‌در‌آن‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌219‬‬
‫دادهکاوی‌برای‌ ‌‬

‫وزندار‪‌ ،‬در‌‬
‫شبینیِ ‌ما‪‌ ،‬از ‌شیبِ ‌یکِ ‌ ‌‬
‫‌به ‌این ‌معنی ‌است ‌که ‌پی ‌‬ ‫در ‌این ‌فرمول‪‌،‬‬
‫یکند‪‌ .‬پس ‌برای ‌مثال‪‌،‬‬ ‫یکه ‌کاربرِ ‌‪‌ u‬به ‌آیتمِ ‌‪‌ j‬امتیاز ‌داده ‌است‪‌ ،‬استفاده ‌م ‌‬ ‫حالت ‌‬
‫شبینیِ ‌ما ‌از ‌امتیازی ‌است ‌که ‌‪‌ Ben‬به‌‬ ‫‌به ‌معنیِ ‌پی ‌‬
‫‪‌Whitney Houston‬خواهد‌داد‪‌ ‌.‬‬
‫یخواهم ‌به ‌همین ‌سوال ‌پاسخ ‌بدهم‪‌ Ben‌ :‬چه ‌امتیازی ‌به ‌ ‪Whitney‬‬ ‫فرض ‌کنیم ‌م ‌‬
‫‪‌Houston‬خواهد‌داد؟ ‌‬
‫اجازه‌بدهید‌صورتِ‌کسر‌را‌در‌فرمول‌واکاوی‌کنیم‪‌ :‬‬

‫∑‬

‫گروههای ‌موسیقی ‌(یا ‌همان ‌هنرمندان) ‌که ‌‪‌ Ben‬به‌‬ ‫یگوید‪‌:‬برای ‌هر ‌کدام ‌از ‌ ‌‬
‫این ‌به ‌ما ‌م ‌‬
‫دادهاست‌(به‌جز‌‪‌Whitney Houston‬که‌لبارت‌{‪‌}j‬در‌فرمولِ‌باالست)‪‌ .‬‬ ‫آنها‌امتیاز‌ ‌‬ ‫‌‬
‫گروههای ‌موسیقیِ ‌‪‌ i‬که‌‬
‫کلِ ‌صورتِ ‌کسر ‌در ‌فرمول‪‌ ،‬به ‌این ‌معناست ‌که‪‌:‬برای ‌هر ‌کدام ‌از ‌ ‌‬
‫دادهاست‌(به‌جز‌‪‌)Whitney Houston‬ا‌به‌دنبالِ‌انحراف‌از‌ ‪Whitney‬‬ ‫آنها‌امتیاز‌ ‌‬‫‪‌Ben‬به‌ ‌‬
‫جهی ‌آن ‌را ‌با ‌امتیازِ ‌‪‌ Ben‬به ‌گروه ‌موسیقیِ ‌‪‌i‬‬
‫‪‌ Houston‬تا ‌آن ‌گروهِ ‌موسیقی ‌هستم ‌و ‌نتی ‌‬
‫جمع ‌می‌کنیم‪‌.‬سپس ‌آن ‌را ‌در ‌کاردینالیتیِ ‌آن ‌دو ‌(‪‌ –‌ cardinality‬تعداد ‌افرادی ‌که ‌به ‌هر‌‬
‫دادهاند)‌ضرب‌می‌کنیم‪‌ .‬‬ ‫دو‌گروه‌موسیقی‌(‪‌Whiney Houston‬و‌‪‌)i‬امتیاز‌ ‌‬
‫اجازه‌بدهید‌با‌مثالِ‌مرحله‌به‌مرحله‌پیش‌برویم‪‌ :‬‬
‫انحرافها‌را‌که‌از‌قبل‌داشتیم‪‌ :‬‬
‫‌‬ ‫اول‪‌،‬امتیازات‌‪‌Ben‬به‌همراه‌‬
‫‌‬

‫‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪217‬‬

‫‌‬
‫دادهاست‌–‌این‌همان‌ ‌است‪‌ .‬‬ ‫‪‌Ben‌.2‬به‌‪‌Taylor Swift‬امتیاز‌‪‌ ‌5‬‬
‫‪‌.1‬انحراف ‌از ‌‪‌ Whitney Houston‬با ‌توجه ‌به ‌‪‌ Taylor Swift‬برابر ‌‪‌ -2‬است ‌– ‌این ‌همان‌‬
‫‌است ‌‬
‫یشود ‌‬ ‫‌برابر‌‪‌4‬م ‌‬ ‫‪‌.3‬پس‬
‫‪‌.4‬به ‌چند ‌صفحه ‌قبل ‌نگاه ‌کنید‪‌ ،‬جایی ‌که ‌نشان ‌دادیم ‌دو ‌کاربر ‌(‪‌ Amy‬و ‌‪‌)Daisy‬وجود‌‬
‫داشتند‌که‌هم‌‪Taylor Swift‬و‌هم‌‪‌Whitney Houston‬را‌امتیازدهی‌کرده‌بودند‪‌.‬پس‌ ‌‬
‫یشود‪‌ .‬‬
‫برابر‌‪‌1‬م ‌‬
‫(‌‬ ‫)‬ ‫‪‌.5‬پس‌‬
‫‪‌Ben‌.9‬به‌‪‌PSY‬امتیاز‌‪‌ ‌1‬‬
‫دادهاست ‌‬
‫‪‌.7‬انحراف‌از‌‪‌‌Whitney Houston‬نسبت‌به‌‪‌PSY‬برابر‌‪‌1.75‬است ‌‬
‫یشود ‌‬‫‌برابر‌‪‌1.75‬م ‌‬ ‫‪‌.1‬پس‌‬
‫‪‌.6‬دو‌کاربر‌هستند‌که‌هر‌دوی‌‪‌‌Whitney Houston‬و‌‪‌PSY‬را‌امتیازدهی‌ ‌‬
‫کردهاند‪‌.‬پس‪‌ :‬‬
‫‌‬
‫(‬ ‫)‬
‫‌‬
‫یشود‌‪(‌23.5‬برای‌صورت‌کسر) ‌‬ ‫مرحلهی‌‪‌5‬و‌‪‌6‬را‌حساب‌می‌کنیم‌که‌م ‌‬ ‫‌‬ ‫‪‌.21‬جمعِ‌‬
‫‌‬
‫حاال‌برای‌مخرج‌کسر‪‌ :‬‬
‫گروههای‌‬
‫‪‌.22‬با ‌واکاویِ ‌مخرجِ ‌کسر‪‌ ،‬می‌فهمیم ‌که ‌معنیِ ‌آن ‌این ‌است ‌که‪‌ :‬برای ‌هر ‌کدام ‌از ‌ ‌‬
‫گروههای‌موسیقی‌‬ ‫دادهاست‪‌،‬جمعِ‌کاردینالیتی ‌را‌برای‌آن‌ ‌‬ ‫موسیقی ‌که ‌‪‌Ben‬به‌ ‌‬
‫آنها‌امتیاز‌ ‌‬
‫یآوریم ‌(یعنی ‌چند ‌نفر ‌آن ‌گروهِ ‌موسیقی ‌و ‌‪‌ Whitney Houston‬را ‌با ‌هم‌‬ ‫به ‌دست ‌م ‌‬
‫کردهاند)‪‌.‬پس ‌‪‌ ،Ben‬به ‌‪‌ Taylor Swift‬امتیاز ‌داده ‌است ‌و ‌کاردینالیتیِ ‌ ‪Taylow‬‬
‫امتیازدهی ‌ ‌‬
‫‪‌ Swift‬و ‌‪‌ Whitney Houston‬برابر ‌‪‌ 1‬است ‌(یعنی ‌تعداد ‌افرادی ‌که ‌به ‌هر ‌دوی ‌ ‪Taylor‬‬
‫دادهاند)‪‌ Ben‌.‬به ‌‪‌ PSY‬امتیاز ‌ ‌‬
‫دادهاست ‌و ‌کاردینالیتیِ‌‬ ‫‪‌ Swift‬و ‌‪‌ Whitney Houston‬امتیاز ‌ ‌‬
‫یشود‪‌ .‬‬ ‫‪‌PSY‬هم‌برابر‌‪‌1‬است‪‌.‬پس‌مخرجِ‌کسر‌برابر‌‪‌4‬م ‌‬
‫یدهد ‌به ‌این‌‬‫شبینیِ ‌این‌که ‌‪‌ Ben‬چه ‌امتیازی ‌به ‌‪‌ Whitney Houston‬م ‌‬ ‫‪‌ .21‬بنابراین ‌پی ‌‬
‫یشود‪‌ :‬‬‫صورت‌محاسبه‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌211‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬

‫‌‬
‫‌‬

‫حاال‌نوبت‌کد‌پایتون‌است ‌‬
‫نکه ‌خیلی ‌طوالنی ‌نشود‪‌،‬‬‫یخواهم ‌کالسِ ‌نوشته ‌شده ‌در ‌فصلِ ‌‪‌ 1‬را ‌توسعه ‌دهم‪‌.‬برای ‌ای ‌‬ ‫م‌‬
‫یکنم ‌– ‌فقط ‌به ‌آن ‌ارجاع‌‬ ‫کدهای ‌مربوط ‌به ‌کالسِ ‌‪‌ recommender‬را ‌ای ‌‬
‫نجا ‌تکرار ‌نم ‌‬
‫یدهم ‌(و ‌یادتان ‌باشد ‌که ‌می‌توانید ‌کدها ‌را ‌از ‌سایت ‌‪‌ guidtodatamining.com‬و ‌سایت‌‬ ‫م‌‬
‫دادههای ‌آماده ‌شده ‌برای ‌آن‌‬
‫یآورید ‌که ‌فرمتِ ‌ ‌‬ ‫‪‌ chistio.ir‬دانلود ‌کنید)‪‌ .‬حتماً ‌به ‌یاد ‌م ‌‬
‫کالس‪‌،‬به‌این‌صورت‌بود‪:‬‬

‫‪users2 = {"Amy": {"Taylor Swift": 4, "PSY": 3, "Whitney‬‬


‫‪Houston": 4},‬‬
‫‪"Ben": {"Taylor Swift": 5, "PSY": 2},‬‬
‫‪"Clara": {"PSY": 3.5, "Whitney Houston": 4},‬‬
‫}}‪"Daisy": {"Taylor Swift": 5, "Whitney Houston": 3‬‬

‫انحرافها‌(‪‌ .)deviations‬‬
‫‌‬ ‫محاسبهی‌‬
‫‌‬ ‫اول‪‌،‬‬
‫یآورم‪:‬‬
‫انحرافها‌را‌م ‌‬
‫‌‬ ‫محاسبهی‌‬
‫‌‬ ‫نجا‌فرمولِ‌‬
‫دوباره‌ای ‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪216‬‬

‫‌‬
‫دادهی ‌ورودی ‌به ‌تابعِ ‌‪‌ computeDeviations‬باید ‌به ‌فرمتِ ‌‪‌ users2‬که ‌در ‌باال‌‬
‫پس ‌ ‌‬
‫دادههای‌زیر‌شود‪:‬‬
‫شداده‌شد‪‌،‬باشد‪‌.‬خروجی‌باید‌یک‌حالتی‌از‌ ‌‬‫نمای ‌‬

‫‌‬
‫الدادِ ‌داخل ‌پرانتز‪‌ ،‬تعدادِ ‌تکرار ‌(فرکانس)‌هستند ‌(یعنی‪‌ ،‬تعداد ‌کاربرانی ‌که ‌هر ‌دوی ‌این‌‬
‫کردهاند)‪‌ .‬پس ‌برای ‌هر ‌جفت ‌گروهِ ‌موسیقی‪‌ ،‬بایستی‌‬ ‫گروههای ‌موسیقی ‌را ‌امتیازدهی ‌ ‌‬ ‫‌‬
‫انحراف‌و‌تعداد‌تکرار‌(فرکانس)‌را‌ذخیره‌کنیم‪‌ .‬‬
‫سودوکد‌برای‌تابعِ‌ما‪‌،‬چیزی‌شبیه‌به‌کدِ‌زیر‌است‪‌ :‬‬
‫‌‬

‫‌‬
‫دادههای‌‬
‫یبینید‪‌ ،‬یک ‌ناهماهنگی ‌بین ‌فرمتِ ‌ ‌‬ ‫همانطور ‌که ‌م ‌‬
‫سودوکدِ ‌باال‪‌ ،‬زیباست ‌ولی ‌ ‌‬
‫دادههای ‌واقعی‪‌ ،‬وجود ‌دارد ‌(‪‌ users2‬را ‌در ‌مثال ‌باال ‌ببینید)‪‌ .‬به‌‬
‫ورودیِ ‌این ‌سودوکد ‌و ‌ ‌‬
‫دادهها‌را‌تغییر ‌دهیم‪‌،‬یا‌‬
‫نکه‌فرمت‌ ‌‬ ‫برنامهنویس‪‌،‬دو‌راه ‌جلوی‌پایمان‌است‪‌ ،‬یا‌ای ‌‬
‫لنوانِ‌یک‌ ‌‬
‫یکنم‪‌ .‬سودوکدِ‌‬ ‫بایستی ‌یک ‌بازنگری ‌در ‌سودوکد ‌داشته ‌باشیم‪‌ .‬من ‌راه ‌دوم ‌را ‌انتخاب ‌م ‌‬
‫یشود‪‌ :‬‬
‫بازنگری‌شده‌چیزی‌شبیه‌به‌سودوکدِ‌زیر‌م ‌‬
‫‌‬
‫برنامهنویسان‬ ‌ ■‌221
‌ ‌‫دادهکاوی‌برای‬


‌ :‫‌تابع‌مورد‌نیاز‌را‌مرحله‌به‌مرحله‌بسازیم‬،‫حاال‌بیایید‌با‌هم‬

‌ :2‌‫مرحلهی‬


def computeDeviations(self):
# for each person in the data:
# get their ratings
for ratings in self.data.values():

‌ ‌)‫‌نیز‌شهرت‌دارند‬hash tables‌–‌‫درهمساز‬
‌‫جفتهای‬ ‌ ‌‫یهای‌پایتون‌(که‌به‌جداول‬ ‌ ‫دیکشنر‬
‌.‫ ‌یک ‌دیکشنری ‌در ‌پایتون ‌است‬self.data‌ ،‫ ‌در ‌کدِ ‌باال‬.‫) ‌هستند‬key/value(‌ ‫مقدار‬/‫کلید‬
‌‫دادهی ‌ما ‌چیزی ‌شبیه‬
‌ ‌.‫یکند‬‌ ‫)‌استخراج ‌م‬self.data(‌ ‫ ‌مقادیر ‌را ‌از ‌دیکشنری‬،values‌ ِ‫تابع‬
‌ :‫به‌کد‌زیر‌است‬

users2 = {"Amy": {"Taylor Swift": 4, "PSY": 3, "Whitney
Houston": 4},
"Ben": {"Taylor Swift": 5, "PSY": 2},
"Clara": {"PSY": 3.5, "Whitney Houston": 4},
"Daisy": {"Taylor Swift": 5, "Whitney Houston": 3}}

‌ :‫پس‌در‌اولین‌دورِ‌حلقه‌داریم‬

ratings = {"Taylor Swift": 4, "PSY": 3, "Whitney Houston
": 4}

‌ :1‌‫مرحلهی‬


def computeDeviations(self):
# for each person in the data:
222 ■‌‫‌پایش‌بر‌اساس‌اقالم‬.3‌‫‌فصل‬

# get their ratings


for ratings in self.data.values():
#for each item & rating in that set of ratings:
for (item, rating) in ratings.items():
self.frequencies.setdefault(item, {})
self.deviations.setdefault(item, {})

‌‫ ‌را‬self.deviations‌ ‫ ‌و‬self.frequencies‌ ‫ ‌من‬،recommender‌ ‫ ‌از ‌کالس‬init‌ ‫در ‌تابع‬
‌ .‫یکنم‌تا‌به‌دیکشنری‌تبدیل‌شوند‬
‌ ‫مقداردهیِ‌اولیه‌م‬

def __init__(self, data, k=1, metric='pearson', n=5):
...
#
# The following two variables are used for Slope One
#
self.frequencies = {}
self.deviations = {}

‌‫ ‌یک ‌کلید ‌و ‌یک ‌مقدار‬.‫ ‌آرگومان ‌می‌گیرد‬1‌ ،‫یهای ‌پایتون‬ ‌ ‫ ‌در ‌دیکشنر‬setdefault‌ ِ‫تابع‬
‌‫‌این ‌کلید‌را‬،‫‌اگر‌کلید‌در ‌دیکشنری‌موجود‌نبود‬:‫‌این‌تابع‌به‌این ‌صورت ‌لمل‌می‌کند‬.‫اولیه‬
‌‫‌در‬.‫یکند‬‌ ‫ ‌مقداردهیِ ‌اولیه ‌م‬،‫دادهایم‬
‌ ‌ ‫با ‌مقدار ‌اولی‌های ‌که ‌به ‌لنوان ‌آرگومان ‌دوم ‌به ‌این ‌تابع‬
‌ .‫یگرداند‬‌ ‫‌مقدارِ‌فعلیِ‌کلید‌در‌آن‌دیکشنری‌را‌برم‬،‫غیر‌این‌صورت‬

‌ :3‌‫مرحلهی‬


def computeDeviations(self):
# for each person in the data:
# get their ratings
for ratings in self.data.values():
# for each item & rating in that set of ratings:
for (item, rating) in ratings.items():
self.frequencies.setdefault(item, {})
" " " " "
self.deviations.setdefault(item, {})
# for each item2 & rating2 in that set of ratin
gs:
for (item2, rating2) in ratings.items():
if item != item2:
‫برنامهنویسان‬ ‌ ■‌221
‌ ‌‫دادهکاوی‌برای‬

# add the difference between the rating


s
# to our computation
self.frequencies[item].setdefault(item2
, 0)
self.deviations[item].setdefault(item2,
0.0)
self.frequencies[item][item2] += 1
self.deviations[item][item2] += rating
- rating2

‌.‫ ‌جمع ‌می‌کند‬self.deviations‌ ‫ ‌اختالفِ ‌دو ‌امتیاز ‌را ‌محاسبه ‌می‌کند ‌و ‌آن ‌را ‌با‬،‫کدِ ‌باال‬
‌ :‫دادهها‌چیزی‌شبیه‌به‌کد‌زیر‌است‬ ‌ ‌،‫دوباره‬

{"Taylor Swift": 4, "PSY": 3, "Whitney Houston": 4}

item = “Tayor ‌ ‫حلقهی ‌خارجی ‌هستیم ‌که ‌مقدار ‌آیتمِ ‌موردِ ‌نظرِ ‌ما ‌برابر‬
‌ ‌ ‫وقتی ‌که ‌در‬
‌‫حلقهی‌داخلی‌که‌آیتمِ‌دومِ‌ما‬ ‌ ‌‫‌و‌در‬،‫)‌است‬rating=4(‌4‌‫‌و‌امتیاز‌مورد‌نظر‌ما‌برابر‬Swift”
rating2 = (‌3‌‫)‌برابر‌با‬rating2(‌‫(‌و‌امتیاز‌دوم‬item2 = “PSY”‌‫‌(یعنی‬PSY‌‫)‌برابر‬item2(
‌self.deviation[“Teylor Swift”][“PSY”]‌ ‫ ‌را ‌به‬2‌ ِ‫ ‌لدد‬،‫ ‌آخرین ‌خط ‌کدِ ‌باال‬،‫) ‌است‬3
‌ .‫اضافه‌می‌کند‬

‌ :4‌‫مرحلهی‬

‌‫) ‌بزنیم ‌تا ‌بتوانیم ‌هر‬iterate(‌ ‫ ‌چند ‌دور‬self.deviations‌ ‫ ‌نیاز ‌داریم ‌تا ‌بر ‌روی‬،‫سرانجام‬
‌ .‫آنها‌(فرکانس)‌بکنیم‬
‌ ‌‫انحرافها‌را‌تقسیم‌بر‌تعداد‌تکرار‬
‌ ‌‫کدام‌از‬

def computeDeviations(self):
# for each person in the data:
# get their ratings
for ratings in self.data.values():
# for each item & rating in that set of ratings:
for (item, rating) in ratings.items():
self.frequencies.setdefault(item, {})
self.deviations.setdefault(item, {})
# for each item2 & rating2 in that set of ra
tings:
for (item2, rating2) in ratings.items():
223 ■‌‫‌پایش‌بر‌اساس‌اقالم‬.3‌‫‌فصل‬

if item != item2:
# add the difference between the rat
ings
# to our computation
self.frequencies[item].setdefault(it
em2, 0)
self.deviations[item].setdefault(ite
m2, 0.0)
self.frequencies[item][item2] += 1
self.deviations[item][item2] += rati
ng - rating2
for (item, ratings) in self.deviations.items():
for item2 in ratings:
ratings[item2] /= self.frequencies[item][ite
m2]

‌ :‫ادهسازی‌کردیم‬
‌ ‫کامنتها)‌پی‬
‌ ‌‫‌خط‌کد‌(با‬21‌‫تمام‌شد!‌در‌واقع‌ما‌فرمولِ‌زیر‌را‌در‬


‌ :‫‌اجرا‌می‌کنم‬،‫کردهام‬
‌ ‌‫دادههایی‌که‌برای‌این‌مثال‌استفاده‬
‌ ‌‫هنگامی‌که‌این‌تابع‌را‌با‬

users2 = {"Amy": {"Taylor Swift": 4, "PSY": 3, "Whitney
Houston": 4},
"Ben": {"Taylor Swift": 5, "PSY": 2},
"Clara": {"PSY": 3.5, "Whitney Houston": 4},
"Daisy": {"Taylor Swift": 5, "Whitney Houston": 3}}

‌ :‫یشود‬
‌ ‫جهی‌زیر‌حاصل‌م‬
‌ ‫نتی‬

‫برنامهنویسان‬ ‫‪‌ ■‌224‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫محاسبهی‌دستی‌نیز‌به‌دست‌آمد‪‌ :‬‬
‫‌‬ ‫همانچیزی‌است‌که‌در‌‬
‫که‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫یک‌تشکر‌هم‌بکنیم‌از‌‪‌Bryan O’Sullivan‬و‌وبالگِ‌خوبش‌(‪‌)serpentine.com/blog‬که‌‬
‫ادهسازیِ ‌پایتون ‌را ‌برای ‌الگوریتمِ ‌شیبِ ‌یک ‌در ‌این ‌وبالگ ‌قرار ‌داده ‌بود‪‌ .‬کدهایی ‌که‌‬
‫پی ‌‬
‫بودهاست‪‌ .‬‬
‫نجا‌گفتم‪‌،‬بر‌اساس‌کارهای‌ایشان‌ ‌‬ ‫ای ‌‬
‫‌‬

‫‌‬
‫‌‬

‫وزندارد‌(‪‌:)Weighted Slope 1‬قسمت‌توصی‌هگر ‌‬


‫الگوریتمِ‌شیبِ‌یکِ‌ ‌‬
‫حاال‌وقت‌آن‌است‌که‌قسمت‌توصی‌هگر‌را‌بنویسیم‪‌ :‬‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪225‬‬

‫‌‬
‫محاسبهی‌‬
‫‌‬ ‫یتوانیم ‌آن ‌‪‌ 21‬خط ‌کد ‌را ‌که ‌برای ‌‬
‫یشود ‌این ‌است ‌که ‌آیا ‌م ‌‬
‫سوالی ‌که ‌مطرح ‌م ‌‬
‫انحراف‌(‪‌)computeDeviations‬نوشتیم‪‌،‬کمترش‌کنیم؟‌اجازه‌بدهید‪‌،‬فرمول‌باال‌را‌تفسیر‌‬
‫کنیم‌و‌آن‌را‌به‌زبانِ‌فارسی‌یا‌سودوکد‌بنویسیم‪‌.‬اول‌شما‌امتحان‌کنید‪‌ :‬‬

‫مدادتان‌را‌تیز‌کنید ‌‬
‫فرمول‌را‌به‌صورت‌سودوکد‌بنویسید‪:‬‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل ‌‬
‫راهحل‌من‌به‌این‌صورت‌است ‌‬ ‫‌‬
‫یخواهم ‌یک ‌پیشنهاد ‌برای ‌یک ‌کاربرِ ‌خاص ‌درست ‌کنم‪‌‌.‬پیشنهادهای ‌آن ‌کاربر ‌را ‌به‌‬ ‫م‌‬
‫فرم‌زیر‌دارم‪‌ :‬‬
‫‌‌‬
‫سودوکد‪‌ :‬‬
‫تمهای ‌کاربر) ‌و ‌هر ‌‪(‌ userRating‬امتیازات ‌کاربر) ‌در ‌قسمت‌‬‫برای ‌هر ‌‪(‌ userItem‬آی ‌‬
‫پیشنهادهای‌کاربر‪‌ :‬‬
‫تمها)‌که ‌آن ‌کاربر ‌امتیازدهی ‌نکرده ‌باشد ‌( ≠ ‪item2‬‬
‫‌‌‌‌برای ‌هر ‌‪(‌ diffItem‬اختالف ‌آی ‌‬
‫‪‌ :)item‬‬
‫‌‌‌‌‌‌‌‌اختالف ‌‪‌ diffItem‬را ‌با ‌توجه ‌به ‌‪‌ userItem‬به ‌‪‌ userRating‬برای ‌‪‌userItem‬‬
‫اضافه ‌کنید‪‌ .‬آن ‌را ‌در ‌تعداد ‌افرادی ‌که ‌‪‌ userItem‬و ‌‪‌ diffItem‬را ‌امتیازدهی ‌ ‌‬
‫کردهاند‪‌،‬‬
‫ضرب‌کنید ‌‬
‫‌‌‌‌‌‌‌‌‌‌‌‌آن‌را‌با‌مقدار‌جاری‌‪‌diffItem‬جمع‌کنید ‌‬
‫‌‌‌‌‌‌‌‌‌‌‌‌همچنین‌جمع‌تعداد‌افرادی‌که‌‪‌diffItem‬را‌امتیازدهی‌ ‌‬
‫کردهاند‪‌،‬نگه‌دارید ‌‬
‫برنامهنویسان‬ ‌ ■‌229
‌ ‌‫دادهکاوی‌برای‬

‌‫ ‌جمعِ ‌تمام ‌آن‬،‫مجمولهی ‌نتایجِ ‌ما ‌هست‬


‌ ‌ ‫ها ‌که ‌در‬diffItem‌ ‫در ‌آخر ‌برای ‌هر ‌کدام ‌از‬
‫فرکانسهای‌آن‌آیتم‌کنید‌و‌نتایج‌را‌برگردانید‬
‌ ‌‫آیتم‌را‌تقسیم‌بر‌تمام‬


‌ :‫و‌این‌هم‌راه‌حل‌من‌به‌لنوان‌یک‌کد‌پایتون‬

def slopeOneRecommendations(self, userRatings):
recommendations = {}
frequencies = {}
# for every item and rating in the user's recommenda
tions
for (userItem, userRating) in userRatings.items():
# for every item in our dataset that the user di
dn't rate
for (diffItem, diffRatings) in self.deviations.i
tems():
if diffItem not in userRatings and userItem
in self.deviations[diffItem]:
freq = self.frequencies[diffItem][userIt
em]
recommendations.setdefault(diffItem, 0.0
)
frequencies.setdefault(diffItem, 0)
# add to the running sum representing th
e numerator
# of the formula
recommendations[diffItem] += (diffRating
s[userItem] + userRating) * freq
# keep a running sum of the frequency of
diffitem
frequencies[diffItem] += freq
recommendations = [(self.convertProductID2name(k),
v / frequencies[k])
for (k, v) in recommendations.items()]
# finally sort and return
recommendations.sort(key=lambda artistTuple: artistT
uple[1], reverse = True)
return recommendations

‌ :‫‌یک‌تستِ‌ساده‌برای‌الگوریتمِ‌شیبِ‌یک‌به‌صورت‌کامل‬،‫و‌در‌زیر‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪227‬‬

‫‌‬

‫‌‬
‫نتایاجِ ‌حاصل ‌شده‪‌ ،‬با ‌چیزی ‌که ‌به ‌صورت ‌دستی ‌محاسبه ‌کردیم‪‌ ،‬انطباق ‌دارد‪‌.‬پس ‌قسمتِ‌‬
‫پیشنهاد‌دهنده ‌(‪‌ )recommendation‬در ‌این ‌الگوریتم‪‌ ،‬در ‌‪‌ 21‬خط ‌انجام ‌شد‪‌ .‬در ‌نتیجه‌‬
‫ادهسازی ‌کردیم‪‌.‬با ‌این ‌مثال ‌فهمیدیم‌‬
‫توسطِ ‌‪‌ 39‬خط ‌کدِ ‌پایتون‪‌ ،‬الگوریتمِ ‌شیبِ ‌یک ‌را ‌پی ‌‬
‫یتوانید‌کدهای‌نسبتاً‌فشرده‌را‌تولید‌کنید‪‌ .‬‬ ‫که‌با‌استفاده‌از‌زبان‌پایتون‪‌،‬م ‌‬
‫‌‬

‫دادهی‌‪‌ MovieLens‬‬
‫مجمولهی‌ ‌‬
‫‌‬
‫دادهی ‌دیگر‪‌ ،‬امتحان ‌کنیم‪‌.‬‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫اجازه ‌بدهید‪‌ ،‬الگوریتم ‌شیبِ ‌یک ‌را ‌بر ‌روی ‌یک ‌‬
‫دادهی ‌‪‌ MoviewLens‬که ‌توسط ‌گروه ‌تحقیقاتیِ ‌‪‌ GroupLens‬در ‌دانشگاهِ‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬
‫لمهای‌مختلف‌است‪‌.‬این‌مجموله‌ی‌‬ ‫جمعآوری‌شده‪‌،‬شاملِ‌امتیازاتِ‌کاربران‌به‌فی ‌‬ ‫نهسوتا‌ ‌‬ ‫می ‌‬
‫داده ‌در ‌سایت ‌‪‌ www.grouplens.org‬جهت ‌دانلود ‌در ‌سه ‌سایز ‌مختلف ‌در ‌دسترسِ ‌لموم‌‬
‫مجمولهی ‌آن ‌استفاده‌‬
‫‌‬ ‫قرار ‌داده ‌شده ‌است‪‌ .‬برای ‌یک ‌آزمایشِ ‌ساده‪‌ ،‬من ‌از ‌کوچکترین ‌‬
‫یکنم‌که‌شامل‌صد‌هزار‌امتیاز‌(بین‌‪‌2‬تا‌‪‌)5‬از‌‪‌643‬کاربر‌در‌مورد‌‪‌2911‬فیلم‌است‪‌.‬یک‌‬ ‫م‌‬
‫شنهادگر ‌(‪‌)recommender‬‬ ‫‌‬ ‫دادهها ‌را ‌به ‌کالسِ ‌پی‬
‫یتوانیم ‌ ‌‬
‫لهی ‌آن ‌م ‌‬‫تابع ‌نوشتم ‌که ‌به ‌وسی ‌‬
‫معرفی‌کنیم‪‌ .‬‬
‫حال‌بیایید‌امتحان‌کنیم‪‌ :‬‬
‫توصیهگر‌(‪‌)recommender object‬در‌پایتون‪‌،‬بارگزاری‌می‌کنم‪‌ :‬‬ ‫‌‬ ‫دادهها‌را‌به‌شیِ‌‬
‫اول‪‌ ‌،‬‬
‫‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌221‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دادهها‪‌ ،‬به ‌‪‌ 51‬لدد ‌از‌‬


‫شمارهی ‌‪‌ 2‬استفاده ‌خواهم ‌کرد‪‌.‬فقط ‌جهتِ ‌بررسی ‌ ‌‬
‫‌‬ ‫از ‌اطاللاتِ ‌کاربرِ ‌‬
‫دادهاست‪‌،‬نگاه‌می‌کنیم‪‌ :‬‬
‫آنها‌امتیاز‌ ‌‬
‫شمارهی‌‪‌2‬به‌ ‌‬
‫‌‬ ‫اقالمی‌که‌کاربرِ‌‬
‫‌‬

‫‌‬
‫دادهاست! ‌‬
‫همهی‌این‌‪‌51‬فیلم‪‌،‬امتیاز‌‪‌ ‌5‬‬
‫شمارهی‌‪‌2‬به‌ ‌‬
‫‌‬ ‫کاربرِ‌‬
‫انحرافها‪‌ :‬‬
‫‌‬ ‫محاسبهی‌‬
‫‌‬ ‫مرحلهی‌الگوریتمِ‌شیبِ‌یک‌را‌انجام‌می‌دهم‪‌:‬‬
‫‌‬ ‫حاال‌اولین‌‬
‫‌‬

‫‌‬
‫شمارهی‌‪‌2‬بسازیم‪‌ :‬‬
‫‌‬ ‫و‌در‌آخر‪‌،‬بیایید‌یک‌سری‌پیشنهاد‌برای‌کاربر‌‬
‫‌‬

‫‌‬
‫شمارهی‌‪‌ :15‬‬
‫‌‬ ‫و‌یک‌سری‌پیشنهاد‌برای‌کاربر‌‬
‫‌‬
‫‌فصل‌‪‌.3‬پایش‌بر‌اساس‌اقالم‌■ ‪226‬‬

‫‌‬
‫پروژهها‬
‫‌‬
‫یدهد‪‌.‬‬ ‫لمهای ‌مختلف ‌را ‌به ‌شما ‌پیشنهاد ‌م ‌‬
‫‪‌ .2‬ببینید ‌که ‌چطور ‌الگوریتمِ ‌شیبِ ‌یک‪‌ ،‬فی ‌‬
‫دادهی‌‪‌.)MovieLens‬آیا‌‬ ‫مجمولهی‌ ‌‬
‫‌‬ ‫نکار‪‌21‌،‬فیلم‌را‌امتیازدهی‌کنید‌(در‌همین‌‬ ‫برای‌ای ‌‬
‫یدهد؟‬ ‫لمهایی‌را‌که‌دوست‌دارید‌به‌شما‌پیشنهاد‌م ‌‬ ‫الگوریتم‪‌،‬فی ‌‬
‫ادهسازی‌‬‫لشده ‌(‪‌)adjusted cosine similarity‬را ‌پی ‌‬ ‫‪‌.1‬فرمول ‌شباهتِ ‌کسینوسیِ ‌تعدی ‌‬
‫کنید‪‌.‬کاراییِ‌آن‌را‌با‌روشِ‌شیبِ‌یک‌مقایسه‌کنید‪.‬‬
‫سایت‌مبادلهی‌‬
‫‌‬ ‫دادههای ‌‬
‫یخواستم ‌این ‌روش ‌را ‌بر ‌روی ‌ ‌‬ ‫سختتر ‌از ‌همه)‌وقتی ‌که ‌م ‌‬
‫‌‬ ‫‪(‌.3‬‬
‫حافظهی‌‬
‫‌‬ ‫حافظهی‌اصلی‌(‪‌)RAM‬کم‌آوردم!‌من‌یک‌‬ ‫‌‬ ‫کتاب‌(‪‌)Book Crossing‬اجرا‌کنم‪‌،‬‬
‫اصلیِ ‌‪‌ 1‬گیگابایتی ‌دارم‪‌ .‬یادتان ‌بیاید ‌که ‌‪‌ 171‬هزار ‌کتاب ‌داشتیم ‌که ‌امتیازدهی ‌شده‌‬
‫انحرافها‪‌،‬‬
‫‌‬ ‫رهی ‌‬
‫بودند‪‌ .‬پس ‌به ‌یک ‌دیکشنری ‌با ‌ابعاد ‌‪‌ 171111‬در ‌‪‌ 171111‬برای ‌ذخی ‌‬
‫یای‌‬ ‫خانهی ‌در ‌دیکشنری!‌یک ‌همچین ‌دیکشنر ‌‬ ‫احتیاج ‌داریم‪‌.‬یعنی ‌تقریباً ‌‪‌ 73‬میلیارد ‌ ‌‬
‫گونهای‌تغییر‌دهید‌تا‌‬‫دادههای‌‪‌ MovieLens‬چقدر‌تنک ‌(‪‌)sparse‬است؟‌کُد‌را‌به‌ ‌‬ ‫برای ‌ ‌‬
‫دادههای‌بزرگتری‌را‌نیز‌پردازش‌کنیم‪.‬‬ ‫بتوانیم‌مجموله‌ ‌‬
‫‌‬
‫یگوییم!! ‌‬ ‫برای‌اتمامِ‌فصل‌‪‌3‬به‌شما‌تبریک‌م ‌‬
‫کدهای ‌به ‌ظاهر‌‬
‫طاقتفرسا ‌در ‌این ‌فصل ‌کم‌نداشتیم‪‌ .‬واکاویِ ‌ ‌‬
‫اتهایی ‌سخت ‌و ‌ ‌‬ ‫انصافاً ‌لملی ‌‬
‫آنها‌کار‌راحتی‌نبود‪‌ .‬‬
‫ادهسازیِ‌ ‌‬
‫آنها‌و‌پی ‌‬‫پیچیده‌برای‌دركِ‌هر‌چه‌بیشترِ‌ ‌‬
‫‌‬
‫فصل ‪ .3‬طبقهبندي‬
‫پايش بر اساس محتوا و طبقهبندي (‪)Content Based Filtering & Classification‬‬
‫طبقهبندي (‪ )Classification‬بر اساس ويژگيهاي اقالم‬

‫‌‬
‫فصلهای‌قبلی‪‌،‬در‌مورد‌ایجاد‌پیشنهادات‌و‌توصیه‌ها‌بیرا‌ی‌کیاربران‪‌‌،‬از‌طریی‌ق‌پیا‌یش‌و‌‬ ‫در‌ ‌‬
‫یشیود‌‌صیحبت‌‌‬ ‫فیلترینگِ‌مشارکتی‌که‌پایشِ‌اجتمالی‌–‌‪‌social filtering‬نیی‌ز‌نامیی‌ده‌می‌ ‌‬
‫کردیم‪‌.‬در‌پایش‌مشارکتی‌(‪‌)collaborative filtering‬ما‌قدرتِ‌اجتماعِ‌میردم‌‌را‌بیه‌‌نیول‌ی‌‬
‫مهار‌کردیم‌تا‌بتوانیم‌توسط‌آن‪‌،‬پیشنهادهایی‌را‌برای‌کاربران‌آماده‌کنیم‪‌.‬فرض‌کنید‌شیما‌‌‬
‫یدانیم‌که‌بسیاری‌از‌مشتریان‌ما‌‬ ‫آلبومِ‌‪‌Wolfgang Amadeus Phoenix‬را‌خری ‌‬
‫دهاید‪‌.‬ما‌م ‌‬
‫دهاند‪‌،‬همچنی‌ین‌آلبیوم‌‌‪‌Contra‬اثیر‌‌‪‌Vampire Weekend‬را‌‬ ‫که‌این‌آلبومِ‌موسیقی‌را‌خری ‌‬
‫کردهاند‪‌.‬پس‌ما‌آلبوم‌‪‌Contra‬را‌نیز‌به‌شما‌توصیه ‌می‌کنیم‪‌.‬من‌یک‌قسیمت‌‌‬ ‫نیز‌خریداری‌ ‌‬
‫یبینم‌و‌سایت‌‪‌،Netflix‬سیر‌یال‌‪‌Quantum Leap‬را‌بیه‌‌مین‌‌‬ ‫از‌سریال‌‪‌Doctor Who‬را‌م ‌‬
‫یدهید‌‌کیه‪‌‌،‬‬ ‫یدهد‪‌.‬سایت‌‪‌Netflix‬به‌این‌دلیل‌ایی‌ن‌کیار‌‌را‌انجیام‌‌می‌ ‌‬‫برای‌دیدن‪‌،‬پیشنهاد‌م ‌‬
‫دهانید‪‌‌،‬همچنی‌ین‌سیر‌یال‌‬ ‫بسیاری‌از‌کاربرانی‌که‌سریال‌‪‌Doctor who‬را‌در‌این‌سیا‌یت‌دیی‌ ‌‬
‫فصلهای‌قبلی‪‌،‬در‌موردِ‌برخی‌ی‌از‌چیالش‌هیا‌ی‌پیا‌یشِ‌‬ ‫‪‌Quantum Leap‬را‌هم‌دی ‌‬
‫دهاند‪‌.‬در‌ ‌‬
‫دادههیا‌‌( ‪data‬‬
‫مشارکتی‌صحبت‌کردیم‪‌.‬این‌چیالش‌هیا‌‌شیاملِ‌‌مشیکالت‌ی‌بیا‌‌تنیک‌‌بیودن‌‌ ‌‬
‫یشد‪‌.‬مشیکلِ‌‌دیگیر‌‌ایی‌ن‌اسیت‌‌کیه‌‌سیسیتم‌هیا‌ی‌‬ ‫‪‌)sparsity‬و‌مقیاس‌پذیر‌بودنِ‌سیستم‌م ‌‬
‫یکننید‪‌‌،‬‬‫پیشنهاد‌دهنده‌یا‌همان‌سیستم‌های‌توصیه‌گر‌که‌مبتنی‌بر‌پایشِ‌مشارکتی‌کیار‌‌می‌ ‌‬
‫بیشتر‌تمایل‌دارند‌تا‌اقالمی‌را‌به‌کاربران‌پیشنهاد‌دهند‌که‌در‌حال‌حاضر‪‌،‬مشهور‌هسیتند‌‌‬
‫–‌در‌واقع‌یک‌انحراف‌(‪‌)bias‬به‌سمت‌شهرت‌وجود‌دارد‪‌.‬به‌لنوان‌مثیال‌‌کیه‌البتیه‌مثیالی‌‬

‫‪020‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌211‬‬
‫دادهکاوی‌برای‌ ‌‬

‫تازهکار‪‌،‬اولین‌آلبوم‌خیود‌‌را‌انتشیار‌‌‬
‫زیاد‌خوبی‌هم‌نیست‪‌،‬تصور‌کنید‌که‌یک‌گروهِ‌موسیقیِ‌ ‌‬
‫یدهد‪‌.‬از‌آن‌جایی‌که‌این‌گروهِ‌موسیقی‌و‌این‌آلبیوم‪‌‌،‬توسیطِ‌‌هی‌یچ‌کیاربر‌ی‪‌،‬تیا‌بیه‌حیال‌‬
‫م‌‬
‫یشود‪‌ .‬‬
‫چوقت‌به‌کسی‌توسطِ‌سیستم‪‌،‬پیشنهاد‌نم ‌‬ ‫امتیازدهی‌نشده‌است‪‌،‬هی ‌‬
‫‌‬
‫یتوانند‌پولدارها‌را‌پولدارتر‌کنند‌(برای‌‬
‫ستمهای‌پیشنهاددهنده‪‌،‬م ‌‬
‫«این‌قبیل‌سی ‌‬
‫شناختهشده)» ‌‬
‫‌‬ ‫کمتر‌‬
‫محصوالت‌مشهور)‌و‌برلکس‌(برای‌محصوالت‌ ‌‬

‫‪Daniel Fleder & Kartik Hosanagar. 2009. “Blockbusters‬‬


‫‪Culture’s Next Rise or Fall: The Impact of Recommender‬‬
‫‪‌ Systems on Sales Diversity” Management Science vol 55‬‬
‫‌‬
‫یکنی‌یم‪‌.‬سیا‌یت‌پخیشِ‌‌آنالیی‌نِ‌موسی‌یقیِ‌پانیدورا‌‌‬ ‫در‌این‌فصل‪‌،‬ما‌راهکارِ‌متفاوتی‌را‌دنبال‌م ‌‬
‫یتوانیی‌د‌‬ ‫(‪‌)Pandora‬را‌تصور‌کنید‪‌.‬در‌این‌سایت‪‌،‬همان‌طور‌که‌خیلی‌از‌شما‌می‌ ‌‬
‫یدانیی‌د‪‌،‬می‌ ‌‬
‫ایستگاه‌های‌رادیوییِ‌مختلفی‌را‌ایجاد‌و‌تنظیم‌کنید‪‌.‬در‌هر‌ایستگاهِ‌رادیویی‪‌،‬شما‌بیا‌‌گیوش‌‌‬
‫یدهیی‌د‌‬ ‫دادن‌به‌یک‌گروه‌موسیقی‌یا‌یک‌هنرمنید‪‌‌،‬یی‌ک‌نیوع‌‌بذرپاشی‌یِ‌اولیی‌ه‌را‌انجیام‌‌می‌ ‌‬
‫آهنگهایی‌را‌پخش‌خواهد‌کرد‌که‌به‌آن‌گروه ‌موسیقی ‌ییا‌‬ ‫‌‬ ‫(‪‌)seeding‬و‌بعد‌از‌آن‌پاندورا‪‌،‬‬
‫یتوانم‌یک‌ایستگاه‌درست‌کرده‌و‌آن‌را‌با‌گوش‌دادن‌‬ ‫هنرمندِ‌اولیه‪‌،‬شبیه‌باشند‪‌.‬مثالً‌من‌م ‌‬
‫به‌گروهِ‌‪‌Phoenix‬شروع‌کینم‌‪‌.‬حیاال‌‌ایی‌ن‌سیا‌یت‪‌،‬بعید‌‌از‌ایی‌ن‪‌،‬خیودش‌‌شیروع‌‌بیه‌‌پخیش‌‌‬
‫یدهد‌شبیه‌به‌‪‌Phoenix‬باشد‪‌.‬برای‌مثال‪‌،‬یک‌آهنگ‌از‌‬ ‫یکند‌که‌احتمال‌م ‌‬ ‫یهایی‌م ‌‬‫موسیق ‌‬
‫یکند‪‌.‬سایت‌پاندورا‪‌،‬این‌کار‌را‌با‌روشِ‌پیا‌یش‌مشیارکت‌ی‌انجیام‌‌‬ ‫‪‌El Ten Eleven‬را‌پخش‌م ‌‬
‫نکیه‌‌‬‫یدهد‪‌.‬در‌واقیع‪‌‌،‬آهنگی‌ی‌از‌‪‌El Ten Eleven‬را‌پخیش‌‌خواهید‌‌کیرد‪‌‌،‬بیه‌‌خیاطر‌‌ایی‌ ‌‬ ‫نم ‌‬
‫دهانید‌‌کیه‌‌ ‪El Ten‬‬ ‫گرفتهشده‌در‌این‌سایت‌بیه‌‌ایی‌ن‌جمیع‌بنید‌ی‌رسی‌ی ‌‬ ‫تمهای‌به‌کار‌ ‌‬ ‫الگوری ‌‬
‫یتوانید‌از‌پاندورا‌بپرسی‌ید‌کیه‌‌چیرا‌‌‬ ‫‪‌Eleven‬از‌لحاظ‌موسیقیایی‌شبیه‌به‌‪‌Phoenix‬است‪‌.‬م ‌‬
‫این‌موسیقی‌را‌پخش‌کرده‌است‌(چیزی‌مانند‌شکل‌زیر)‪‌ :‬‬
‫‌‬
‫طبقهبندی‌■ ‪213‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫‌‬
‫یبینید‌(و‌خود‌پاندورا‌هم‌دلیلِ‌این‌رفتار‌را‌گفتیه‌‌اسیت‌)‪‌،‬پانیدورا‌‌‬‫همان‌طور‌که‌در‌تصویر‌م ‌‬
‫آهنگِ‌‪‌My Only Swerving‬از‌‪‌El Ten Eleven‬را‌انتخاب‌و‌در‌ایستگاهِ‌موسیقیِ‌‪‌Phoenix‬‬
‫پخش‌کرده‌است‪‌،‬و‌برای‌این‌کارِ‌خود‌دالیلی‌ی‌داشیته‌‌اسیت‌‪‌.‬ایین‌دالییل‌را‌زییر‌آهنیگ‌در‌‬
‫قسمتِ‌«?‪‌»Why this track‬نوشته‌است‪«‌:‬بر‌اساس‌چیزهایی‌که‌تا‌بیه‌‌حیال‌‌شیما‌‌بیه‌‌میا‌‌‬
‫یها‪‌،‬آکوستیکِ‌مرکب‌‬ ‫یکنیم‪‌،‬به‌خاطر‌تکرار‌ملود ‌‬‫قطعهی‌موسیقی‌را‌پخش‌م ‌‬ ‫گفته‌اید‪‌،‬این‌ ‌‬
‫و‌تنظیم‌الکترونیک‪‌،‬تونالیتیِ‌کلیی‌د‌اصیل‌ی‪‌،‬ریی‌ف‌هیا‌ی‌گیتیار‌‌الکتریی‌ک‌و‌چیی‌دمانِ‌ابیزار‌ی‌‬
‫(‪‌.»)instrumental arrangement‬در‌ایستگاهِ‌موسیقیِ‌‪‌،Hiromi‬پاندورا‌یی‌ک‌موسی‌یقی‌از‌‬
‫شهی‌جاز‌کالسیک‌داشت‪‌،‬یک‌تک‌نوازی‌زیبای‌پیانو‌‬ ‫‪‌E.S.T‬پخش‌کرد‪‌،‬به‌خاطر‌این‌که‪«‌:‬ری ‌‬
‫ضربزنی‌آرامی‌داشت‌و‌هچنین‌نوشته‌و‌ساختار‌جذابی‌داشت»‪‌ .‬‬ ‫داشت‪‌ ‌،‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌214‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫پروژهی‌ژنوم‌موسیقی‌( ‪Music‬‬ ‫پروژهای‌به‌نامِ‌« ‌‬‫شنهادگرِ‌خود‌را‌بر‌پای‌هی‌ ‌‬ ‫‌‬ ‫پاندورا‪‌،‬سیستم‌پی‬
‫شزمینیه‌ی‌‬ ‫حرفهای‌بیا‌‌پی‌ی ‌‬
‫یدان‌ ‌‬ ‫آنها‪‌،‬چندین‌موسیق ‌‬ ‫‪‌»)Genome Project‬گذاشته‌است‪‌ ‌.‬‬
‫یهیا‌‌را‌بیرا‌ی‌انیواعِ‌‬ ‫خوب‌در‌تئوری‌و‌تحلیلِ‌آثار‌موسیقی‌را‌به‌کار‌گرفتند‌تا‌بتواننید‌‌ویژگی‌ ‌‬
‫یگوینید‌)‪‌.‬ایی‌ن‌‬ ‫یهیا‌‌«ژن»‌می‌ ‌‬ ‫یها‌به‌دست‌آورند‌(آن‌هیا‌‌بیه‌‌هیر‌‌کیدام‌‌از‌ایی‌ن‌ویژگی‌ ‌‬
‫موسیق ‌‬
‫یبینند‪‌.‬هنگامی‌که‌آموزش‌دیدنید‪‌‌،‬بیه‌‌صیورت‌‌‬ ‫تحلیگران‪‌،‬بیش‌تر‌از‌‪‌251‬سالت‪‌،‬آموزش‌م ‌‬
‫یکننید‌‌تیا‌‌بتواننید‌‌‬‫قطعهی‌موسیقی‌وقیت‌‌صیرف‌‌می‌ ‌‬ ‫میانگین‌بین‌‪‌11‬تا‌‪‌31‬دقیقه‌برای‌هر‌ ‌‬
‫قطعهی‌موسیقی‌مشخص‌کنند‪‌.‬بسی‌یاری‌از‌ایی‌ن‌ژن‌هیا‪‌‌،‬‬ ‫یها‌یا‌همان‌ژن‌ها‌را‌برای‌آن‌ ‌‬ ‫ویژگ ‌‬
‫یکنید)‪‌ :‬‬‫لگران‌را‌مشاهده‌م ‌‬ ‫برگههای‌این‌تحلی ‌‬‫نمونهای‌از‌ ‌‬
‫فنی‌هستند‌( ‌‬
‫‌‬

‫‌‬
‫طبقهبندی‌■ ‪215‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫(در‌تصویر‌باال‌دو‌آهنگِ‌‪‌EL Ten Eleven‬و‌‪‌My Only Swerving‬را‌مشاهده‌می‌کنیم‌که‌‬


‫هر‌کدام‌‪‌5‬ویژگی‌یعنی‌‪‌5‬ژن‌دارند‪‌.‬مثالً‌ویژگیِ‌تعداد‌ضربه‌در‌دقیقه‌( ‪Beats per‬‬
‫‪‌)Minute‬برای‌آهنگ‌‪‌EI Ten Eleven‬برابر‌‪‌221‬نوشته‌شده‌است‌و‌به‌همین‌ترتیب‌‬
‫یهای‌دیگر‌نیز‌موجود‌هستند) ‌‬ ‫ویژگ ‌‬
‫‌‬
‫یکنند‪‌.‬این‌فرآیند‪‌،‬کاری‌به‌شیدت‌‌‬ ‫تحلیل‌گران‪‌،‬این‌مقادیر‌را‌برای‌بیش‌از‌‪‌411‬ژن‌فراهم‌م ‌‬
‫یشود‪‌ .‬‬
‫قطعهی‌موسیقی‪‌،‬در‌هر‌ماه‌اضافه‌م ‌‬
‫طاقتفرسا‌است‌و‌تقریباً‌‪‌25‬هزار‌ ‌‬ ‫‌‬
‫‌‬
‫یدانم‌‬
‫تمهای‌پاندورا‪‌،‬به‌صورت‌اختصاصی‌در‌اختیار‌پاندورا‌قرار‌دارد‌و‌من‌نم ‌‬ ‫نکته‪‌:‬الگوری ‌‬
‫نحوهی ‌کارکردِ‌‬
‫تمها ‌چگونه ‌کار ‌می‌کنند‪‌ .‬چیزی ‌که ‌گفته ‌شد‪‌ ،‬در ‌واقع ‌ ‌‬
‫که ‌این ‌الگوری ‌‬
‫دربارهی ‌چگونگیِ ‌ساختنِ ‌یک ‌همچین ‌سیستمی‌‬ ‫پاندورا ‌نبود‪‌ ،‬بلکه ‌به ‌نولی ‌توضیحی ‌ ‌‬
‫شبیه‌به‌پاندورا‌در‌موسیقی‌بود‪‌ .‬‬
‫‌‬

‫اهمیتِ‌انتخابِ‌مقادیرِ‌مناسب ‌‬
‫یهیا‌ی‌خیود‌‌اسیتفاده‌‌کنید‌‪‌:‬ژانیر‌‌‬
‫فرض‌کنید‌که‌پاندورا‌از‌این‌دو‌ژن‌(ویژگی)‌برای‌موسی‌یق ‌‬
‫یتواند‌چیزی‌مانند‌شکل‌زیر‌شود‪‌ :‬‬ ‫حال‌وهوا‌(‪‌.)mood‬مقادیرِ‌این‌ ‌‬
‫ژنها‌م ‌‬ ‫(‪‌)genre‬و‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫رنامهنویسان‬ ‫‪‌ ■‌219‬‬
‫دادهکاوی‌برای‌ب ‌‬

‫پس‌هنگامی‌که‌مقدار‌ژانر‌(‪‌)genre‬برابر‌‪‌4‬باشد‌به‌معنیِ‌سبکِ‌«روحی‌ی‌(‪‌»)Soul‬اسیت‌‌و‌‬
‫اگر‌مقدار‌حال‌و‌هوا‌(‪‌)mood‬برابر‌‪‌3‬باشد‪‌،‬به‌معنیا‌ی‌سیبک‌‌«شیور‌‌و‌اشیت‌یاق‌(‪‌»)passion‬‬
‫است‪‌.‬حاال‌فرض‌کنید‪‌،‬من‌موسیقیِ‌راك‌با‌حیال‌‌و‌هیوا‌ی‌«مالیی‌م‌(‪‌»)melancholy‬داشیته‌‌‬
‫باشم‪‌.‬برای‌مثال‪‌،‬آهنیگِ‌‌‪‌You’re Beautiful‬اثیر‌‌‪‌.James Blunt‬در‌یی‌ک‌فضیا‌ی‌‪‌1‬بُعید‌ی‌‬
‫(‪‌،)2D‬چیزی‌شبیه‌به‌شکل‌زیر‌برای‌این‌آهنگ‌به‌وجود‌م ‌‬
‫یآید‪:‬‬

‫‌‬
‫فرض‌کنید‪‌،Tex‌،‬لاشقِ‌آهنگِ‌‪‌You’re Beautiful‬است‌و‌میا‌‌می‌ ‌‬
‫یخیواه‌یم‪‌،‬پیشینهادِ‌‌یی‌ک‌‬
‫آهنگِ‌جدید‌را‌به‌او‌بدهیم‪‌ .‬‬
‫طبقهبندی‌■ ‪217‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫مجمولهی‌داده‪‌،‬چند‌موسیقیِ‌دیگر‌اضافه‌کنیم‪‌.‬موسی‌یقیِ‌شیماره‌ی‌‪‌2‬‬
‫‌‬ ‫اجازه‌بدهید‪‌،‬به‌این‌‬
‫شمارهی‌‪‌1‬یک‌موسیقیِ‌«روحی‌ی‌‬‫‌‬ ‫«جاز‌(‪‌»‌)jazz‬و‌«مالیم‌(‪‌»)melancholy‬است‪‌.‬موسیقیِ‌‬
‫شمارهی‌‪‌،3‬یک‌موسیقیِ‌«جیاز‌‌‬
‫‌‬ ‫(‪‌»)soul‬و‌«خشمگین‌(‪‌»)angry‬است‌و‌در‌نهایت‌موسیقیِ‌‬
‫دادهایم‪‌ :‬‬
‫یها‌را‌نمایش‌ ‌‬‫(‪‌»)jazz‬و‌«خشمگین‌(‪‌»)angry‬است‪‌.‬در‌شکل‌زیر‌این‌موسیق ‌‬
‫موسیقی‌‪‌ song 1‌=‌2‬‬
‫موسیقی‌‪‌ song 2‌=‌1‬‬
‫موسیقی‌‪song 3‌=‌3‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌211‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫یها‌داشته‌ایم‪‌.‬اجیازه‌‌‬
‫امیدوارم‌فهمیده‌باشید‌که‌یک‌اشتباهِ‌مهلک‪‌،‬در‌طراحی‌شِمای‌موسیق ‌‬
‫بدهید‌یک‌بار‌دیگر‪‌،‬مقادیرِ‌ممکن‌برای‌متغیرها‌را‌نگاه‌کنیم‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫اگر‌سعی‌کنیم‌از‌هر‌معیارِ‌فاصله‌(که‌در‌فصل‌‪‌1‬در‌موردش‌صحبت‌کردیم)‌استفاده‌کنی‌یم‪‌،‬‬
‫با‌استفاده‌از‌شِمایی‌که‌در‌شکل‌باال‌داریم‪‌،‬در‌واقع‌منظورمان‌ایی‌ن‌اسیت‌‌کیه‌‌آهنیگ‌ ‌هیا‌ی‌‬
‫«جاز‌(‪‌»)jazz‬به‌آهنگ‌های‌«راك‌(‪‌»)rock‬نزدیک‌تر‌هستند‌تا‌آهنگ‌های‌«روحی‌(‪‌»)soul‬‬
‫طبقهبندی‌■ ‪216‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫فاصلهی‌بی‌ین‌«جیاز‌‌(‪‌»)jazz‬و‌‬
‫فاصلهی‌بین‌«جاز‌(‪‌»)jazz‬و‌«راك‌(‪‌»)rock‬برابر‌‪‌2‬است‌و‌ ‌‬ ‫( ‌‬
‫«روحی‌(‪‌»)soul‬برابر‌‪‌ 1‬است)‪‌.‬یی‌ا‌بیرا‌ی‌مثیال‪‌‌،‬آهنیگ‌هیا‌ی‌«مالیی‌م‌(‪‌»)melancholy‬بیه‌‌‬
‫آهنگ‌های‌«شاد‌(‪‌»)joyful‬نزدیک‌تر‌هستند‌تا‌آهنگ‌های‌«خشمگین‌(‪‌.»)angry‬حتی‌اگیر‌‌‬
‫یماند‪‌ .‬‬
‫مقادیر‌را‌مانند‌زیر‌بازچینی‌کنیم‪‌،‬مشکل‌همچنان‌باقی‌م ‌‬
‫‌‬

‫‌‬
‫‌‬
‫یکند‌که‌چگونه‌مقادیر‌را‌بازچینی‌کنیم‪‌،‬اگیر‌‌بیه‌‌‬ ‫یکند‪‌.‬فرقی‌نم ‌‬ ‫بازچینی‪‌،‬مشکل‌را‌حل‌نم ‌‬
‫یدهد‪‌.‬در‌واقع‌ایی‌ن‌حالیت‌‌بیه‌‌میا‌‌یی‌ادآوری‌‬ ‫این‌طریق‌لمل‌کنیم‪‌،‬الگوریتم‌جوابِ‌خوبی‌نم ‌‬
‫یخیواه‌یم‌کیه‌‌‬ ‫یهیا‌یی‌را‌می‌ ‌‬
‫یهایمان‌را‌به‌خوبی‌انتخاب‌نکرده‌ایم‪‌.‬ما‌ویژگی‌ ‌‬ ‫یکند‌که‌ویژگ ‌‬ ‫م‌‬
‫یتوانیم‌به‌سیادگ‌ی‪‌،‬‬ ‫یدار‌قرار‌بگیرند‪‌.‬برای‌حلِ‌این‌مشکل‌م ‌‬ ‫بازهی‌معن ‌‬
‫مقادیرِ‌آن‌ها‪‌،‬در‌یک‌ ‌‬
‫ویژگیِ‌«ژانر‌(‪‌»)genre‬را‌به‌‪‌5‬ویژگیِ‌جدا‌از‌هم‌تبدیل‌کنیم‌–‌یکی‌برای‌سیبکِ‌‌موسی‌یقیِ‌‬
‫«کییانتری‌(‪‌،»)country‬یکییی‌بییرای‌«جییاز‌‬
‫نطور‌الی‌آخر‪‌ .‬‬ ‫(‪‌»)jazz‬و‌همی ‌‬
‫یتوانند‌بین‌‪‌2‬تا‌‪‌5‬باشند‪‌.‬‬ ‫تمامِ‌این‌ژانرها‪‌،‬م ‌‬
‫یتیوان‌یم‌بفهمی‌یم‌کیه‌‌یی‌ک‌‬ ‫–‌برای‌مثال‪‌،‬می‌ ‌‬
‫قطعهی‌موسی‌یقی‌چقیدر‌‌در‌ژانیرِ‌‌«کیانتر‌ی‌‬‫‌‬
‫یگیی‌رد‌–‌‪‌2‬بیه‌‌معنیا‌ی‌‬ ‫(‪‌»)country‬قرار‌م ‌‬
‫قطعهی‌موسی‌یقی‌اصیالً‌‌در‌‬‫این ‌است‌که‌این‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌231‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یگیرد‌و‌‪‌5‬به‌معنای‌این‌است‌که‌این‌قطعیه‌ی‌موسی‌یقی‌‬ ‫ژانرِ‌«کانتری‌(‪‌»)country‬قرار‌نم ‌‬
‫یدهد‪‌.‬میثالً ‌االن‌‬ ‫کالً‌ژانرِ‌«کانتری‌(‪‌»)country‬دارد‪‌.‬حاال‪‌،‬این‌مقیاس‪‌،‬یک‌معنیِ‌خاصی‌م ‌‬
‫اگر‌بخواهیم‌یک‌قطعیه‌ی‌موسی‌یقی‪‌،‬شیب‌یه‌بیه‌‌قطعیه‌ی‌دیگیر‪‌‌،‬کیه‌‌مقیدار‌‌ژانیرِ‌‌«کیانتر‌ی‌‬
‫(‪‌»)country‬برای‌آن‌‪‌5‬شده‌است‪‌،‬پیدا‌کنیم‪‌،‬قطعیه‌ای‌کیه‌‌مقیدارِ‌‌«کیانتر‌ی‌(‪‌»)country‬‬
‫بودن‌بیرا‌ی‌آن‌برابیر‌‌‪‌4‬باشید‪‌‌،‬طبیعتیاً‌‌نزدیی‌ک‌تیر‌‌از‌قطعیه‌‌ای‌اسیت‌‌کیه‌‌مقیدارِ‌‌«کیانتر‌ی‌‬
‫(‪‌»)country‬بودن‌برای‌آن‌برابرِ‌‪‌2‬باشد‪‌ .‬‬
‫یهیا‌ی‌خیود‌‌را‌‬ ‫این‌دقیقاً‌همان‌روشی‌است‌که‌پانیدورا‪‌‌،‬مجمولیه‌ی‌ژن‌هیا‌‌یی‌ا‌همیان‌‌ویژگی‌ ‌‬
‫بازهی‌‪‌2‬تا‌‪‌5‬هستند‌(البتیه‌‌بیا‌‌قیدم‌هیا‌ی‌‪‌1.5‬‬ ‫یسازد‪‌.‬ژن‌های‌مختلف‌در‌پاندورا‪‌،‬اکثراً‌در‌ ‌‬ ‫م‌‬
‫یگیرند‪‌.‬برای‌مثال‪‌،‬یک‌دسته‌بندیِ‌کیفیِ‌موسی‌یقیایی‌وجیود‌‌‬ ‫تایی)‪‌.‬ژن‌ها‌در‌دسته‌ها‌قرار‌م ‌‬
‫انواع‌موسیقیهیای‌‌«راك‌بلیوز‌‌(‪«‌،»)Blues Rock‬راك‌محلی‌ی‌‬ ‫‌‬ ‫ژنهایی‌برای‌‬
‫دارد‌که‌شاملِ‌ ‌‬
‫دستهبنید‌یِ‌‬
‫یشود‪‌ ‌.‬‬ ‫(‪‌»)Folk Rock‬و‌«پاپ‌راك‌(‪‌»)Pop Rock‬در‌میان‌بقی‌هی‌موسیق ‌‬
‫یها‌م ‌‬
‫فهیا‌ی‌گیتیار‌‌الکتریی‌ک‌‬ ‫لهی‌ژانرهایی‌مانندِ‌«آکیاردئون‌‌(‪«‌،»)accordion‬ریی‌ ‌‬ ‫دیگر‪‌،‬به‌وسی ‌‬
‫ارگانهیا‌ی‌صیدا‌یی‌کثیی‌ف‌( ‪Use of‬‬ ‫کثیف‌(‪‌»)Dirty Electric Guitar Riffs‬و‌«استفاده‌از‌ ‌‬
‫یهیا‌)‌کیه‌‌هیر‌‌‬
‫ژنهیا‌‌(ویژگی‌ ‌‬
‫یشود‪‌.‬با‌استفاده‌از‌این‌ ‌‬ ‫‪‌»)Dirty Sounding Organs‬نواخته‌م ‌‬
‫قطعهی‌موسی‌یقی‌را‌بیه‌‌یی‌ک‌‬ ‫کدام‌از‌آن‌ها‪‌،‬به‌خوبی‌مقادیری‌بین‌‪‌2‬تا‌‪‌5‬دارند‪‌،‬پاندورا‪‌،‬هر‌ ‌‬
‫قطعهی‌موسیقی‪‌،‬یک‌نقطیه‌‌در‌‬ ‫اندازهی‌‪‌411‬تبدیل‌کرده‌است‌(یعنی‌هر‌ ‌‬ ‫بُردار‌(‪‌)vector‬با‌ ‌‬
‫یتوانید‌‌پیشینهادات‌‌خیود‌‌را‌بسیازد‌‪‌.‬ایی‌ن‌‬ ‫یک‌فضای‌‪‌411‬بُعید‌ی‌اسیت‌)‪‌.‬حیاال‌‌پانیدورا‪‌‌،‬می‌ ‌‬
‫پیشنهادها‌شاملِ‌تصمیم‌به‌پخشِ‌یک‌موسیقی‌در‌یک‌ایستگاه‌رادیوییِ‌ساخته‌شده‌توسط‌‬
‫فاصلهی‌اسیتاندارد‌‌کیه‌‌در‌فصیل‌‌‪‌1‬و‌‪‌3‬درمیورد‌‌‬ ‫کاربر‌است)‪‌.‬این‌پیشنهاد‌ها‌بر‌اساس‌توابع‌ ‌‬
‫آنها‌صحبت‌کردیم‪‌،‬هستند‪‌ .‬‬ ‫‌‬
‫‌‬

‫یک‌مثال‌ساده ‌‬
‫دادهی‌ساده‌تولید‌کنیم‌تا‌با‌این‌روش‌بیشتر‌آشنا‌شیو‌یم‪‌.‬فیرض‌‌‬
‫اجازه‌بدهید‌یک‌مجموله‌ ‌‬
‫بازهی‌‪‌2‬تا‌‪‌5‬هستند‌(با‌افیزا‌یش‌‪1.5‬تیا‌یی)‪‌.‬البتیه‌‌‬
‫کنید‪‌،‬هفت‌ویژگی‌داریم‌که‌هر‌کدام‌در‌ ‌‬
‫قبول‌دارم‌که‌خیلی‌منطقی‌و‌کامل‌نیست‪‌ :‬‬
‫‪(‌piano‌.2‬پیانو)‌=‌اگر‌در‌آهنگ‌از‌پیانو‌استفاده‌نشده‌باشد‪‌،‬لدد‌‪‌2‬و‌اگر‌در‌سراسر‌آهنگ‌‬
‫یگیرد ‌‬‫کامالً‌و‌به‌صورتِ‌موثر‌از‌پیانو‌استفاده‌شده‌بود‌لدد‌‪‌5‬در‌این‌ویژگی‌قرار‌م ‌‬
‫طبقهبندی‌■ ‪232‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‪(‌vocals‌.1‬وکال ‌ها)‌=‌اگر‌در‌آهنگ‌هیچ‌وکالی‌نبود‪‌،‬لدد‌‪‌2‬و‌اگیر‌‌در‌سراسیر‌‌آهنیگ‌‌بیه‌‌‬
‫یگیرد ‌‬‫صورت‌موثر‌از‌وکال‌استفاده‌شده‌بود‪‌،‬لدد‌‪‌5‬به‌این‌ویژگی‌تعلق‌م ‌‬
‫درامهیا‌‌و‌‬
‫نکیه‌‌چطیور‌‌ ‌‬ ‫‪(‌driving beat‌.3‬ضربه‌درایوینگ)‌=‌ترکیبی‌از‌تمپوی‌ممتد‪‌،‬و‌ایی‌ ‌‬
‫یکنند ‌‬‫ضربههای‌موسیقی‌را‌هدایت‌م ‌‬‫باس‪‌ ‌،‬‬
‫‪(‌blues Infulence‌.4‬تاثیر‌بلوز) ‌‬
‫‪(‌dirty elec. guitar‌.5‬گیتار‌الکتریک‌کثیف) ‌‬
‫‪‌ (‌backup vocals‌.9‬‬
‫وکالهای‌پشتیبان) ‌‬
‫‪(‌rap inf.‌.7‬تاثیر‌رپ) ‌‬
‫قطعهی‌موسیقی‌را‌امتیازدهی‌کینم‌‌(قطعیاتِ‌‌‬ ‫یخواهم‌‪‌ ‌21‬‬ ‫یها‪‌،‬م ‌‬
‫حاال‌با‌استفاده‌از‌این‌ویژگ ‌‬
‫ستونها‌هستند)‪‌ :‬‬
‫یها‌در‌ ‌‬ ‫موسیقی‌در‌سطرها‌قرار‌دارند‌و‌ویژگ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫یتیوان‌یم‌از‌‬
‫از‌آن‌جایی‌که‌هر‌کدام‌از‌قطعاتِ‌موسیقی‪‌،‬شاملِ‌مجموله‌ای‌از‌الداد‌هستند‪‌،‬می‌ ‌‬
‫محاسبهی‌فاصله‌بین‌این‌قطعاتِ‌موسیقی‌استفاده‌کنیم‪‌.‬برای‌مثیال‪‌‌،‬‬
‫‌‬ ‫هر‌تابعِ‌فاصله‌ای‌برای‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌231‬‬
‫دادهکاوی‌برای‌ ‌‬

‫قطعییهی‌‬
‫‌‬ ‫قطعییهی‌‪‌Dr. Dog’s Fate‬و‌‬
‫‌‬ ‫فاصییلهی‌منهییتن‌(‪‌)Manhatan distance‬بییین‌‬
‫‌‬
‫‪‌Phoenix’s Lisztomania‬به‌صورت‌زیر‌محاسبه‌م ‌‬
‫یشود‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫جمع‌سطرِ‌آخر‌–‌‪‌Distance‬یعنی‌جمع‌فاصله‌ها‌در‌هر‌ویژگی‪‌،‬برابر‌فاصیله‌ی‌منهیتن‌‌(در‌‬
‫یشود‪‌ .‬‬
‫نجا‌برابر‌‪‌)6‬م ‌‬‫ای ‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید ‌‬
‫یکنم‌بفهمم‌که‌کدام‌قطعات‌موسیقی‪‌،‬به‌آهنگِ‌‪‌Jessie’s Girl‬اثر‌‪‌Glee‬با‌‬ ‫دارم‌سعی‌م ‌‬
‫یتوانید‌جدول‌زیر‌را‌تکمیل‌کنیی‌د‌و‌‬ ‫فاصلهی‌اقلیدسی‪‌،‬نزدیک‌تر‌هستند‪‌.‬آیا‌م ‌‬
‫توجه‌به ‌ ‌‬
‫کتر‌است‪‌ .‬‬‫بگویید‌کدام‌یک‌به‌این‌آهنگ‪‌،‬نزدی ‌‬
‫‌‬
‫طبقهبندی‌■ ‪233‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫‌‬

‫مدادتان‌را‌تیز‌کنید‌–‌ ‌‬
‫راهحل ‌‬
‫‌‬

‫فاصلهی‌اقلیدسی‌(‪‌)Euclidean distance‬بین‌دو‌شیِ‌‪‌x‬و‌‪‌y‬که‌دارای‌‬
‫به‌یاد‌بیاورید‌که‌ ‌‬
‫‪‌n‬ویژگی‌(‪‌n‬بُعد)‌بودند‪‌،‬به‌صورت‌زیر‌محاسبه‌م ‌‬
‫یشد‪‌ :‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌234‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫فاصلهی‌اقلیدسی‌بین‌‪‌Glee‬و‌‪‌Lady Gaga‬به‌صورت‌زیر‌محاسبه‌م ‌‬
‫یشود‪‌ :‬‬ ‫پس‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬

‫برویم‌به‌سراغ‌کدهای‌پایتون ‌‬
‫دادههای‌ما‌برای‌پایش‌اجتمیال‌ی‌(‪‌)social filtering‬در‌فصیلِ‌‌قبلی‌ی‪‌،‬بیه‌‌‬
‫به‌یاد‌بیاورید‌که‌ ‌‬
‫فرمت‌زیر‌بود‪‌ :‬‬

‫یتوانیم‌به‌همان‌شکل‌نمایش‌دهیم‪‌ :‬‬
‫دادههای‌فعلی‌را‌نیز‌م ‌‬
‫‌‬
‫‌‬
‫طبقهبندی‌■ ‪235‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫یگوید‌بیه‌‌قطعیه‌ی‌‪‌Black Keys Magic Potion‬‬ ‫حاال‌فرض‌کنید‌که‌من‌دوستی‌دارم‌که‌م ‌‬
‫کتیر‌ین‌همسیا‌ی‌هی‌آن‌را‌توسیط‌‌تیابعِ‌‌فاصیله‌ی‌منهیتن‌‌‬
‫یتوانم‌نزدیی‌ ‌‬
‫لالقهمند‌است‪‌.‬من‌م ‌‬
‫‌‬
‫نوشتهام‌محاسبه‌کنم‪‌ :‬‬
‫‌‬ ‫(‪‌)Manhattan‬که‌با‌پایتون‌‬
‫‌‬

‫‌‬
‫یتیوانم‌‌بیه‌‌او‌قطعیه‌ی‌‪‌Heartless Bastard’s Out at Sea‬را‌‬
‫و‌با‌استفاده‌از‌ایی‌ن‌روش‪‌،‬می‌ ‌‬
‫پیشنهاد‌دهم‌که‌به‌نظر‌پیشنهاد‌خوبی‌هم‌هست‪‌ .‬‬
‫‌‬
‫نکته‬
‫برنامهنویسان‬ ‫‪‌ ■‌239‬‬
‫دادهکاوی‌برای‌ ‌‬

‫وبسایت‌‬
‫کدهای‌این‌مثال‪‌،‬مانند‌تمامیِ‌دیگر‌کدهای‌این‌کتاب‪‌،‬در‌ ‌‬
‫‌‬
‫وبسایت‌‪‌chistio.ir‬موجود‌است‪.‬‬
‫‪‌guidtodatamining.com‬و‌ ‌‬
‫‌‬

‫پاسخ‌به‌سوالِ‌«چرا؟» ‌‬
‫یدهید‌‌کیه‌‌چیرا‌‌‬
‫یدهد‪‌،‬برایتیان‌‌توضی‌یح‌می‌ ‌‬
‫هنگامی‌که‌پاندورا‪‌،‬چیزی‌را‌به‌شما‌پیشنهاد‌م ‌‬
‫ممکن‌است‌آن‌را‌دوست‌داشته‌باشید‪‌ :‬‬

‫‌‬
‫یتوانیم‌این‌کار‌را‌بکنیم‪‌.‬آن‌دوستمان‌را‌به‌یاد‌بیاوریی‌د‌کیه‌‌قطعیه‌ی‌ ‪Black Keys‬‬ ‫ما‌هم‌م ‌‬
‫‪‌Magic Potion‬را‌دوست‌داشت‪‌.‬میا‌‌بیه‌‌او‌قطعیه‌ی‌‪‌Heartless Bastards Out at Sea‬را‌‬
‫یهیا‌‌در‌آن‌پیشینهاد‌‌تاثیرگیذار‌‌بودنید‌‪‌.‬‬ ‫پیشنهاد‌دادیم‪‌.‬حال‌سوال‌این‌جاست‌که‌کدام‌ویژگ ‌‬
‫قطعهی‌موسیقی‌یک‌بیردار‌)‌را‌بیا‌‌یکید‌یگر‌مقایسیه‌‌کنی‌یم‌‬‫بیایید‪‌،‬دو‌بردارِ‌ویژگی‌(برای‌هر‌ ‌‬
‫یها)‪‌ :‬‬
‫انگر‌ویژگ ‌‬‫ستونها‌بی ‌‬
‫انگرِ‌قطعات‌موسیقی‌هستند‌و‌ ‌‬ ‫(سطرها‌نمای ‌‬
‫‌‬
‫طبقهبندی‌■ ‪237‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫‌‬
‫قطعهی‌موسیقی‌مشترك‌بود‪‌،‬پیانو‌(‪‌،)piano‬وجود‌وکیال‌هیا‌ی‌‬ ‫یهایی‌که‌بین‌این‌دو‌ ‌‬ ‫ویژگ ‌‬
‫فاصلهی‌صیفر‌‌بیا‌‌‬
‫آنها‌ ‌‬ ‫پشتیبان‌(‪‌)backup vocals‬و‌تاثیرِ‌رپ‌(‪‌)rap inf.‬بود‌–‌که‌ ‌‬
‫همهی‌ ‌‬
‫یها‌در‌هر‌کدام ‌از‌قطعاتِ‌‬ ‫هم‌داشتند‪‌،‬یعنی‌در‌هر‌دو‌بردار‌برابر‌بودند‪‌.‬با‌این‌حال‪‌،‬این‌ویژگ ‌‬
‫موسیقی‪‌،‬در‌کمترین‌حالتِ‌خود‌قرار‌داشتند‪‌:‬یعنی‌هر‌دو‌قطعیه‌ی‌موسی‌یقی‪‌،‬بیدون‌‌پیی‌انو‪‌،‬‬
‫بدون‌حضور‌وکال‌های‌پشتیبان‌و‌بدون‌تاثیر‌رپ‌بودند‪‌.‬پس‌احتماالً‌خیلی‌جالب‌نیست‌کیه‌‌‬
‫قطعهی‌موسیقی‌را‌به‌دلیلِ‌نداشیتنِ‌‌وکیال‌‌هیا‌ی‌‬
‫یکنیم‌که‌شما‌این‌ ‌‬ ‫مثالً‌بگوییم‪«‌:‬ما‌فکر‌م ‌‬
‫پیشتیبان‪‌،‬دوست‌داشتید»‪‌.‬در‌لوض‪‌،‬تمرکیزِ‌‌خودمیان‌‌را‌بیر‌‌روی‌اشیتراك‌ ‌هیا‌ی‌ایی‌ن‌دو‌‬
‫یگذاریم‌–‌یعنی‌جاهایی‌که‌الدادِ‌موجیود‌‌در‌بردارهیا‌‌‬ ‫قطعهی‌موسیقی‌در‌الدادِ‌بزرگ‌تر‌م ‌‬ ‫‌‬
‫نزدیک‌به‌‪‌5‬باشند‪‌ .‬‬
‫قطعهی‌ ‪Heartless Bastards‬‬ ‫یکنیم‌شما‌ ‌‬ ‫برای‌مثال‌فکر‌م ‌‬
‫تشیونده‌‌و‌‬ ‫‪‌Out at Sea‬را‌به‌خاطرِ‌داشتنِ‌ ‌‬
‫ضربههای‌هدای ‌‬
‫داشتهاید‪‌ .‬‬
‫‌‬ ‫وکالها‌و‌گیتار‌الکتریک‌کثیف‌دوست‌‬ ‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫یهیا‌ی‌کمی‌ی‌هسیت‪‌‌،‬و‌البتیه‌‌خیلی‌ی‌هیم‌‌‬ ‫دادهی‌ما‌دارای‌ویژگی‌ ‌‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫به‌خاطرِ‌این‌که‌‬
‫یرسند‪‌ :‬‬
‫شنهادها‌خیلی‌جالب‌و‌متقالدکننده ‌به‌نظر‌نم ‌‬ ‫‌‬ ‫متعادل‌نیست‪‌،‬بقی‌هی‌پی‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌231‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫مثالً‌پیشنهاد‌‪‌Lady Gaga‬به‌نظر‌پیشنهاد‌خوبی‌نیست‪‌ .‬‬
‫‌‬

‫اسهای‌متفاوت ‌‬
‫مشکل‌در‌مقی ‌‬
‫دادههایم‌اضافه‌کینم‌‪‌.‬ایی‌ن‌بیار‪‌‌،‬تعیداد‌‌‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫یخواهم‌یک‌ویژگیِ‌دیگر‌به‌‬‫فرض‌کنید‌م ‌‬
‫ضربه‌در‌دقیقه‌(‪‌beats per minute‬یا‌‪‌)bpm‬را‌اضافه‌می‌ ‌‬
‫یکینم‌‪‌.‬بیه‌‌نظیر‌‌ویژگی‌یِ‌بیه‌‌درد‌‬
‫یها‌را‌دوست‌داشیته‌‌باشیم‌‌و‌‬ ‫یرسد‌–‌مثالً‌ممکن‌است‌ضربه‌های‌سریع‌در‌موسیق ‌‬ ‫بخوری‌م ‌‬
‫یا‌آهنگ‌های‌رمانتیک‌تر‌را‌ترجیح‌دهم‪‌.‬حاال‌با‌این‌تغییر‪‌،‬داده‌هیا‌ی‌مین‌‌بیه‌‌شیکل‌‌زیی‌ر‌در‌‬
‫یها)‪‌ :‬‬
‫انگر‌ویژگ ‌‬ ‫ستونها‌بی ‌‬
‫انگر‌قطعات‌موسیقی‌هستند‌و‌ ‌‬ ‫یآیند‌(مانند‌قبل‪‌،‬سطرها‌بی ‌‬
‫م‌‬
‫‌‬
‫طبقهبندی‌■ ‪236‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫‌‬
‫کتیر‌ین‌همسیا‌یه‌بیه‌‌‪‌،Black Keys’ Magic Potion‬قطعیه‌ی‌‬ ‫بدون‌استفاده‌از‌‪‌،bpm‬نزدیی‌ ‌‬
‫‪‌Heartless Bastards’ Out to Sea‬و‌دورتیر‌ین‌قطعیه‌‌بیه‌‌آن‪Bad Plus’s Smells Like ‌،‬‬
‫‪‌Teen Spirit‬است‪‌.‬ولی‌هنگامی‌که‌ما‌ویژگیِ‌‪‌bpm‬را‌اضافه‌م ‌‬
‫یکنیم‪‌،‬با‌اسیتفاده‌‌از‌همیان‌‌‬
‫یشود‌–‌در‌واقع‌‪‌bpm‬به‌نیول‌ی‪‌،‬بیر‌‌روی‌‬ ‫یریزد‌و‌خراب‌م ‌‬‫تابعِ‌فاصله‌‪‌،‬نتایج‌کامالً‌به‌هم‌م ‌‬
‫یکنید‌‪‌.‬حیاال‪‌‌،‬قطعیه‌ی‌‪‌Bad Plus‬بیه‌‌‪‌Black Keys‬‬ ‫حکمرانی‌و‌سیطره‌پییدا‌می‌ ‌‬
‫محاسبات‌ما‌ ‌‬
‫آنها‌به‌یکید‌یگر‌خیلی‌ی‌نزدیی‌ک‌‬‫کتر‌است‌و‌دلیل‌آن‌این‌است‌که‌ویژگیِ‌‪‌ ‌bpm‬‬ ‫خیلی‌نزدی ‌‬
‫است‪‌ .‬‬
‫مثال‌دیگری‌را‌در‌نظر‌بگیرید‪‌.‬فرض‌کنید‌من‌یک‌سیا‌یت‪‌،‬مخصیوص‌‌قیرار‌‌مالقیات‌‌دارم‌و‌‬
‫یها‌برای‌این‌که‌دو‌نفر‌را‌به‌هم‌معرفی‌کنیم‌یکی‌ی‌سین‌‌(‪‌)age‬‬ ‫التقاد‌دارم‌که‌بهترین‌ویژگ ‌‬
‫است‌و‌دیگری‌حقوق‌(‪:)salary‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌241‬‬
‫دادهکاوی‌برای‌ ‌‬

‫(جدول‌‪‌،gals‬جنسیت‌مونث‌هستند‌و‌جدول‌‪‌guys‬جنسیت‌مذکر) ‌‬
‫‌‬
‫بازهی‌حقوق‌‬ ‫بازهی‌سن‪‌،‬بین‌‪‌15‬تا‌‪‌53‬سال‌(یعنی‌با‌اختالف‌‪‌11‬سال)‌است‌ولی‌ ‌‬ ‫در‌این‌جا‌ ‌‬
‫در‌بین‌‪‌43‬هزار‌تا‌‪‌225‬هزار‪‌ ،‬یعنی‌با‌اختالف‌‪‌71‬هزار‌واحید‌‌قیرار‌‌دارد‪‌.‬بیه‌‌خیاطرِ‌‌تفیاوتِ‌‌‬
‫بسیار‌زیادِ‌این‌بازه‌ها‪‌،‬ویژگیِ‌حقوق‌(‪‌)salary‬بر‌تمامیِ‌محاسبات‌حکم‌رانی‌و‌سی‌یطره‌پیی‌دا‌‬
‫یکند‪‌.‬اگر‌بخواهیم‌به‌صورت‌چشمی‪‌،‬دو‌نفر‌را‌به‌هم‌مرتبط‌کنیم‪‌،‬احتمیاالً‌‌‪‌David‬را‌بیه‌‌‬ ‫م‌‬
‫ردهی‌سنی‌هستند‌و‌حقوقشان‌هیم‌‌تقریبیاً‌‌بیه‌‌‬ ‫‪‌Yun‬مرتبط‌خواهیم‌کرد‌چون‌آن‌ها‌در‌یک‌ ‌‬
‫هم‌نزدیک‌است‪‌.‬با‌این‌حال‪‌،‬اگر‌همین‌کار‌را‌با‌استفاده‌از‌هر‌کدام‌از‌فرمول‌های‌فاصله‌کیه‌‌‬
‫نجا‌گفتیم‌(مثل‌منهتن‌یا‌اقلیدسی)‪‌،‬انجام‌دهیم‪‌Brian‌،‬با‌‪‌53‬سال‌سین‪‌‌،‬شخصی‌ی‌‬ ‫تا‌به‌ای ‌‬
‫یشود‌که‌این‌قطعاً‌برای‌سایتِ‌تازه‌تاسیسِ‌مین‌‌‬ ‫است‌که‌به‌‪‌Yun‬با‌‪‌35‬سال‌سن‌پیشنهاد‌م ‌‬
‫خوب‌نیست‪‌ .‬‬
‫یها‪‌،‬یک‌مشکل‌بزرگ‌بیرا‌ی‌هیر‌‌سیسیتم‌‌‬ ‫در‌واقع‪‌،‬بازه‌ها‌و‌مقیاس‌های‌متفاوت‌بین‌ویژگ ‌‬
‫شنهاددهندهای‌است‪‌ .‬‬
‫‌‬ ‫پی‬
‫‌‬

‫نرمالسازی ‌‬
‫‌‬
‫وحشت‌نکنید! ‌‬
‫یک‌نفس‌لمیق‌بکشید‌و‌آسوده‌باشید‪‌ ...‬‬
‫طبقهبندی‌■ ‪242‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫نرمالسازی‌(‪‌)normalization‬است! ‌‬‫راهحل‪‌ ‌،‬‬‫‌‬


‫برای‌این‌که‌این‌مشکل‌و‌انحراف‌را‌حیل‌‌کنی‌یم‪‌،‬احتیی‌اج‌داریی‌م‌تیا‌‌داده‌هیا‌‌را‌نرمیال‌سیاز‌ی‌‬
‫نرمالسازی‌این‌‬
‫راهحلِ‌رایج‌در‌ ‌‬ ‫(‪‌)normalize‬یا‌استانداردسازی‌(‪‌)standardize‬کنیم‪‌.‬یک‌ ‌‬
‫بازهی‌صفر‌یا‌یک‌داشته‌باشیم‪‌ .‬‬ ‫است‌که‌مقادیرِ‌هر‌ویژگی‌را‌در‌ ‌‬
‫برای‌مثال‪‌،‬ویژگیِ‌حقوق‌(‪‌)salary‬را‌در‌وب‌سایتِ‌قرار‌مقاالت‌تصور‌کنید‪‌.‬کمتیر‌ین‌میی‌زانِ‌‬
‫حقوق‌برابر‌‪‌43111‬و‌بیشترینِ‌آن‌برابر‌‪‌225111‬بود‪‌.‬در‌واقیع‌‌یی‌ک‌بیازه‌ی‌‪‌71111‬تیا‌یی‌‬
‫بازهی‌‪‌1‬تا‌‪‌،2‬آن‌مقدار‌را‌از‌کمترین‌مقدارِ‌موجود ‌در‌‬ ‫وجود‌داشت‪‌.‬برای‌تبدیلِ‌هر‌مقدار‌به‌ ‌‬
‫یکنیم‪‌ .‬‬‫بازهی‌موجود‌تقسیم‌م ‌‬ ‫یکنیم‌و‌نتیجه‌را‌بر‌ ‌‬‫ویژگیِ‌متناظرِ‌خود‌کم‌م ‌‬
‫‌‬
‫پس‌مقدار‌نرمال‌شده‌برای‌‪‌Yum‬برابر‌اسیت‌‌‬
‫با‪:‬‬

‫‪(75,000 - 43,000) / 72,000 = 0.444‬‬

‫بستگی‌به‌داده‌ها‌و‌مجمولیه‌ی‌داده‌ای‌کیه‌‌‬
‫یتواند‌به‌‬
‫در‌اختیار‌دارید‪‌،‬این‌روشِ‌ساده‌م ‌‬
‫خوبی‌کار‌کند‪‌ .‬‬
‫(در‌ستون‌‪‌‌normalized salary‬در‌شیکل‌‬
‫یتوانیی‌د‌بقیی‌‌هی‌حقیوق‌هیا‌ی‌‬‫سمت‌چپ‪‌،‬م ‌‬
‫نرمالشده‌را‌مشاهده‌کنید) ‌‬
‫‌‬
‫اگر‌دروس‌آماری‌را‌بخوانید‌با‌روش‌های‌دقیق‌تر‌برای‌استانداردسازی‌داده‌ها‌آشینا‌‌خواهیی‌د‌‬
‫یتوانیم‌از‌مقداری‌به‌نام‌«امتیاز‌استاندارد‌(‪‌»)standard score‬اسیتفاده‌‌‬ ‫شد‪‌.‬برای‌مثال‪‌،‬م ‌‬
‫یشود‪‌ :‬‬‫کنیم‌که‌به‌صورت‌زیر‌محاسبه‌م ‌‬
‫لهی‌«امتیاز‌اسیتاندار‌»‌کیه‌‌بیه‌‌‪‌z-score‬نیی‌ز‌معیروف‌‌اسیت‪‌‌،‬‬ ‫یتوانیم‌یک‌مقدار‌را‌به‌وسی ‌‬‫م‌‬
‫یگوید‌که‌یک‌لدد‌در‌بین‌الدادِ‌دیگر‪‌،‬به‌چه‌مقدار‌‬ ‫استانداردسازی‌کنیم‪‌.‬این‌مقدار‌به‌ما‌م ‌‬
‫آنها‌انحراف‌دارد‪‌ .‬‬
‫از‌میانگینِ‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌241‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫انحراف‌استاندراد‌(‪‌)standard deviation‬یا‌همان‌انحراف‌معیار‌برابر‌است‌با‪:‬‬

‫‌‬
‫که‌در‌آن‌)‪‌card(x‬مقدار‌کاردینالیتی ‌برای‌‪‌x‬است‌–‌یعنی‌چند‌تا‌مقدار‌در‌آن‌است‪‌ .‬‬
‫یتوانید‌کتیابِ‌‌«‪‌»The Manga Guide to Statistics‬‬ ‫یک‌نکته‪‌:‬اگر‌با‌آمار‌مشکلی‌دارید‪‌،‬م ‌‬
‫را‌مطالعه‌کنید‪‌ .‬‬
‫صفحهی‌‬
‫‌‬ ‫داده‌های‌مربوط‌به‌وب‌سایتِ‌قرار‌مالقات‌در‌چند‌‬
‫قبل‌را‌به‌یاد‌آورید‪‌ .‬‬
‫در‌این‌داده‌ها‪‌،‬جمع‌تمامیِ‌حقوق‌ها‌(ستون‌‪‌،)salary‬برابر‌‬
‫‪‌577111‬شده‌است‪‌.‬از‌آن‌جایی‌که‌‪‌1‬نفیر‌‌در‌ایی‌ن‌داده‌هیا‌‌‬
‫یشود‪‌ .‬‬‫حضور‌داشتند‪‌،‬میانگینِ‌حقوق‌برابر‌‪‌71215‬م ‌‬
‫حاال‪‌،‬اجازه‌دهید‪‌،‬انحرافِ‌استاندارد‌(‪‌)sd‬را‌برای‌حقوق‌به‌‬
‫دست‌بیاوریم‌(فرمول‌که‌مانند‌زیر‌بود)‪‌ :‬‬
‫‌‬

‫‌‬
‫طبقهبندی‌■ ‪243‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫پس‌برای‌حقوق‌داریم‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫دوباره‌به‌یاد‌بیاورید‌که‌امتیازِ‌استاندارد‌(‪‌)z-score‬به‌صورت‌زیر‌محاسبه‌م ‌‬
‫یشد‪‌ :‬‬

‫‌‬
‫پس‌امتیازِ‌استاندارد‌(‪‌)z-score‬برای‌فردی‌مثل‌‪‌،Yun‬برابر‌است‌با‪‌ :‬‬

‫مدادتان‌را‌تیز‌کنید ‌‬
‫برای‌افراد‌زیر‪‌،‬امتیازِ‌استاندارد‌(‪‌)z-score‬را‌محاسبه‌کنید‪:‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌244‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫مدادتان‌را‌تیز‌کنید‌–‌راه حل ‌‬
‫برای‌افراد‌زیر‪‌،‬امتیازِ‌استاندارد‌(‪‌)z-score‬را‌محاسبه‌کنید‪:‬‬
‫طبقهبندی‌■ ‪245‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬

‫مشکلِ‌استفاده‌از‌امتیازِ‌استاندارد ‌‬
‫مشکل‌اصلی‌در‌استفاده‌از‌امتیازِ‌اسیتاندارد‌‌‬
‫یا‌همان‌‪‌،z-score‬این‌است‌که‌این‌امتیی‌از‪‌،‬‬
‫یگیرد‪‌.‬برای‌‬ ‫از‌داده‌های‌پرت‪‌،‬تاثیر‌زیادی‌م ‌‬
‫مثییال‪‌،‬اگییر‌در‌یییک‌فروشییگاهی‌ماننیید‌‬
‫‪‌100‌،LargeMart‬نفر‌کارگر‌حضور‌داشیته‌‌‬
‫باشند‌و‌هر‌کدام‌‪‌21‬دالر‌در‌سالت‌حقیوق‌‌‬
‫بگیرنیید‪‌،‬امییا‌مییدیرلامل‌‪‌9‬میلی یون‌دالر‌در‌‬
‫سییال‌حقییوق‌داشییته‌باشیید‪‌،‬حییق‌الزحمییه‌ی‌‬
‫میانگین‌بیرا‌ی‌هیر‌‌سیالت‌‌بیه‌‌صیورت‌‌زیی‌ر‌‬
‫یشود‪‌ :‬‬
‫محاسبه‌م ‌‬

‫‌‬
‫که‌برای‌فروشگاهی‌مانند‌‪‌LargeMart‬رقمِ‌کمی‌نیست‪‌.‬همان ‌طور‌که‌مشیاهده‌‌می‌ ‌‬
‫یکنیی‌د‪‌،‬‬
‫دادهی‌پرت‌(همان‌حقوقِ‌مدیرلامل)‌قرار‌گرفت‪‌ ‌.‬‬
‫میانگین‪‌،‬کامالً‌تحتِ‌تاثیرِ‌ ‌‬
‫به‌خاطر‌این‌مشکل‌که‌با‌میانگین‌(‪‌)mean‬پیدا‌م ‌‬
‫یکنیم‪‌،‬معموالً‌فرمولِ‌امتیازِ‌استاندارد‌را‌‬
‫یدهیم‪‌ .‬‬
‫تغییر‌م ‌‬
‫‌‬

‫اصالحشده‌(‪‌ )Modified Standard Score‬‬


‫‌‬ ‫امتیازِ‌استانداردِ‌‬
‫محاسبهی‌امتیازِ‌استاندردِ‌اصالح‌شده‪‌،‬میی‌انگین‌(‪‌)mean‬را‌در‌فرمیولِ‌‌بیاال‌‌بیه‌‌میانیه‌‌‬
‫‌‬ ‫برای‌‬
‫یدهیم‪‌.‬همچنین‌انحراف‌استاندارد‌(در‌مخرج)‌را‌با‌«انحیرافِ‌‌اسیتانداردِ‌‌‬ ‫(‪‌)median‬تغییر‌م ‌‬
‫یکنیم‪‌ :‬‬‫مطلق‌(‪‌»)asd‬جایگزین‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌249‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫که‌در‌این‌فرمول‌‪‌µ‬همان‌میانه‌(‪‌)median‬است‪‌ .‬‬
‫‌‬
‫یشود‪‌ :‬‬
‫پس‌امتیازِ‌استانداردِ‌اصالح‌شده‌به‌صورت‌زیر‌محاسبه‌م ‌‬

‫‌‬
‫یچینیم‪‌،‬‬ ‫محاسبهی‌میانه‌(‪‌،)median‬الداد‌را‌به‌ترتیب‌از‌کوچک‌ترین‌تا‌بزرگ‌ترین‌م ‌‬ ‫‌‬ ‫برای‌‬
‫یکنیم‪‌.‬اگر‌تعیدادِ‌‌الیداد‌‌زوج‌بیود‪‌‌،‬میانیه‌‌(‪‌)media‬برابیرِ‌‌‬
‫سپس‌لددِ‌میانیِ‌آن‌را‌انتخاب‌م ‌‬
‫یشود‪‌ .‬‬
‫میانگینِ‌دو‌لددِ‌وسط‌م ‌‬
‫خب‪‌،‬حاال‌بیایید‌با‌مثال‌یاد‌بگیریم‪‌.‬در‌جدولِ‌زیر‪‌،‬مقادیرِ‌حقوق‌را‌از‌کیم‌‌بیه‌‌زیی‌اد‪‌،‬مرتیب‌‌‬
‫کردهام‪‌ .‬‬
‫‌‬
‫بقهبندی‌■ ‪247‬‬
‫‌فصل‌‪‌.4‬ط ‌‬

‫‌‬
‫یشود‪‌،‬میانه‌(‪‌)median‬برابرِ‌میانگینِ‌دو‌لدد‌وسط‌است‪‌ :‬‬
‫آن‌جاهایی‌که‌تعداد‌الداد‌زوج‌م ‌‬
‫‌‬

‫‌‬
‫‌‬
‫و‌انحراف‌استاندرادِ‌مطلق‌(‪‌)asd‬به‌صورت‌زیر‌محاسبه‌م ‌‬
‫یشود‪‌ :‬‬
‫‌‬

‫‌‬
‫حاال‌بیایید‌امتیازِ‌استانداردِ‌اصالح‌شده‌(‪‌)mss‬را‌برای‌‪‌Yun‬محاسبه‌کنیم‪‌ .‬‬
‫‌‬

‫‌‬
‫مدادتان‌را‌تیز‌کنید ‌‬
‫قطعهی‌موسیقی‌(ستون‌‪‌)track‬را‌پخش‌ ‌‬
‫کردهام‌در‌‬ ‫در‌جدولِ‌زیر‪‌،‬تعداد‌دفعاتی‌که‌یک‌ ‌‬
‫ستون‌‪‌،play count‬نمایش‌داده‌شده‌است‪‌.‬آیا‌م ‌‬
‫یتوانید‌مقادیر‌را‌با‌اسیتفاده‌‌از‌امتیی‌ازِ‌‬
‫اصالحشده‪‌،‬استانداردسازی‌کنید؟ ‌‬
‫‌‬ ‫استانداردِ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌241‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬
‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل ‌‬
‫‌‬
‫محاسبهی‌میانه‌(‪‌ )median‬‬
‫‌‬ ‫قدم‌‪‌:2‬‬
‫یدارم‌که‌‬
‫مقادیر‌را‌به‌ترتیب‌صعودی‌(‪‌)12‌.25‌.21‌.7‌.3‬قرار‌داده‌و‌مقدار‌میانی‌را‌برم ‌‬
‫یشود‪‌ .‬‬
‫برابر‌‪‌21‬م ‌‬
‫‌‬
‫محاسبهی‌انحراف‌استاندارد‌مطلق‌(‪‌ )asd‬‬
‫‌‬ ‫قدم‌‪‌:1‬‬
‫‌‬
‫طبقهبندی‌■ ‪246‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫برای‌هر‌کدام‌از‌نمونهها ‌‬
‫‌‬ ‫اصالحشده‌‬
‫‌‬ ‫محاسبهی‌امتیازات‌استاندارد‌‬
‫‌‬ ‫قدم‌‪‌:3‬‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬

‫نرمالسازی‌را‌انجام‌بدهیم‌یا‌نه؟ ‌‬
‫‌‬
‫یهیا‌‌(ابعیاد‌)‌نسیبت‌‌بیه‌‌یکید‌یگر‌‬
‫یدهد‌که‌بازه‌و‌مقیاسِ‌ویژگ ‌‬ ‫نرمال‌سازی‌هنگامی‌جواب‌م ‌‬
‫یهیا‌‌‬
‫قبلتر‌در‌همین‌فصل‌گفتیم‪‌،‬تعدادی‌از‌ویژگ ‌‬ ‫بسیار‌متغیر‌باشند‪‌.‬در‌مثالِ‌موسیقی‌که‌ ‌‬
‫بازهی‌‪‌2‬تا‌‪‌5‬قرار‌داشتند‌و‌این‌در‌حالی‌اسیت‌‌کیه‌‌ویژگی‌یِ‌«ضیربه‌‌در‌‬ ‫وجود‌داشتند‌که‌در‌ ‌‬
‫دقیقه‌(‪‌»)beats per minute – bpm‬به‌صیورت‌‌بلقیوه‌‌در‌بیازه‌ای‌بی‌ین‌‪‌91‬تیا‌‌‪‌211‬قیرار‌‌‬
‫یگیرد‪‌.‬در‌مثالِ‌سایتِ‌قرار‌مالقات‌هم‪‌،‬لدمِ‌تطیابقِ‌‌بیازه‌‪‌،‬بی‌ین‌ویژگی‌یِ‌«سین‌‌(‪‌»)age‬بیا‌‌‬
‫م‌‬
‫ویژگیِ‌«حقوق‌(‪‌»)salary‬مشهود‌بود‪‌ .‬‬
‫تصور‌کنید‌من‌رویای‌پولدار‌شدن‌دارم‌و‌به‌دنبال‌منزلی‌در‌شیهرِ‌‌سیانتافه‌‌(‪‌)Santa Fe‬در‌‬
‫یدهد‪‌ .‬‬ ‫نیومکزیکو‌هستم‪‌.‬جدولِ‌زیر‪‌،‬چند‌خانه‌در‌بازار‌را‌نشان‌م ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌251‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫نجیا‌‌‬‫یهیا‌‌(در‌ایی‌ ‌‬
‫آنجایی‌که‌بازه‌و‌مقیاسِ‌یکی‌ی‌از‌ویژگی‌ ‌‬ ‫این‌جا‌هم‌مشکل‪‌،‬نمایان‌است‪‌.‬از‌ ‌‬
‫یها‌هست‪‌،‬این‌ویژگی‌بر‌هیر‌‌معیی‌ارِ‌فاصیله‌ای‌‬ ‫ویژگیِ‌«قیمت»)‌خیلی‌بیشتر‌از‌بقی‌هی‌ویژگ ‌‬
‫فاصلهی‌‬
‫یاندازد‪‌.‬و‌اینکه‌مثالً‌خانه‪‌،‬دو‌اتاق‌داشته‌باشد‌یا‌بیست‌اتاق‪‌،‬تاثیر‌زیادی‌بر‌ ‌‬ ‫سایه‌م ‌‬
‫بین‌دو‌خانه‌نخواهد‌گذاشت‪‌ .‬‬
‫یکنیم‌که‪‌ :‬‬ ‫نرمالسازی‌استفاده‌م ‌‬
‫پس‌هنگامی‌از‌ ‌‬
‫فاصلهی‌بین‌دو‌رکیورد‌‌‬ ‫محاسبهی‌ ‌‬
‫‌‬ ‫یدهیم‪‌،‬به‌دنبال‌‬ ‫‌روشی‌که‌مورد‌استفاده‌قرار‌م ‌‬ ‫‪.2‬‬
‫آنها‌باشد ‌‬
‫یهای‌ ‌‬ ‫(دو‌سطر)‌بر‌اساسِ‌مقادیرِ‌ویژگ ‌‬
‫یهیا‌ی‌مختلیف‌‌در‌آن‌مجمولیه‌ی‌داده‪‌،‬بیا‌‌یکید‌یگر‌تفیاوت‌‌‬ ‫بازهی‌ویژگ ‌‬
‫‌مقیاس‌یا‌ ‌‬ ‫‪.1‬‬
‫داشته‌باشند‌(مخصوصاً‌هنگامی‌که‌این‌تفاوت‌بسی‌یار‌فیاحش‌‌باشید‌‌–‌بیرا‌ی‌مثیال‪‌‌،‬بیازه‌ی‌‬
‫دادهی‌باال) ‌‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫بازهی‌«تعداد‌اتاق»‌در‌یک‌منزل‌مانند‌‬ ‫«قیمت»‌در‌مقایسه‌با‌ ‌‬
‫‌‬
‫لالقهی‌خود‌را‌با‌استفاده‌از‌آیکون‌های‌موافقت‪/‬مخالفت‌(انگشیت‌‌‬ ‫حاال‌فرض‌کنید‌شخصی‪‌ ‌،‬‬
‫وبسیا‌یت‌خبیر‌ی‪‌،‬بیرا‌ی‌اخبیار‌‌‬ ‫شصت‌به‌سمت‌باال‪/‬انگشت‌شصت‌به‌سمت‌پایین)‌در‌یی‌ک‌ ‌‬
‫یبینیی‌د‌(لیدد‌‌‪‌2‬بیه‌‌معنی‌یِ‌‬ ‫مختلف‌نشان‌دهد‪‌.‬در‌زیر‌لیستی‌از‌لالیق‌کاربر‌به‌اخبیار‌‌را‌می‌ ‌‬
‫موافقت‌و‌لدد‌‪‌1‬به‌معنی‌مخالفت‌است)‪‌ :‬‬
‫} … ‪Bill = {0, 0, 0, 1, 1, 1, 1, 0, 1, 0‬‬
‫واضح‌است‌که‌احتیاجی‌به‌نرمال‌سازیِ‌داده‌ها‌وجود‌ندارد‪‌.‬در‌موردِ‌سیا‌یتِ‌پانیدورا‌‌(همیان‌‌‬
‫یگرفتند‪‌.‬آیی‌ا‌‬
‫بازهی‌‪‌2‬تا‌‪‌5‬قرار‌م ‌‬
‫یها)‪‌،‬در‌ ‌‬‫سایتِ‌پخش‌موسیقی)‌چه؟‌تمامیِ‌متغیرها‌(ویژگ ‌‬
‫طبقهبندی‌■ ‪252‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫آن‌ها‌نیز‌نیاز‌به‌نرمال‌سازی‌دارند؟‌اگر‌داده‌ها‌را‌نرمال‌سازی‌کنیم‌احتمیاالً‌‌دقیتِ‌‌الگیور‌یتمِ‌‬
‫نهی‌محاسباتی‪‌،‬برای‌نرمال‌سازی‌باشید‌‪‌.‬‬ ‫یبیند‪‌،‬اما‌حواستان‌به‌هزی ‌‬
‫مورد‌استفاده‪‌،‬آسیبی‌نم ‌‬
‫دادههییای‌نرمییال‌شییده‌و‌‬‫یتییوانیم‌بییه‌صییورتِ‌تجرب یی‌و‌چشییمی‪‌،‬نتییایجِ‌ ‌‬
‫در‌ای ین‌مییورد‪‌،‬م ی ‌‬
‫غیرنرمال ‌شده‌را‌مشاهده‌کرده‌و‌بهترین‌راه‌را‌انتخاب‌کنیم‪‌.‬بعداً‌در‌همین‌فصل‌میورد‌ی‌را‌‬
‫یدهد‪.‬‬
‫نرمالسازی‪‌،‬دقتِ‌الگوریتم‌را‌کاهش‌م ‌‬
‫خواهیم‌دید‌که‌ ‌‬
‫‌‬

‫برگردیم‌به‌مثالِ‌پاندورا‌(‪‌–‌Pandora‬سایت‌پخش‌آنالین‌موسیقی) ‌‬
‫یدادیی‌م‪‌.‬‬‫لهی‌چندین‌ویژگی‌(‪‌)attributes‬نمایش‌می‌ ‌‬ ‫در‌مثالِ‌پاندورا‪‌،‬هر‌موسیقی‌را‌به‌وسی ‌‬
‫اگر‌یک‌کاربر‪‌،‬یک‌ایستگاه‌رادیوی‌بیرا‌ی‌گیروهِ‌‌موسی‌یقیِ‌‪‌Green Day‬بسیازد‪‌‌،‬میا‌‌تصیم‌یم‌‬
‫یگیریم‌که‌چه‌چیزی‌را‌بر‌اساس‌نزدیک‌ترین‌همسایه‌به‌این‌گروهِ‌موسیقی‪‌،‬پخش‌کنیم‪‌.‬‬ ‫م‌‬
‫قطعهی‌موسیقیِ‌خاص‪‌،‬بیا‌‌لالمیت‌‌هیا‌ی‌«انگشیت‌‌‬ ‫یدهد‌که‌به‌یک‌ ‌‬ ‫پاندورا‌به‌کاربر‌اجازه‌م ‌‬
‫شصت‌باال‪/‬انگشت‌شصت‌پایین»‌امتیاز‌دهد‪‌.‬مسئله‌این‌جاست‌که‌چگونیه‌‌از‌ایی‌ن‌اطاللیات‌ی‌‬
‫که‌کاربر‌در‌اختیار‌ما‌گذاشته‌استفاده‌کنیم؟ ‌‬
‫قطعهی‌موسیقی‌استفاده‌کینم‌‪‌:‬مقیدارِ‌‌«گیتیار‌‌‬
‫فرض‌کنید‌من‌از‌‪‌1‬ویژگی‪‌،‬برای‌نمایشِ‌هر‌ ‌‬
‫تشونده‌(‪‌»)Driving Beat‬که‌هیر‌‌کیدام‌‌‬ ‫کثیف‌(‪‌»)Dirty Guittar‬و‌مقدار‌« ‌‬
‫ضربههای‌هدای ‌‬
‫بازهی‌‪‌2‬تا‌‪‌5‬داشته‌باشیند‌‪‌.‬کیاربر‌ی‌بیه‌‌‪‌5‬قطعیه‌ی‌موسی‌یقی‪‌،‬‬ ‫یتوانند‌مقداری‌در‌ ‌‬ ‫از‌آن‌ها‌م ‌‬
‫دهندهی‌این‌است‌کیه‌‌او‪‌،‬ایی‌ن‌‬
‫‌‬ ‫یدهد‌که‌نشان ‌‬ ‫امتیازِ‌«لالمت‌مثبت‌(انگشت‌شصت‌باال)»‌م ‌‬
‫آهنگ‌ها‌را‌دوست‌داشته‌است‌و‌در‌شکل‌زیر‌با‌کاراکترِ‌«‪‌»L‬مشخص‌شده‌اسیت‌‪‌.‬همچنی‌ین‌‬
‫یدهد‌بیه‌‌‬ ‫قطعهی‌موسیقی‌امتیازِ‌‌«لالمت‌منفی‌(انگشت‌شصت‌پایین)»‌م ‌‬ ‫این‌شخص‌به‌‪‌ ‌5‬‬
‫آهنگها‌را‌دوست‌نداشته‌است‌که‌در‌شکل‌زیر‌با‌کیاراکترِ‌‌«‪‌»D‬مشیخص‌‌‬ ‫‌‬ ‫این‌معنی‌که‌این‌‬
‫شده‌است‪‌ .‬‬
‫یای‌را‌که‌با‌لالمتِ‌سیوال‌‌یعنی‌ی‌‬ ‫قطعهی‌موسیق ‌‬
‫به‌شکل‌زیر‌نگاه‌کنید‪‌.‬به‌نظرِ‌شما‪‌،‬کاربر‪‌ ‌،‬‬
‫«?»‌نشان‌داده‌شده‌است‪‌،‬دوست‌دارد‌یا‌خیر؟ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌251‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫یزنم‌که‌بگویید‪‌،‬بله‪‌،‬او‌این‌قطعه‌را‌دوست‌خواهد‌داشت‪‌.‬این‌گفته‌بر‌ایی‌ن‌اسیاس‌‌‬ ‫حدس‌م ‌‬
‫است‌که‌«?»‌به‌«‪»L‬ها‌در‌شکل‌نزدیک‌تر‌است‌تا‌«‪»D‬ها‪‌.‬ما‌ادامه‌ای‌ایی‌ن‌فصیل‌‌را‌بیه‌‌ایی‌ن‌‬
‫یدهیم‪‌.‬واضح‌ترین‌راه‌حل‌این‌است‌که‌نزدیک‌ترین‌همسایه‌را‌به‌«?»‌پیی‌دا‌‬ ‫ایده‌اختصاص‌م ‌‬
‫کنیم‌و‌پیش‌بینیِ‌خود‌را‌بر‌این‌اساس‌بگذاریم‌که‌این‌قطعه‌ی‌موسیقی‌هیم‪‌‌،‬هیم‌‌طبقیه‌ی‌‬
‫کترین‌گزینه‌به‌«?»‪‌»L«‌،‬است‪‌،‬پس‌بیرا‌ی‌‬ ‫نزدیک‌ترین‌قطعه‌به‌او‌است‪‌.‬در‌شکلِ‌باال‪‌،‬نزدی ‌‬
‫یکنیم)‌که‌«?»‪‌،‬نیز‌مقدار‌«‪‌»L‬را‌خواهید‌‌داشیت‌‌یعنی‌ی‌‬ ‫یزنیم‌(پیش‌بینی‌م ‌‬
‫همین‌حدس‌م ‌‬
‫ی‌موسیقی‌را‌نیز‌دوست‌دارد‪‌ .‬‬ ‫قطعه ‌‬
‫کاربر‌این‌ ‌‬
‫‌‬

‫کترین‌همسایه ‌‬
‫طبقهبندیِ‌نزدی ‌‬
‫کد‌پایتون‌برای‌ ‌‬
‫مجمولهی‌داده‌ای‌که‌قبالً‌به‌آن‌اشاره‌کیردم‪‌‌،‬اسیتفاده‌‌کینم‌‌–‌‪‌21‬قطعیه‌ی‌‬
‫‌‬ ‫اجازه‌بدهید‌از‌‬
‫موسیقی‌که‌هیر‌‌کیدام‌‌‪‌7‬ویژگی‌ی‌دارنید‌‌(سیطرها‪‌،‬قطعیات‌موسییقی‌هسیتند‌و‌سیتون‌هیا‪‌،‬‬
‫های‌ما‌را‌تشکیل‌میدهند)‪‌ :‬‬
‫‌‬ ‫‌‬
‫ویژگی‬
‫‌‬
‫طبقهبندی‌■ ‪253‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫‌‬
‫دادههای‌زیر‌را‌توسعه‌دادیم‪‌ :‬‬
‫قبالً‌در‌همین‌فصل‪‌،‬کدِ‌پایتون‌برای‌ ‌‬
‫‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌254‬‬
‫دادهکاوی‌برای‌ ‌‬

‫رشتههیا‌ی‌‪‌backup vocals‌،guitar‌،blues‌،beat‌،vocals‌،piano‬و‌‬ ‫اگر‌کد‌را‌نگاه‌کنید‪‌ ‌،‬‬


‫‪‌rap‬چندین‌بار‌در‌سراسر‌این‌کد‌تکرار‌شده‌اند‪‌.‬حاال‌اگر‌من‌‪‌211‬هیزار‌‌قطعیه‌ی‌موسی‌یقی‌‬
‫یخیواهم‌‌بیا‌‌اسیتفاده‌‌از‌بردارهیا‌‌‬
‫داشته‌باشم‪‌،‬این‌رشته‌ها‌‪‌211‬هزار‌بار‌تکرار‌خواهند‌شد‪‌.‬م ‌‬
‫(‪‌،)vectors‬این‌تکرار‌را‌حذف‌کنم‪‌ :‬‬
‫‌‬
‫طبقهبندی‌■ ‪255‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫یهیا‌ی‌یی‌ک‌قطعیه‌ی‌موسی‌یقی‌بیه‌‌صیورت‌‌بیردار‌ی‪‌،‬احتیی‌اج‌دارم‌تیا‌‌‬
‫لالوه‌بر‌تبدیل‌ویژگی‌ ‌‬
‫لالمتهای‌«موافقت‪/‬مخالفت‌(انگشت‌شصت‌به‌سمت‌باال‪/‬انگشت‌شصت‌به‌سمت‌پیا‌یین)»‌‬ ‫‌‬
‫را‌نیز‌به‌صورت‌برداری‌تبدیل‌کنم‪‌.‬به‌خاطر‌این‌که‌هر‌کیاربر‪‌‌،‬همیه‌ی‌قطعیات‌‌موسی‌یقی‌را‌‬
‫امتیازدهی‌نکرده‌است‌یعنی‌داده‌ها‌تُنُک‌(‪‌)sparse‬است‪‌،‬از‌روشِ‌دیکشنریِ‌دیکشینر‌ی‌هیا‌‌‬
‫(‪‌)dictionary of dictionaries‬استفاده‌خواهم‌کرد‪‌ :‬‬
‫‌‬
‫برنامهنویسان‬ ‌ ■‌259
‌ ‌‫دادهکاوی‌برای‬


‌‌‫‌شیما‬.‌‫)‌اختیی‌اری‌اسیت‬D‌‫‌و‬L(‌‫موافقت‌انتخاب‌کردم‬/‫‌روشی‌که‌من‌برای‌مخالفت‬،‫در‌کدِ‌باال‬
‌ .‫‌بگذارید‬2‌‫‌و‬1‌ً‫یتوانید‌مثال‬
‌‫م‬
‌‫‌بایستی‌تغییری‌در‌تیابع‌ی‌کیه‌‌بیرا‌ی‌محاسیبه‌ی‬،‫دادهها‌را‌تغییر‌دادیم‬
‌ ‌ِ‫آنجایی‌که‌فرمت‬ ‌ ‌‫از‬
‌‫‌نیی‌ز‬computeNearestNeighbor‌‌‫‌هچنین‌تغییی‌ری‌در‌تیابع‬.‫‌بدهم‬،‫فاصله‌منهتن‌نوشتیم‬
‌ :‫یدهم‬‌‫م‬

def manhattan(vector1, vector2):
"""Computes the Manhattan distance."""
distance = 0
total = 0
n = len(vector1)
for i in range(n):
distance += abs(vector1[i] - vector2[i])
return distance

def computeNearestNeighbor(itemName, itemVector, items):


"""creates a sorted list of items based on their dis
tance to item"""
distances = []
for otherItem in items:
if otherItem != itemName:
distance = manhattan(itemVector, items[other
Item])
distances.append((distance, otherItem))
# sort based on distance -- closest first
distances.sort()
‫طبقهبندی‌■ ‪257‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‪return distances‬‬
‫‌‬
‫یخیواهم‌‌بتیوانم‌‌‬ ‫یخواهم‌یی‌ک‌تیابع‌‌بیرا‌ی‌طبقیه‌ ‌بنید‌ی‌(‪‌)classify‬بنویسی‌م‪‌.‬می‌ ‌‬‫سرانجام‪‌،‬م ‌‬
‫یکنید‌‌‬‫شبینی‌کنم‌که‌چطور‌یک‌کاربرِ‌خیاص‪‌‌،‬یی‌ک‌قطعیه‌ی‌موسی‌یقی‌را‌امتیی‌ازدهی‌می‌ ‌‬ ‫پی ‌‬
‫یهیا‌ی‌آن‌‬ ‫قطعهی‌موسیقی‌را‌دوست‌دارد‌یا‌خیر)‪‌.‬این‌کار‌با‌استفاده‌از‌ویژگی‌ ‌‬ ‫(یعنی‌آیا‌این‌ ‌‬
‫یشود‪‌ :‬‬ ‫قطعهی‌موسیقی‌انجام‌م ‌‬
‫‌‬
‫‌‬

‫‌‬
‫(نکته‪‌:‬برای‌شکل‌ظاهریِ‌بهتر‌در‌کدهای‌پایتون‌در‌زیر‪‌،‬از‌«‪‌»Cagle‬برای‌مشیخص‌‌کیردن‌‌‬
‫یکنم) ‌‬ ‫خوانندهی‌آن‌استفاده‌م ‌‬
‫‌‬ ‫قطعهی‌موسیقیِ‌گفته‌شده‌در‌باال‌و‌‬
‫این‌ ‌‬
‫اولین‌کاری‌که‌تابع‌باید‌انجام‌دهد‪‌،‬این‌است‌کیه‌‌نزدیی‌ک‌تیر‌ین‌همسیا‌یه‌را‌بیرا‌ی‌قطعیه‌ی‌‬
‫موسیقیِ‌‪‌Chris Cagle‬پیدا‌کند‪‌.‬بعد‌از‌آن‌بایی‌د‌بببیی‌نم‪‌،‬کیاربر‪‌‌،‬آن‌قطعیه‌ی‌نزدیی‌ ‌‬
‫کتیر‌ین‌‬
‫همسایه‌را‌چگونه‌امتیازدهی‌کرده‌است‪‌،‬و‌بعد‌از‌طریق‌همین‌کار‌پیش‌بینی‌کنیم‌کیه‌‌یی‌ک‌‬
‫قطعهی‌موسیقیِ‌‪‌Chris Cagle‬را‌امتیی‌ازدهی‌خواهید‌‌کیرد‌‪‌.‬تیابعِ‌‌زیی‌ر‪‌،‬تیالش‌‌‬
‫کاربر‌چگونه‌ ‌‬
‫طبقهبندی‌(‪‌)classify‬است‪‌ :‬‬
‫ادهسازی‌ ‌‬‫ابتدایی‌من‌برای‌پی ‌‬
‫‌‬
‫‪def classify(user, itemName, itemVector):‬‬
‫‪"""Classify the itemName based on user ratings‬‬
‫"""‪Should really have items and users as parameters‬‬
‫‪# first find nearest neighbor‬‬
‫‪nearest = computeNearestNeighbor(itemName, itemVecto‬‬
‫]‪r, items)[0][1‬‬
‫]‪rating = users[user][nearest‬‬
‫‪return rating‬‬
‫‌‬
‫یکنم‌که‌اگر‌‪‌،Angelica‬آهنیگِ‌‌ ‪I Breathe‬‬
‫خب‪‌،‬بیایید‌این‌تابع‌را‌آزمایش‌کنیم‪‌.‬تعجب‌م ‌‬
‫‪‌In, I Breathe Out‬از‌‪‌Chris Cage‬را‌دوست‌داشته‌باشد‪‌ .‬‬
‫‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌251‬‬
‫دادهکاوی‌برای‌ ‌‬

‫االن‌ما‌پیش‌بینی‌کردیم‌که‌‪‌Angelica‬این‌ ‌‬
‫قطعهی‌موسیقی‌را‌دوسیت‌‌دارد!‌چیرا‌‌ایی‌ن‌طیور‌‌‬
‫شد؟ ‌‬
‫‌‬

‫‌‬
‫قطعهی‌‪‌I Breathe In, I Breathe Out‬از‌‪‌Chris Cagle‬‬ ‫شبینی‌کردیم‌که‌‪‌ ‌Angelica‬‬ ‫ما‌پی ‌‬
‫قطعهی‌‪‌Alejandro‬از‌‪‌Lady Gaga‬‬ ‫قطعهی‌موسیقی‌به‌ ‌‬ ‫نکه‪‌،‬این‌ ‌‬‫را‌دوست‌دارد‌به‌خاطر‌ای ‌‬
‫نزدیک‌بود‌(در‌واقع‌نزدیک‌ترین‌همسایه‌به‌این‌قطعه‌ی‌موسیقی‌بود)‌و ‌بنابراین‌‪‌Angelica‬‬
‫قطعهی‌موسیقی‌را‌دوست‌داشته‌است‪‌ .‬‬ ‫این‌ ‌‬
‫کاری‌که‌در‌این‌جا‌انجام‌دادیم‪‌،‬ایجاد‌یک‌طبقه‌بند‌(‪‌)classifier‬بود‌–‌در‌این‌جا‪‌،‬وظیفیه‌ی‌‬
‫قطعهی‌موسیقی‌را‌برای‌یک‌کاربر‌طوری‌طبقه‌بندی‌کنیم‌که‌به‌یکی‌ی‌از‌‬ ‫ما‌این‌بود‌که‌یک‌ ‌‬
‫دو‌گروه‌(دوست‌داشتن‪/‬دوست‌نداشتن)‌تعلق‌بگیرد‪‌ .‬‬
‫‌‬
‫طبقهبندی‌■ ‪256‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫‌‬
‫یهای‌یک‌شی‪‌،‬برای‌مشخص‌کردنِ‌‬ ‫یک‌طبقه‌بند‌(‪‌،)classifier‬برنامه‌ای‌است‌که‌از‌ویژگ ‌‬
‫یکند‪‌ .‬‬ ‫گروه‌یا‌کالسی‌که‌آن‌شی‌به‌آن‌تعلق‌دارد‪‌،‬استفاده‌م ‌‬
‫یک‌طبقه‌بند‪‌،‬از‌مجموله‌ای‌از‌اشیا‌یعنی‌همان‌رکوردها‌که‌دارای‌برچسب‌(‪‌)label‬هسیتند‌‌‬
‫دهندهی‌گروه‌یا‌کالسی‌هستند‌که‌شی‪‌،‬بیه‌‌آن‌تعلیق‌‌‬ ‫‌‬ ‫یکند‪‌.‬این‌برچسب‌ها‌نشان‌‬ ‫استفاده‌م ‌‬
‫دارد‪‌.‬طبقه‌بند‪‌،‬از‌آن‌مجموله‌برای‌طبقه‌بنید‌یِ‌اشی‌یای‌جدیی‌د‌و‌برچسیب‌نخیورده‌‌اسیتفاده‌‌‬
‫یای‌را‌دوسیت‌‌‬ ‫یدانیم‌که‌‪‌Angelica‬چیه‌‌قطعیات‌‌موسی‌یق ‌‬ ‫یکند‪‌.‬بنابراین‌در‌مثال‌ما‪‌،‬ما‌م ‌‬‫م‌‬
‫دارد‌(که‌با‌برچسبِ‌«‪‌»liked‬برچسب‌خورده‌اند)‌و‌همچنین‌قطعاتی‌را‌که‌دوسیت‌‌نیدارد‌‌را‌‬
‫یخواهیم‌بدانیم‌که‌آیا‌‪‌،Angelica‬قطعات‌‪‌Chris Cagle‬را‌دوسیت‌‌دارد‌‬ ‫یدانیم‪‌.‬حاال‌م ‌‬‫هم‌م ‌‬
‫یا‌نه‌(چون‌‪‌Angelica‬برای‌قطعات‌‪‌Chris Cagle‬امتیازی‌ثبت‌نکرده‌است‌یعنی‌ی‌برچسیب‌ی‌‬
‫نزده‌است)‪‌ .‬‬
‫یکنیم‌که‌آیا‌‪‌Angelica‬این‌آهنگ‌(‪‌)Alegandro‬را‌دوست‌دارد‌یا‌خیر‌‬ ‫بعد‌از‌آن‌بررسی ‌م ‌‬
‫یکنی‌یم‌کیه‌‌‪‌Angelica‬آهنیگِ‌‌ ‪I‬‬ ‫–‌او‌این‌آهنگ‌را‌دوست‌دارد‪‌.‬پس‌ایی‌ن‌پی‌ی ‌‬
‫شبینی‌ی‌را‌می‌ ‌‬
‫‪‌Breathe In, I Breath Out‬از‌‪‌Chris Cagle‬را‌دوست‌دارد‪‌.‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌291‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫یکنیم‪:‬‬‫آنها‌اشاره‌م ‌‬
‫طبقهبندها‌کاربردهای‌فراوانی‌دارند‪‌.‬در‌زیر‌به‌برخی‌از‌ ‌‬
‫‌‬
‫‌‬
‫طبقهبندی‌برای‌تحلیل‌احساسات‌توییتری ‌‬ ‫‌‬
‫برخی‌از‌افراد‌بر‌روی‌طبقه‌بندیِ‌احساسات‌(مثبت‌یا‌منفی)‌بر‌روی‌داده‌هیا‌ی‌تیو‌یتر‌کیار‌‌‬
‫روشهای‌گوناگون‌مورد‌استفاده‌قرار‌بگیرند‪‌.‬برای‌مثال‪‌،‬‬ ‫یتوانند‌به‌ ‌‬ ‫یکنند‪‌.‬این‌داده‌ها‌م ‌‬‫م‌‬
‫اگر‌شرکت‌‪‌Axe‬یک‌اسپری‌ضد‌تعریقِ‌جدید‌تولید‌کرده‌باشد‪‌،‬م ‌‬
‫یتواننید‌‌از‌ایی‌ن‌طریی‌ق‌‬
‫(توییت‌ها‌و‌تحلیل‌احساسات)‌متوجه‌شوند‌که‌آیا‌کاربران‌از‌آن‌خوششان‌آمده‌اسیت‌‌یی‌ا‌‬
‫یها‌در‌این‌مسئله‪‌،‬کلماتِ‌هر‌توییت‌هستند‪‌ .‬‬ ‫خیر‪‌.‬ویژگ ‌‬
‫‌‬
‫تشخیص‌خودکار‌افراد‌در‌تصاویر ‌‬
‫یتوانند‌دوستانِ‌شما‌را‌در‌تصاویر‌شناسیا‌یی‌‬ ‫در‌حال‌حاضر‌نرم‌افزارهایی‌وجود‌دارند‌که‌م ‌‬
‫کرده‌و‌برچسب‌زنی‌کنند‪(‌.‬و‌همین‌تکنولوژی‌برای‌شناسایی‌افراد‌در‌هنگام‌پیی‌اده‌روی‌در‌‬
‫یگیرند)‪‌.‬روش‌های‌متفیاوت‌ی‌بیرا‌ی‌‬ ‫خیابان‌توسط‌دوربین‌های‌لمومی‌مورد‌استفاده‌قرار‌م ‌‬
‫طبقهبندی‌■ ‪292‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫اندازهی‌چشم‌ها‪‌،‬بینی‌ی‪‌،‬فیک‌‌و‌‬
‫این‌کار‌وجود‌دارد‌ولی‌برخی‌از‌آن‌ها‪‌،‬از‌موقعیت‌نسبی‌و‌ ‌‬
‫یکنند‪‌ .‬‬
‫نکار‌استفاده‌م ‌‬
‫غیره‌در‌افراد‌مختلف‌برای‌ای ‌‬
‫‌‬
‫هدفمند ‌‬
‫طبقهبندی‌برای‌تبلیغات‌سیاسیِ‌ ‌‬ ‫‌‬
‫یهیا‌ی‌‬ ‫به‌این‌روش‪‌،‬میکروهدفمندی‌(‪‌)microtargeting‬م ‌‬
‫یگویند‪‌.‬افیراد‌‌در‌دسیته‌ ‌بنید‌ ‌‬
‫یتواننید‌‌بیه‌‌ایی‌ن‌صیورت‌‌باشیند‌‪Barn «‌:‬‬ ‫یهیا‌‌می‌ ‌‬
‫یگیرند‪‌.‬این‌دسیته‌بنید‌ ‌‬
‫مختلفی‌قرار‌م ‌‬
‫نها‌هر‌کیدام‌‌یی‌ک‌‬ ‫‪(‌»Hearth Keepers«‌،»Inner Compass«‌،»Raisers‬فرض‌کنید‌ای ‌‬
‫گروهی‌از‌افراد‌در‌یک‌جامعه‌باشند‪‌،‬مثالً‌«اصالح‌طلب»‪«‌،‬اصیول‌گیرا‌»‌و‌«التیدال‌گیرا‌»)‪‌.‬‬
‫حاال‌مثال‌گروهِ‌«‪‌،»Hearth Keepers‬تمرکزشان‌بر‌روی‌الضای‌خیانواد‌ه‌و‌حفیظ‌‌کیردن‌‌‬
‫یشود) ‌‬ ‫آنها‌است‌(پس‌مثالً‌برای‌این‌گروه‌از‌افراد‪‌،‬تبلیغِ‌مختص‌به‌خودشان‌انجام‌م ‌‬ ‫‌‬
‫‌‬
‫سالمتی‌و‌حفاظت‌از‌خود ‌‬
‫یتیوان‌یم‌وسیائل‌‌سیاده‌‌ای‌مثیل‌‌‬
‫االن‌شرولی‌برای‌رسیدن‌به‌خود‌است‪‌.‬در‌این‌زمانیه‪‌‌،‬می‌ ‌‬
‫فیت‌بیت‌(‪‌)FitBit‬و‌دست‌بند‌های‌‪‌Nike‬را‌بخریم‌(این‌دست‌بند‌هیا‌‌اطاللیات‌ی‌از‌وضیع‌یت‌‬
‫یآورند)‪‌.‬شرکت‌اینتل‌و‌شیرکت‌هیا‌ی‌دیگیر‌‌در‌‬ ‫سالمت‌ما‌از‌طریق‌حسگرهایی‌به‌دست‌م ‌‬
‫حال‌کار‌بر‌روی‌خانه‌های‌هوشمند‌هستند‌که‌در‌کفِ‌آن‌ها‌وسائلی‌تعبیه‌شده‌اسیت‌‌کیه‌‌‬
‫یتوانند‌ما‌را‌وزن‌کنند‪‌،‬رفت‌و‌آمد‌ما‌را‌زیر‌نظر‌بگیرند‌و‌در‌صورت‌رفتار‌غیرلادی‪‌،‬بیه‌‌‬ ‫م‌‬
‫یافتید‌)‪‌.‬‬
‫یشود‌و‌کیف‌‌زمی‌ین‌می‌ ‌‬
‫شخص‌دیگری‌هشدار‌دهند‌(برای‌مثال‌کسی‌حالش‌بد‌م ‌‬
‫یکنند‌که‌تا‌چند‌سالِ‌آینده‌میا‌‌کامپیوترهیا‌ی‌کیوچک‌ی‌را‌‬ ‫شبینی‌م ‌‬‫خبرگانِ‌این‌حوزه‌پی ‌‬
‫یتوانند‌هزاران‌فاکتورِ‌مختلف‌از‌بدن‌ما‌را‌در‌لحظه‪‌،‬نظیارت‌‌کننید‌‌و‌‬ ‫خواهیم‌پوشید‌که‌م ‌‬
‫طبقهبندی‌را‌انجام‌دهند‪‌ .‬‬
‫سریعاً‌لملیات‌ ‌‬
‫‌‬
‫هدفمند ‌‬
‫تبلیغات‌ ‌‬
‫تبلیغات‌هدف‌مند‌چیزی‌شبیه‌به‌میکروهدف‌مندی‌در‌سیاست‌است‌کیه‌‌بیاالتر‌‌در‌میورد‌‌‬
‫نهای‌تبلیغیات‌یِ‌گسیترده‌‌بیرا‌ی‌فیروشِ‌‌سیاختمان‌‌‬ ‫آن‌صحبت‌کردیم‪‌.‬به‌جای‌ایجادِ‌کمپی ‌‬
‫یتیوانم‌‌مشیتر‌یانِ‌بیالقوه‌‌را‌‬
‫مجلل‌مسکونی‌در‌شهر‌وگیاس‌‌کیه‌مالیک‌آن‌هسیتم‌‪‌،‬آیی‌ا‌می‌ ‌‬
‫شناسایی‌کرده‌و‌تبلیغات‌را‌مستقیماً‌و‌فقط‌بیه‌‌آن‌هیا‌‌نشیان‌‌دهیم؟‌‌یی‌ا‌حتی‌ی‌بهتیر‪‌‌،‬آیی‌ا‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌291‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یتوانیم‌زیرگروهی‌از‌مشتریان‌بیالقوه‌‌را‌شناسیا‌یی‌کینم‌‌و‌تبلیغیاتم‌‌را‌مخصیوص‌‌آن‌هیا‌‌‬ ‫م‌‬
‫طراحی‌کنم؟ ‌‬
‫‌‬
‫یانتهاست‪‌ ...‬‬
‫این‌لیست‌ب ‌‬
‫‌تقسیم‌کردن‌افراد‌به‌تروریست‌و‌‌غیرترورسیت ‌‬ ‫‪-‬‬
‫لهیا‌ی‌لیاد‌ی‪‌،‬هرزنامیه‌‌ییا‌همیان‌‬‫‌طبقه‌بندیِ‌خودکار‌ایمیل‌(ایمیل‌های‌مهم‪‌،‬ایمی ‌‬ ‫‪-‬‬
‫اسپمها) ‌‬
‫‌‬
‫شبینیِ‌خروجیِ‌پزشکان ‌‬ ‫‌پی ‌‬ ‫‪-‬‬
‫کارتهای‌التباری) ‌‬
‫یهای‌ ‌‬ ‫یهای‌مالی‌(برای‌مثال‪‌،‬دزد ‌‬ ‫کالهبردار ‌‬
‫‌مشخص‌کردنِ‌ ‌‬ ‫‪-‬‬
‫‌‬

‫مسئلهی‌«چه‌ورزشی؟» ‌‬
‫‌‬
‫برای‌این‌که‌یک‌دید‌کلی‌در‌مورد‌کارهایی‌که‌قرار‌است‌در‌چند‌فصیل‌‌بعید‌‌بیا‌‌هیم‌‌انجیام‌‌‬
‫یکنیم‌–‌طبقه‌بنید‌یِ‌ایی‌ن‌کیه‌‌زنیانِ‌‌‬
‫دهیم‌را‌داشته‌باشید‪‌،‬یک‌مثال‌ساده‌تر‌را‌با‌هم‌مرور‌م ‌‬
‫یدهد‪‌،‬این‌طبقه‌بندی‌تنها‌دو‌ویژگی‌دارد‪‌:‬وزن‌(‪‌)weight‬و‌‬ ‫ورزشکار‌چه‌ورزشی‌را‌انجام‌م ‌‬
‫دادهی‌کوچک‌را‌که‌از‌وب‌سیا‌یت‌هیا‌ی‌مختلیف‌‌‬ ‫مجمولهی‌ ‌‬
‫‌‬ ‫قد‌(‪‌.)height‬در‌جدول‌زیر‌یک‌‬
‫یکنید‪‌ :‬‬‫جمعآوری‌کردم‪‌،‬مشاهده‌م ‌‬
‫‌‬
‫(ستون ‪ ،Name‬نام ورزشکار است‪ ،‬ستون ‪ ،Sport‬ورزشی است که این ورزشکار انجام‬
‫میدهد‪ ،‬ستون ‪ Age‬سن‪ ،‬ستون ‪ Height‬قد و ستون ‪ Weight‬وزن ورزشکار را نشان‬
‫میدهد‪ ،‬همچنین در ستون ‪ ،Sport‬مقادیر مختلف ورزشها به این صورت درج شده است‪:‬‬
‫‪ Gymnastics‬ورزش ژیمیناستیک‪ Basketball ،‬ورزش بسکتبال و ‪ Track‬ورزش دو و‬
‫میدانی یا ماراتن هستند)‬
‫طبقهبندی‌■ ‪293‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫کهای ‌‪‌ 1121‬و‌‬ ‫دادههای ‌ژیمیناستیکِ ‌برخی ‌از ‌شرکت‌کنندگان ‌المپی ‌‬ ‫در ‌این ‌مجموله‪‌ ‌ ،‬‬
‫مهایی ‌در ‌لیگ ‌‪‌ NBA(‌ WNBA‬زنان) ‌بازی‌‬ ‫‪‌ 1111‬را ‌داریم‪‌ .‬بازیکنان ‌بسکتبال‪‌ ،‬برای ‌تی ‌‬
‫یکردند‪‌ .‬و ‌همچنین ‌زنانِ ‌دونده ‌که ‌توانسته ‌بودند ‌دوی ‌ماراتن ‌در ‌المپیک ‌‪‌ 1121‬را ‌به‌‬‫م‌‬
‫یتواند ‌به ‌ما ‌کمک‌‬
‫پایان ‌برسانند‪‌.‬درست ‌است ‌که ‌این ‌مثال‪‌ ،‬یک ‌مثال ‌بدیهی ‌است‪‌ ،‬ولی ‌م ‌‬
‫مجمولهی‌داده‌به‌کار‌بگیریم‪‌ .‬‬
‫‌‬ ‫آموختهایم‪‌،‬بر‌روی‌این‌‬
‫‌‬ ‫روشهایی‌را‌که‌‬
‫کند‌تا‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌294‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یبینید‪‌ ،‬من‪‌ ،‬ستونِ ‌سن ‌(‪‌ )age‬را ‌هم ‌در ‌جدول ‌اضافه ‌کردم‪‌ .‬با ‌یک ‌نگاهِ‌‬
‫همانطور ‌که ‌م ‌‬
‫‌‬
‫یتواند ‌یک‌‬‫یکنید ‌که ‌سن ‌(‪‌ )age‬به ‌تنهایی ‌م ‌‬ ‫دادهی ‌باال‪‌ ،‬مشاهده ‌م ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫ساده ‌به ‌‬
‫رشتهی‌ورزشیِ‌ورزشکاران ‌زیر ‌را ‌محاسبه‌‬ ‫شبینیِ ‌نسبتاً ‌خوب ‌باشد‪‌.‬سعی ‌کنید ‌ ‌‬ ‫فاکتورِ ‌پی ‌‬
‫کنید‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫پاسخها ‌‬
‫‌‬
‫لسآنجلس ‌اسپارك ‌در ‌‪‌ WNBA‬و ‌برای ‌تیم‌‬ ‫مهای ‌ ‌‬ ‫خانم ‌‪‌ ،Candace Parker‬برای ‌تی ‌‬
‫‪‌ Ekaterinburg‬در ‌لیگ ‌‪‌ UMMC‬در ‌روسیه‪‌ ،‬بسکتبال ‌بازی ‌می‌کند‪‌ .‬خانم ‌ ‪McKayla‬‬
‫طبقهبندی‌■ ‪295‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‪‌ Maroney‬لضو ‌تیم ‌ژیمیناستیک ‌آمریکا ‌بود ‌و ‌یک ‌مدال ‌طال ‌و ‌یک ‌نقره ‌برنده ‌شده ‌بود‪‌.‬‬
‫رقابتهای ‌المپیک‌‬
‫دوندهی ‌استقامتِ ‌صربستانی ‌است ‌که ‌در ‌ ‌‬ ‫خانم ‌‪‌ Olivera Kevtic‬یک ‌ ‌‬
‫سال ‌‪‌ 1111‬و ‌‪‌ 1121‬شرکت ‌کرده ‌بود‪‌ .‬خانم ‌‪‌ Lisa Jane Weightman‬نیز ‌یک ‌ ‌‬
‫دوندهی‌‬
‫استقامتِ‌استرالیایی‌است‌که‌او‌هم‌در‌سال‌‪‌1111‬و‌‪‌1121‬در‌المپیک‌شرکت‌کرده‌بود‪‌ .‬‬
‫طبقهبندی ‌(‪‌ )classification‬را ‌انجام‌‬‫اگر ‌تمرین ‌باال ‌را ‌انجام ‌داده ‌باشید‪‌ ،‬االن ‌شما ‌یک ‌ ‌‬
‫کردهاید ‌(در ‌این‌‬
‫شبینی ‌ ‌‬ ‫آنها ‌پی ‌‬‫یهای ‌ ‌‬ ‫دادهاید ‌– ‌در ‌واقع ‌شما ‌کالسِ ‌اشیا ‌بر ‌اساس ‌ویژگ ‌‬
‫‌‬
‫رشتهی‌ورزشی‌زنان‌بر‌اساس‌ویژگیِ‌سن‌(‪‌ ))age‬‬ ‫شبینیِ‌ ‌‬ ‫مثال‪‌،‬پی ‌‬
‫‌‬
‫ورزش‌ذهنی ‌‬
‫یخواهم‌حدس‌بزن‌که‌بر‌اساس‌قد‌و‌وزن‪‌،‬یی‌ک‌شیخص‌‌چیه‌‌رشیته‌ی‌‬ ‫فرض‌کنید‪‌،‬من‌م ‌‬
‫یدهد‪‌.‬مجمولیه‌ی‌داده‌ای‌کیه‌‌در‌اختیی‌ار‌دارم‌‬ ‫ورزشی‌را‌انجام‌م ‌‬
‫کوچک‌است‌و‌فقط‌دو‌نفر‌در‌آن‌هستند‪‌.‬خانم‌‪‌Nakia Sanford‬‬
‫بازیکن‌‪‌WNBA‬در‌تیم‌‪‌Phoenix Mercury‬است‌کیه‌‌‪‌9‬پیا‌‌و‌‪‌4‬‬
‫یمتر)‌قد‌و‌‪‌111‬پوند‌(تقریباً‌معادل‌‬ ‫اینج‌(معادل‌تقریباً‌‪‌261‬سانت ‌‬
‫‪‌61‬کیلوگرم)‌وزن‌دارد‪‌.‬خانم‌‪‌،Sarah Beale‬بازیکنِ‌خط‌ ‌‬
‫حملهی‌‬
‫راگبی‌تیم‌ملی‌انگلستان‌است‌که‌‪‌5‬پا‌و‌‪‌21‬اینج‌(معادل‌تقریباً‌‬
‫یمتر)‌قد‌و‌‪‌261‬پوند‌(تقریباً‌معادل‌‪‌19‬کیلوگرم)‌وزن‌‬ ‫‪‌277‬سانت ‌‬
‫یخیواهم‌‌‬ ‫دادهی‌خیلی‌کوچک‪‌،‬می‌ ‌‬ ‫مجمولهی‌ ‌‬
‫‌‬ ‫دارد‪‌.‬بر‌اساس‌این‌‬
‫طبقهبندی‌کنم‪‌.‬به‌این‌معنا‌که‌ببینم‌ایی‌ن‌خیانم‪‌‌،‬بیاز‌یکنِ‌‬ ‫خانم‌‪‌Catherine Spencer‬را‌ ‌‬
‫یمتیر‌)‌قید‌‌و‌‬‫بسکتبال‌هست‌یا‌بازیکن‌راگبی؟‌او‌‪‌5‬پا‌و‌‪‌21‬اینج‌(تقریباً‌معادل‌‪‌277‬سانت ‌‬
‫‪‌111‬پوند‌(تقریباً‌معادل‌‪‌61‬کیلوگرم)‌وزن‌دارد‪‌.‬به‌نظر‌شما‌این‌شیخص‌‌چیه‌‌ورزشی‌ی‌را‌‬
‫یدهد؟ ‌‬ ‫انجام‌م ‌‬
‫دادهاید‪‌.‬خانم ‌‪‌ Catherine Spencer‬مهاجم‌‬ ‫اگر ‌بگویید ‌بازیکنِ ‌راگبی ‌است‪‌ ،‬پاسخ ‌درستی ‌ ‌‬
‫فاصلهای‌‬
‫نحال‪‌ ،‬اگر ‌حدسمان ‌را ‌بر ‌اساس ‌معیار ‌ ‌‬ ‫راگبی ‌در ‌تیم ‌ملی ‌انگلستان ‌است‪‌ .‬با ‌ای ‌‬
‫فاصلهی ‌منهتن ‌(‪‌)Manhattan distance‬بگذاریم‪‌ ،‬پاسخ ‌اشتباه ‌است‪‌.‬معیار‌‬ ‫مانند ‌معیار ‌ ‌‬
‫فاصلهی ‌منهتن ‌بین ‌‪‌ Catherine Spencer‬و ‌خانم ‌‪(‌ Nakia‬که ‌بازیکن ‌بسکتبال ‌بود) ‌‪‌9‬‬ ‫‌‬
‫فاصلهی ‌منهتن ‌بین ‌خانم ‌‪‌ Catherine‬و ‌‪(‌ Sarah‬که ‌بازیکن‌‬ ‫است‪‌.‬این ‌در ‌حالی ‌است ‌که ‌ ‌‬
‫کترین ‌فرد ‌را ‌بر ‌اساس ‌این ‌معیار ‌فاصله‌‬ ‫راگبی ‌بود)‌برابر ‌‪‌ 21‬است‪‌.‬پس ‌اگر ‌بخواهیم ‌نزدی ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌299‬‬
‫دادهکاوی‌برای‌ ‌‬

‫انتخاب ‌کنیم‪‌ ،‬بایستی ‌‪‌ Nakia‬را ‌انتخاب ‌کرده ‌و ‌بگوییم ‌که ‌‪‌ Catherine‬هم ‌مانند ‌او‪‌ ،‬یک‌‬
‫بازیکن‌بسکتبال‌است‪‌ .‬‬
‫قتر‌کمک‌کند؟ ‌‬ ‫طبقهبندیِ‌دقی ‌‬
‫آیا‌از‌مثالِ‌باال‪‌،‬چیزی‌آموختیم‌که‌بتواند‌به‌ما‌در‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫اصالحشده ‌(‪‌ )modified standard score‬استفاده‌‬
‫‌‬ ‫یتوانیم ‌از ‌امتیازِ ‌استانداردِ ‌‬
‫بله‪‌ ،‬ما ‌م ‌‬
‫کنیم‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬

‫دادههای‌آزمون‌(‪‌ )Test Data‬‬


‫‌‬
‫بیایید ‌ویژگیِ ‌سن ‌(‪‌ )Age‬را ‌از ‌میان ‌ ‌‬
‫دادههایمان ‌حذف ‌کنیم‪‌ .‬در ‌جدول ‌زیر ‌افرادی ‌را‌‬
‫طبقهبندی‌کنم‪‌ :‬‬
‫آنها‌را‌ ‌‬ ‫یخواهم‌ ‌‬
‫یبینید‌که‌م ‌‬
‫م‌‬
‫طبقهبندی‌■ ‪297‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬

‫‌‬
‫‌‬

‫کد‌پایتون ‌‬
‫دادهها ‌را ‌مستقیماً ‌در ‌پایتون ‌هاردکُد ‌(‪‌ )hard-coding‬کنم‪‌ ،‬تصمیم‌‬‫یاینکه ‌ ‌‬ ‫نبار ‌به ‌جا ‌‬
‫ای ‌‬
‫لها‌به‌این‌صورت‌هستند‪‌ :‬‬ ‫آنها‌را‌در‌دو‌فایل‌مجزا‌قرار‌دهم‪‌.‬فای ‌‬ ‫گرفتم‌که‌ ‌‬
‫‪‌athletesTrainingSet.txt‬و‌‪‌ athletesTestSet.txt‬‬
‫یکنم‪‌.‬‬ ‫دادههای ‌فایلِ ‌‪‌ athletesTrainingSet.txt‬برای ‌آموزشِ ‌ ‌‬
‫طبقهبند ‌استفاده ‌م ‌‬ ‫من‪‌ ،‬از ‌ ‌‬
‫ساختهایم ‌مورد‌‬
‫‌‬ ‫دادههای ‌فایلِ ‌‪‌ athletesTestSet.txt‬برای ‌آزمودنِ ‌کیفیت ‌ ‌‬
‫طبقهبندی ‌که ‌‬ ‫‌‬
‫مجمولهی ‌آزمون‌‬
‫‌‬ ‫یگیرند‪‌ .‬به ‌بیانی ‌دیگر‪‌ ،‬هر ‌کدام ‌از ‌سطرهای ‌موجود ‌در ‌‬
‫استفاده ‌قرار ‌م ‌‬
‫ساختهشده‌‬
‫‌‬ ‫دادههای ‌آموزش ‌(‪‌)training set‬‬
‫طبقهبندی ‌که ‌از ‌روی ‌ ‌‬‫(‪‌)test set‬بر ‌اساس ‌ ‌‬
‫یشوند‪‌ .‬‬‫طبقهبندی‌م ‌‬
‫است‪‌،‬به‌صورت‌خودکار‌ ‌‬
‫لها‌به‌صورت‌زیر‌است‪‌ :‬‬ ‫فرمتِ‌این‌فای ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌291‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫حتماً‌می‌دانید‌که‌فایل‌های‌داده‌و‌کدهای‌پایتون‌در‌سیا‌یت‌‪‌guidetodatamining.com‬‬
‫وبسایت‌‪‌chistio.ir‬موجود‌است‪‌ .‬‬ ‫و‌ ‌‬
‫‌‬
‫های‌آنها‌با ‌‪‌ tab‬از ‌یکدیگر‌‬
‫‌‬ ‫‌‬
‫ویژگی‬ ‫در ‌این ‌فایل‪‌ ،‬هر ‌خط ‌یک ‌شی ‌(یک ‌ورزشکار)‌است ‌که ‌‬
‫شبینی‌‬ ‫یخواهم‌تا‌با‌استفاده‌از‌قد‌و‌وزنِ‌یک‌فرد‌بتواند‌پی ‌‬ ‫طبقهبندِ‌خودم‌م ‌‬
‫شدهاند‪‌.‬از‌ ‌‬
‫جدا‌ ‌‬
‫یهای ‌لددی‌‬ ‫رشتهای ‌ورزش ‌می‌کند‪‌.‬پس ‌دو ‌ستونِ ‌آخر‪‌ ،‬ویژگ ‌‬ ‫کند ‌که ‌یک ‌شخص ‌در ‌چه ‌ ‌‬
‫آنها ‌استفاده ‌می‌کنم ‌و ‌ستونِ ‌دوم‪‌ ،‬همان ‌ستونی‌‬ ‫طبقهبندی ‌از ‌ ‌‬
‫هستند ‌که ‌من ‌در ‌فرآیندِ ‌ ‌‬
‫یدهد‪‌.‬نامِ‌‬‫انجام‌میدهد)‌را ‌نشان ‌م ‌‬
‫‌‬ ‫رشتهی‌ورزشی ‌که ‌آن ‌فرد ‌‬‫هست ‌که ‌کالسِ ‌یک ‌شی ‌( ‌‬
‫یشود‪‌ .‬البته ‌من ‌امتحان ‌نکردم ‌که ‌ببینم ‌آیا ‌نامِ ‌یک‌‬ ‫طبقهبند ‌استفاده ‌نم ‌‬
‫ورزشکار ‌توسط ‌ ‌‬
‫‌‬
‫یدهد‌کمکی‌کند‌یا‌خیر‪‌،‬و‌که‌این‌کار‌‬ ‫شبینیِ‌ورزشیِ‌که‌آن‌فرد‌انجام‌م ‌‬ ‫یتواند‌به‌پی ‌‬
‫فرد‌م ‌‬
‫را‌هم‌نخواهم‌کرد‪‌ .‬‬
‫‌‬

‫‌‬
‫‌‬
‫طبقهبندی‌■ ‪296‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫طبقهبندی ‌مفید‌‬
‫لهای ‌برای ‌توضیح ‌دادنِ ‌تصمیماتِ ‌ ‌‬ ‫یتواند ‌به ‌لنوان ‌وسی ‌‬
‫با ‌این ‌حال‪‌ ،‬نام ‌م ‌‬
‫ککار ‌است ‌به ‌خاطر ‌این‌که ‌با‌‬ ‫باشد‪‌ .‬مثالً ‌ما ‌فکر ‌می‌کنیم ‌‪‌ Amelia Pond‬یک ‌ژیمیناستی ‌‬
‫کتر‌‬‫ککار ‌است‪‌ ،‬نزدی ‌‬ ‫توجه ‌به ‌قد ‌و ‌وزنش ‌به ‌‪‌ Gabby Douglas‬که ‌او ‌هم ‌یک ‌ژیمیناستی ‌‬
‫است‪‌ ».‬‬
‫نمونهی‌خاص ‌محدود ‌نباشد‌‬ ‫ینویسم ‌که ‌به ‌یک ‌ ‌‬ ‫همانطور ‌که ‌گفتم‪‌ ،‬کد ‌پایتون ‌را ‌طوری ‌م ‌‬
‫‌‬
‫دادهی ‌باال ‌محدود ‌نباشد)‪‌.‬برای ‌رسیدن ‌به ‌این ‌هدف‪‌ ،‬یک‌‬‫مجمولهی ‌ ‌‬
‫‌‬ ‫(برای ‌مثال‪‌ ،‬فقط ‌به ‌‬
‫یکنم‪‌ .‬این ‌سطرِ ‌اولیه‌‬ ‫مجمولهی ‌داده ‌اضافه ‌م ‌‬
‫‌‬ ‫سطر ‌به ‌لنوان ‌سرآیند ‌(‪‌ )header‬به ‌این ‌‬
‫یآورم‪‌ :‬‬‫یکند‪‌.‬در‌زیر‌چند‌سطرِ‌اول‌را‌م ‌‬ ‫لملکردِ‌هر‌ستون‌را‌مشخص‌م ‌‬
‫‌‬

‫‌‬
‫‌‬
‫طبقهبندی ‌که ‌ما ‌می‌نویسیم‌‬‫لهی ‌ ‌‬ ‫هر ‌ستونی ‌که ‌‪(‌ comment‬توضیحات) ‌باشد‪‌ ،‬به ‌وسی ‌‬
‫طبقهی‌آن‌شی‌است‌و‌ستونی‌‬ ‫انگر‌ ‌‬ ‫یشود‪‌.‬ستونِ ‌‪(‌class‬کالس‌یا‌طبقه)‌بی ‌‬ ‫نادیده‌گرفته‌م ‌‬
‫یهای‌آن‌شی‌یا‌رکورد‌است‪‌ .‬‬ ‫که‌با‌‪(‌num‬لدد)‌مشخص‌شده‌باشد‪‌،‬ویژگ ‌‬
‫‌‬
‫ورزش‌ذهنی ‌‬
‫یدهی‌یم؟‌چنید‌‌نمونیه‌‌را‌در‌زیی‌ر‌‬ ‫دادهها‌را‌در‌پایتون‌نمایش‌م ‌‬
‫یکنید‪‌،‬چگونه‌این‌ ‌‬ ‫فکر‌م ‌‬
‫نمونهی‌خود‌را‌داشته‌باشید)‪‌ .‬‬
‫یتوانید‌ ‌‬‫یآورم‌(شما‌هم‌م ‌‬ ‫م‌‬
‫فرمِ‌دیکشنری‪‌ :‬‬

‫‌‬
‫‌‬
‫ستها‪‌ :‬‬
‫فرمِ‌لیستی‌از‌لی ‌‬

‫‌‬
‫‌‬
‫تاپلها‌(‪‌ :)tuples‬‬
‫فرمِ‌لیستی‌از‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌271‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫‌‬
‫ورزش‌ذهنی‌–‌راه‌حل ‌‬
‫فرم‌دیکشنری‪‌ :‬‬

‫‌‬
‫این‌فرم‌خیلی‌خوب‌نیست‪‌.‬کلیدِ‌هر‌دیکشنری‪‌،‬نام‌ورزشکار‌است‌که‌اصال‌در‌محاسبات‌‬
‫یشود‪‌ .‬‬‫از‌آن‌استفاده‌نم ‌‬
‫‌‬
‫ستها‪‌ :‬‬
‫فرمِ‌لیستی‌از‌لی ‌‬

‫‌‬
‫آنجیا‌یی‌کیه‌‌‬
‫این‌فرم‌بد‌نیست‪‌.‬این‌فرم‌در‌واقع‌برگردانِ‌فایی‌ل‌هیا‌ی‌ورودی‌اسیت‌‌و‌از‌ ‌‬
‫یخواهد‌که‌بر‌روی‌داد‌ها‌تکرار‌(‪‌)iterate‬داشته‌باشید‌‪‌،‬‬ ‫الگوریتم‌نزدیک‌ترین‌همسایه‌م ‌‬
‫یخورد‪‌ .‬‬‫این‌فرمِ‌لیست‪‌،‬به‌درد‌م ‌‬
‫‌‬
‫تاپلها‌(‪‌ :)tuples‬‬
‫فرم‌لیستی‌از‌ ‌‬

‫‌‬
‫یها‌را‌‬
‫من‌این‌فرم‌را‌بیشتر‌از‌بقیه‌دوست‌دارم‪‌،‬چون‌این‌طرزِ‌نمایش‪‌،‬هر‌کدام‌از‌ویژگ ‌‬
‫یدارد‌و‌یک‌سطح‌جداگانه‌ای‌بی‌ین‌کیالس‌هیا‪‌‌،‬‬ ‫در‌یک‌لیستِ‌مخصوص‌به‌خودش‌نگه‌م ‌‬
‫یدهد‪‌.‬من‌توضیحات‌(‪‌)comment‬را‌هم‌لیست‌‬ ‫یها‌و‌توضیحات‌را‌برای‌ما‌انجام‌م ‌‬
‫ویژگ ‌‬
‫یتوانند‌چند‌تا‌باشد‪‌ .‬‬
‫ستونهای‌توضیحات‌م ‌‬‫‌‬ ‫کردم‌چون‌تعداد‌‬
‫‌‬
‫کد‌پایتون‌من‌که‌قرار‌است‌فایل‌را‌به‌فرمت‌زیر‌تبدیل‌کند‪‌ :‬‬
‫‌‬

‫‌‬
272 ■‌‫طبقهبندی‬
‌ ‌.4‌‫‌فصل‬

‌ :‫یک‌همچین‌شکلی‌دارد‬

class Classifier:
def __init__(self, filename):
self.medianAndDeviation = []
# reading the data in from the file
f = open(filename)
lines = f.readlines()
f.close()
self.format = lines[0].strip().split('\t')
self.data = []
for line in lines[1:]:
fields = line.strip().split('\t')
ignore = []
vector = []
for i in range(len(fields)):
if self.format[i] == 'num':
vector.append(int(fields[i]))
elif self.format[i] == 'comment':
ignore.append(fields[i])
elif self.format[i] == 'class':
classification = fields[i]
self.data.append((classification, vector, ig
nore))

‌ :‫کد‌بزنید‬
‌‌،‫قبل‌از‌این‌که‌داده‌ها‌را‌توسط‌امتیازِ‌اسیتانداردِ‌‌اصیالح‌شیده‬
‌‌‫‌تابعی‌احتیاج‌داریی‌م‌کیه‌‌بتوانید‌‌میانیه‬،‫استانداردسازی‌کنیم‬
‌‫)‌را‌برای‌الداد‌در‬asd(‌‫)‌و‌انحرافِ‌استاندارد‌مطلق‬median(
‌ :‫لیست‌محاسبه‌کند‬

‫برنامهنویسان‬ ‫‪‌ ■‌271‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫ادهسازی‌کنید؟ ‌‬
‫یتوانید‌این‌توابع‌را‌در‌پایتون‌پی ‌‬
‫آ یا‌ م ‌‬
‫فایییی‌لِ‌‪‌testMedianAndASD.py‬را‌از‌سییییایت‌‪‌guidetodatamining.com‬و‌ییییا‌‬
‫‪‌chistio.ir‬دانلود‌کنید‪‌ .‬‬

‫خطاهای‌‪‌Assertion‬و‌تابع‌‪‌Assert‬در‌پایتون ‌‬
‫راهحل ‌به ‌دو ‌تکه ‌کد ‌تبدیل ‌شود‪‌ .‬یک ‌تکه ‌کُد ‌برای‌‬ ‫مهم ‌این ‌است ‌که ‌هر ‌قسمت ‌از ‌ ‌‬
‫ادهسازیِ ‌آن ‌قسمت ‌و ‌یک ‌تکه ‌کُد ‌برای ‌آزمودن ‌(‪‌.)test‬در ‌واقع‪‌ ،‬یک ‌روش ‌این ‌است ‌که‌‬‫پی ‌‬
‫ابتدا ‌آزمون ‌(‪‌ )test‬را ‌بنویسید ‌و ‌بعد ‌از ‌آن ‌پی ‌‬
‫ادهسازی ‌را ‌داشته ‌باشید ‌(به ‌این ‌کار ‌در‌‬
‫نکار ‌طراحی ‌کردم‌‬ ‫اصطالح ‌‪‌ Test First Programming‬م ‌‬
‫یگویند)‪‌.‬قالبی ‌که ‌من ‌برای ‌ای ‌‬
‫یک‌تابع‌به‌اسم‌‪‌unitTest‬دارد‪‌.‬یک‌ورژن‌ساده‌از‌این‌تابع‌که‌فقط‌یک‌آزمون‌(‪‌)test‬دارد‌‬
‫در‌زیر‌نمایش‌داده‌شده‌است‪‌ :‬‬

‫‪def unitTest():‬‬
‫]‪list1 = [54, 72, 78, 49, 65, 63, 75, 67, 54‬‬
‫)'‪classifier = Classifier('athletesTrainingSet.txt‬‬
‫)‪m1 = classifier.getMedian(list1‬‬
‫)‪assert(round(m1, 3) == 65‬‬
‫‪print("getMedian and getAbsoluteStandardDeviation wo‬‬
‫)"‪rk correctly‬‬

‫تابع‌‪‌getMedian‬بایستی‌چیزی‌شبیه‌به‌کد‌زیر‌باشد‪‌ :‬‬
‫‌‬
‫‪def getMedian(self, alist):‬‬
‫"""‪"""return median of alist‬‬
‫"""‪"""TO BE DONE‬‬
‫‪return 0‬‬
‫‌‬
‫پس ‌ابتدا ‌تابعِ ‌‪‌ ،getMedian‬لدد ‌‪‌ 1‬را ‌برای ‌هر ‌لیستی ‌برمی‌گرداند‪‌ .‬شما ‌بایستی‌‬
‫‪‌getMedian‬را‌طوری‌کامل‌کنید‌که‌مقدارِ‌درست‌را‌برگرداند‪‌.‬در‌تابع‌‪‌،unitTest‬من‌تابعِ‌‬
‫‪‌getMedian‬را‌با‌لیست‌زیر‌صدا‌می‌زنم‪‌ :‬‬
‫طبقهبندی‌■ ‪273‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫‌‬
‫یگرداند‌بایستی‌برابر‌‬‫یگوید‪‌،‬مقداری‌که‌‪‌getMedian‬برم ‌‬ ‫خطِ‌‪‌assert‬در‌تابع‌‪‌unitTest‬م ‌‬
‫یکند‌و‌لبارتِ‪‌ :‬‬‫نطور‌باشد‪‌،‬فرآیندِ‌اجرا‌به‌صورت‌زیر‌ادامه‌پیدا‌م ‌‬
‫‪‌95‬باشد‪‌.‬اگر‌ای ‌‬
‫‌‬

‫‌‬
‫یگرداند ‌برابر ‌‪‌ 95‬نباشد‪‌ ،‬خطِ ‌زیر ‌به ‌لنوان ‌خطا ‌چاپ‌‬
‫یشود‪‌ .‬اگر ‌چیزی ‌که ‌برم ‌‬‫چاپ ‌م ‌‬
‫یشود‪‌ :‬‬‫م‌‬
‫‌‬

‫‌‬
‫اگر ‌کد ‌را ‌از ‌سایت ‌دانلود ‌کرده ‌باشید ‌و ‌بدون ‌تغییر ‌اجرا ‌کنید‪‌ ،‬این ‌خطا ‌را ‌خواهید ‌دید‪‌.‬اما‌‬
‫هنگامی ‌که ‌تابع ‌‪‌ getMedian‬و ‌تابع ‌‪‌ getAbsoluteStandardDeviation‬را ‌به ‌درستی‌‬
‫ادهسازی ‌کنید‪‌ ،‬این ‌خطا ‌از ‌بین ‌خواهد ‌کرد‪(‌.‬در ‌واقع ‌ما ‌تست ‌را ‌نوشتیم ‌و ‌شما ‌بایستی‌‬ ‫پی ‌‬
‫کد‌را‌بنویسید) ‌‬
‫یخواهید‌بنویسید‪‌،‬به‌دو‌قسمت‌تبدیل‌‬ ‫«این‌نکته‌مهم‌است‌که‌هر‌قسمتی‌از‌جزئیات‌که‌م ‌‬
‫ادهسازی ‌و ‌یک ‌قسمت ‌هم ‌برای ‌آزمودنِ ‌آن‪‌.‬اگر ‌آزمونی ‌مانند ‌این ‌را‌‬ ‫شود‪‌.‬یک ‌قسمت ‌پی ‌‬
‫یدانید ‌که ‌آیا ‌به‌‬‫رساندهاید‪‌ ،‬نم ‌‬
‫‌‬ ‫یتوانید ‌بفهمید ‌که ‌چه ‌موقع ‌آن ‌را ‌به ‌اتمام ‌‬‫ننویسید‪‌ ،‬نم ‌‬
‫یتواند ‌منجر ‌به‌‬ ‫یدانید ‌که ‌تغییراتِ ‌آتی ‌م ‌‬ ‫کردهاید ‌یا ‌خیر‪‌ ،‬و ‌نم ‌‬
‫درستی ‌موضوع ‌را ‌درك ‌ ‌‬
‫خراب‌شدنِ‌این‌قسمت‌از‌کد‌شود‪‌».‬پیتر‌نورویگ‌(‪‌ )Peter Norvig‬‬
‫‌‬
‫برنامهنویسان‬ ‌ ■‌274
‌ ‌‫دادهکاوی‌برای‬



‌ ‫راهحل‬

‌ :‫ادهسازی‌این‌الگوریتم‌به‌صورت‌زیر‌است‬
‌ ‫راههای‌پی‬
‌ ‌‫یکی‌از‬

def getMedian(self, alist):
"""return median of alist"""
if alist == []:
return []
blist = sorted(alist)
length = len(alist)
if length % 2 == 1:
# length of list is odd so return middle element
return blist[int(((length + 1) / 2) - 1)]
else:
# length of list is even so compute midpoint
v1 = blist[int(length / 2)]
v2 =blist[(int(length / 2) - 1)]
return (v1 + v2) / 2.0

def getAbsoluteStandardDeviation(self, alist, median):


"""given alist and median return absolute standard d
eviation"""
sum = 0
for item in alist:
sum += abs(item - median)
‫طبقهبندی‌■ ‪275‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫)‪return sum / len(alist‬‬


‫‌‬
‫یبینید‪‌،‬تابعِ‌‪‌getMedian‬در‌ابتدا‌و‌قبل‌از‌پیدا‌کردنِ‌میانه‪‌،‬لیستِ‌الداد‌را‌‬ ‫همانطور‌که‌م ‌‬
‫‌‬
‫دادههای‌خیلی‌بزرگی ‌سر‌و‌کار‌ندارم‪‌ ،‬فکر‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬ ‫یکند‪‌.‬به‌خاطرِ‌این‌که ‌من‌با‌‬‫مرتب‌م ‌‬
‫راهحلِ‌مناسبی‌باشد‪‌.‬اگر‌بخواهم‌کُد‌را‌بهینه‌کنم‪‌،‬ممکن‌است‌این‌قسمت‌را‌با‌‬ ‫یکنم‌این‌ ‌‬ ‫م‌‬
‫یک‌الگوریتمِ‌انتخاب‌(‪‌)selection algorithm‬جایگزین‌کنم‪‌ .‬‬
‫یشوند ‌و ‌در ‌لیستی ‌به ‌نام ‌‪‌data‬‬‫دادهها ‌از ‌فایلِ ‌‪‌ athletesTrainingSet.txt‬خوانده ‌م ‌‬
‫االن‪‌ ‌ ،‬‬
‫یشوند‪‌.‬فرمتِ‌آن‌چیزی‌شبیه‌به‌کد‌زیر‌است‪‌ :‬‬ ‫نگهداشته‌م ‌‬
‫طبقهبند‌ ‌‬
‫در‌ ‌‬
‫‌‬

‫‌‬
‫یخواهم ‌بُردار ‌را ‌نرمال‌سازی ‌کنم ‌تا ‌لیستی ‌که ‌در ‌‪‌ data‬در ‌ ‌‬
‫طبقهبند ‌قرار ‌دارد‪‌،‬‬ ‫حاال ‌م ‌‬
‫نرمالشده‌را‌در‌خود‌داشته‌باشند‪‌.‬برای‌مثال‪‌ :‬‬‫دادههای‌ ‌‬‫‌‬
‫‌‬

‫‌‬
‫یکنم‪‌ :‬‬
‫برای‌این‌کار‪‌،‬چند‌خطِ‌زیر‌را‌به‌تابعی‌که‌اول‌نوشتم‌اضافه‌م ‌‬
‫‌‬
‫‪# get length of instance vector‬‬
‫)]‪self.vlen = len(self.data[0][1‬‬
‫‪# now normalize the data‬‬
‫‪for i in range(self.vlen):‬‬
‫)‪self.normalizeColumn(i‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌279‬‬
‫دادهکاوی‌برای‌ ‌‬

‫نرمالسازی ‌کنیم‪‌.‬پس ‌برای ‌اولین ‌بار‌‬


‫دادهها ‌را ‌ستون ‌به ‌ستون ‌ ‌‬
‫یخواهیم ‌ ‌‬‫حلقهی ‌‪‌ for‬م ‌‬
‫در ‌ ‌‬
‫در ‌حلقه‪‌ ،‬ستونِ ‌قد ‌(‪‌ )height‬را ‌ ‌‬
‫نرمالسازی ‌خواهیم ‌کرد‪‌ ،‬بعد ‌از ‌آن ‌نوبت ‌به ‌ستونِ ‌وزن‌‬
‫یرسد‪.‬‬ ‫(‪‌)weight‬م ‌‬
‫‌‬
‫کد‌بزنید‪‌ :‬‬
‫یتوانید‌تابعِ‌‪‌normalizeColumn‬را‌بنویسید؟ ‌‬ ‫آ یا‌ م ‌‬
‫یتوانید ‌با ‌نام ‌‪‌ normalizedColumnTemplate.py‬از ‌سایت‌‬ ‫قالبِ ‌نمونه ‌را ‌م ‌‬
‫‪‌guidetodtamining.com‬و‌یا‌‪‌chistio.ir‬برای‌نوشتن‌و‌آزمون‪‌،‬دانلود‌کنید‪‌ .‬‬
‫‌‬
‫راهحل ‌‬ ‫‌‬
‫ادهسازی‌کردم‪‌ :‬‬‫نجا‌برایتان‌تابع‌‪‌normalizeColumn‬را‌پی ‌‬ ‫ای ‌‬
‫‌‬
‫‪def normalizeColumn(self, columnNumber):‬‬
‫‪"""given a column number, normalize that column in s‬‬
‫"""‪elf.data‬‬
‫‪# first extract values to list‬‬
‫]‪col = [v[1][columnNumber] for v in self.data‬‬
‫)‪median = self.getMedian(col‬‬
‫)‪asd = self.getAbsoluteStandardDeviation(col, median‬‬
‫))‪#print("Median: %f ASD = %f" % (median, asd‬‬
‫))‪self.medianAndDeviation.append((median, asd‬‬
‫‪for v in self.data:‬‬
‫‪v[1][columnNumber] = (v[1][columnNumber] - media‬‬
‫‪n) / asd‬‬
‫‌‬
‫یبینید‪‌،‬مقادیر‌میانه‌(‪‌)median‬و‌انحراف‌استانداردِ‌مطلق‌(‪‌)asd‬را‌برای‌هر‌‬ ‫همانطور‌که‌م ‌‬
‫‌‬
‫ستون ‌در ‌لیست ‌‪‌ medianAndDeviation‬قرار ‌دادم‪‌ .‬از ‌این ‌اطاللات ‌هنگامی ‌استفاده‌‬
‫شبینی ‌کند‪‌.‬‬ ‫تازهتر‪‌ ،‬پی ‌‬
‫نمونههای ‌ ‌‬
‫طبقهبند‪‌ ،‬کالسِ ‌جدید ‌را ‌برای ‌ ‌‬
‫خواهم ‌کرد ‌که ‌بخواهم ‌ ‌‬
‫رشتهی ‌ورزشی ‌را ‌بازی‌‬‫شبینی ‌کنم ‌که ‌خانم ‌‪‌ Kelly Miller‬چه ‌ ‌‬ ‫یخواهم ‌پی ‌‬‫برای ‌مثال‪‌ ،‬م ‌‬
‫یکند؟‌این‌خانم‪‌5‌،‬فوت‌و‌‪‌21‬اینج‌قد‌و‌‪‌271‬پوند‌وزن‌دارد‪‌.‬اولین‌قدم‌تبدیلِ‌قد‌و‌وزنِ‌‬ ‫م‌‬
‫اصالحشده ‌است‪‌.‬بردار ‌ویژگیِ ‌اصلی ‌برای ‌او ‌برابر ‌[ ‪70,‬‬
‫‌‬ ‫او ‌به ‌صورت ‌امتیازهای ‌استانداردِ ‌‬
‫‪‌]140‬است‪‌ .‬‬
‫طبقهبندی‌■ ‪277‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫دادههای‌آموزشی‪‌،‬مقادیر‌موجود‌در‌‪‌meanAndDeviation‬به‌‬
‫بعد‌از‌انجام‌لملیات‌بر‌روی‌ ‌‬
‫صورت‌زیر‌درمیآید‪‌ :‬‬
‫‌‬

‫‌‬
‫انهای ‌برابر ‌‪‌ 95.5‬و ‌انحراف ‌استانداردِ ‌مطلق‌‬
‫دادهها ‌در ‌ستونِ ‌اولِ ‌بردار‪‌ ،‬می ‌‬
‫به ‌این ‌معنی ‌که ‌ ‌‬
‫برابر‌‪‌5.65‬دارند‪‌.‬میانه‌برای‌ستونِ‌دوم‌برابر‌‪‌217‬و‌انحراف‌استانداردِ‌مطلق‌برای‌این‌ستون‌‬
‫برابر‌‪‌33.95‬است‪‌ .‬‬
‫اصالحشده ‌را ‌در‌‬
‫‌‬ ‫من ‌از ‌این ‌اطاللات ‌برای ‌تبدیل ‌بردارِ ‌اصلی‪‌ ،‬به ‌برداری ‌که ‌امتیاز ‌استانداردِ ‌‬
‫خود ‌داشته ‌باشد‪‌ ،‬استفاده ‌می‌کنم‪‌ .‬برای ‌مثال‪‌ ،‬برای ‌ویژگیِ ‌اول‪‌ ،‬این ‌لدد ‌به ‌صورت ‌زیر‌‬
‫اصالح‌می‌شود‪‌ :‬‬
‫‌‬

‫‌‬
‫و‌برای‌ویژگیِ‌دوم‪‌ :‬‬
‫‌‬

‫‌‬
‫تابعِ‌پایتونی‌که‌این‌کار‌را‌انجام‌دهد‌نیز‪‌،‬مانند‌شکل‌زیر‌است‪‌ :‬‬
‫‌‬
‫‪def normalizeVector(self, v):‬‬
‫‪"""We have stored the median and asd for each column‬‬
‫‪.‬‬
‫"""‪We now use them to normalize vector v‬‬
‫)‪vector = list(v‬‬
‫‪for i in range(len(vector)):‬‬
‫]‪(median, asd) = self.medianAndDeviation[i‬‬
‫‪vector[i] = (vector[i] - median) / asd‬‬
‫‪return vector‬‬
‫‌‬
‫مهنویسان‬ ‫‪‌ ■‌271‬‬
‫دادهکاوی‌برای‌برنا ‌‬

‫آخرین‌تکه‌کدی‌که‌باید‌برای‌تکمیل‌ایی‌ن‌قسیمت‌‌زده‌شیود‪‌‌،‬کُیدِ‌‌مربیوط‌‌بیه‌‌پی‌یش‌بینی‌یِ‌‬
‫نکیه‌‌‬ ‫نمونه‌های‌جدید‌است‌–‌در‌مثالِ‌ما‪‌،‬ورزشی‌که‌یک‌ورزشکار‌انجام‌م ‌‬
‫یدهید‌‪‌.‬بیرا‌ی‌ایی‌ ‌‬
‫مشخص‌شود‌که‌شخصی‌مانند‌‪‌Kelly Miller‬که‌‪‌5‬فوت‌و‌‪‌21‬اینج‌(یعنی‌ی‌در‌مجمیوع‌‌‪‌71‬‬
‫یدهد‪‌،‬بایستی‌تابع‌زیر‌را‌صدا‌بزنیم‪‌ :‬‬ ‫اینچ)‌قد‌و‌‪‌271‬پوند‌وزن‌دارد‪‌،‬چه‌ورزشی‌را‌انجام‌م ‌‬
‫‌‬

‫‌‬
‫در‌کدِ‌من‪‌،‬تابعِ‌‪‌classify‬فقط‌یک‌ساختارِ ‌کلی‪‌،‬برای‌انجام‌لملیاتِ‌نزدیک‌ترین‌همسایه‌بیا‌‌‬
‫تابعِ‌‪‌nearestNeighbor‬هست‪‌ :‬‬
‫‌‬
‫‪def classify(self, itemVector):‬‬
‫"""‪"""Return class we think item Vector is in‬‬
‫‪return(self.nearestNeighbor(self.normalizeVector(ite‬‬
‫)]‪mVector))[1][0‬‬
‫‌‬
‫کد‌بزنید ‌‬
‫یتوانید‌تابعِ‌‪‌nearestNeighbor‬را‌پیاده‌سازی‌کنید؟‌(من‪‌،‬یک‌تابعِ‌جدا‌بیه‌‌اسیم‌‌‬ ‫آ یا‌ م ‌‬
‫‪‌manhattanDistance‬نوشتم) ‌‬
‫یتوانید ‌با ‌اسم‌‪‌classifyTemplate.py‬از‌سیا‌یت‌‬ ‫دوباره‪‌،‬قالبِ‌مربوط‌به‌این‌مسئله‌را‌م ‌‬
‫‪‌guidetodatamining.com‬و‌‪‌chistio.ir‬دریافت‌کنید‪‌ .‬‬
‫‌‬
‫راه‌حل ‌‬
‫ادهسازیِ‌تابعِ‌‪‌nearestNeighbor‬کوتاه‌است‪‌ :‬‬
‫پی ‌‬
‫‌‬
‫‪def manhattan(self, vector1, vector2):‬‬
‫"""‪"""Computes the Manhattan distance.‬‬
‫‪return sum(map(lambda v1, v2: abs(v1 - v2), vector1,‬‬
‫))‪vector2‬‬

‫‪def nearestNeighbor(self, itemVector):‬‬


‫"""‪"""return nearest neighbor to itemVector‬‬
‫‪return min([ (self.manhattan(itemVector, item[1]), i‬‬
‫)‪tem‬‬
‫طبقهبندی‌■ ‪276‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫)]‪for item in self.data‬‬


‫‌‬
‫تمام‌شد!!! ‌‬
‫کترین ‌همسایه ‌را‌‬ ‫طبقهبندیِ ‌نزدی ‌‬
‫ما ‌تابع ‌ ‌‬
‫با‌پایتون‌در‌حدود‌‪‌111‬خط‌کد‌نوشتیم‪‌ .‬‬
‫وبسایت ‌ما‌‬‫یتوانید ‌از ‌ ‌‬
‫در ‌کُدِ ‌کامل‪‌ ،‬که ‌م ‌‬
‫دانلود‌کنید‪‌،‬یک‌تابع‌به‌نام‌‪‌test‬قرار‌دادم‪‌،‬‬
‫که ‌به ‌لنوانِ ‌ورودی‪‌ ،‬یک ‌فایل ‌برای‌‬
‫مجمولهی ‌آموزشی ‌و ‌یک ‌فایل ‌برای‌‬ ‫‌‬
‫مجمولهی ‌آزمون ‌از ‌شما ‌می‌گیرد ‌و ‌دقتِ‌‬
‫‌‬
‫یکند‪‌ .‬در‌‬‫طبقهبند ‌را ‌در ‌خروجی ‌چاپ ‌م ‌‬ ‫‌‬
‫طبقهبند‪‌،‬‬
‫یکنید ‌تابع ‌ ‌‬ ‫شکل ‌زیر ‌مشاهده ‌م ‌‬
‫طبقهبندی‌کرده‌است‪‌ :‬‬
‫دادههای‌ورزشکارانِ‌زن‌را‌ ‌‬ ‫چگونه‌ ‌‬
‫‌‬

‫‌‬
‫طبقهبند‪‌ ،‬در ‌مورد ‌بازیکنانِ‌‬
‫طبقهبندِ ‌ما ‌‪‌ 11‬درصد ‌دقت ‌دارد‪‌.‬این ‌ ‌‬
‫یبینید‪‌ ‌ ،‬‬
‫همانطور ‌که ‌م ‌‬
‫‌‬
‫بسکتبال‌بسیار‌لالی‌لمل‌کرده‌است‌ولی‌چهار‌خطا‌در‌دو‌و‌میدانی‌و‌ژیمیناستیک‌دارد‪‌ .‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌211‬‬
‫دادهکاوی‌برای‌ ‌‬

‫گلهای‌زنبق‌(‪‌ )Iris Dataset‬‬


‫دادهی‌ ‌‬
‫مجموله‌ ‌‬
‫گلهای‌زنبق‌(‪‌)Iris‬که‌بدون‌شک‌‬ ‫دادهی‌ ‌‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫سادهای‌که‌نوشیم‌را‌بر‌روی‌‬
‫طبقهبندِ‌ ‌‬
‫‌‬
‫مجمولهی‌‬
‫‌‬ ‫دادهکاوی ‌است‪‌ ،‬آزمایش ‌کردم‪‌ .‬این ‌‬‫دادهی ‌موجود ‌در ‌ ‌‬
‫مشهورترین ‌مجموله‌ی ‌ ‌‬
‫گلهای‌‬‫دادهی ‌ ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫لهی ‌‪‌ Sir Ronald Fisher‬در ‌‪‌ 2631‬استفاده ‌م ‌‬
‫یشد‪‌.‬‬ ‫داده ‌به ‌وسی ‌‬
‫نمونهی ‌گل ‌برای ‌هر ‌نوع ‌گلِ ‌زنبق ‌است ‌(زنبقِ ‌ستوتا ‌(‪‌،)Iris Setos‬‬
‫زنبق ‌متشکل ‌از ‌‪‌ ‌ 51‬‬
‫مجمولهی‌داده‌‬
‫‌‬ ‫زنبقِ‌ویرجینیکا‌(‪‌)Iris Virginica‬و‌زنبقِ‌ورسیکالر‌(‪‌.))Iris Versicolor‬این‌‬
‫اندازههای ‌دو ‌بخشِ ‌گل ‌زنبق ‌تشکیل‌شده‌است‪‌:‬کاسبرگ ‌(‪‌ )sepal‬یعنی ‌قسمت ‌سبز‌‬ ‫از‌ ‌‬
‫گلبرگها‌(‪.)petals‬‬
‫‌‬ ‫غنچهی‌گل‌و‌‬
‫رنگِ‌ ‌‬

‫شدهاست ‌در ‌سایتِ ‌کتاب‪‌ ،‬یعنی‌‬‫آنها ‌اشاره ‌ ‌‬ ‫دادههایی ‌که ‌در ‌این ‌کتاب ‌به ‌ ‌‬
‫مجموله ‌‬
‫‌‬ ‫تمامیِ ‌‬
‫وبسایت ‌‪‌ chistio.ir‬موجود ‌است‪‌ .‬این ‌کار ‌به‌‬ ‫‪‌ guidetodatamining.com‬و ‌همچنین ‌ ‌‬
‫دادهها‌را‌دانلود‌کرده‌و‌با‌الگوریتم‌ها‪‌،‬تجربه‌کسب‌کنید‪‌.‬مثالً‌‬ ‫شما‌این‌امکان‌را‌می‌دهد‌تا‌ ‌‬
‫دادهها ‌دقت ‌را ‌افزایش ‌می‌دهد ‌یا ‌برلکس ‌بالث ‌کاهشِ‌‬ ‫نرمالسازیِ ‌ ‌‬
‫نکه ‌بفهمید‪‌ ،‬آیا ‌ ‌‬ ‫ای ‌‬
‫یبخشد ‌یا ‌خیر؟‌‬ ‫مجمولهی ‌داده‪‌ ،‬نتایج ‌را ‌بهبود ‌م ‌‬
‫‌‬ ‫دادههای ‌بیشتر ‌در ‌‬
‫یشود؟ ‌آیا ‌ ‌‬
‫دقت ‌م ‌‬
‫فاصلهی‌اقلیدسی‪‌،‬چه‌تاثیراتی‌دارد؟‬‫تغییر‌معیار‌به‌ ‌‬
‫طبقهبندی‌■ ‪212‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫یادتان‌باشد‌که‪‌:‬هر‌چیزی‌که‌یاد‌بگیرید‪‌،‬در‌ذهنِ‌شماست‪‌،‬نه‌من‌(و‌نه‌منِ‌مترجم!)‪‌.‬هر‌‬
‫دادههای‌اشاره‌شده‌در‌این ‌کتاب‌تعامل‌داشته‌باشید‌و ‌کار ‌کنید‪‌،‬‬
‫کدها‌و‌ ‌‬
‫چقدر‌بیشتر‌با ‌ ‌‬
‫بیشتر‌یاد‌خواهید‌گرفت‪.‬‬
‫‌‬

‫گلهای‌زنبق‌(‪‌)Iris‬چیزی‌شبیه‌به‌شکل‌زیر‌است‌( ‌‬
‫گونههای‌مختلفِ‌گلِ‌‬ ‫دادهی‌ ‌‬
‫مجمولهی‌ ‌‬
‫‌‬
‫شبینی‌کند) ‌‬
‫یخواهد‌پی ‌‬
‫طبقهبند‌م ‌‬
‫زنبق‪‌،‬چیزی‌است‌که‌ ‌‬

‫‌‬
‫دادههای‌آموزشی‌(‪‌)training set‬قرار‌‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫‪‌211‬نمونه‌گلِ‌زنبق‌همراه‌با‌برچسب‌در‌‬
‫مجمولهی ‌آزمون ‌(‪‌ )test set‬قرار ‌ ‌‬
‫گرفتهاند‌‬ ‫‌‬ ‫دارد ‌و ‌‪‌ 31‬نمونه ‌هم ‌همراه ‌با ‌برچسب ‌در ‌‬
‫مجمولهی‌آموزشی‌نیستند)‪‌ .‬‬
‫‌‬ ‫دادههای‌مجموله‌ی‌آزمون‌در‌‬
‫(هیچ‌کدام‌از‌ ‌‬
‫طبقهبندِ ‌ما ‌(که ‌در ‌قسمتِ ‌قبلی ‌ساختیم) ‌چگونه ‌و ‌با ‌چه ‌کیفیتی‌‬
‫اجازه ‌دهید ‌ببینیم ‌ ‌‬
‫یکند؟ ‌‬ ‫طبقهبندی‌م ‌‬
‫گلهای‌زنبق‌را‌ ‌‬ ‫دادههای‌ ‌‬
‫‌‬
‫‌‬

‫‌‬
‫جهی‌خوب‌با‌همان‌طبقه‌بندِ‌ساده‌ای‌که‌داریم‌به‌دست‌آمده‌است‪‌.‬حال‌ایین‌‬ ‫دوباره‌یک‌نتی ‌‬
‫نکته‌جالب‌است‌که‌بدون‌نرمال‌سازیِ‌داده‌ها‪‌،‬طبقه‌بند‌دارای‌دقتِ‌‪‌211‬درصدی‌شده‌است‌‬
‫(ولی‌با‌نرمال‌سازی‌مانند‌شکلِ‌باال‌‪‌63.33‬درصد‌دقت‌داشته‌ایم)‪‌.‬ایی‌ن‌مشیکل‌ی‌کیه‌‌در‌اثیرِ‌‌‬
‫یکنیم‪‌ .‬‬
‫یآید‌را‌در‌فصلِ‌بعدی‌با‌جزئیاتِ‌بیشتری‌بررسی‌م ‌‬ ‫شم ‌‬
‫نرمالسازی‌پی ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌211‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫مسئلهی‌مایل‌به‌ازای‌هر‌گالن ‌‬
‫‌‬
‫اصالحشده‪‌ ،‬که ‌به ‌صورت ‌گسترده ‌هم‌‬‫‌‬ ‫دادهی ‌‬
‫طبقهبندمان ‌را ‌بر ‌روی ‌یک ‌مجموله ‌ ‌‬
‫در ‌آخر‪‌ ‌ ،‬‬
‫در‌اتومبیلها‌‬
‫‌‬ ‫آزمایش‌کردیم‪‌.‬این‌مجمولهی‌داده‪‌ ،‬مایل ‌به ‌ازای ‌هر ‌گالن ‌‬
‫‌‬ ‫یشود ‌‬
‫استفاده ‌م ‌‬
‫(‪‌)Auto Miles Per Gallon‬از‌دانشگاه‌کارنی‌ملون‌(‪‌)Carnegie Melon‬است‌که‌در‌ابتدا‌‬
‫دادهها ‌برای ‌این‌‬
‫در ‌سال ‌‪‌ 2613‬در ‌نمایشگاهِ ‌انجمنِ ‌آمارِ ‌آمریکا ‌استفاده ‌شد‪‌ .‬فرمتِ ‌ ‌‬
‫مجمولهی‌داده‪‌،‬چیزی‌مانندِ‌شکل‌زیر‌است‪‌ :‬‬
‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫یخواهیم‌ستونِ‌‪‌mpg‬را‌که‌یک‌مجموله‌ی‌‬ ‫مجمولهی‌داده‪‌،‬م ‌‬
‫‌‬ ‫شدهی‌این‌‬
‫اصالح ‌‬
‫‌‬ ‫نسخهی‌‬
‫در‌ ‌‬
‫شبینی ‌کنیم ‌(مقادیرِ ‌این ‌ستون ‌‪‌ 35‌ ،31‌ ،15‌ ،11‌ ،25‌ ،21‬و ‌‪‌ 45‬است)‪‌.‬‬‫گسسته ‌است‪‌ ،‬پی ‌‬
‫یهای ‌مورد ‌استفاده‪‌ ،‬تعداد ‌سیلندر ‌(‪‌ ،)cylanders‬ظرفیت ‌پیستون ‌(‪‌)displacement‬‬ ‫ویژگ ‌‬
‫که‌در‌ستونِ‌جدولِ‌باال‌با‌‪‌c.i.‬مشخص‌شده‌است‪‌،‬اسب‌بخار‌(‪‌)horsepower‬یا‌همان‌‪‌HP‬‬
‫در‌جدولِ‌باال‪‌ ،‬وزن ‌(‪‌ )weight‬و ‌شتاب ‌(‪‌ )acceleration‬یعنی‌زمان‌به‌ثانیه‌بین‌‪‌ 1‬تا‌‪‌91‬‬
‫کیلومتر‌(‪‌)secs. 0-60‬است‪‌ .‬‬
‫‌‬
‫مجمولهی ‌آموزشی‌‬
‫‌‬ ‫تعداد ‌‪‌ 341‬نمونه ‌ماشین‪‌ ،‬در ‌‬
‫(‪‌ )training set‬موجود ‌هستند ‌و ‌تعداد ‌‪‌51‬‬
‫مجمولهی ‌آزمون ‌(‪‌ .)test set‬اگر ‌به‌‬
‫‌‬ ‫نمونه‪‌ ،‬در ‌‬
‫صورت ‌تصادفی‪‌ ،‬مقدارِ ‌‪(‌ mpg‬مایل ‌به ‌ازای ‌هر‌‬
‫شبینی ‌کنیم‪‌ ،‬دقت ‌برابر ‌‪‌ 21.5‬خواهد‌‬ ‫گالن)‌را ‌پی ‌‬
‫بود‪‌ .‬‬
‫‌‬
‫طبقهبندی‌■ ‪213‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫نرمالسازی‌‬
‫نرمالسازی‪‌ ،‬به ‌دقتِ ‌‪‌ 59‬درصد ‌رسیدیم‪‌ ،‬ولی ‌بدون ‌ ‌‬
‫یبینید‪‌ ،‬با ‌ ‌‬
‫همانطور ‌که ‌م ‌‬
‫‌‬
‫یشود‪‌ .‬‬‫دقت‌ما‌برابر‌‪‌31‬درصد‌م ‌‬
‫‌‬

‫‌‬
‫‌‬

‫ماندهی‌فصل ‌‬
‫ته ‌‬ ‫‌‬
‫حواستان‌به‌نرمالسازی‌باشد! ‌‬
‫‌‬
‫دادهها‌‬
‫نرمالسازیِ ‌ ‌‬
‫دربارهی ‌اهمیتِ ‌ ‌‬
‫در ‌این ‌فصل‪‌ ‌ ،‬‬
‫نرمالسازی ‌وقتی ‌خیلی ‌اهمیت ‌پیدا‌‬
‫صحبت ‌کردیم‪‌ ‌.‬‬
‫اسها ‌و‌‬
‫یهای ‌مختلف‪‌ ،‬در ‌مقی ‌‬ ‫یکند ‌که ‌ویژگ ‌‬ ‫م‌‬
‫بازههای ‌متفاوت ‌قرار ‌دارند ‌(برای ‌مثال‪‌ ،‬حقوق ‌و‌‬
‫‌‬
‫فاصلهی ‌دقیق‪‌ ،‬نیاز‌‬
‫سن)‪‌ .‬برای ‌رسیدن ‌به ‌معیارِ ‌ ‌‬
‫یها‌را‌به‌بازه‌ی‌یکسان‌تغییر‌دهیم‪‌ .‬‬
‫داریم‌تا‌ویژگ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌214‬‬
‫دادهکاوی‌برای‌ ‌‬

‫نرمالسازی ‌(‪‌ )normalization‬برای ‌اشاره ‌به ‌این‌‬ ‫کلمهی ‌ ‌‬‫کاوها‪‌ ،‬از ‌ ‌‬‫داده ‌‬
‫یکه ‌اکثرِ ‌ ‌‬
‫در ‌حال ‌‬
‫نرمالسازی‌(‪‌)normalization‬و‌‬ ‫تغییرِ‌بازه‌استفاده‌می‌کنند‪‌،‬بعضی‌از‌افراد‌هستند‌که‌بین‌ ‌‬
‫نرمالسازی‪‌،‬برابر‌‬
‫یشوند‪‌،‬برای‌این‌افراد‪‌ ‌،‬‬ ‫استانداردسازی ‌(‪‌)standardization‬تفاوت‌قائل‌م ‌‬
‫بازهی‌‪‌1‬‬
‫بازهی‌مقادیرِ‌مختلف‌به‌صورتی‌است‌که‌بعد‌از‌این‌تغییر‪‌،‬مقادیر‌در‌ ‌‬ ‫است‌با‌تغییرِ‌ ‌‬
‫تا ‌‪‌ 2‬قرار ‌بگیرند‪‌.‬در ‌حالی ‌که ‌استاندارسازی‪‌ ،‬در‌واقع‪‌ ،‬تغییر ‌بازه ‌و ‌مقیاسِ ‌یک ‌ویژگی ‌است‌‬
‫انهی‌آن)‌برابر‌‪‌ 1‬شود‌و‌بقی‌هی‌مقادیر‪‌،‬حاصلِ‌‬ ‫گونهای‌که‌به‌طور‌متوسط‌(میانگین‌یا‌می ‌‬ ‫به‌ ‌‬
‫انحراف‌از‌این‌میانگین‌باشند‌(مانند‌انحرافِ‌استاندارد‌یا‌انحرافِ‌استانداردِ‌مطلق)‪‌.‬پس‌برای‌‬
‫مثالهایی ‌از‌‬
‫اصالحشده‪‌ ‌ ،‬‬
‫‌‬ ‫دادهکاوها‪‌ ،‬امتیازِ ‌استاندارد ‌یا ‌امتیازِ ‌استانداردِ ‌‬
‫این ‌دسته ‌از ‌ ‌‬
‫استانداردسازی‌است‪‌ .‬‬
‫بازهی‌‪‌1‬تا‌‪‌ 2‬قرار‌‬
‫یکه‌در‌ ‌‬ ‫نرمالسازیِ‌یک‌ویژگی‌به ‌صورت ‌‬ ‫راههای‌ ‌‬ ‫به‌یاد‌بیاورید ‌که‌یکی‌از‌ ‌‬
‫محاسبهی ‌کمینه ‌(‪‌ )min‬و ‌بیشینه ‌(‪‌ )max‬برای ‌مقادیرِ ‌آن ‌ویژگی ‌بود‪‌ .‬مقدار‌‬ ‫‌‬ ‫بگیرد‪‌ ،‬‬
‫یشد‪‌ :‬‬ ‫نرمالشده‌برای‌هر‌یک‌از‌مقادیرِ‌آن‌ویژگی‌به‌صورت‌زیر‌محاسبه‌م ‌‬ ‫‌‬
‫‌‬

‫‌‬
‫یکند‌در‌مقایسه‌‬
‫نرمالسازی‌استفاده‌م ‌‬
‫طبقهبند ‌را‌برای‌هنگامی‌که‌از‌این‌ ‌‬
‫بیایید‌دقتِ‌یک‌ ‌‬
‫یکند‪‌،‬پیدا‌کنیم‪‌ .‬‬
‫اصالحشده‌استفاده‌م ‌‬
‫‌‬ ‫با‌هنگامی‌که‌از‌امتیازِ‌استانداردِ‌‬
‫‌‬

‫‌‬
‫‌‬
‫طبقهبندی‌■ ‪215‬‬
‫‌فصل‌‪‌ ‌.4‬‬

‫کد‌بزنید‪‌ :‬‬
‫نرمالسازیِ ‌نوشته ‌شده‌‬
‫طبقهبندی ‌که ‌نوشتیم ‌را ‌طوری ‌تغییر ‌دهید ‌که ‌از ‌ ‌‬
‫یتوانید‪‌ ‌ ،‬‬ ‫آی ا ‌ م ‌‬
‫صفحهی‌قبل‌استفاده‌کند؟ ‌‬ ‫‌‬ ‫در‌‬
‫دادهای ‌که ‌داشتیم‪‌،‬‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫دادهها ‌را ‌بر ‌روی ‌سه ‌‬
‫یتوانید ‌بعد ‌از ‌تغییرِ ‌کد‪‌ ،‬این ‌ ‌‬
‫م‌‬
‫آزمایش‌کنید‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬
‫کد‌بزنید‌–‌نتایجِ‌من ‌‬
‫گرفتهام‪‌ :‬‬
‫‌‬ ‫این‌نتایجی‌است‌که‌من‌‬
‫‌‬

‫‌‬
‫‌‬
‫نرمالسازی ‌(‪‌ )min-max‬با ‌روشِ ‌امتیازِ ‌استانداردِ‌‬
‫خب! ‌اگر ‌بخواهیم ‌نتایج ‌را ‌برای ‌این ‌ ‌‬
‫اصالحشده‌مقایسه‌کنیم‪‌،‬باید‌بگوییم‌که‌نتایج‌ناامیدکننده‌بوده‌است‪‌ .‬‬
‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌219‬‬
‫دادهکاوی‌برای‌ ‌‬

‫روشهای‌مختلفی‌را‌بر‌‬‫دادههای‌مختلف‌سر‌و‌کله‌بزنید‌و‌ ‌‬ ‫یشود‌اگر‌که‌با‌مجموله‌ ‌‬ ‫جالب‌م ‌‬


‫گلهای ‌زنبق ‌(‪‌)Iris‬و ‌مایل ‌به ‌ازای ‌یک‌‬
‫دادههای ‌ ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫آنها ‌آزمایش ‌کنید‪‌.‬من ‌‬
‫روی ‌ ‌‬
‫گالن ‌(‪‌)MPG‬را ‌از ‌سایتِ ‌‪‌ UCI‬که ‌مخزنی ‌برای ‌ ‌‬
‫دادههای ‌مربوط‌‬
‫‌کردم‌‬ ‫‌دریافت‬ ‫‌است‪،‬‬ ‫‌ماشین‬ ‫‌یادگیریِ‬ ‫به‬
‫(‪‌.)archive.ics.uci.edu/ml‬به ‌شما ‌هم ‌پیشنهاد ‌م ‌‬
‫یکنم ‌که ‌به‌‬
‫وبسایت‌را‌‬‫دادههای‌این‌ ‌‬
‫مجموله ‌‬
‫‌‬ ‫این‌سایت‌بروید‌و‌یکی‌دو‌تا‌از‌‬
‫آنها‌را‌به‌فرمتِ‌دلخواه‌تبدیل‌کرده‌و‌ببینید‌‬‫دانلود‌کنید‪‌.‬سپس‌ ‌‬
‫دادهها‌خواهد‌گرفت‪‌ .‬‬
‫طبقهبندِ‌ما‌چه‌نتایجی‌بر‌روی‌این‌ ‌‬‫که‌ ‌‬
‫‌‬
‫فصل ‪ .2‬كمي بيشتر در مورد طبقهبندي‬

‫توسعههاي ديگري از طبقهبندي‬


‫الگوريتمهاي ارزيابي (‪‌)Evaluating Algorithm‬و الگوريتم ‪‌ KNN‬‬

‫‌‬
‫بیایید‌به‌مثالِ‌ورزشکارانِ‌زن‌در‌فصلِ‌قبل‌برگردیم‪.‬‬
‫طبقهبندی ‌ساختیم ‌که ‌قد ‌و ‌وزنِ ‌هر ‌ورزشکار ‌را ‌به ‌لنوان ‌ورودی‌‬
‫در ‌آن ‌مثال‪‌ ،‬ما ‌یک ‌ ‌‬
‫ورزشهای ‌مختلف ‌مانند ‌ژیمیناستیک‪‌ ،‬دو ‌و ‌میدانی ‌یا‌‬ ‫‌‬ ‫یگرفت‪‌ ،‬و ‌آن ‌ورودی ‌را ‌به ‌‬
‫م‌‬
‫یکرد‪.‬‬ ‫طبقهبندی‌م ‌‬
‫بسکتبال‪‌ ‌،‬‬
‫حاال‪‌،‬فردی‌مانندِ‌‪‌،Marissa Coleman‬که‌‪‌9‬فوت‌و‌‪‌2‬اینچ‌قد‪‌،‬و‌‪‌291‬پوند‌وزن‌دارد‌را‌در‌‬
‫شبینی ‌کند ‌که ‌این ‌خانم‪‌ ،‬بازیکنِ ‌بسکتبال‌‬
‫طبقهبندِ ‌ما ‌به ‌درستی ‌توانست ‌پی ‌‬
‫نظر‌بگیرید‪‌ ‌.‬‬
‫است‪:‬‬
‫‌‬

‫‌‬
‫شبینی‌کرد‌که‌شخصی‌با‌قدِ‌‪‌4‬فوت‌و‌‪‌6‬اینچ‪‌،‬و‌وزنِ‌‪‌61‬پوند‪‌،‬‬
‫طبقهبند‌پی ‌‬
‫و‌همچنین‌این‌ ‌‬
‫احتماالً‌یک‌ژیمیناستیک‌کار‌است‪:‬‬
‫‌‬
‫‪027‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌211‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫طبقهبند‌را‌ایجاد‌می‌کنیم‪‌،‬شاید‌مایل‌باشیم‌به‌برخی‌از‌سواالتِ‌پیرامون‌‬
‫هنگامی‌که‌ما‌یک‌ ‌‬
‫آن‌پاسخ‌دهیم‪:‬‬
‫‌‬

‫‌‬
‫یتوانیم‌به‌این‌سواالت‌پاسخ‌دهیم؟‬
‫اما‌چگونه‌م ‌‬
‫‌‬

‫مجمولهی‌آزمون‌(‪)Test Set‬‬
‫‌‬ ‫مجمولهی‌آموزشی‌(‪‌)Training Set‬و‌‬
‫‌‬
‫دادهی‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫دادهی ‌مختلف ‌کار ‌کردیم‪‌ :‬‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫در ‌انتهای ‌فصلِ ‌قبلی‪‌ ،‬ما ‌با ‌سه ‌‬
‫مجمولهی‌داده‌ی‌مایل‌به‌ازای‌هر‌‬
‫‌‬ ‫گلهای‌زنبق‌(‪‌)Iris‬و‌‬
‫دادهی‌ ‌‬
‫ورزشکاران‌زن‪‌،‬مجموله‌ی‌ ‌‬
‫دادهها ‌را ‌به ‌دو ‌زیر ‌قسمت ‌تقسیم ‌کردیم‪‌.‬از‌‬
‫لها‪‌.‬هر ‌کدام ‌از ‌این ‌مجموله ‌ ‌‬
‫گالن ‌برای ‌اتومبی ‌‬
‫مجمولهی‌‬
‫‌‬ ‫طبقهبند ‌(‪‌)classifier‬استفاده ‌کردیم‪‌.‬به ‌این ‌‬
‫قسمتها ‌برای ‌ساختِ ‌ ‌‬
‫‌‬ ‫یکی ‌از ‌زیر‌‬
‫در‌مورد‌طبقهبندی‌■ ‪216‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫مجمولهی ‌آموزشی ‌( ‪training‬‬


‫‌‬ ‫طبقهبند ‌مورد ‌استفاده ‌قرار ‌گرفت‪‌ ،‬‬
‫داده ‌که ‌برای ‌آموزشِ ‌ ‌‬
‫طبقهبند ‌مورد ‌استفاده ‌قرار ‌می‌گیرد‪‌.‬به‌‬
‫یشود‪‌.‬قسمت ‌دوم ‌اما‪‌ ،‬برای ‌ارزیابیِ ‌ ‌‬ ‫‪‌ )set‬گفته ‌م ‌‬
‫یشود‪‌.‬این‌دو‌لبارت‌(مجموله‌ی‌‬ ‫مجمولهی‌آزمون‌(‪‌)test set‬گفته‌م ‌‬
‫‌‬ ‫مجمولهی‌داده‪‌،‬‬
‫‌‬ ‫ای ن ‌‬
‫مجمولهی‌آزمون)‌دو‌لبارتِ‌آشنا‌و‌مرسوم‌در‌دنیای‌داده‌کاوی‌هستند‪‌ .‬‬ ‫‌‬ ‫آموزشی‌و‌‬

‫آنها ‌برای ‌یاد‌‬


‫دادههایی ‌که ‌از ‌ ‌‬
‫تمهای ‌خود ‌را ‌با ‌ ‌‬ ‫چگاه ‌الگوری ‌‬ ‫انسانها ‌هی ‌‬
‫دادهکاوی‪‌ ‌ ،‬‬ ‫در ‌دنیای ‌ ‌‬
‫یکنند‪(‌ .‬در ‌واقع ‌داده‌هایی ‌که ‌از ‌آن‌ها ‌یاد‌‬ ‫کردهاند‪‌ ،‬امتحان ‌نم ‌‬
‫گرفتن ‌و ‌آموزش ‌استفاده ‌ ‌‬
‫میکنید‪‌ ،‬تفاوت ‌داشته‌‬ ‫میگیرید ‌بایستی ‌با ‌داده‌هایی ‌که ‌توسط ‌آن‪‌ ،‬الگوریتم ‌را ‌ارزیابی ‌ ‌‬ ‫‌‬
‫باشد)‬
‫‌‬
‫نکار‌‬ ‫یکنیم‪‌.‬برای ‌ای ‌‬ ‫مجمولهی ‌آموزش‪‌ ،‬برای ‌ارزیابی ‌استفاده ‌نم ‌‬
‫‌‬ ‫بیایید‌ببینیم‌که ‌چرا ‌ما ‌از ‌‬
‫کترین ‌همسایه ‌را ‌در ‌نظر ‌بگیرید‪‌.‬اگر ‌خانمِ ‌‪‌ Marissa Coleman‬که‌‬ ‫همان ‌الگوریتمِ ‌نزدی ‌‬
‫مجمولهی‌آموزشیِ‌ما‌باشد‪‌،‬او‌با‌‪‌9‬فوت‌و‌‪‌2‬اینچ‌قد‪‌،‬و‌‪‌291‬‬ ‫‌‬ ‫یک‌بازیکنِ‌بسکتبال‌است‪‌،‬در‌‬
‫کترین ‌شخص ‌به ‌خودش ‌خواهد ‌بود‪‌ .‬پس ‌هر ‌گاه ‌بخواهیم ‌الگوریتمِ‌‬ ‫پوند ‌وزن‪‌ ،‬نزدی ‌‬
‫دادههای‌آزمونِ‌ما‌که‌برای‌‬ ‫کترین‌همسایه‌را‌آزمایش‌کنیم‌و‌دقت‌آن‌را‌بسنجیم‪‌،‬اگر‌ ‌‬ ‫نزدی ‌‬
‫دادههای ‌آموزشی ‌باشد‪‌،‬‬ ‫مجمولهای ‌از ‌ ‌‬
‫‌‬ ‫یشود‪‌ ،‬زیر ‌‬ ‫آزمایش ‌کردنِ ‌دقتِ ‌الگوریتم ‌استفاده ‌م ‌‬
‫یتر‪‌ ،‬در ‌ارزیابیِ ‌هر‌‬ ‫همواره ‌دقتی ‌نزدیک ‌به ‌‪211‬درصد ‌خواهیم ‌داشت‪‌ .‬به ‌بیانِ ‌لموم ‌‬
‫مجمولهی‌‬
‫‌‬ ‫دادههای ‌‬
‫مجمولهای ‌از ‌ ‌‬
‫‌‬ ‫مجمولهی ‌آزمون‪‌ ،‬زیر ‌‬
‫‌‬ ‫دادههای ‌‬
‫دادهکاوی‪‌ ،‬اگر ‌ ‌‬ ‫الگوریتمِ ‌ ‌‬
‫آموزشی‌باشد‪‌،‬نتایج‪‌،‬خوشبینانه‌و‌معموالً‌بیش‌از‌حد‌خوشبینانه‌خواهد‌بود‪‌.‬پس‌این‌کار‌به‌‬
‫یرسد‪.‬‬ ‫دهی‌خوبی‌نم ‌‬ ‫نظر‌ای ‌‬
‫دادههایمان ‌را ‌به‌‬
‫دهای ‌که ‌در ‌فصلِ ‌قبل ‌از ‌آن ‌استفاده ‌کردیم‪‌ ،‬برگردیم‪‌.‬ما ‌ ‌‬ ‫حاال‌بیایید ‌به ‌ای ‌‬
‫کوچکتر‌را‌برای‌آزمون‌‬‫‌‬ ‫بزرگتر‌را‌برای‌آموزش‌و‌قسمتِ ‌‬ ‫دو‌قسمت‌تقسیم ‌کردیم‪‌.‬قسمتِ‌ ‌‬
‫یتوانیم ‌در‌‬ ‫و ‌ارزیابی ‌استفاده ‌کردیم‪‌ .‬البته ‌که ‌این ‌کار ‌هم ‌مشکالتِ ‌خودش ‌را ‌دارد‪‌ .‬م ‌‬
‫دادههایمان‌بسیار‌بدشانس‌باشیم‪‌.‬برای‌مثال‪‌،‬تمامیِ‌بازیکنانِ‌بسکتبال‪‌،‬در‌‬ ‫چگونگیِ‌تقسیمِ‌ ‌‬
‫مجمولهی‌آزمون‪‌،‬کوتاه‌قامت‌باشند‪(‌.‬مانند‌خانم‌‪‌Debbie Black‬که‌‪‌5‬فوت‌و‌‪‌3‬اینچ‌قد‌و‌‬ ‫‌‬
‫میشوند‪‌.‬و ‌یا‌‬‫طبقهبندی ‌ ‌‬‫‪‌ 214‬پوند ‌وزن ‌دارد)‌و ‌طبیعتاً ‌به ‌لنوانِ ‌وزرشکارهای ‌دو ‌ماراتن ‌ ‌‬
‫سبکوزن ‌باشند‪‌ ،‬مانند‌‬ ‫مجمولهی ‌آزمون‪‌ ،‬کوتاه ‌قامت ‌و ‌ ‌‬ ‫‌‬ ‫تمامیِ ‌ورزشکارانِ ‌دو ‌و ‌میدانی ‌در ‌‬
‫خانم ‌‪‌ Tatyana Petrova‬که ‌‪‌ 5‬فوت ‌و ‌‪‌ 3‬اینچ ‌قد ‌و ‌‪‌ 211‬پوند ‌وزن ‌دارد‪‌.‬در ‌این ‌صورت‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌261‬‬
‫دادهکاوی‌برای‌ ‌‬

‫مجمولههای‌‬
‫‌‬ ‫یشوند‪‌ .‬در ‌‬‫طبقهبندی ‌م ‌‬
‫ککار ‌ ‌‬ ‫بازهم ‌این ‌ورزشکاران ‌به ‌اشتباه ‌ژیمیناستی ‌‬
‫مجمولهی‌‬
‫‌‬ ‫آزمونی ‌مانندِ ‌این‪‌ ،‬دقت ‌(‪‌ )accuracy‬کم ‌خواهد ‌بود‪‌ .‬و ‌یا ‌شاید‪‌ ،‬در ‌انتخابِ ‌‬
‫مجمولهی ‌آزمون ‌از ‌لحاظ ‌قد‌‬
‫‌‬ ‫خوششانس ‌باشیم‪‌.‬برای ‌مثال‪‌ ،‬هر ‌شخصی ‌در ‌‬‫‌‬ ‫آزمون‪‌ ،‬خیلی ‌‬
‫و‌وزن‌کامالً‌مطابق‌و‌متناسب‌با‌ورزشِ‌مورد‌نظر‌خود‌باشد‌و‌در‌این‌صورت‌دقتِ‌ما‌نزدیک‌‬
‫خوششانسی ‌یا‌‬
‫‌‬ ‫حالتها ‌(‬
‫به ‌‪211‬درصد ‌خواهد ‌شد ‌که ‌اشتباه ‌است‪‌ .‬در ‌هر ‌کدام ‌از ‌ ‌‬
‫یتوان ‌انتظار ‌داشت‌که‌‬ ‫بدشانسی)‪‌ ،‬اگر ‌دقت ‌را ‌بر ‌مبنای‌یک ‌مجموله ‌آزمون ‌قرار ‌دهیم‪‌ ،‬نم ‌‬
‫دادههای‌واقعی‌به‌ما‌نشان‌دهد‪‌.‬‬ ‫طبقهبند‌با‌ ‌‬
‫دقتِ‌واقعی‌را‌در‌زمانِ‌اجرایِ‌ ‌‬
‫یتواند ‌این ‌باشد ‌که ‌این ‌فرآیند ‌را ‌چندین ‌بار ‌تکرار ‌کنیم ‌و‌‬
‫راه ‌حل ‌برای ‌این ‌مشکل‪‌ ،‬م ‌‬
‫میانگینِ ‌دقت ‌را ‌برای ‌تمامیِ ‌نتایج ‌محاسبه ‌کرده ‌و ‌معیار ‌لمل ‌قرار ‌دهیم‪‌ .‬برای ‌مثال‪‌،‬‬
‫دادهها ‌را ‌به ‌صورت ‌مساوی ‌(نصف)‌تقسیم ‌کنیم‪‌.‬اجازه ‌دهید ‌این ‌دو ‌قسمت ‌را‪‌،‬‬ ‫یتوانیم ‌ ‌‬
‫م‌‬
‫قسمتِ‌‪‌)Part 1(‌2‬و‌قسمتِ‌‪‌)Part 2(‌1‬در‌نظر‌بگیریم‪‌ .‬‬
‫‌‬

‫‌‬

‫طبقهبند ‌مورد ‌استفاده ‌قرار ‌دهیم ‌و‌‬


‫دادههای ‌موجود ‌در ‌قسمتِ ‌‪‌ 2‬را ‌برای ‌آموزشِ ‌ ‌‬
‫یتوانیم ‌ ‌‬ ‫م‌‬
‫دادههای‌موجود‌در‌قسمتِ‌‪‌1‬را‌برای‌آزمون‌و‌ارزیابی‌استفاده‌کنیم‪‌.‬و‌دوباره‌فرآیند‌را‌تکرار‌‬ ‫‌‬
‫طبقهبند ‌را‌‬
‫نبار ‌با ‌قسمتِ ‌‪‌ ،1‬لملیات ‌آموزش ‌را ‌انجام ‌داده ‌و ‌با ‌قسمتِ ‌‪‌ ‌ 2‬‬‫کنیم‪‌ ،‬ولی ‌ای ‌‬
‫بیازماییم‪‌.‬در ‌آخر‪‌ ،‬میانگینِ ‌دقت ‌را ‌محاسبه ‌کرده ‌و ‌به ‌لنوانِ ‌دقتِ ‌نهایی ‌برگردانیم‪‌.‬یک‌‬
‫طبقهبند ‌در ‌هر ‌دور‌‬ ‫مشکل ‌با ‌این ‌طرز ‌تفکر‪‌ ،‬این ‌است ‌که ‌فقط ‌از‌ ‪‌ ‌ ⁄‬‬
‫دادهها ‌برای ‌آموزشِ ‌ ‌‬
‫راهحلِ ‌آن ‌این ‌است ‌که ‌تعداد‌‬‫کردهایم‪‌.‬خوشبختانه ‌این ‌موضوع ‌قابل ‌حل ‌است ‌و ‌ ‌‬
‫استفاده ‌ ‌‬
‫یتوانیم ‌سه ‌قسمت ‌داشته ‌باشیم ‌و ‌در ‌هر ‌دور‪‌ ،‬دو‌‬‫قسمتها ‌را ‌افزایش ‌دهیم‪‌.‬برای ‌مثال‪‌ ،‬م ‌‬
‫‌‬
‫در‌مورد‌طبقهبندی‌■ ‪262‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫دادهها ‌را ‌برای ‌آموزش ‌و ‌یک ‌سوم ‌( ‪‌) ⁄‬را ‌برای ‌آزمون ‌استفاده ‌می‌کنیم‪‌.‬‬
‫سوم ‌( ‪‌) ⁄‬از ‌ ‌‬
‫یشود‪:‬‬‫چیزی‌شبیه‌به‌جدول‌زیر‌م ‌‬
‫‌‬

‫‌‬

‫قسمتها‌را‌به‌صورتِ‌‪‌21‬تایی‌تقسیم‌کنیم‌و‌‬
‫‌‬ ‫معمولترین‌روش‌این‌است‌که‌‬
‫‌‬ ‫دادهکاوی‪‌،‬‬
‫در‌ ‌‬
‫تکهای‌(‪‌)10-Fold Cross Validation‬معروف‌‬
‫این‌روش‌به‌روشِ‌التبار‌سنجیِ‌متقابلِ‌‪‌ -21‬‬
‫است‪.‬‬

‫تکهای‌(‪)10-Fold Cross Validation‬‬


‫التبار‌سنجیِ‌متقابلِ‌‪‌ -21‬‬
‫مجمولهی ‌داده ‌داریم ‌که ‌آن ‌را ‌به ‌صورت ‌تصادفی ‌به ‌‪‌21‬‬
‫‌‬ ‫با ‌استفاده ‌از ‌این ‌روش‪‌ ،‬یک ‌‬
‫یکنیم‪‌ .‬از ‌‪‌ 6‬قسمتِ ‌آن ‌برای ‌آموزش‪‌ ،‬و ‌از ‌‪‌ 2‬قسمتِ ‌آن ‌برای ‌آزمون‌‬ ‫قسمت ‌تقسیم ‌م ‌‬
‫قسمتهای ‌مختلف ‌را ‌(یک‌‬‫‌‬ ‫یکنیم‪‌ .‬این ‌فرآیند ‌را ‌‪‌ 21‬بار ‌تکرار ‌کرده ‌و ‌هر ‌بار ‌‬
‫استفاده ‌م ‌‬
‫قسمت‌از‌‪‌21‬قسمت‌را)‌برای‌آزمون‌انتخاب‌می‌کنیم‪.‬‬
‫طبقهبند ‌درست ‌کنم ‌که ‌فقط‌‬
‫یخواهم ‌یک ‌ ‌‬ ‫بیایید ‌به ‌یک ‌مثال ‌بپردازیم‪‌.‬فرض ‌کنید ‌من ‌م ‌‬
‫جوابهای ‌بلی ‌(‪‌)yes‬یا ‌خیر ‌(‪‌)no‬را ‌به ‌سوالِ ‌«آیا ‌این ‌شخص ‌یک ‌بازیکنِ ‌ ‌‬
‫حرفهایِ‌‬ ‫بتواند ‌ ‌‬
‫دادههای ‌من ‌بر ‌اساسِ ‌‪‌ 511‬بازیکنِ ‌بسکتبال ‌و ‌‪‌ 511‬بازیکنِ ‌غیر‌‬‫بسکتبال ‌هست؟» ‌بدهد‪‌ ‌.‬‬
‫بسکتبال‌هستند‪.‬‬
‫‌‬

‫تکهای‌(‪)10-Fold Cross Validation‬‬


‫مثالِ‌‌التبار‌سنجیِ‌متقابلِ‌‪‌ -21‬‬
‫یکنیم‪:‬‬
‫دادهها‌را‌به‌‪‌21‬قسمتِ‌مساوی‌تقسیم‌م ‌‬
‫قدمِ‌‪‌ ‌:2‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌261‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یعنی ‌در‌هر‌سطل ‌(قسمت)‌‪‌51‬بازیکنِ‌بسکتبال‌و‌‪‌51‬بازیکنِ‌غیر‌بسکتبال ‌قرار‌می‌دهیم‪.‬‬


‫سطلها‪‌ ،‬حاوی ‌اطاللاتِ ‌‪‌ 211‬شخص ‌هستند‪(‌ .‬به‌هر‌قسمت‌اصطالحاً‌‬ ‫در ‌واقع ‌هر ‌کدام ‌از ‌ ‌‬
‫یک‌سطل‌–‌‪‌bucket‬می‌گوییم) ‌‬

‫یکنیم‪:‬‬‫قدمهای‌زیر‌را‌‪‌21‬بار‌تکرار‌م ‌‬ ‫قدمِ‌‪‌ ‌:1‬‬


‫شمارهی‌‪‌2‬را‌‬
‫‌‬ ‫یگذاریم‪‌.‬مثالً‌برای ‌دورِ‌اول‪‌ ،‬سطلِ‌‬ ‫سطلها‌را ‌کنار‌م ‌‬
‫‪‌2-1‬در‌هر‌دور‪‌،‬یکی‌از‌ ‌‬
‫شمارهی‌‪‌1‬و‌به‌همین‌ترتیب‌تا‌آخر‪.‬‬‫‌‬ ‫کنار‌می‌گذاریم‪‌،‬دورِ‌دوم‌سطلِ‌‬
‫طبقهبند‌‬
‫نشدهاند)‪‌ ‌ ،‬‬
‫لها ‌(که ‌کنار ‌گذاشته ‌ ‌‬ ‫دادههای ‌موجود ‌در ‌بقیه‌ی ‌سط ‌‬‫‪‌ 1-1‬با ‌استفاده ‌از ‌ ‌‬
‫سطلهای‌‪‌1‬‬
‫دادههای‌موجود‌در‌ ‌‬ ‫طبقهبند‌را‌بر‌اساسِ‌ ‌‬ ‫یدهیم‌(مثالً‌در‌دورِ‌اول‪‌ ‌،‬‬ ‫را‌آموزش‌م ‌‬
‫تا‌‪‌21‬آموزش‌می‌دهیم)‬
‫گذاشتهایم ‌مورد‌‬
‫‌‬ ‫دادههای ‌آن ‌سطلی ‌که ‌کنار ‌‬‫ساختهایم ‌را ‌با ‌ ‌‬
‫‌‬ ‫طبقهبندی ‌که ‌‬
‫‪‌ 3-1‬حاال ‌ ‌‬
‫آزمایش ‌قرار ‌داده ‌و ‌نتایج ‌را ‌برای ‌آن ‌دور ‌ذخیره ‌می‌کنیم‪‌.‬برای ‌مثال ‌نتایج ‌برای ‌یک ‌دور‪‌،‬‬
‫یتواند‌به‌شکل‌زیر‌باشد‪:‬‬ ‫م‌‬
‫شدهاند‬
‫طبقهبندی‌ ‌‬
‫‪‌35‬نفر‌از‌بازیکنانِ‌بسکتبال‪‌،‬به‌درستی‌ ‌‬
‫شدهاند‬
‫طبقهبندی‌ ‌‬‫‪‌16‬نفر‌از‌بازیکنان‌غیر‌بسکتبال‌نیز‌به‌درستی‌ ‌‬
‫‌‬
‫یکنیم‬ ‫قدمِ‌‪‌:3‬نتایجِ‌حاصل‌از‌قدمِ‌دو‌را‌تجمیع‌م ‌‬
‫یدهیم‪:‬‬‫معموالً‌نتایجِ‌نهایی‌را‌در‌جدولی‌مانندِ‌جدولِ‌زیر‌قرار‌م ‌‬
‫‌‬
‫در‌مورد‌طبقهبندی‌■ ‪263‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫‌‬

‫آنها ‌به ‌صورتِ‌‬‫یکنید ‌در‌مثالِ‌جدول‌باال‪‌،‬از ‌‪‌ 511‬بازیکنِ ‌بسکتبال‪‌ 371‌ ،‬نفر ‌از ‌ ‌‬ ‫مشاهده ‌م ‌‬
‫اینها‌را ‌با ‌هم‌‬
‫یتوانیم ‌انجام ‌دهیم ‌این ‌است ‌که ‌ ‌‬ ‫شدهاند‪‌.‬یک ‌کاری ‌که ‌م ‌‬
‫طبقهبندی ‌ ‌‬ ‫صحیح ‌ ‌‬
‫جمع‌کرده‌و‌بگوییم‌از‌‪‌2111‬نفری‌که‌مورد‌ارزیابی‌قرار ‌دادیم‪‌)111‌+‌371(‌951‌،‬نفر‌از‌‬
‫در‌اینجا‌دقت ‌‪‌%95.1‬است‪‌.‬معیاری ‌که ‌ما ‌از‌‬ ‫‌‬ ‫کردهایم‪‌.‬پس ‌‬
‫طبقهبندی ‌ ‌‬
‫آنها ‌را ‌به ‌درستی ‌ ‌‬ ‫‌‬
‫تکهای ‌(‪‌)10-Fold Cross Validation‬به ‌دست ‌آوریم‪‌ ،‬نسبت ‌به‌‬ ‫التبارسنجیِ ‌متقابلِ ‌‪‌ -21‬‬
‫یافتد ‌که‌‬ ‫تکهای‪‌ ،‬ارزش‌بیشتری ‌دارد‪‌.‬این ‌ارزش‪‌ ،‬به ‌این ‌دلیل ‌اتفاق ‌م ‌‬
‫التبار ‌سنجیِ ‌‪‌ 1‬یا ‌‪‌ ‌ 3‬‬
‫یکه‌برای‌مثال‌‬ ‫دادهها‌استفاده‌می‌کنیم‌(در‌حال ‌‬ ‫طبقهبند‪‌،‬ما‌از‌‪‌61‬درصدِ ‌ ‌‬
‫در‌هر‌بار‌آموزشِ‌ ‌‬
‫دادهها ‌استفاده‌‬
‫تکهای‪‌ ،‬در ‌هر ‌بار ‌آموزش‪‌ ،‬از ‌‪‌ 51‬درصدِ ‌ ‌‬ ‫در ‌التبار ‌سنجیِ ‌متقابلِ ‌‪‌ ‌ 1‬‬
‫یکردیم)‪‌ .‬‬‫م‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌264‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫طبق‌گفته‌ی‌این‌خانم‌در‌شکل‌باال‪‌،‬برای‌مثال‪‌،‬اگر‌ما‌‪‌2111‬نمونه‌(مثالً‌‪‌2111‬ورزشکار)‌‬
‫یمانده ‌آزمایش‌‬‫طبقهبندمان ‌را ‌بر ‌اساسِ ‌‪‌ 666‬نفر ‌آموزش ‌داده ‌و ‌بر ‌اساس ‌‪‌ 2‬نفرِ ‌باق ‌‬
‫داریم‪‌ ‌ ،‬‬
‫یکنیم‌و‌این‌کار‌را‌در‌‪‌2111‬دور‌(‪‌2111‬مرتبه)‌تکرار‌خواهیم‌کرد‪‌.‬در‌واقع‌با‌استفاده‌از‌‬ ‫م‌‬
‫یتواند‌بسیار‌بیشتر‌شود‪.‬‬ ‫طبقهبند‪‌،‬دقت‌آن‌م ‌‬‫نمونههای‌موجود‌برای‌آموزشِ‌ ‌‬ ‫حداکثر‌تعداد‌ ‌‬
‫‌‬

‫روش‌کنار‌گذاشتنِ‌یکی‌(‪)Leave-One-Out‬‬
‫یماشین‪‌ ،‬التبار ‌سنجیِ ‌متقابل ‌‪-n‬تایی ‌(‪‌ )n-fold cross validation‬که‌‬ ‫در ‌ادبیاتِ ‌یادگیر ‌‬
‫دادهی ‌ماست‪‌ ،‬روشِ‌«کنار‌گذاشتنِ‌یکی‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬ ‫در ‌آن ‌‪‌ ،n‬تعداد ‌ ‌‬
‫نمونههای ‌موجود ‌در ‌‬
‫یهای ‌این ‌روش ‌را‌‬ ‫یشود‪‌ .‬در ‌حال ‌حاضر ‌یکی ‌از ‌ویژگ ‌‬ ‫(‪‌ »)leave-one-out‬نیز ‌نامیده ‌م ‌‬
‫طبقهبند ‌را ‌استفاده‌‬
‫نکه ‌در ‌هر ‌دور‪‌ ،‬حداکثر ‌مقادیرِ ‌موجود ‌برای ‌آموزشِ ‌ ‌‬ ‫گفتهایم ‌– ‌ای ‌‬
‫‌‬
‫یهای ‌مثبتِ ‌دیگر‪‌ ،‬این ‌است ‌که ‌این ‌روش ‌یک ‌روشِ ‌قطعی‌‬ ‫یکنیم‪‌ .‬یکی ‌از ‌ویژگ ‌‬ ‫م‌‬
‫(‪‌)deterministic‬است‪.‬‬
‫منظورمان‌از‌قطعی‌(‪‌)deterministic‬چیست؟‬
‫در‌مورد‌طبقهبندی‌■ ‪265‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫فرض ‌کنید ‌‪‌ 80‌ ،Lucy‬سالتِ ‌فشرده ‌را ‌در ‌هفته ‌به ‌ساخت ‌و ‌کدنویسیِ ‌یک ‌الگوریتمِ‌‬
‫طبقهبندی ‌پرداخته ‌باشد‪‌.‬االن ‌جمعه ‌است ‌و ‌‪‌ Lucy‬دیگر ‌خسته ‌ ‌‬
‫شدهاست‪‌.‬او ‌از ‌دو ‌دوستِ‌‬ ‫‌‬
‫دیگر‌خود‌(‪‌Emily‬و‌‪‌)Li‬درخواست‌می‌کند‌تا‌الگوریتمِ‌او‌را‌مورد‌ارزیابی‌قرار‌دهند‪‌.‬او‌به‌آن‌‬
‫آنها‌‬
‫یدهد ‌و ‌از ‌ ‌‬‫مجمولهی ‌داده‌ی ‌یکسان ‌م ‌‬
‫‌‬ ‫شدهی ‌خود ‌را ‌همراه ‌‬‫دو‪‌ ،‬الگوریتمِ ‌ساخته ‌ ‌‬
‫تکهای ‌ارزیابی ‌کنند‪‌.‬‬
‫یخواهد ‌این ‌این ‌الگوریتم ‌را ‌با ‌استفاده ‌از ‌التبارسنجیِ ‌متقابلِ ‌‪‌ -21‬‬‫م‌‬
‫یخواهد‌تا‌نتایج‌را‌به‌او‌بدهند‪:‬‬ ‫دوشنبه‪‌Lucy‌،‬از‌ ‌‬
‫آنها‌م ‌‬
‫‌‬

‫‌‬

‫نگرفتهاند‪‌ .‬آیا ‌یکی ‌از ‌آن ‌دو ‌اشتباهی ‌مرتکب‌‬


‫‌‬ ‫آنها ‌نتایجِ ‌یکسانی ‌‬
‫میرسد ‌ ‌‬‫خب! ‌به ‌نظر ‌ ‌‬
‫دادهها‌را‌به‌صورت‌تصادفی‌‬ ‫تکهای‪‌،‬ما‌ ‌‬ ‫شدهاست؟‌نه‌الزماً‪‌.‬در‌روشِ‌التبارسنجیِ‌متقابلِ‌‪‌ -21‬‬ ‫‌‬
‫سطلهای‌مختلف ‌قرار‌می‌دهیم‪‌.‬به‌خاطرِ‌وجودِ‌این ‌لنصرِ ‌تصادفی‪‌،‬احتماالً ‌‪‌Emily‬و ‌‪‌Li‬‬ ‫در‌ ‌‬
‫نکردهاند‪‌.‬در‌واقع‪‌،‬خیلی‌احتمال ‌کمی‌دارد‌که‌‬ ‫قسمتهای ‌شبیه‌به‌هم‌تقسیم‌ ‌‬ ‫‌‬ ‫دادهها‌را‌به‌‬
‫‌‬
‫دادههای‌‬
‫دادهها ‌را ‌انجام ‌داده ‌باشند ‌و ‌دقیقاً ‌ ‌‬
‫مکردنِ ‌ ‌‬‫آنها ‌دقیقاً ‌مانندِ ‌یکدیگر ‌لملیاتِ ‌تقسی ‌‬
‫‌‬
‫قسمتها ‌یا ‌همان ‌سطل‌های ‌مشابه‪‌ ،‬قرار ‌داده ‌باشند‪‌ .‬پس ‌در ‌هنگامِ ‌آموزشِ‌‬ ‫‌‬ ‫مشابه ‌را ‌در ‌‬
‫نکار ‌نیز ‌در ‌هنگامِ‌‬
‫کردهاند‪‌ .‬همی ‌‬
‫دادههای ‌مختلفی ‌استفاده ‌ ‌‬ ‫آنها ‌از ‌ ‌‬ ‫طبقهبندی‪‌ ‌ ،‬‬
‫الگوریتمِ ‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌269‬‬
‫دادهکاوی‌برای‌ ‌‬

‫ساختهشده‌‬
‫‌‬ ‫دادههای‌مختلفی‪‌،‬الگوریتمِ‌‬‫آنها‌با‌ ‌‬ ‫طبقهبندی‌رخ‌داده‌است‌و‌ ‌‬ ‫آزمودنِ‌الگوریتمِ‌ ‌‬
‫کردهاند‪‌ .‬پس ‌بسیار ‌منطقی ‌است ‌که ‌نتایجِ ‌مختلفی ‌گرفته ‌باشند ‌و ‌این ‌نتیجه‌‬ ‫را ‌ارزیابی ‌ ‌‬
‫دادهاند‪‌.‬اگر ‌خودِ ‌‪‌ Lucy‬هم ‌یک‌‬
‫ربطی ‌به ‌این ‌ندارد ‌که ‌دو ‌نفرِ ‌جدا‪‌ ،‬لملیاتِ ‌ارزیابی ‌را ‌انجام ‌ ‌‬
‫تکهای ‌را ‌انجام ‌می‌داد‪‌ ،‬دو ‌نتیجه‌ی ‌مشابه ‌را ‌هم‌‬
‫بار‌دیگر‌لملیات ‌التبارسنجیِ ‌متقابلِ ‌‪‌ -21‬‬
‫دریافت ‌می‌کرد‪‌.‬دلیلِ ‌این ‌اختالف ‌این ‌است ‌که ‌یک ‌قسمت ‌از ‌آن ‌به ‌صورت ‌تصادفی ‌انجام‌‬
‫تکهای ‌یک ‌روشِ ‌غیرِ ‌قطعی ‌(‪non-‬‬
‫یشود‪‌.‬برای ‌همین ‌است ‌که ‌التبارسنجیِ ‌متقابلِ ‌‪‌ -21‬‬ ‫م‌‬
‫یشود‪‌،‬یعنی‌اگر‌دو‌بار‌آزمون‌را‌انجام‌دهیم‪‌،‬هیچ‌تضمینی‌وجود‌‬ ‫‪‌)deterministic‬نامیده‌م ‌‬
‫ندارد ‌که ‌نتایجِ ‌یکسانی ‌را ‌دریافت ‌کنیم‪‌.‬برلکس‪‌ ،‬روشِ ‌«کنار‌گذاشتنِ‌یکی‌(‪leave-one-‬‬
‫‪‌ »)out‬یک ‌روشِ ‌قطعی ‌است‪‌.‬هر ‌باری ‌که ‌ما ‌این ‌روش ‌را ‌بر ‌روی ‌یک ‌الگوریتمِ ‌ ‌‬
‫طبقهبندیِ‌‬
‫جهی ‌یکسانی ‌خواهیم ‌گرفت‪‌ .‬که ‌این‌‬ ‫مجمولهی ‌داده‌ی ‌یکسان ‌اجرا ‌کنیم‪‌ ،‬نتی ‌‬ ‫‌‬ ‫خاص ‌با ‌‬
‫برایمان‌خوب‌است! ‌‬

‫معایب‌روشِ‌کنار‌گذاشتنِ‌یکی‌(‪)Leave-One-Out‬‬
‫نهی ‌محاسباتی ‌آن ‌است‪‌.‬‬ ‫لیب ‌اصلی ‌در ‌روشِ ‌کنار‌گذاشتنِ‌یکی‌(‪‌ ،)leave-one-out‬هزی ‌‬
‫ولهی ‌داده ‌با ‌‪‌ 2111‬نمونه ‌داشته ‌باشیم ‌و ‌برای ‌آموزشِ ‌الگوریتمِ‌‬
‫فرض ‌کنید ‌یک ‌مجم ‌‬
‫دادهها‪‌ ،‬به ‌یک ‌دقیقه ‌زمان ‌احتیاج ‌باشد‪‌.‬برای ‌التبارسنجیِ ‌متقابلِ ‌‪‌21‬‬
‫طبقهبندی ‌با ‌این ‌ ‌‬
‫‌‬
‫تکهای‪‌ ،‬طبیعتاً ‌به ‌ده ‌دقیقه ‌زمان ‌برای ‌آموزش ‌احتیاج ‌داریم‪‌.‬ولی ‌در ‌روشِ ‌‪leave-one-‬‬
‫‌‬
‫دادهی ‌ما ‌شامل ‌یک ‌میلیون ‌نمونه‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫‪‌ ،out‬این ‌زمان ‌به ‌‪‌ 29‬سالت ‌م ‌‬
‫یرسد‪‌.‬اگر ‌‬
‫باشد‪‌،‬مجموعِ‌زمانِ‌یادگیری‌در‌روشِ‌‪‌leave-one-out‬تقریباً‌‪‌1‬سال‌م ‌‬
‫یشود!‬
‫‌‬

‫‌‬
‫در‌مورد‌طبقهبندی‌■ ‪267‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫مشکلِ‌دیگر‌این‌روش‪‌،‬مربوط‌به‌الی‌هبندی‌(‪‌)stratification‬م ‌‬
‫یشود‪.‬‬
‫‌‬

‫الی‌هبندی‌(‪)Stratification‬‬
‫شبینی ‌کند ‌یک‌‬ ‫بیایید ‌به ‌مثالِ ‌فصل ‌قبل ‌برگردیم ‌– ‌ساخت ‌یک ‌ ‌‬
‫طبقهبند ‌که ‌بتواند ‌پی ‌‬
‫یدهد ‌(بسکتبال‪‌ ،‬ژیمیناستیک ‌یا ‌دو ‌و ‌میدانی)‪‌.‬در ‌هنگام‌‬ ‫ورزشکار‪‌ ،‬چه ‌ورزشی ‌را ‌انجام ‌م ‌‬
‫دادهها‌بوده‌و‌از‌هر‌‬
‫نمایندهای‌از‌ ‌‬
‫‌‬ ‫دادههای‌آموزشی‌‬
‫یخواهیم‌ ‌‬ ‫طبقهبندی‪‌،‬م ‌‬‫آموزشِ‌الگوریتمِ‌ ‌‬
‫دادهها ‌موجود‌‬
‫طبقهی ‌موجود ‌(بسکتبال‪‌ ،‬ژیمیناستیک ‌و ‌دو ‌و ‌میدانی)‌در ‌این ‌ ‌‬ ‫یک ‌از ‌سه ‌ ‌‬
‫مجمولهی ‌آموزشی ‌به ‌صورت ‌کامالً ‌تصادفی ‌اختصاص‌‬‫‌‬ ‫دادهها ‌را ‌به ‌‬
‫باشند‪‌.‬فرض ‌کنید ‌ما ‌ ‌‬
‫مجمولهی‌تصادفیِ‌آموزشی‪‌،‬‬
‫‌‬ ‫دهیم‪‌.‬این‌امکان‌وجود‌دارد‌که‌هیچ‌بازیکن‌بسکتبالی‌در‌این ‌‬
‫ساختهشده‪‌ ،‬برای ‌تشخیص ‌بازیکنان ‌بسکتبال‪‌،‬‬ ‫‌‬ ‫موجود ‌نباشد ‌و ‌به ‌همین ‌خاطر ‌الگوریتمِ ‌‬
‫مجمولهی ‌داده ‌از ‌‪‌ 211‬ورزشکار ‌داشته‌‬
‫‌‬ ‫خیلی ‌خوب ‌لمل ‌نکند‪‌ .‬یا ‌مثالً ‌فرض ‌کنید ‌یک ‌‬
‫وبسایتِ ‌مسابقات ‌‪(‌ WNBA‬بسکتبال ‌‪‌ NBA‬زنان) ‌م ‌‬
‫یرویم ‌و ‌اطاللاتِ ‌‪‌33‬‬ ‫باشیم‪‌ .‬اول ‌به ‌ ‌‬
‫وبسایت ‌ویکی‌پدیا ‌رفته ‌و ‌تعداد ‌‪‌ 33‬ورزشکار‌‬ ‫ورزشکار ‌را ‌استخراج ‌می‌کنیم‪‌ .‬سپس ‌به ‌ ‌‬
‫یکنیم‪‌.‬در ‌آخر‌‬‫کردهاند ‌را ‌یادداشت ‌م ‌‬
‫ژیمیناستیک ‌که ‌در ‌مسابقات ‌المپیک ‌‪‌ 1121‬شرکت ‌ ‌‬
‫سر‌میزنیم‌و‌تعداد‌‪‌34‬نفر‌از‌ورزشکارانِ‌زنِ‌دو‌و‌میدانی‌که‌‬‫‌‬ ‫وبسایت‌ویکی‌پدیا‌‬
‫دوباره‌به‌ ‌‬
‫دادهی‌‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫کردهاند‌را‌استخراج‌می‌کنیم‪‌.‬پس‌در‌واقع‌‬ ‫کهای‌مختلف‌شرکت‌ ‌‬ ‫در‌المپی ‌‬
‫ما‌چیزی‌شبیه‌به‌شکل‌زیر‌می‌شود‪:‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌261‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫تکهای ‌(‪‌ )10-Fold Cross Validation‬استفاده‌‬ ‫بیایید ‌از ‌روشِ ‌التبارسنجیِ ‌متقابلِ ‌‪‌ -21‬‬
‫یدهیم‪‌.‬‬‫کنیم‪‌.‬از ‌اولِ ‌لیست ‌شروع ‌کرده ‌و ‌هر ‌‪‌ 21‬نفر ‌را ‌در ‌یک ‌قسمت ‌(سطل)‌مجزا ‌قرار ‌م ‌‬
‫سطلهای ‌یک ‌و ‌دو ‌داریم‪‌.‬سطلِ ‌سوم ‌شامل‌‬
‫در ‌موردِ ‌مثالِ ‌باال‪‌ ،‬ما ‌‪‌ 21‬بازیکنِ ‌بسکتبال ‌در ‌ ‌‬
‫سطلهای ‌چهارم ‌و ‌پنجم ‌تنها ‌به ‌بازیکنان‌‬
‫یشود‪‌ ‌ .‬‬ ‫بازیکنانِ ‌بسکتبال ‌و ‌ژیمیناستیک ‌م ‌‬
‫یگیرند ‌و ‌به ‌همین ‌ترتیب ‌تا ‌سطلِ ‌دهم‪‌.‬احتماالً‌متوجه‌شده‌اید‌که‌‬ ‫ژیمیناستیک ‌تعلق ‌م ‌‬
‫دادهی ‌نیستند‪‌ .‬این ‌بالث ‌چولگی ‌در ‌نتایج‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫نمایندهی‌‬
‫‌‬ ‫سطلهای ‌ما‪‌ ،‬‬
‫هیچ ‌کدام ‌از ‌ ‌‬
‫سطلها ‌این ‌است ‌که ‌اطمینان‌‬
‫دادهها ‌به ‌ ‌‬
‫خواهد ‌شد‪‌.‬روش ‌خوب ‌و ‌مناسب ‌برای ‌اختصاصِ ‌ ‌‬
‫طبقهها ‌(بسکتبال‪‌ ،‬ژیمیناستیک ‌و ‌دو ‌و ‌میدانی) ‌به ‌صورت ‌متناسب‪‌ ،‬با‌‬ ‫حاصل ‌کنیم ‌که ‌ ‌‬
‫سطلها ‌نیز ‌وجود‌‬
‫نسبتی ‌که ‌در ‌مجموله‌ی ‌داده‌ی ‌اصلی ‌موجود ‌هستند‪‌ ،‬در ‌هر ‌کدام ‌از ‌ ‌‬
‫در‌مورد‌طبقهبندی‌■ ‪266‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫مجمولهی ‌اصلی‪‌ ،‬بازیکنان ‌بسکتبال‌‬


‫‌‬ ‫دادههای ‌‬
‫داشته ‌باشند‪‌.‬پس ‌چون ‌در ‌مثالِ ‌ما ‌یک ‌سومِ ‌ ‌‬
‫سطلها)‌نیز ‌بایستی ‌یک ‌سوم‪‌ ،‬بازیکنِ ‌بسکتبال ‌داشته‌‬
‫هستند‪‌ ،‬در ‌هر ‌کدام ‌از ‌قسمت‌ها ‌( ‌‬
‫سطلها‪‌ ،‬یک ‌سومِ ‌دیگر ‌بایستی ‌ژیمیناستیک‌کار ‌و‌‬
‫باشیم‪‌.‬به ‌همین ‌نسبت ‌در ‌هر ‌کدام ‌از ‌ ‌‬
‫یک ‌سوم‪‌ ،‬ورزشکارانِ ‌دو ‌و ‌میدانی ‌باشند‪‌ .‬به ‌این ‌کار ‌در ‌اصطالح‪‌ ،‬الی‌هبندی‌‬
‫یشود ‌و ‌کار ‌خوبی ‌هم ‌هست‪‌.‬ولی ‌مشکلِ ‌روشِ ‌‪‌leave-one-out‬‬ ‫(‪‌ )stratification‬گفته ‌م ‌‬
‫مجمولههای ‌آزمون‪‌ ،‬الی‌هبندی ‌شده ‌نیستند ‌و ‌در ‌واقع ‌‪non-‬‬
‫‌‬ ‫این ‌است ‌که ‌هیچ ‌کدام ‌از ‌‬
‫دادهی‌آزمون‌در‌نظر‌گرفته‌‬‫‪‌stratified‬هستند‪‌،‬چون‌فقط‌یک‌نمونه‌در‌هر‌دور‌تکرار‪‌،‬برای‌ ‌‬
‫دادههای ‌کوچک‪‌،‬‬‫یشود‪‌ .‬در ‌مجموع‪‌ ،‬با ‌این‌که ‌روشِ ‌‪‌ leave-one-out‬برای ‌مجموله ‌ ‌‬ ‫م‌‬
‫تکهای‌(‪‌)10-fold cross validation‬به‌‬ ‫یتواند‌مفید‌باشد‪‌ ،‬روشِ‌التبارسنجیِ‌متقابلِ‌‪‌ -21‬‬ ‫م‌‬
‫روشهای ‌گفته ‌شده ‌در ‌دنیای ‌داده‌کاوی ‌و‌‬
‫معروفترین ‌روش ‌در ‌میان ‌ ‌‬‫‌‬ ‫دالیلِ ‌ذکر ‌شده‪‌ ،‬‬
‫یماشین‌است‪.‬‬ ‫یادگیر ‌‬

‫ماتریس‌اغتشاش‌(‪)Confusion Matrices‬‬
‫طبقهبندیِ ‌خودمان‌‬
‫نجای ‌کار‪‌ ،‬ما ‌الگوریتمِ ‌ ‌‬ ‫تا ‌به ‌ای ‌‬
‫را ‌بر ‌اساس ‌معیارِ ‌دقت ‌(‪‌ )accuracy‬ارزیابی‌‬
‫یکردیم‪‌.‬این‌معیار‌به‌صورت‌زیر‌محاسبه‌می‌شود‪:‬‬ ‫م‌‬
‫طبقهبندی ‌شده ‌است‌‬
‫تعداد ‌مواردی ‌که ‌به ‌درستی ‌ ‌‬
‫مجمولهی‌آزمون) ‌‬
‫‌‬ ‫(در‌‬
‫تقسیم‌بر ‌‬
‫مجمولهی ‌آزمون ‌قرار‌‬
‫‌‬ ‫تعدادِ ‌کلِ ‌مواردی ‌که ‌در ‌‬
‫داشته‌است‬

‫طبقهبندی ‌به‌‬
‫تمهای ‌ ‌‬ ‫قتری ‌از ‌کیفیتِ ‌الگوری ‌‬‫اما ‌گاهی ‌اوقات‪‌ ،‬ما ‌نیاز ‌داریم ‌تا ‌اطاللاتِ ‌دقی ‌‬
‫دست ‌آوریم‪‌.‬یکی ‌از ‌مفاهیمی ‌که ‌به ‌صورت ‌دقیق ‌و ‌با ‌جزئیات ‌این ‌کار ‌را ‌انجام ‌می‌دهد‪‌،‬‬
‫ماتریس ‌اغتشاش ‌(‪‌ )confusion matrix‬است‪‌.‬در ‌این ‌ماتریس‪‌ ،‬سطرها ‌بیان‌گرِ ‌ ‌‬
‫طبقههای‌‬
‫شبینی ‌کرده ‌است‪‌ ،‬اشاره‌‬ ‫طبقهبندی ‌پی ‌‬
‫طبقهای ‌که ‌الگوریتمِ ‌ ‌‬
‫ستونها ‌به ‌ ‌‬‫واقعی ‌هستند‪‌ ،‬و ‌ ‌‬
‫یکنند‪.‬‬
‫م‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌111‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یآید‌که‌با‌دیدن‌این‌ماتریس‪‌،‬‬ ‫آنجایی‌م ‌‬‫اسمِ‌«ماتریسِ‌اغتشاش‌(‪‌»)confusion matrix‬از‌ ‌‬


‫یفهیم ‌که ‌الگوریتممان ‌در ‌کجاها ‌«گیج ‌(‪‌ »)confused‬شده است‪‌.‬اجازه ‌بدهید ‌به ‌مثالِ‌‬ ‫م‌‬
‫دادهای ‌داریم ‌که‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫خودمان‪‌ ،‬درباره ‌زنانِ ‌ورزشکار ‌برگردیم‪‌ .‬فرض ‌کنید ‌ما ‌‬
‫رشتههای ‌مختلف ‌را ‌در ‌خود ‌جای ‌داده ‌است‪‌ 211‌ .‬زن‌‬ ‫یهای ‌زنانِ ‌ورزشکار ‌در ‌ ‌‬ ‫ویژگ ‌‬
‫ژیمیناستیک‌کار‪‌ 211‌ ،‬زن ‌که ‌در ‌مسابقات ‌بسکتبال ‌‪‌ WNBA‬بازی ‌می‌کنند ‌و ‌‪‌ 211‬زن ‌که‌‬
‫طبقهبندی ‌را ‌با ‌روشِ ‌التبارسنجیِ‌‬
‫کردهاند‪‌.‬الگوریتمِ ‌ ‌‬
‫در ‌دو ‌و‌میدانی‌(دوی ‌ماراتُن)‌شرکت ‌ ‌‬
‫یکنیم‪‌.‬در‌این‌روش‪‌،‬هر‌کدام‌از‌‬ ‫تکهای‌(‪‌)10-fold cross validation‬ارزیابی‌م ‌‬ ‫متقابلِ‌‪‌ -21‬‬
‫نمونهها‪‌،‬یعنی‌هر‌کدام‌از‌زنانِ‌ورزشکار‌را‌دقیقاً‌یک‌بار‌برای‌آزمون‌استفاده‌می‌کنیم‪‌.‬نتایجِ‌‬
‫‌‬
‫(ژیمیناستیککار‌=‌‪‌،gymnast‬‬
‫‌‬ ‫شدهاست ‌‬
‫این ‌آزمون‪‌ ،‬در ‌ماتریسِ ‌اغتشاشِ ‌زیر ‌نمایش ‌داده ‌ ‌‬
‫بازیکن ‌بسکتبال ‌= ‌‪‌ basketball player‬و ‌ورزشکار ‌دو ‌و ‌میدانی ‌(دوی ‌ماراتن) ‌=‌‬
‫‪:)marathoner‬‬

‫طبقههای ‌واقعی ‌بوده ‌و‌‬


‫انگرِ ‌ ‌‬ ‫همانطور ‌که ‌گفتیم‪‌ ،‬سطرها ‌بی ‌‬ ‫برای ‌تفسیر ‌جدول ‌باال‪‌ ‌ ،‬‬
‫طبقهبندی ‌کرده ‌است‪‌.‬پس ‌برای‌‬ ‫طبقههایی ‌هستند ‌که ‌الگوریتمِ ‌ما ‌ ‌‬‫نشاندهنده‌ی ‌ ‌‬ ‫ستونها ‌ ‌‬
‫‌‬
‫آنها ‌به‌‬
‫شدهاند ‌و ‌‪‌ 27‬مورد ‌از ‌ ‌‬
‫طبقهبندی ‌ ‌‬
‫مثال ‌‪‌ 13‬مورد ‌از ‌ژیمیناستیک‌کارها ‌به ‌درستی ‌ ‌‬
‫شدهاند‪‌ 61‌ .‬نفر ‌از ‌بازیکنانِ‌‬
‫طبقهبندی ‌ ‌‬
‫اشتباه‪‌ ،‬ورزشکارِ ‌دوی ‌ماراتن‪‌ ،‬توسط ‌الگوریتم‪‌ ‌ ،‬‬
‫آنها‪‌،‬به‌اشتباه‌به‌لنوان‌‬‫شدهاند‌و‌‪‌1‬نفر‌از‌ ‌‬
‫طبقهبندی‌ ‌‬‫بسکتبال‌به‌درستی‌توسط‌الگوریتم‪‌ ‌،‬‬
‫شدهاند‪‌.‬در ‌آخر‪‌ 75‌ ،‬نفر ‌از ‌بازیکنانِ ‌دوی ‌ماراتن ‌به ‌درستی‌‬
‫بازیکنان ‌دوی ‌ماراتن ‌شناخته ‌ ‌‬
‫آنها ‌را‪‌ ،‬به ‌اشتباه ‌برچسبِ ‌ژیمیناستیک‌کار ‌و ‌‪‌29‬‬
‫شدهاند ‌و ‌الگوریتم‪‌ 6‌ ،‬نفر ‌از ‌ ‌‬
‫طبقهبندی ‌ ‌‬
‫‌‬
‫به‌طبقهی‌بسکتبالیست‌نسبت‌داده‌است‪.‬‬ ‫‌‬ ‫نفر‌را‪‌،‬‬
‫شدهاند‪:‬‬
‫طبقهبندی‌ ‌‬ ‫نمونههایی‌است‌که‌به‌درستی‌ ‌‬ ‫انگر‌ ‌‬ ‫قطرِ‌اصلی‌در‌ماتریسِ‌اغتشاش‪‌،‬بی ‌‬
‫در‌مورد‌طبقهبندی‌■ ‪112‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫در‌این‌مثال‪‌،‬دقت‌(‪‌)accuracy‬برای‌الگوریتمِ‌ما‌به‌صورت‌زیر‌محاسبه‌می‌شود‪:‬‬

‫یتوانیم ‌به ‌سادگی‪‌ ،‬ماتریسِ‌‬‫نکه ‌بفهمیم ‌الگوریتممان ‌چه ‌نوع ‌خطاهایی ‌دارد‪‌ ،‬م ‌‬ ‫برای ‌ای ‌‬
‫طبقهبندیِ ‌ما‪‌ ،‬توانسته‌‬
‫یرسد ‌که ‌الگوریتمِ ‌ ‌‬‫اغتشاش ‌را ‌بررسی ‌کنیم‪‌.‬در ‌مثالِ ‌باال‪‌ ،‬به ‌نظر ‌م ‌‬
‫یستها ‌قائل ‌شود‪‌ .‬ولی ‌بعضی ‌اوقات‌‬
‫تمایزِ ‌خوبی ‌بینِ ‌ورزشکاران ‌ژیمیناستیک ‌و ‌بسکتبال ‌‬
‫ککاران ‌به ‌لنوان ‌ورزشکارانِ ‌دوی ‌ماراتن ‌توسط ‌الگوریتم‌‬ ‫بازیکنان ‌بسکتبال ‌و ‌ژیمیناستی ‌‬
‫یشوند ‌و ‌برخی ‌دیگر ‌از ‌اوقات‪‌ ،‬ورزشکارانِ ‌دوی ‌ماراتن ‌به ‌لنوان‌‬ ‫شناخته ‌م ‌‬
‫برچسب‌میخورند‪.‬‬
‫‌‬ ‫ژیمیناستیک‌کاران‌یا‌ورزشکارانِ‌بسکتبالیست‪‌،‬‬
‫‌‬

‫دركِ ‌ماتریسِ ‌اغتشاش‪‌ ،‬خیلی ‌هم‌‬


‫سخت‌نیس!‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌111‬‬
‫دادهکاوی‌برای‌ ‌‬

‫برنامهنویسی‬
‫یک‌مثال‌ ‌‬
‫دادهی‌‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫دادهای‌که‌در ‌فصلِ‌پیش‌به‌آن‌پرداختیم‪‌،‬برگردیم‪‌.‬‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫بیایید‌به‌‬
‫«مایل ‌به ‌ازای ‌هر ‌گالن ‌برای ‌اتومبیل‌ها ‌(‪‌ »)Auto Miles Per Gallon‬از ‌دانشگاهِ ‌کارنی‌‬
‫دادهها‌چیزی‌شبیه‌به‌جدول‌زیر‌بود‪:‬‬ ‫ملون‌(‪‌.)Carnegie Mellon University‬فرمتِ‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫شبینی ‌کنم‪‌.‬این‌‬ ‫یخواهم ‌مصرف ‌اتومبیل‌ها ‌را ‌به ‌صورتِ ‌مایل ‌به ‌ازای ‌هر ‌گالن‪‌ ،‬پی ‌‬‫من ‌م ‌‬
‫یهای ‌مختلف ‌مانند ‌«تعداد ‌سیلندرها ‌(‪«‌ ،»)cylinders‬ظرفیت‌‬ ‫شبینی ‌بر ‌اساس ‌ویژگ ‌‬
‫پی ‌‬
‫پیستون ‌(بر ‌اساس ‌اینچِ ‌مکعب ‌(‪‌ ،»)).c.i‬اسبِ ‌بخار ‌(‪‌ ،)HP‬وزن ‌(‪‌)weight‬و ‌شتاب ‌(یعنی‌‬
‫زمانِ ‌بین ‌‪‌ 1‬تا ‌‪‌ ))secs. 0-60(‌ 91‬است‪‌ .‬من ‌تمامیِ ‌این ‌‪‌ 361‬نمونه ‌را ‌در ‌فایلی ‌با ‌نام‌‬
‫‪‌mpgData.txt‬گذاشتم‌و‌کدِ‌پایتونِ‌زیر‌را‌برای‌آن‌نوشتم‪‌.‬این‌کدِ‌پایتون‌ ‌‬
‫دادهها‌را‌به‌‪‌21‬‬
‫دادهها‌و‌کدها‌در‌‬‫یکند‪‌ (‌.‬‬ ‫سطلها)‌با‌روشِ‌الی‌هبندی‌(‪‌)stratified‬تقسیم‌م ‌‬ ‫قسمتِ‌مختلف‌( ‌‬
‫وبسایت‌‪‌guidetodataminig.com‬و‌‪‌chistio.ir‬موجود‌است)‬ ‫‌‬
‫‌‬
‫‪import random‬‬
‫‪def buckets(filename, bucketName, separator, classColumn‬‬
‫‪):‬‬
‫‪"""the original data is in the file named filename‬‬
‫‪bucketName is the prefix for all the bucket names‬‬
‫‪separator is the character that divides the columns‬‬
‫‪(for ex., a tab or comma and classColumn is the colu‬‬
‫‪mn‬‬
‫"""‪that indicates the class‬‬
‫‪# put the data in 10 buckets‬‬
‫‪numberOfBuckets = 10‬‬
‫}{ = ‪data‬‬
‫‪# first read in the data and divide by category‬‬
‫‪with open(filename) as f:‬‬
‫)(‪lines = f.readlines‬‬
‫‪for line in lines:‬‬
113 ■‌‫در‌مورد‌طبقهبندی‬
‌ ‌‫‌کمی‌بیشتر‬.5‌‫‌فصل‬

if separator != '\t':
line = line.replace(separator, '\t')
# first get the category
category = line.split()[classColumn]
data.setdefault(category, [])
data[category].append(line)
# initialize the buckets
buckets = []
for i in range(numberOfBuckets):
buckets.append([])
# now for each category put the data into the bucket
s
for k in data.keys():
#randomize order of instances for each class
random.shuffle(data[k])
bNum = 0
# divide into buckets
for item in data[k]:
buckets[bNum].append(item)
bNum = (bNum + 1) % numberOfBuckets
# write to file
for bNum in range(numberOfBuckets):
f = open("%s-%02i" % (bucketName, bNum + 1), 'w'
)
for item in buckets[bNum]:
f.write(item)
f.close()
buckets("mpgData.txt", 'mpgData','\t',0)

‌‫ ‌و ‌به ‌همین ‌ترتیب ‌تا‬mpgData02‌ ،mpgData01‌ ‫نامهای‬


‌ ‌ ‫ ‌فایل ‌با‬21‌ ،‫با ‌اجرای ‌این ‌کد‬
.‫یشود‬‌ ‫‌ساخته‌م‬،‫آخر‬

‫کد‌بزنید‬
‌‫کترین ‌همسایه ‌را ‌از ‌فصلِ ‌قبل ‌طوری ‌تغییر ‌دهید ‌که ‌تابعِ ‌آزمون‬
‌ ‫یتوانید ‌کدِ ‌نزدی‬
‌ ‫آی ا ‌ م‬
‌‫ساختهایم‬
‌ ‌‫دادهای ‌که‬ ‌ -21‌ِ‫ ‌لملیاتِ‌التبارسنجیِ‌متقابل‬،)test(
‌ ‌ِ‫ ‌فایل‬21‌‫تکهای‌را‌بر‌روی‬
‌chistio.ir‌ ‫ ‌و‬guidetodatamining.com‌ ‫یتوانید ‌از ‌سایت‬ ‌ ‫دادهها ‌را ‌م‬
‌ (‌ ‫تولید ‌کند؟‬
)‫دریافت‌کنید‬
:‫‌یک‌ماتریسِ‌اغتشاش‌مانندِ‌زیر‌تولید‌کند‬،‫‌بایستی‌در‌خروجی‬،‫ینویسید‬ ‌ ‫برنامهای‌که‌م‬

‫برنامهنویسان‬ ‫‪‌ ■‌114‬‬
‫دادهکاوی‌برای‌ ‌‬

‫کد‌بزنید‌–‌ ‌‬
‫راهحل‬
‫یتواند‌این‌باشد‪:‬‬
‫حلها‌برای‌مسئله‌ی‌باال‌م ‌‬
‫راه ‌‬
‫یکی‌از‌ ‌‬
‫‌تابع‌اولیه‌(‪‌)initializer‬را‌تغییر‌داده‌تا‌ ‌‬
‫دادهها‌را‌از‌‪‌6‬قسمت‌(‪‌6‬سطل)‌بخواند‬
‫‌یک‌تابعِ‌جدید‌برای‌آزمودن‌(‪‌)test‬از‌ ‌‬
‫دادههای‌یک‌قسمت‌بسازیم‬
‫‌یک‌تابعِ‌جدید‌بسازیم‌که‌لملیات‌التبارسنجیِ‌متقابل‌‪‌ -21‬‬
‫تکهای‌را‌محاسبه‌کند‌‬
‫‌‬
‫بیایید‌به‌صورت‌لملی‌به‌این‌قضیه‌نگاهی‌بیندازیم‬
‫‌‬
‫تابع‌اولیه‌__‪__init‬‬
‫امضا‌(‪‌)signature‬برای‌تابعِ‌__‪‌‌__init‬به‌این‌صورت‌است‪:‬‬
‫‌‬

‫‌‬
‫لها ‌(‪‌)filenames‬برای‌هر‌قسمت‌چیزی‌مانند ‌‪‌mpgData-02‌ ،mpgData-01‬و‪‌...‬‬ ‫اسمِ ‌فای ‌‬
‫خواهد ‌بود‪‌.‬در ‌این ‌مثالِ ‌ما‪‌ bucketPrefix‌ ،‬در ‌واقع ‌«‪‌ »mpgData‬است ‌به ‌معنای ‌پیشوند‪‌.‬‬
115 ■‌‫در‌مورد‌طبقهبندی‬
‌ ‌‫‌کمی‌بیشتر‬.5‌‫‌فصل‬

‌‫ ‌تکه ‌را‬21‌ ‫فهی ‌جداسازی‬ ‌ ‫سطلها ‌هستند ‌که ‌وظی‬ ‌ ‌ ‫قسمتها ‌یا‬‌ ‌ ‫ ‌همان‬bucket‌ ‫منظور ‌از‬
‌ ‌ ‫ ‌همان ‌سطلی ‌است ‌که‬testBucketNumber‌.‫برلهده ‌دارند‬
‌‫دادههای ‌آزمون ‌را ‌در ‌خود ‌نگه‬
‌ ‌ ِ‫ ‌الگوریتم‬،‫ ‌بود‬3‌ ‫ ‌برابر‬testBucketNumber‌ ِ‫‌مثالً ‌اگر ‌مقدار‬.‫یدارد‬
‌ِ‫ ‌بر ‌اساس‬،‫طبقهبندی‬ ‌‫م‬
‌‫یداد ‌و ‌بر‬
‌ ‫ ‌لملیاتِ ‌یادگیری ‌را ‌انجام ‌م‬21‌ ‫ ‌و‬6‌ ،1‌ ،7‌ ،9‌ ،5‌ ،4‌ ،1‌ ،2‌ ‫قسمتهای‬
‌ ‌ ‫دادههای‬

‌‫رشتهای‌است‌که‌مشخص‬ ‌ ‌dataFormat‌.‫یکرد‬ ‌ ‫‌خود‌را‌ارزیابی‌م‬،3‌ِ‫دادههای‌قسمت‬ ‌ ‌ِ‫اساس‬
:‫‌برای‌مثال‬.‫ستونها‌در‌داده‌ها‌بایستی‌تفسیر‌شوند‬ ‌ ‌‫یکند‌چگونه‬ ‌‫م‬
”class num num num num num comment“
‌‫)‌برای‌هر ‌نمونه‬class(‌ ‫مشخص ‌می‌کند ‌که ‌اولین ‌ستون ‌(از ‌سمتِ ‌چپ)‌به ‌معنای ‌طبقه‬
‌‫نمونهها‌هستند‌و‌ستونِ‌آخر‌به‌لنوان‬ ‌ ‌‫یهای‌لددی‌برای‬ ‌ ‫‌بیان‌گرِ‌ویژگ‬،‫‌ستونِ‌بعدی‬5‌.‫است‬
.‫یشود‬
‌ ‫توضیحات‌در‌نظر‌گرفته‌م‬
:‫‌مانند‌کدهای‌زیر‌است‬،‫‌به‌صورت‌کامل‬،__init__‌‫تابع‬

import copy
class Classifier:
def __init__(self, bucketPrefix, testBucketNumber, dataF
ormat):
""" a classifier will be built from files with the b
ucketPrefix
excluding the file with textBucketNumber. dataFormat
is a
string that describes how to interpret each line of
the data
files. For example, for the mpg data the format is:
"class num num num num num comment"
"""
self.medianAndDeviation = []
# reading the data in from the file
self.format = dataFormat.strip().split('\t')
self.data = []
# for each of the buckets numbered 1 through 10:
for i in range(1, 11):
# if it is not the bucket we should ignore, read
the data
if i != testBucketNumber:
filename = "%s-%02i" % (bucketPrefix, i)
f = open(filename)
lines = f.readlines()
f.close()
‫برنامهنویسان‬ ‌ ■‌119
‌ ‌‫دادهکاوی‌برای‬

for line in lines:


fields = line.strip().split('\t')
ignore = []
vector = []
for i in range(len(fields)):
if self.format[i] == 'num':
vector.append(float(fields[i]))
elif self.format[i] == 'comment':
ignore.append(fields[i])
elif self.format[i] == 'class':
classification = fields[i]
self.data.append((classification, vector
, ignore))
self.rawData = copy.deepcopy(self.data)
# get length of instance vector
self.vlen = len(self.data[0][1])
# now normalize the data
for i in range(self.vlen):
self.normalizeColumn(i)

)testBucket(‌‫قسمتها‬
‌ ‌‫تابع‌آزمون‬
‌‫دادههای ‌موجود ‌در‬ ‌ ‫ ‌تابعی ‌را ‌م‬،‫__ ‌را ‌نوشتیم‬init__‌ ِ‫بعد ‌از ‌آن ‌که ‌تابع‬
‌ ‌ ‫ینویسیم ‌که ‌بتواند‬
:‫یک‌قسمت‌(سطل)‌را‌مورد‌آزمون‌و‌ارزیابی‌قرار‌دهد‬

def testBucket(self, bucketPrefix, bucketNumber):
"""Evaluate the classifier with data from the file
bucketPrefix-bucketNumber"""
filename = "%s-%02i" % (bucketPrefix, bucketNumber)
f = open(filename)
lines = f.readlines()
totals = {}
f.close()
for line in lines:
data = line.strip().split('\t')
vector = []
classInColumn = -1
for i in range(len(self.format)):
if self.format[i] == 'num':
vector.append(float(data[i]))
elif self.format[i] == 'class':
classInColumn = i
theRealClass = data[classInColumn]
classifiedAs = self.classify(vector)
‫در‌مورد‌طبقهبندی‌■ ‪117‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫)}{ ‪totals.setdefault(theRealClass,‬‬
‫)‪totals[theRealClass].setdefault(classifiedAs, 0‬‬
‫‪totals[theRealClass][classifiedAs] += 1‬‬
‫‪return totals‬‬
‫‌‬
‫این ‌تابع ‌یک ‌‪‌ bucketPrefix‬و ‌یک ‌‪‌ bucketNumber‬به ‌لنوان ‌ورودی ‌دریافت ‌می‌کند‪‌.‬‬
‫مثالً ‌اگر ‌مقدارِ ‌پیشوند ‌(‪‌ )bucketPrefix‬برابر ‌«‪‌ »mpgData‬و ‌لددِ ‌قسمت‌‬
‫دادهی ‌آزمون ‌از ‌فایلِ ‌‪‌ mgpData-03‬خوانده ‌م ‌‬
‫یشود‪‌.‬تابعِ‌‬ ‫(‪‌)bucketNumber‬برابر ‌‪‌ 3‬بود‪‌ ‌ ،‬‬
‫‪‌testBucket‬یک‌دیکشنری‌با‌فرمتِ‌زیر‌برمی‌گرداند‪:‬‬
‫‌‬

‫‌‬
‫طبقهی‌واقعی‌برای‌آن‌نمونه‌است‪‌.‬برای‌مثال‪‌،‬خطِ‌اول‌بیان‌گر‌‬
‫انگرِ‌ ‌‬
‫کلیدِ‌این‌دیکشنری‪‌،‬بی ‌‬
‫آنها‌برابر‌‪(‌mpg‌35‬مایل‌به‌‬
‫طبقهبندی‌برای‌ ‌‬
‫نمونههایی‌است‌که ‌مقدار‌درستِ‌ ‌‬
‫نتایج‌برای‌ ‌‬
‫ازای‌هر‌گالن)‌بوده‌است‪‌.‬مقادیرِ‌هر‌کدام‌از‌این‌کلیدها‌یک‌دیکشنریِ‌دیگر‌است‌که‌نشان‌‬
‫نمونهها‌را‌برچسب‌زده‌است‪‌.‬برای‌مثال‪‌،‬خطِ‬
‫طبقهبندی‪‌،‬چگونه‌این‌ ‌‬
‫یدهد‌الگوریتمِ‌ ‌‬‫م‌‬
‫‌‬

‫‌‬
‫آنها‌به‌‬
‫گرفتهاند‌و‌دو‌تای‌ ‌‬
‫دهندهی‌آزمونی‌است‌که‌در‌آن‌‪‌3‬نمونه‪‌،‬مورد‌بررسی‌قرار‌ ‌‬ ‫‌‬ ‫نشان‌‬
‫شمارهی ‌‪‌ ،3‬که ‌به ‌لددِ ‌‪‌ mpg‌ 11‬به ‌اشتباه ‌ ‌‬
‫طبقهبندی‌‬ ‫‌‬ ‫نمونهی ‌‬
‫شدهاند‪‌ ‌.‬‬
‫طبقهبندی ‌ ‌‬
‫اشتباه ‌ ‌‬
‫شمارهی ‌‪‌ 4‬که ‌به ‌درستی ‌به ‌لددِ ‌‪‌ ‌ mpg‌ 25‬‬
‫طبقهبندی ‌شده ‌است ‌و‌‬ ‫‌‬ ‫نمونهی ‌‬
‫شده ‌است‪‌ ‌ ،‬‬
‫شمارهی‌‪‌2‬که‌به‌اشتباه‌به‌لددِ‌‪‌ ‌mpg‌21‬‬
‫طبقهبندی‌شده‌است‪.‬‬ ‫‌‬ ‫نمونهی‌‬
‫‌‬
‫‌‬
‫برنامهنویسان‬ ‌ ■‌111
‌ ‌‫دادهکاوی‌برای‬

)10-Fold Cross Validation(‌‫تکهای‬


‌ -21‌ِ‫فرآیند‌التبارسنجیِ‌متقابل‬
‌ -21‌ ِ‫ ‌بایستی ‌تابعی ‌بنویسیم ‌که ‌بتواند ‌فرآیند ‌التبارسنجیِ ‌متقابل‬،‫در ‌آخر‬
‌‫تکهای ‌را ‌انجام‬
‌ِ‫ ‌قسمت‬6‌ ‫طبقهبندها ‌با‬
‌ ‌ ‫ ‌هر ‌کدام ‌از ‌این‬.‫یسازد‬‌ ‫طبقهبند ‌م‬
‌ ‌ 21‌ ،‫ ‌در ‌واقع ‌این ‌تابع‬.‫دهد‬
.‫یشوند‬
‌ ‫‌ارزیابی‌م‬،‫یمانده‬
‌ ‫‌قسمتِ‌باق‬2‌ِ‫یبینند‌و‌بر‌اساس‬ ‌ ‫‌آموزش‌م‬،‫آموزشی‬

def tenfold(bucketPrefix, dataFormat):


results = {}
for i in range(1, 11):
c = Classifier(bucketPrefix, i, dataFormat)
t = c.testBucket(bucketPrefix, i)
for (key, value) in t.items():
results.setdefault(key, {})
for (ckey, cvalue) in value.items():
results[key].setdefault(ckey, 0)
results[key][ckey] += cvalue

# now print results


categories = list(results.keys())
categories.sort()
print( "\n Classified as: ")
header = " "
subheader = " +"
for category in categories:
header += category + " "
subheader += "----+"
print (header)
print (subheader)
total = 0.0
correct = 0.0
for category in categories:
row = category + " |"
for c2 in categories:
if c2 in results[category]:
count = results[category][c2]
else:
count = 0
row += " %2i |" % count
total += count
if c2 == category:
correct += count
print(row)
print(subheader)
‫در‌مورد‌طبقهبندی‌■ ‪116‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫‪print("\n%5.3f percent correct" %((correct * 100) /‬‬


‫))‪total‬‬
‫)‪print("total of %i instances" % total‬‬

‫)"‪tenfold("mpgData", "class num num num num num comment‬‬

‫یشود‪:‬‬
‫با‌اجرای‌این‌برنامه‪‌،‬نتایجِ‌زیر‌حاصل‌م ‌‬

‫آمار‌کاپا‌(‪)Kappa Statistic‬‬
‫طبقهبندی ‌پرسیدیم ‌که ‌احتماالً ‌دوست‌‬‫تمهای ‌ ‌‬ ‫ابتدای ‌این ‌فصل‪‌ ،‬چند ‌سوال ‌در ‌مورد ‌الگوری ‌‬
‫طبقهبند ‌چقدر ‌خوب ‌است؟‌‬ ‫آنها ‌پاسخ ‌دهیم‪‌ .‬مثالً ‌این ‌سوال ‌که ‌این ‌ ‌‬ ‫داشته ‌باشیم ‌به ‌ ‌‬
‫تکهای‌‬
‫همچنین‌ما‌معیار‌و‌روشِ‌ارزیابیِ‌خود‌را‌اصالح‌کردیم‌و‌به‌التبارسنجیِ‌متقابلِ‌‪‌ -21‬‬
‫و ‌ماتریسِ ‌اغتشاش ‌روی ‌آوردیم‪‌ .‬در ‌مثالِ ‌چند ‌صفحه ‌قبل‪‌ ،‬مشخص ‌کردیم ‌که ‌الگوریتم‌‬
‫شبینیِ ‌«مایل ‌به ‌ازای ‌هر ‌گالن» ‌برای ‌یک ‌اتومبیل‪‌ %53.329‌ ،‬دقت‌‬ ‫طبقهبندی‪‌ ،‬برای ‌پی ‌‬
‫‌‬
‫طبقهبندیِ‌ما‌خوب‌است‌یا‌خیر؟‌‬ ‫داشت‪‌.‬ولی‌آیا‌‪‌%53.329‬به‌معنیِ‌این‌است‌که‌الگوریتمِ‌ ‌‬
‫برای ‌پاسخ ‌به ‌این ‌سوال‪‌ ،‬می‌خواهیم ‌به ‌نولی ‌آمار ‌بپردازیم ‌به ‌نام ‌آمارِ ‌کاپا ‌( ‪Kappa‬‬
‫‪‌ .)statistic‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌121‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫طبقهبندِ ‌دوم ‌کامالً‌‬


‫یکند‌به ‌طوری‌که‌ ‌‬ ‫طبقهبندِ‌دیگر‌مقایسه‌م ‌‬
‫طبقهبند‌را‌با‌یک‌ ‌‬
‫آمارِ‌کاپا‪‌ ‌،‬‬
‫یکند‪‌ ،‬با‌‬‫نکه ‌نشان ‌دهیم ‌آمارِ ‌کاپا ‌چگونه ‌کار ‌م ‌‬
‫بر ‌اساسِ ‌شانس ‌ساخته ‌شده ‌باشد‪‌.‬برای ‌ای ‌‬
‫یکنم‌و‌برای‌این‌کار‌دوباره‌به‌‬ ‫سادهتر‌از‌«مایل‌به‌ازای‌هر‌گالن‌–‌‪‌»mpg‬شروع‌م ‌‬ ‫یک‌مثالِ‌ ‌‬
‫طبقهبندی ‌برای‌‬‫دادهی ‌زنانِ ‌ورزشکار ‌می‌پردازم‪‌.‬شکلِ ‌زیر‪‌ ،‬نتایجِ ‌یک ‌الگوریتمِ‌ ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬
‫ورزشکاران‌زن‌است‪:‬‬
‫‌‬
‫در‌مورد‌طبقهبندی‌■ ‪122‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫‌‬
‫‌‬
‫برای‌یک‌طبقهبندِ‌خاص‌‬
‫‌‬ ‫در‌شکلِ‌باال‪‌،‬که‌در‌واقع‌ماتریس‌اغتشاش‌(‪‌)confusion matrix‬‬
‫است‪‌ ،‬مجموع ‌را ‌هم ‌در ‌ستون ‌‪‌ TOTALS‬نمایش ‌دادم‪‌ .‬برای ‌مشخص ‌کردنِ ‌دقت‌‬
‫(‪‌)accuracy‬ما‌جمعِ‌الداد‌برای‌قطرِ‌اصلی‌را‌محاسبه‌می‌کنیم‌(‪‌)252‌=‌11‌+‌11‌+‌35‬و‌‬
‫یکنیم‪‌.‬پاسخ‌به‌صورت‌‬
‫نمونهها‌یعنی‌‪‌111‬لدد‌تقسیم‌م ‌‬
‫حاصلِ‌این‌لدد‌را‌بر‌تعدادِ‌تمامیِ‌ ‌‬
‫یشود‪:‬‬
‫زیر‌م ‌‬

‫یخواهم‌یک‌ماتریس‌اغتشاشِ‌دیگر‌را‌تولید‌کنم‪‌.‬این‌ماتریسِ‌اغتشاش‌بیان‌گر‌نتایجِ‌‬ ‫حاال‌م ‌‬
‫یهایش ‌به‌‬ ‫شبین ‌‬
‫طبقهبندی ‌که ‌پی ‌‬ ‫طبقهبندِ ‌مبتنی ‌بر ‌شانس ‌(‪‌)random‬است‪‌.‬یعنی ‌ ‌‬ ‫یک ‌ ‌‬
‫یکنیم ‌و‌‬‫جای ‌یادگیری‪‌ ،‬کامالً ‌تصادفی ‌است‪‌.‬در ‌ابتدا‪‌ ،‬یک ‌کپی ‌از ‌ماتریسِ ‌باال ‌را ‌ایجاد ‌م ‌‬
‫یداریم‪:‬‬
‫آنها‌نگه‌م ‌‬‫فقط‌مجموع‌(‪‌)TOTALS‬را‌برای‌ ‌‬
‫‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪ ■‌121‬دا ‌‬
‫دهکاوی‌برای‌ ‌‬

‫مشاهدهی ‌سطرِ ‌پایینی‪‌ ،‬مشاهده ‌می‌کنیم ‌که ‌در ‌‪‌ 51‬درصدِ ‌موارد ‌(‪‌ 211‬مورد ‌از ‌‪‌111‬‬ ‫‌‬ ‫با ‌‬
‫کردهاست‪‌.‬در ‌‪‌ 11‬درصدِ‌‬ ‫طبقهبندِ ‌ما‪‌ ،‬بازیکنی ‌را ‌به ‌لنوانِ ‌بازیکنِ ‌بسکتبال ‌انتخاب ‌ ‌‬
‫مورد)‪‌ ‌ ،‬‬
‫ککار ‌و ‌در ‌‪‌ 31‬درصدِ ‌موارد ‌دوی ‌ماراتن ‌را ‌برای‌‬ ‫موارد ‌(‪‌ 41‬مورد ‌از ‌‪‌ 111‬مورد)‌ژیمیناستی ‌‬
‫ورزشکاران‌انتخاب‌کرده‌است‪.‬‬
‫حاال ‌ما ‌از ‌این ‌درصدها ‌برای ‌پر ‌کردنِ ‌بقی‌هی‌‬
‫جدول ‌استفاده ‌خواهیم ‌کرد‪‌ .‬االن ‌تعداد ‌‪‌91‬‬
‫ژیمیناستیک‌کار ‌به ‌صورت ‌واقعی ‌حضور ‌دارند‪‌.‬‬
‫طبقبندیِ ‌ما ‌که ‌به ‌صورت ‌تصادفی ‌کار‌‬
‫الگوریتمِ ‌ ‌‬
‫یکند‪‌ 11‌ ،‬درصد ‌از ‌این ‌افراد ‌را‪‌،‬‬ ‫م‌‬
‫یشود ‌‪‌ 21‬و ‌ما ‌لددِ ‌‪‌ 21‬را ‌در‌‬
‫یکند‪‌.‬پس ‌‪‌ 11‬درصدِ ‌‪‌ ،91‬م ‌‬ ‫طبقهبندی ‌م ‌‬
‫ژیمیناستیک‌کار ‌ ‌‬
‫جدول ‌قرار ‌می‌دهیم‪‌.‬بعد ‌از ‌آن‪‌ 51‌ ،‬درصد ‌از ‌این ‌افراد ‌را ‌به ‌لنوانِ ‌بازیکنِ ‌بسکتبال ‌(‪‌51‬‬
‫آنها‌را‌ورزشکارانِ ‌دوی‌ماراتن ‌(‪‌31‬درصدِ‌‪‌ 91‬که‌‬ ‫یشود‌‪‌،)31‬و ‌‪‌31‬درصدِ‌ ‌‬ ‫درصدِ‌‪‌ 91‬که‌م ‌‬
‫یکند‪‌ .‬‬‫طبقهبندی‌م ‌‬
‫یشود‌‪‌ ‌)21‬‬ ‫م‌‬
‫‌‬

‫‌‬

‫طبقهبندِ‌‬
‫و ‌به ‌همین ‌صورت ‌ادامه ‌می‌دهیم‪‌ .‬تعدادِ ‌‪‌ 211‬بازیکن ‌بسکتبال ‌حضور ‌دارند‪‌ ‌ .‬‬
‫ککار‪‌ 51‌ ،‬درصد ‌را ‌به ‌لنوان ‌بازیکنِ‌‬
‫آنها ‌را ‌به ‌لنوان ‌ژیمیناستی ‌‬
‫تصادفی‪‌ 11‌ ،‬درصد ‌از ‌ ‌‬
‫یکند ‌و ‌به ‌همین‌‬ ‫طبقهبندی ‌م ‌‬
‫بسکتبال ‌و ‌‪‌ 31‬درصد ‌را ‌به ‌لنوانِ ‌ورزشکار ‌دوی ‌مارتن ‌ ‌‬
‫خانههای‌ماتریس‌را‌پر‌می‌کنیم‪:‬‬‫صورت‌تا‌آخر‌تمامیِ‌ ‌‬
‫‌‬
‫در‌مورد‌طبقهبندی‌■ ‪123‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫‌‬

‫کردهاست‪‌ ،‬بایستی ‌مانندِ‌‬


‫برای ‌مشخص ‌کردنِ ‌دقتِ ‌این ‌روش ‌که ‌به ‌صورت ‌تصادفی ‌لمل ‌ ‌‬
‫نمونهها‌کنیم‪.‬‬
‫قبل‪‌،‬تمامی‌الداد‌در‌ستونِ‌اصلی‌را‌جمع‌کرده‌و‌تقسیم‌بر‌کلِ‌ ‌‬
‫‌‬

‫‌‬
‫طبقهبندِ‌‬
‫طبقهبندِ ‌ما‪‌ ،‬چقدر ‌بهتر ‌از ‌یک ‌الگوریتمِ ‌ ‌‬
‫حاال‪‌ ،‬آمارِ ‌کاپا‪‌ ،‬به ‌ما ‌می‌گوید ‌الگوریتم ‌ ‌‬
‫تصادفی‌کار‌می‌کند‪‌.‬فرمول‌کاپا‌به‌صورت‌زیر‌است‪:‬‬
‫‌‬

‫طبقهبندِ ‌طراحی ‌شده ‌توسطِ ‌ما)‌است ‌و‌‬ ‫که ‌در ‌آن ‌)‪‌‌ P(c‬دقتِ ‌الگوریتمِ ‌ ‌‬
‫طبقهبندِ ‌واقعی ‌( ‌‬
‫طبقهبندِ ‌واقعی‪‌،‬‬ ‫)‪‌ P(r‬دقتِ ‌الگوریتمِ ‌ ‌‬
‫طبقهبندِ ‌تصادفی ‌است‪‌ .‬در ‌این ‌مثال‪‌ ،‬دقتِ ‌الگوریتمِ ‌ ‌‬
‫طبقهبندِ‌تصادفی‌برابرِ‌‪‌1.37‬شد‪‌.‬پس‪:‬‬
‫برای‌‪‌1.755‬شد‌و‌دقتِ‌ ‌‬

‫حاال ‌چگونه ‌لددِ ‌‪‌ 1.92‬را ‌ارزیابی ‌کنیم؟ ‌آیا ‌این ‌به ‌آن ‌معناست ‌که ‌الگورریتمی ‌که ‌طراحی‌‬
‫کردهایم ‌ضعیف ‌است؟ ‌یا ‌به ‌معنی ‌این ‌است ‌که ‌الگوریتمِ ‌ما ‌قوی ‌و ‌یا ‌حتی ‌لالی ‌است؟ ‌در‌‬
‫‌‬
‫یکند‪:‬‬
‫یکنید‌که‌به‌ما‌در‌تفسیر‌لددِ‌کارپا‌کمک‌م ‌‬ ‫زیر‪‌،‬نموداری‌را‌مشاهده‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌124‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‪‌:‬یعنی‌طبقهبندِ‌ما‌خوب‌نیست‪‌،‬و‌دقتِ‌آن‌کمتر‌از‌طبقه‌بندِ‌تصادفی‌شده‌است ‌‬
‫‌‬ ‫‪‌> 0‬‬
‫‪‌:0.01-0.20‬خیلی‌کم‌خوب ‌‬
‫‪‌:0.21-0.40‬لملکرد‌منصفانه ‌‬
‫‪‌:0.41-0.60‬لملکرد‌معقول ‌‬
‫صورت‌قابل‌مالحظهای‌خوب ‌‬
‫‌‬ ‫‪‌:0.61-0.80‬به‌‬
‫‪‌:0.81-1.00‬لملکرد‌نزدیک‌به‌لالی ‌‬
‫منبع‪‌ :‬‬
‫‪Landis, JR, Koch, GG. 1977. The measurement of observer agreement for‬‬
‫‪categorical data. Biometrics 33:159-74‬‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‬
‫رشتهی‌دانشجویانِ‌جاریِ‌دانشگاه‌را‌بر‌اساس‌‬
‫طبقهبندِ‌نادان‌داریم‌که‌ ‌‬
‫فرض‌کنید‌ما‌یک‌ ‌‬
‫دادهای ‌شامل ‌‪‌ 911‬دانشجو ‌داریم‪‌.‬‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫یکنند‪‌.‬ما ‌‬
‫دهاند‪‌ ،‬بررسی ‌م ‌‬
‫‪‌ 21‬فیلمی ‌که ‌دی ‌‬
‫رشتههای ‌للوم ‌کامپیوتر ‌(‪‌ ،)cs‬للوم ‌آموزشی ‌(‪‌ ،)ed‬زبان ‌انگلیسی‌‬
‫این ‌دانشجویان ‌در ‌ ‌‬
‫(‪‌ )eng‬و ‌روانشناسی ‌(‪‌ )psych‬مشغول ‌به ‌تحصیل ‌هستند‪‌ .‬ماتریسِ ‌اغتشاش ‌برای ‌این‌‬
‫یتوانید‌آمارِ‌کاپا‌(‪‌)Kappa statistic‬‬
‫دانشجویان‌در‌زیر‌نمایش‌داده‌شده‌است‪‌.‬آیا‌شما‌م ‌‬
‫را‌برای‌این‌ماتریس‌محاسبه‌کرده‌و‌آن‌را‌تفسیر‌کنید؟ ‌‬
‫در‌مورد‌طبقهبندی‌■ ‪125‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫‌‬
‫‌‬

‫مدادتان‌را‌تیز‌کنید‌–‌ ‌‬
‫راهحل‬
‫یتوانید‌‬
‫طبقهبندِ‌ما‌برا‌اساس‌این‌ماتریس‌اغتشاش‪‌،‬چه‌کیفیتی‌دارد؟‌آیا‌شما‌م ‌‬
‫الگوریتمِ‌ ‌‬
‫آمارِ‌کاپا‌(‪‌)Kappa Statistic‬را‌برای‌این‌ماتریس‌محاسبه‌کرده‌و‌آن‌را‌تفسیر‌کنید؟‬
‫ستونها‌را‌داشته‌باشیم‪:‬‬
‫در‌ابتدا‌بایستی‌جمع‌تمامیِ‌ ‌‬
‫‌‬

‫‌‬

‫طبقهبندِ‌تصادفی‌بسازیم‪:‬‬
‫در‌قدمِ‌بعدی‪‌،‬بایستی‌ماتریسِ‌اغتشاش‌را‌برای‌ ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌129‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫یشود‪:‬‬
‫طبقهبندِ‌تصادفی‪‌،‬برابرِ‌‪‌1.161‬است‌که‌مانند‌زیر‌محاسبه‌م ‌‬
‫دقتِ‌این‌ ‌‬
‫‌‬
‫‪(8 + 24 + 51 + 92) / 600 = (175 / 600) = 0.292‬‬

‫طبقهبندِ‌ما‌برابر‌‪‌1.967‬شده‌است‬
‫دقتِ‌ ‌‬
‫طبقهبندِ‌تصادفی‌هم‌برابر‌‪‌1.161‬شده‌است‬
‫دقتِ‌ ‌‬
‫یشود‪:‬‬
‫طبقهبند‌محاسبه‌م ‌‬
‫آمارِ‌کاپا‌به‌صورت‌زیر‌برای‌این‌ ‌‬
‫‌‬

‫‌‬

‫و‌تفسیرِ‌آن‌به‌این‌معناست‌که‌الگوریتمِ‌ما‌به‌صورت‌معقولی‌خوب‌لمل‌کرده‌است‪‌ .‬‬
‫در‌مورد‌طبقهبندی‌■ ‪127‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫‌‬
‫‌‬

‫کترین‌همسایه‌(‪)Nearest Neighbor‬‬
‫بهبودِ‌الگوریتمِ‌نزدی ‌‬
‫طبقهبندِ ‌ساده ‌(‪‌ )rote classifier‬است ‌– ‌یعنی‌‬ ‫طبقهبند‪‌ ‌ ،‬‬ ‫یک ‌مثالِ ‌بدیهی ‌از ‌یک ‌ ‌‬
‫طبقهبند ‌تمامیِ‌‬
‫یکند‪‌ .‬این ‌ ‌‬ ‫مگیری ‌م ‌‬ ‫طبقهبندی ‌که ‌بدون ‌فکر ‌و ‌تحلیلِ ‌خاصی ‌تصمی ‌‬ ‫‌‬
‫نمونهی ‌جدید ‌را ‌فقط ‌وقتی‌‬
‫حافظهی ‌خود ‌ذخیره ‌می‌کند ‌و ‌یک ‌ ‌‬ ‫‌‬ ‫مجمولهی ‌آموزشی ‌را ‌در ‌‬
‫‌‬
‫نمونههای ‌موجود ‌در ‌حافظه ‌(یعنی ‌همان‌‬‫طبقهبندی ‌می‌کند ‌که ‌این ‌نمونه ‌دقیقاً ‌مانندِ ‌ ‌‬ ‫‌‬
‫مجمولهی‌‬
‫‌‬ ‫دادههای‌موجود‌در‌‬
‫طبقهبندها‌را‌فقط‌بر‌اساس‌ ‌‬ ‫نمونههای‌آموزشی)‌باشد‪‌.‬اگر‌ما‌ ‌‬ ‫‌‬
‫طبقهبندِ ‌ساده ‌(‪‌ )rote classifier‬همیشه ‌دقتِ ‌‪‌211‬‬ ‫آموزشی‪‌ ،‬ارزیابی ‌کنیم‪‌ ،‬الگوریتمِ ‌ ‌‬
‫طبقهبندِ ‌ساده‪‌ ،‬انتخابِ ‌خوبی ‌نیست‪‌ ،‬چون‌‬
‫درصدی ‌را ‌کسب ‌می‌کند‪‌ .‬در ‌دنیای ‌واقعی‪‌ ‌ ،‬‬
‫طبقهبندی ‌کنیم ‌در ‌حالی‌که ‌در‌‬
‫آنها ‌را ‌ ‌‬ ‫یخواهیم ‌ ‌‬ ‫نمونههایی ‌وجود ‌دارند ‌که ‌م ‌‬
‫همواره ‌ ‌‬
‫کترین‌همسایه‌‬ ‫آنها‪‌،‬وجود‌ندارد‪‌.‬الگوریتمِ‌نزدی ‌‬
‫مشابه‌ ‌‬
‫ِ‌‬ ‫نمونههای‌دقیقاً‌‬
‫مجمولهی‌آموزشی‪‌ ‌،‬‬ ‫‌‬
‫طبقهبندِ ‌ساده ‌در ‌نظر‌‬
‫توسعهای ‌از ‌الگوریتمِ ‌ ‌‬
‫‌‬ ‫یتوان ‌به ‌لنوان ‌‬‫(‪‌ )nearest neighbor‬را ‌م ‌‬
‫کترین ‌همسایه)‪‌،‬‬ ‫گرفت‪‌ .‬در ‌این ‌الگوریتم ‌(نزدی ‌‬
‫نمونههایی ‌دقیقاً ‌مشابه‌‬
‫به ‌جای ‌این‌که ‌به ‌دنبال ‌ ‌‬
‫نمونههای ‌جدید ‌بگردیم‪‌ ،‬به‌‬ ‫طبقهبندیِ ‌ ‌‬
‫برای ‌ ‌‬
‫مجمولهی ‌آموزشی‌‬ ‫‌‬ ‫نمونههایی ‌در ‌‬‫دنبال ‌ ‌‬
‫کتر‌‬‫نمونهی ‌جدید‪‌ ،‬نزدی ‌‬ ‫یگردیم ‌که ‌به ‌ ‌‬ ‫م‌‬
‫هستند‪Mecheal ‌ ،Pang Ning Tan‌ .‬‬
‫‪‌ Steinback‬و ‌‪‌ Vipin Kumar‬در ‌کتاب ‌خود ‌با‌‬
‫دادهاند‪‌:‬اگر‌یک‌چیز‪‌،‬مانند‌‬
‫مقدمهای‌بر ‌داده‌کاوی»‌به‌این‌صورت‌این‌روش‌را‌توضیح ‌ ‌‬ ‫‌‬ ‫نامِ‌«‬
‫برنامهنویسان‬ ‫‪‌ ■‌121‬‬
‫دادهکاوی‌برای‌ ‌‬

‫اردك ‌راه ‌برود‪‌ ،‬مانند ‌اردك ‌صدا ‌در ‌بیاورد‪‌ ،‬و ‌از‌نظر‌ظاهری‌هم‌شبیه ‌به ‌اردك ‌باشد‪‌ ،‬پس‌‬
‫احتماالً‌این‌چیز‪‌،‬یک‌اردك‌است‪.‬‬
‫دادههای ‌پَرت‌‬
‫یافتد ‌که ‌ما ‌ ‌‬
‫کترین ‌همسایه ‌هنگامی ‌اتفاق ‌م ‌‬ ‫یکی ‌از ‌مشکالتِ ‌الگوریتمِ ‌نزدی ‌‬
‫(‪‌ )outliers‬داریم‪‌ .‬اجازه ‌بدهیم ‌با ‌مثالی‪‌ ،‬این ‌موضوع ‌را ‌روشن ‌کنم‪‌ .‬بیایید ‌به ‌مثالِ‌‬
‫ورزشهای ‌ژیمیناستیک ‌و ‌دوی ‌ماراتن‌‬‫‌‬ ‫یخواهیم ‌به ‌‬
‫نبار ‌فقط‌م ‌‬
‫ورزشکارانِ ‌زن ‌برگردیم‪‌.‬ای ‌‬
‫رشتهی‌‬
‫سبکوزن ‌داریم ‌که ‌در ‌ ‌‬‫نگاهی ‌بیندازیم‪‌.‬فرض ‌کنید ‌ما ‌یک ‌ورزشکارِ ‌زنِ ‌قد ‌کوتاه ‌و ‌ ‌‬
‫دادهها ‌را‌بر ‌روی ‌نمودار ‌رسم ‌کنیم‪‌ ،‬چیزی‌‬‫دوی ‌ماراتن ‌شرکت ‌کرده ‌است‪‌.‬اگر ‌بخواهیم ‌ ‌‬
‫یشود ‌(‪‌ m‬به ‌معنای ‌ورزشکارِ ‌دوی ‌ماراتن ‌و ‌‪‌ g‬به ‌معنای ‌ورزشکار‌‬ ‫مانندِ ‌شکل ‌زیر ‌م ‌‬
‫ژیمیناستیک‌است)‪:‬‬
‫‌‬

‫‌‬

‫)‌را‌نمایش‌میدهد‌و‌محور‌افقی‪‌،‬‬
‫‌‬ ‫محور‌لمودی‪‌،‬قد‌نرمالسازی‌شده‌(‪normalized height‬‬
‫‌‬
‫یکنیم‪‌،‬آن‌ورزشکارِ‌‬ ‫وزن‌نرمالسازی‌شده‌(‪‌ ‌.)normalized weight‬‬
‫همانطور‌که‌مشاهده‌م ‌‬ ‫‌‬
‫سبکوزن ‌هم ‌بود‪‌ ،‬در ‌میانِ ‌ورزشکارانِ ‌ژیمیناستیک‌‬
‫دوی ‌ماراتن ‌که ‌قدِ ‌کوتاهی ‌داشت ‌و ‌ ‌‬
‫طبقهی‌‬
‫یخواهیم ‌ ‌‬ ‫خیلی ‌تنها ‌قرار ‌گرفت‪‌‌.‬حاال ‌فرض ‌کنید ‌‪‌ x‬یک ‌ ‌‬
‫نمونهی ‌جدید ‌است ‌که ‌م ‌‬
‫کترین ‌همسایه ‌به ‌‪‌ ،x‬همان ‌ ‌‬
‫دادهی‌‬ ‫طبقهبندی‪‌ ،‬مشخص ‌کنیم‪‌.‬نزدی ‌‬
‫آن ‌را ‌توسط ‌الگوریتمِ ‌ ‌‬
‫یگیرد‪‌.‬ولی‌با‌یک‌نگاهِ‌چشمی‌‬ ‫پَرتِ ‌‪‌m‬است‪‌،‬پس ‌‪‌x‬به‌طبقه‌ی‌«دوی‌مارتن ‌‪‌»m‌-‬تعلق‌م ‌‬
‫یتوانیم ‌بفهمیم ‌که ‌‪‌ x‬بیشتر ‌به ‌یک ‌ورزشکارِ ‌ژیمیناستیک ‌نزدیک ‌است‪‌،‬‬
‫به ‌نمودارِ ‌باال‪‌ ،‬م ‌‬
‫چون‌در‌بینِ‌‪g‬ها‌احاطه‌شده‌است‪.‬‬
‫در‌مورد‌طبقهبندی‌■ ‪126‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫کترین‌همسایه‌(‪)KNN‬‬
‫‪‌K‬نزدی ‌‬
‫کترین‌همسایه‌این‌است ‌که‌به‌جای‌نگاه ‌کردن‌به‌یکی‌از‌‬ ‫راههای‌بهبودِ ‌روشِ‌نزدی ‌‬
‫یکی‌از‌ ‌‬
‫آنها‌هست‪‌،‬به‌چند‌همسایه‌ی‌نزدیک‌از‌یک‌نمونه‪‌،‬نگاه‌کنیم‌–‌‬ ‫کترینِ‌ ‌‬‫همسای‌هها‌که‌نزدی ‌‬
‫یشود‪‌ .‬در ‌روشِ ‌‪‌ KNN‬هر ‌کدام ‌از‌‬ ‫کترین ‌همسایه ‌یا ‌‪‌ KNN‬گفته ‌م ‌‬ ‫به ‌این ‌روش ‌‪‌ k‬نزدی ‌‬
‫یهای ‌همسای‌ههای ‌خود‪‌،‬‬ ‫نمونهها ‌را ‌بر ‌اساسِ ‌را ‌‬
‫همسای‌هها ‌یک ‌رای ‌می‌دهند ‌و ‌الگوریتم ‌ ‌‬
‫طبقهای ‌که ‌بیشترین ‌رای ‌را ‌در ‌میانِ ‌همسای‌هها ‌آورده ‌باشد‪‌،‬‬
‫یکند‪‌.‬در ‌واقع ‌ ‌‬ ‫طبقهبندی ‌م ‌‬
‫‌‬
‫یشود‪‌.‬برای ‌مثال‪‌ ،‬فرض ‌کنید ‌ما ‌از ‌الگوریتمِ‌‬ ‫نمونهی ‌جدید ‌م ‌‬
‫شبینی ‌شده ‌برای ‌ ‌‬ ‫طبقهی ‌پی ‌‬
‫‌‬
‫کترین ‌همسایه ‌(‪‌ )k=3‬استفاده ‌می‌کنیم‪‌ .‬در ‌موردِ ‌مثالِ ‌باال‪‌ ،‬دو ‌رای ‌برای‌‬ ‫سه ‌نزدی ‌‬
‫ژیمیناستیک‌کاران ‌و ‌یک ‌رای ‌برای ‌ورزشکار ‌دوی ‌ماراتن ‌داشتیم‪‌ ،‬پس ‌الگوریتم‪‌ x‌ ،‬را ‌یک‌‬
‫یکند‪.‬‬
‫ورزشکار‌ژیمیناستیک‌معرفی‌م ‌‬
‫‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌111‬‬
‫دادهکاوی‌برای‌ ‌‬

‫طبقهی ‌گسسته ‌(‪‌ )discrete class‬برای ‌مثال‌‬ ‫با ‌این ‌تفاسیر ‌هنگامی ‌که ‌می‌خواهیم ‌یک ‌ ‌‬
‫یتوانیم ‌از ‌این ‌روشِ ‌رای‌گیری‌‬‫شبینی ‌کنیم‪‌ ،‬م ‌‬‫دوی ‌ماراتن‪‌ ،‬ژیمیناستیک ‌یا ‌بسکتبال ‌را ‌پی ‌‬
‫شبینی‌‬ ‫طبقهی‌پی ‌‬
‫استفاده‌کنیم‪‌.‬طبقه‌یا‌کالسی‌که‌بیشترین‌رای‌را‌داشته‌باشد‪‌،‬به‌لنوانِ‌ ‌‬
‫یها ‌مساوی ‌بود‪‌ ،‬طبقه ‌یا‌‬
‫یشود‪‌ .‬اگر ‌تعدادِ ‌را ‌‬
‫شبینی‪‌ ،‬انتخاب ‌م ‌‬
‫نمونهی ‌مورد ‌پی ‌‬
‫شده ‌برای ‌ ‌‬
‫طبقههایی ‌که ‌رایشان ‌مساوی ‌شده ‌است‪‌ ،‬انتخاب‌‬ ‫کالس‪‌ ،‬به ‌صورت ‌تصادفی ‌از ‌بین ‌آن ‌ ‌‬
‫شبینی ‌کنیم‪‌،‬‬ ‫یخواهیم ‌یک ‌مقدارِ ‌لددی ‌(و ‌نه ‌گسسته)‌را ‌پی ‌‬ ‫یشود‪‌.‬ولی ‌هنگامی ‌که ‌م ‌‬ ‫م‌‬
‫شبینی ‌کنیم ‌که ‌یک ‌شخص ‌چه ‌امتیازی ‌به ‌یک ‌گروهِ ‌موسیقی‌‬ ‫مثالً ‌اگر ‌بخواهیم ‌پی ‌‬
‫یها ‌را ‌بین ‌همسای‌هها ‌تقسیم ‌کنیم ‌تا ‌به ‌یک ‌مقدارِ ‌مبتنی ‌بر‌‬ ‫یتوانیم ‌تاثیر ‌را ‌‬
‫یدهد‪‌ ،‬م ‌‬
‫م‌‬
‫وزن‪-‬مسافت ‌(‪‌ )distance-weighted‬برسیم‪‌ .‬یعنی ‌رایِ ‌همسای‌ههای ‌نزدی ‌‬
‫کتر‪‌ ،‬تاثیرِ‌‬
‫یخواهیم‌‬ ‫بیشتری ‌داشته ‌باشد‪‌.‬اجازه ‌بدهید ‌کمی ‌این ‌بحث ‌را ‌بیشتر ‌باز ‌کنم‪‌.‬فرض ‌کنید ‌م ‌‬
‫شبینی ‌کنیم ‌که ‌‪‌ Ben‬چقدر ‌گروهِ ‌موسیقیِ ‌‪‌ Funky Meters‬را ‌دوست ‌دارد‪‌ .‬سه‌‬ ‫پی ‌‬
‫همسای‌هی‌نزدیک‌برای‌‪‌Ben‬نیز‪‌،Tara‌،Sally‌،‬و ‌‪‌Jade‬هستند‪‌.‬در ‌زیر‌ ‌‬
‫فاصلهی‌این‌افراد‌از‌‬
‫گروه ‌موسیقیِ ‌‪‌ ‌ Funky Meters‬‬
‫دادهاند ‌را ‌مشاهده‌‬ ‫‪‌ Ben‬و ‌همچنین ‌امتیازی ‌که ‌ ‌‬
‫آنها ‌به ‌ ِ‌‬
‫یکنید‪:‬‬
‫م‌‬
‫در‌مورد‌طبقهبندی‌■ ‪112‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫‌‬

‫‌‬

‫گروه ‌ ‪Funky‬‬
‫کترین ‌شخص ‌به ‌‪‌ Ben‬است ‌و ‌به ‌ ِ‌‬
‫همانطور ‌که ‌مشخص ‌است‪‌ Sally‌ ،‬نزدی ‌‬
‫‌‬
‫کتر ‌است ‌وزنِ‌‬‫یخواهم ‌به ‌شخصی ‌که ‌به ‌‪‌ Ben‬نزدی ‌‬ ‫‪‌ Meters‬امتیازِ ‌‪‌ ‌ 4‬‬
‫دادهاست‪‌ .‬چون ‌م ‌‬
‫بیشتر ‌بدهم‪‌ ،‬اولین ‌قدم ‌اینست ‌که ‌معیارِ ‌فاصله ‌را ‌طوری ‌تغییر ‌دهم ‌که ‌بیشترین ‌لدد‪‌،‬‬
‫نکار‌‬
‫یگیرد‪‌.‬برای ‌ای ‌‬‫کترین ‌شخص ‌به ‌‪‌ Ben‬باشد ‌یعنی‌بیشترین ‌لدد‪‌ ،‬وزن ‌بیشتری ‌م ‌‬ ‫نزدی ‌‬
‫یتوانیم ‌از ‌معکوسِ ‌فاصله ‌استفاده ‌کنیم ‌(برای ‌این‌کار ‌کافیست ‌لددِ ‌‪‌ 2‬را ‌بر ‌آن ‌فاصله‌‬
‫م‌‬
‫فاصلهاش ‌با ‌‪‌ Ben‬برابر ‌‪‌ 5‬است‪‌ ،‬به ‌صورت ‌زیر‪‌ ،‬معکوسِ‌‬
‫تقسیم ‌کنیم)‪‌.‬مثالً ‌برای ‌‪‌ Sally‬که ‌ ‌‬
‫یشود‪:‬‬ ‫فاصله‪‌،‬محاسبه‌م ‌‬
‫‌‬

‫‌‬

‫‌‬

‫آنها ‌تقسیم ‌کنم ‌(تا ‌نرمال‌‬


‫فاصلههای ‌معکوس ‌شده ‌را ‌بر ‌جمعِ ‌ ‌‬
‫حاال ‌باید ‌هر ‌کدام ‌از ‌این ‌ ‌‬
‫یشود‪.‬‬
‫معکوسها‌برابر‌‪‌1.397‬م ‌‬
‫‌‬ ‫شوند)‪‌.‬جمعِ‌تمامیِ‌‬
‫‪0.2 + 0.1 + 0.067 = 0.367‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌111‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫دو ‌چیز ‌را ‌باید ‌مد ‌نظر ‌داشته‌باشیم‪‌.‬اول ‌اینکه ‌جمعِ ‌تمامیِ ‌مقادیرِ ‌تاثیرات ‌(‪‌)influence‬‬
‫فاصلهی ‌اصلی‪‌ Sally‌ ،‬به ‌میزان ‌‪‌ 1‬برابر ‌بیشتر ‌از ‌‪‌ Tara‬به ‌‪‌Ben‬‬
‫برابرِ ‌‪‌ 2‬شود‪‌.‬ثانیاً ‌در ‌الدادِ ‌ ‌‬
‫آنها ‌نیز ‌حفظ ‌شده ‌است‪‌ .‬یعنی ‌‪‌ Sally‬دو ‌برابر‌‬ ‫نزدیک ‌بود ‌و ‌این ‌نزدیک ‌بودن ‌در ‌تاثیرِ ‌ ‌‬
‫کتر‌بود)‪‌.‬در‌آخر‌ما‌تاثیرِ‌هر‌فرد‌‬ ‫یگذارد‌(چون‌دو‌برابر‌نزدی ‌‬ ‫بیشتر‌از‌‪‌Tara‬بر‌‪‌Ben‬تاثیر‌م ‌‬
‫جهی‌نهایی‌محاسبه‌می‌کنیم‪:‬‬ ‫آنها‌را‌به‌لنوان‌نتی ‌‬‫را‌در‌امتیازِ‌او‌ضرب‌کرده‌و‌مجموعِ‌ ‌‬
‫‌‬
‫یدهد‪‌ :‬‬ ‫امتیازی‌که‌‪‌Ben‬به‌گروهِ‌موسیقیِ‌‪‌Funcky Meters‬م ‌‬
‫‪0.545 4 0.272 5 0.1835‬‬
‫‪2.18 1.36 0.915 4.455‬‬

‫مدادتان‌را‌تیز‌کنید‪:‬‬
‫یخواهم ‌بدانم ‌که ‌‪‌ Sofia‬چقدر ‌گروهِ ‌موسیقیِ ‌‪‌ Hiromi‬را ‌دوست ‌خواهد ‌داشت‪‌.‬با‌‬‫من ‌م ‌‬
‫شبینی‌‬‫کترین‌همسایه‌با‌‪‌،k=3‬چه ‌مقداری ‌را‌پی ‌‬ ‫دادههای‌زیر‌و‌الگوریتمِ‌‪‌k‬نزدی ‌‬
‫توجه‌به‌ ‌‬
‫یکنید؟‬ ‫م‌‬
‫‌‬

‫‌‬
‫در‌مورد‌طبقهبندی‌■ ‪113‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‬
‫فاصلهها ‌را ‌(در ‌ستون‌‬
‫اولین ‌کاری ‌که ‌باید ‌انجام ‌دهیم ‌اینست ‌که ‌معکوسِ ‌هر ‌کدام ‌از ‌ ‌‬
‫‪‌)Inverse Distance‬محاسبه‌کنیم‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫یشود‪‌.‬قدمِ‌بعدی‌این‌است‌که‌تاثیرِ‌هر‌شخص‌را‌‬
‫فاصلهها‌برابر‌‪‌1.475‬م ‌‬
‫مجموعِ‌معکوسِ‌ ‌‬
‫معکوسها‌(در‌ستون‌‪‌)Influence‬محاسبه‌کنیم‪:‬‬
‫‌‬ ‫با‌تقسیم‌معکوسِ‌فاصله‌بر‌جمعِ‌این‌‬
‫‌‬

‫‌‬

‫یکنیم‌و‌‬
‫دادهاند‪‌،‬ضرب‌م ‌‬
‫در‌آخر‪‌،‬تمامیِ‌تاثیرات‌را‌در‌امتیازهایی‌که‌هر‌کدام‌از‌اشخاص‌ ‌‬
‫یکنیم‪:‬‬
‫آنها‌را‌با‌یکدیگر‌جمع‌م ‌‬‫همهی‌ ‌‬
‫‌‬
‫‌‬
‫)‪(0.526 ×3) (0.263×3) (0.211×5‬‬
‫‪1.578 0.789 1.055 3.422‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌114‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دادهی‌جدید‌و‌یک‌چالش‬
‫مجمولهی‌ ‌‬
‫‌‬ ‫یک‌‬
‫مجمولهی ‌داده‌ی‌‬
‫‌‬ ‫دادهی ‌جدید ‌نگاهی ‌بیندازیم‪‌ .‬‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫وقت ‌این ‌شده ‌که ‌به ‌یک ‌‬
‫لهی‌هندی)‌که‌توسط‌مرکزِ‌ملیِ‌دیبایت‪‌،‬گوارش‌و‌‬ ‫یهای‌پیما‌‪(‌Pima-‬یک‌قبی ‌‬ ‫دیبابت‌هند ‌‬
‫جمعآوری‌است‪.‬‬
‫کلی‌هی‌ایاالت‌متحده‌ ‌‬

‫شگفتآوری‪‌ ،‬بیش ‌از ‌‪‌ 31‬درصدِ ‌قبلی‌هی ‌‪‌ Pima‬دیابت ‌دارند‪‌.‬برلکس‪‌ ،‬نرخِ ‌دیابت ‌در‌‬ ‫‌‬ ‫به ‌طرز ‌‬
‫ایاالت‌متحده‌برابر‌‪‌1.3‬درصد‌و‌در‌چین‌برابر‌‪‌4.1‬درصد‌است‪.‬‬
‫انگرِ ‌اطاللاتِ ‌یک ‌زنِ ‌لضوِ‌ ‌قبلی‌هی ‌‪‌ Pima‬باالی ‌سن‌‬
‫مجمولهی ‌داده‪‌ ،‬بی ‌‬
‫‌‬ ‫هر ‌نمونه ‌در ‌این ‌‬
‫طبقهها ‌تعلق ‌دارند‪‌:‬فردی ‌که ‌‪‌ 5‬سال ‌است‌‬
‫آنها ‌به ‌یکی ‌از ‌ ‌‬ ‫‪‌ 12‬سال ‌است ‌و ‌هر ‌کدام ‌از ‌ ‌‬
‫دیابت‌دارد‪‌،‬یا‌فردی‌که‌این‌طور‌نیست‪‌.‬تعدادِ‌‪‌1‬ویژگی‌نیز‌موجود‌است‪:‬‬
‫‌تعداد‌دفعاتی‌که‌این‌شخص‌حامله‌شده‌است‬
‫‌غلظت‌گلوکز‌پالسما‌‪‌1‬سالته‌در‌تست‌تحمل‌قند‌خون‬
‫‌فشارِ‌خون‌دیاستولیک‌(‪)mm Hg‬‬
‫در‌مورد‌طبقهبندی‌■ ‪115‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫چهی‌سه‌سر‌(‪)mm‬‬ ‫‌ضخامتِ‌پوست‌ماهی ‌‬
‫‌انسولین‌سرم‌‪‌1‬سالته‌(‪)mu U/ml‬‬
‫تودهی‌بدنی‌(وزن‌به‌کیلو‌گرم‌تقسیم‌بر‌قد‌به‌متر‌به‌توانِ‌‪)1‬‬ ‫‌شاخص‌ ‌‬
‫نامهی‌دیابت‬
‫شجره ‌‬
‫‌‬ ‫‌تابع‌‬
‫‌سن‌(به‌سال)‬
‫یتوانید ‌در ‌زیر ‌مشاهده ‌کنید ‌(ستونِ ‌آخر ‌طبقه ‌یا ‌کالس ‌را ‌مشخص‌‬
‫دادهها ‌را ‌م ‌‬
‫قسمتی ‌از ‌ ‌‬
‫یکند‪‌1‌،‬به‌معنای‌نداشتنِ‌دیابت‌و‌‪‌2‬به‌معنای‌داشتن‌دیابت‌است)‬ ‫م‌‬
‫‌‬

‫‌‬

‫پس‌برای‌مثال‪‌،‬اولین‌زن‌(در‌شکلِ‌باال)‪‌،‬دو‌بچه‌دارد‪‌،‬دارای‌غلظتِ‌گلوکز‌پالسما‌برابر‌‪‌66‬‬
‫است‪‌،‬فشار‌خونِ‌دیاستولیک‌برابر‌‪‌51‬دارد‌و‌به‌همین‌ترتیب‌تا‌آخر‪.‬‬

‫‌‬

‫کد‌بزنید‌–‌قسمت‌اول‬
‫وبسایتِ ‌ما ‌موجود ‌است‪‌ pimaSmall.zip‌.‬که ‌یک ‌فایل ‌فشرده ‌شامل ‌‪‌211‬‬ ‫دو ‌فایل ‌در ‌ ‌‬
‫دادهها‌بوده‌و‌به‌‪‌21‬فایل‌تقسیم‌شده‌است‌(‪‌21‬سطلِ‌جدا‌برای‌لمل‌التبارسنجیِ‌‬ ‫نمونه‌از‌ ‌‬
‫تکهای)‪‌ .‬و ‌همچنین ‌فایلِ ‌‪‌ pima.zip‬که ‌فایلِ ‌کامل‪‌ ،‬شامل ‌‪‌ 363‬نمونه ‌است‪‌.‬‬
‫متقابلِ ‌‪‌ 21-‬‬
‫کترین‌‬ ‫دادهی ‌‪‌ pimaSmall‬همراه ‌با ‌الگوریتمِ ‌ ‌‬
‫طبقهبندِ ‌نزدی ‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬ ‫هنگامی ‌که ‌از ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌119‬‬
‫دادهکاوی‌برای‌ ‌‬

‫تکهای ‌استفاده‌‬
‫همسایه ‌(که ‌در ‌فصل ‌قبلی ‌ساختیم) ‌همراه ‌با ‌التبارسنجیِ ‌متقابلِ ‌‪‌ -21‬‬
‫یرسم‪:‬‬‫یکنم‪‌،‬به‌نتایج‌زیر‌م ‌‬
‫م‌‬
‫‌‬

‫‌‬

‫برمیگرداند) ‌‬
‫ترین‌آیتمها‌را‌ ‌‬
‫‌‬ ‫‌‬
‫کوچک‬‫(تابع‌)‪‌heapq.nsmallest(n, list‬لیستی‌از‌‪‌n‬‬

‫حاال‌این‌تکلیفِ‌شماست‪:‬‬
‫ادهسازی ‌کنید‪‌.‬‬‫وبسایت ‌دانلود ‌کرده ‌و ‌الگوریتم ‌‪‌ KNN‬را ‌پی ‌‬ ‫طبقهبندی ‌را ‌از ‌ ‌‬
‫کدِ ‌الگوریتمِ ‌ ‌‬
‫اجازه ‌دهید ‌ما ‌تابع ‌اولیه ‌(‪‌)initializer‬را ‌تغییر ‌دهیم ‌تا ‌این‌تابع‌بتواند ‌آرگومانِ ‌‪‌ k‬را ‌هم‌‬
‫بپذیرد‪:‬‬
‫‌‬
‫‪def __init__(self, bucketPrefix, testBucketNumber, dataFormat, k):‬‬

‫یشود‪:‬‬
‫تابع‌چیزی‌شبیه‌به‌شکل‌زیر‌م ‌‬
‫‌‬
‫‪def knn(self, itemVector):‬‬

‫این ‌تابع ‌بهتر ‌است ‌از ‌‪‌ self.k‬استفاده ‌کند ‌(یادتان ‌باشد ‌که ‌مقدار ‌‪‌ k‬را ‌در ‌تابعِ ‌‪‌init‬‬
‫طبقهی‌مربوطه ‌(‪‌1‬و‌‪‌2‬برای‌دیابتی‌نبودن‌و‌دیبابتی‌‬ ‫مقداردهی ‌کنید)‌و‌در‌نهایت‌بایستی‌ ‌‬
‫بودن)‌را ‌برگرداند‪‌.‬البته ‌باید ‌تابعِ ‌‪‌ tenfold‬را ‌نیز ‌تغییر ‌داده‌تا ‌بتوانید ‌‪‌ k‬را ‌به ‌‪‌initializer‬‬
‫ارجاع‌دهید‪.‬‬
‫‌‬
‫‌‬
‫‌‬
117 ■‌‫در‌مورد‌طبقهبندی‬
‌ ‌‫‌کمی‌بیشتر‬.5‌‫‌فصل‬

‌ ‌–‌‫کد‌بزنید‬
‫راهحل‬
‌ ‫__‌را‌به‌صورت‌زیر‌تغییر‌م‬init__‌ِ‫تابع‬
:‫یدهم‬


:knn‌ِ‫و‌حاال‌تابع‬

def knn(self, itemVector):
"""returns the predicted class of itemVector using k
Nearest Neighbors"""
# changed from min to heapq.nsmallest to get the
# k closest neighbors
neighbors = heapq.nsmallest(self.k,
[(self.manhattan(itemVector, item[1]), item)
for item in self.data])
# each neighbor gets a vote
results = {}
for neighbor in neighbors:
theClass = neighbor[1][0]
results.setdefault(theClass, 0)
results[theClass] += 1
resultList = sorted([(i[1], i[0]) for i in results.i
tems()],
reverse=True)
#get all the classes that have the maximum votes
maxVotes = resultList[0][0]
possibleAnswers = [i[1] for i in resultList if i[0]
== maxVotes]
# randomly select one of the classes that received t
he max votes
answer = random.choice(possibleAnswers)
return( answer)

‌ ‫‌را‌هم‌کمی‌تغییر‌م‬tenfold‌ِ‫تابع‬
:‫یدهیم‬

def tenfold(bucketPrefix, dataFormat, k):


results = {}
for i in range(1, 11):
c = Classifier(bucketPrefix, i, dataFormat, k)
‫برنامهنویسان‬ ‫‪‌ ■‌111‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‪...‬‬

‫یتوانید ‌کدِ ‌کامل ‌را ‌از ‌سایتِ ‌‪‌ guidetodatamining.com‬و ‌یا ‌‪‌ chistio.ir‬دانلود ‌کنید‪‌.‬‬
‫م‌‬
‫ادهسازیِ‌این‌تابع‌است‌و‌لزوماً‌بهترین‌راه‌نیست‪.‬‬
‫راههای‌پی ‌‬
‫یادتان‌باشد‌که‌این‌فقط‌یکی‌از‌ ‌‬

‫کد‌بزنید‌–‌قسمتِ‌دوم‬
‫دادههای ‌بیشتری ‌داشته ‌باشیم ‌(با ‌توجه ‌به ‌نتایج ‌به‌‬ ‫نکه ‌ ‌‬
‫کدام ‌تاثیرِ ‌بیشتری ‌دارد؟ ‌ای ‌‬
‫دست ‌آمده ‌از ‌‪‌ pimaSmall‬و ‌‪‌)pima‬یا ‌ای ‌‬
‫نکه ‌الگوریتمِ ‌بهتری ‌داشته ‌باشیم ‌(با ‌توجه ‌به‌‬
‫‪‌k=1‬تا‌‪)k=3‬؟‬

‫کد‌بزنید‪‌-‬قسمت‌دوم‌–‌راه‌حل‬
‫یکنید‪:‬‬
‫در‌شکلِ‌زیر‌دقتِ‌به‌دست‌آمده‪‌،‬برای‌مقادیر‌مختلف‌را‌مشاهده‌م ‌‬
‫‌‬

‫‌‬
‫‌‬
‫یدهد ‌تا‌‬
‫دادهها‪‌ ،‬بسیار ‌بیشتر ‌دقت ‌را ‌افزایش ‌م ‌‬
‫یرسد ‌که ‌سه ‌برابر ‌کردنِ ‌ ‌‬‫پس ‌به ‌نظر ‌م ‌‬
‫نهتر‌کنیم‪.‬‬
‫نکه‌الگوریتم‌را‌بهی ‌‬ ‫ای ‌‬
‫‌‬

‫‌‬
‫در‌مورد‌طبقهبندی‌■ ‪116‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫مدادتان‌را‌تیز‌کنید‬
‫یرسد‪‌.‬ولی ‌آیا ‌واقعاً ‌این ‌طور ‌است؟ ‌آمارِ ‌کاپا ‌را ‌برای ‌این‌‬
‫خب!‌‪‌%71.526‬به ‌نظر ‌خوب ‌م ‌‬
‫نتایج‌حساب‌کنید‪:‬‬
‫‌‬

‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‬
‫‌‬

‫‌‬
‫نسبت‌را‌نشان‌میدهد) ‌‬
‫‌‬ ‫(سطر‌‪‌ratio‬‬
‫‌‬
‫طبقهبندِ‌تصادفی‌(‪:)random (r) classifier‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌131‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬
‫‌‬
‫دقت‌(‪‌ :)accuracy‬‬

‫‌‬

‫طبقهبند‪‌ ،‬لملکرد ‌نسبتاً ‌خوب ‌(و ‌نه ‌خیلی ‌خوبی) ‌داشته‌‬


‫یشویم ‌که ‌این ‌ ‌‬
‫پس ‌متوجه ‌م ‌‬
‫اس ت ‪.‬‬

‫‌‬

‫تمهای‌بهتر‌و‌یک‌اتوبوسِ‌خراب‬
‫دادههای‌بیشتر‪‌،‬الگوری ‌‬
‫‌‬
‫چند‌سال‌پیش‪‌،‬در‌کنفرانسی‌در‌مکزیکوسیتی‌بودم‪‌.‬این‌کنفرانس‌تقریباً‌یک‌کنفرانس‌غیر‌‬
‫یرفتیم‌‬ ‫یشد ‌و ‌روز ‌دیگر ‌بایستی ‌به ‌تور ‌م ‌‬‫ارائهها ‌سپری ‌م ‌‬
‫معمول ‌بود ‌چون‌یک ‌روزِ ‌آن ‌به ‌ ‌‬
‫خرابههای ‌‪‌ Inca‬و‪‌ .)...‬روزی ‌که ‌در ‌تور ‌بودیم ‌بایستی ‌مسافتِ ‌زیادی ‌را ‌با‌‬‫(دشتِ ‌سلطان‪‌ ‌ ،‬‬
‫لدهای ‌از ‌ما ‌که ‌‪‌PhD‬‬‫یرفتیم ‌و ‌اتوبوس‌هم‌زیاد‌حالِ‌خوشی‌نداشت‪‌.‬در ‌نتیجه‪‌ ‌ ،‬‬ ‫اتوبوس ‌م ‌‬
‫داشتیم ‌کنار ‌جاده ‌ایستادیم ‌و ‌با ‌یکدیگر ‌صحبت ‌کردیم ‌تا ‌اتوبوس ‌تعمیر ‌شود‪‌.‬این ‌تبادالتِ‌‬
‫جادهای‪‌ ،‬نقطه‌ی ‌لطفی ‌در ‌این ‌کنفرانس ‌برای ‌من ‌بود‪‌.‬یکی ‌از ‌افرادی ‌که ‌با ‌او ‌صحبت‌‬ ‫کنارِ ‌ ‌‬
‫نرمافزاری ‌به ‌اسمِ ‌‪‌Brill tagger‬‬‫توسعهی ‌ ‌‬
‫‌‬ ‫کردم ‌شخصی ‌به ‌نامِ ‌‪‌ Eric Brill‬بود‪‌.‬او ‌به ‌خاطر ‌‬
‫برچسبزنیِ ‌اجزای ‌زبان ‌( ‪Part of‬‬
‫‌‬ ‫زنندهی ‌‪‌ )Brill‬شهرت ‌داشت ‌که ‌لملیاتِ ‌‬ ‫(برچسب ‌ ‌‬
‫‪‌ )Speech‬را ‌انجام ‌می‌داد‪‌ .‬شبیه ‌به ‌کاری ‌که ‌ما ‌در ‌این ‌چند ‌فصل ‌انجام ‌دادیم‪‌،‬‬
‫یکرد ‌– ‌در ‌این ‌مورد‪‌ ،‬او ‌کلمات ‌را ‌بر ‌اساس‌‬ ‫طبقهبندی ‌م ‌‬ ‫زنندهی ‌‪‌ ‌ ،Brill‬‬
‫دادهها ‌را ‌ ‌‬ ‫برچسب ‌‬
‫‌‬
‫در‌مورد‌طبقهبندی‌■ ‪132‬‬
‫‌‬ ‫‌فصل‌‪‌.5‬کمی‌بیشتر‌‬

‫طبقهبندی ‌می‌کرد‪‌.‬الگوریتمِ ‌ارائه ‌شده ‌توسطِ‌‬‫یزد ‌و ‌ ‌‬ ‫اجزای ‌زبان ‌(اسم‪‌ ،‬فعل‪‌ ،‬و‪‌)...‬برچسب ‌م ‌‬
‫تمهای‌قبلی‌در‌همان‌حوزه‌کارکرد‌داشت‌(و‌به‌همین‌خاطر‌‪‌Brill‬در‌‬ ‫او‌خیلی‌بهتر‌از‌الگوری ‌‬
‫حوزهی ‌پردازش ‌زبانِ ‌طبیعی ‌(‪‌ )NLP‬به ‌شهرت ‌رسیده ‌بود)‪‌ .‬در ‌کنارِ ‌جاده‪‌ ،‬با ‌‪‌Eric Brill‬‬ ‫‌‬
‫تمها ‌صحبت ‌کردم‪‌ .‬از ‌نقطه ‌نظرِ ‌او‪‌ ،‬با ‌اضافه ‌کردنِ ‌بیشترِ‌‬ ‫دربارهی ‌بهبودِ ‌لملکردِ ‌الگوری ‌‬
‫‌‬
‫یکنید ‌تا ‌این‌که ‌بخواهید‌‬ ‫مجمولهی ‌آموزشی‪‌ ،‬شما ‌به ‌نتایجِ ‌بهتری ‌دست ‌پیدا ‌م ‌‬
‫‌‬ ‫دادهها ‌در ‌‬
‫‌‬
‫برچسبزنیِ‌‬
‫‌‬ ‫یکرد ‌که ‌اگر ‌همان ‌الگوریتمِ ‌‬
‫الگوریتمتان ‌را ‌بهبود ‌دهید‪‌.‬در ‌واقع‪‌ ،‬او ‌احساس ‌م ‌‬
‫دادههای ‌آموزشی ‌را ‌افزایش ‌دهد‪‌،‬‬ ‫اجزای ‌زبان ‌(‪‌)Part of Speech‬را ‌نگه ‌دارد ‌و ‌فقط ‌تعدادِ ‌ ‌‬
‫یتوانید‌‬
‫یگفت‪‌،‬شما‌نم ‌‬ ‫بهبودِ‌بیشتری‌نسبت‌به‌الگویتمِ‌مشهورش‌رخ‌خواهد‌داد‪‌.‬البته‌که‌م ‌‬
‫میتوانید!‬‫دادههای‌بیشتر‌‪‌PhD‬بگیرید‌ولی‌با‌بهبودِ‌یک‌الگوریتم‌ ‌‬ ‫فقط‌با‌جمع‌کردنِ‌ ‌‬
‫ترجمهی‌ماشینی‌(که‌کامپیوتر‌لملیاتِ‌ترجمه‌را‌انجام‌‬ ‫‌‬ ‫یک‌مثالِ‌دیگر‪‌.‬در‌مسابقاتِ‌مختلفِ‌‬
‫آدمهای ‌با ‌استعداد ‌و ‌باهوشی‌‬‫یایستد‪‌.‬قبول‌دارم‌گوگل‪‌ ‌ ،‬‬ ‫یدهد)‪‌ ،‬گوگل ‌معموالً ‌در ‌صدر ‌م ‌‬ ‫م‌‬
‫طرهی ‌گوگل‪‌ ،‬به ‌خاطرِ‌‬ ‫تمهایش ‌دارد‪‌ ،‬اما ‌قسمت ‌زیادی ‌از ‌این ‌سی ‌‬ ‫توسعهی ‌الگوری ‌‬
‫‌‬ ‫برای ‌‬
‫جمعآوری‌کرده‌است‪.‬‬ ‫دادهی‌بسیار‌بزرگی‌است‌که‌از‌سراسر‌وب‌ ‌‬ ‫مجمولهی‌ ‌‬
‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫همانطور ‌که ‌دیدیم‪‌،‬‬
‫منظورم ‌این ‌نیست ‌که ‌بهترین ‌الگوریتم ‌را ‌برای ‌کارتان ‌انتخاب ‌نکنید‪‌ ‌.‬‬
‫انتخابِ‌الگوریتمِ‌مناسب‌بالثِ‌بهبودِ‌زیادی‌خواهد‌شد‪‌.‬ولی ‌در‌لین‌حال‪‌،‬اگر‌بخواهید‌یک‌‬
‫مقالهی‌للمی)‌ارزشش‌را‌ندارد‌که‌وقتتان‌را‌خیلی‌‬ ‫مسئله‌را‌حل‌کنید‌(به‌جای‌انتشارِ‌یک‌ ‌‬
‫صرفِ ‌تحقیق ‌و ‌انتخابِ ‌الگوریتم ‌مناسب‌کنید‪‌ .‬بهتر ‌است ‌وقتتان ‌را ‌صرف ‌به ‌دست ‌آوردنِ‌‬
‫دادههای‌بیشتر‌کنید‪.‬‬
‫‌‬
‫دادهها ‌صحبت ‌کردم‪‌ ،‬راهم ‌را ‌با ‌معرفی‌‬
‫نکه ‌در ‌موردِ ‌اهمیتِ ‌به ‌دست ‌آوردنِ ‌ ‌‬ ‫با ‌ای ‌‬
‫تمهای‌جدید‌در‌فصولِ‌آینده‌ادامه‌خواهم‌داد! ‌‬ ‫الگوری ‌‬

‫میشود‪:‬‬ ‫معموالً‌‌از‌الگوریتمِ‌‪‌KNN‬برای‌ ‌‬
‫طبقهبندیِ‌مسائلِ‌زیر‌استفاده‌ ‌‬
‫پیشنهادِ‌محصولِ‌جدید‌در‌سایتی‌مانند‌آمازون‬
‫ارزیابیِ‌ریسک‌التباریِ‌یک‌مشتری‬
‫برنامهنویسان‬ ‫‪‌ ■‌131‬‬
‫دادهکاوی‌برای‌ ‌‬

‫طبقهبندی‌پوشش‌زمین‌با‌استفاده‌از‌تحلیل‌تصاویر‬
‫‌‬
‫تشخیص‌چهره‬
‫تشخیص‌جنسیتِ‌افراد‌در‌تصویر‬
‫پیشنهادِ‌صفحاتِ‌وب‬
‫بستههای‌تفریحی‌و‌مسافرتی ‌‬‫پیشنهادِ‌ ‌‬
‫‌‬
‫فصل ‪ .0‬بِيز ساده‬
‫احتماالت و بيز ساده (‪)Naïve Bayes‬‬

‫‌‬
‫اجازه‌بدهید‌برای‌بارِ‌چندم‪‌،‬به‌مثالِ‌ورزشکارانِ‌زن‌برگردیم‪‌.‬فرض ‌کنید‌از‌شما‌سوال ‌کنم‌‬
‫یدهد ‌(ژیمیناستیک‪‌ ،‬دوی ‌ماراتن ‌یا ‌بسکتبال)‌‬ ‫که ‌‪‌ Brittney Griner‬چه ‌ورزشی ‌را ‌انجام ‌م ‌‬
‫و‌به‌شما‌این‌اطاللات‌را‌بدهم‌که‌او‌‪‌9‬فوت‌و‌‪‌1‬اینچ ‌قد‪‌،‬و ‌‪‌117‬پوند‌وزن‌دارد‪‌.‬تصورِ‌من‌‬
‫این‌است‌که‌شما‌بسکتبال‌را‌انتخاب‌می‌کنید‌و‌اگر‌از‌شما‌بپرسم‌که‌چقدر‌از‌انتخابِ‌خود‌‬
‫اطمینان‌دارید؟‌احتماالً‌بگویید‌«تقریباً‌مطمئنم»‪.‬‬
‫یپرسم ‌که ‌‪(‌ Heather Zurich‬که ‌در ‌تصویر ‌مشخص‌‬ ‫حاال ‌از ‌شما ‌م ‌‬
‫است)‌چه ‌ورزشی ‌را ‌انجام ‌می‌دهد؟ ‌او ‌‪‌ 9‬فوت ‌و ‌‪‌ 2‬اینچ ‌قد ‌و ‌‪‌ 279‬پوند‌‬
‫وزن ‌دارد‪‌.‬االن ‌دقیقاً ‌نمی‌دانم ‌که ‌شما ‌چه ‌پاسخی ‌خواهید ‌داد‪‌.‬ممکن‌‬
‫است‌بگویید‌بازیکن‌بسکتبال‌است‌و‌اگر‌بپرسم‌که‌چقدر‌از‌این‌انتخاب‌‬
‫مطمئن‌هستید‪‌،‬اطمینانِ‌کمتری‌نسبت‌به‌انتخابِ‌‌قبلی‌یعنی ‪Brittney‬‬
‫‪‌ Griner‬خواهید ‌داشت‪‌ .‬این ‌شخص ‌ممکن ‌است ‌یک ‌ورزشکارِ ‌دوی‌‬
‫ماراتن‌با‌قدی‌نسبتاً‌بلند‌برای‌این‌رشته‌باشد‪.‬‬
‫نهایتاً ‌از ‌شما ‌می‌پرسم ‌که ‌‪‌ Yumiko Hara‬در ‌کدام ‌ ‌‬
‫رشتهی ‌ورزشی‪‌،‬‬
‫بازی ‌می‌کند؟ ‌او ‌‪‌ 5‬فوت ‌و ‌‪‌ 4‬اینچ ‌قد ‌و ‌‪‌ 65‬پوند ‌وزن ‌دارد‪‌.‬فرض ‌کنید‌‬
‫شما ‌ورزشِ ‌ژیمیناستیک ‌را ‌انتخاب ‌می‌کنید ‌و ‌باز ‌هم ‌من ‌از ‌شما ‌سوال‌‬

‫‪233‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌134‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یکنم ‌که ‌چقدر ‌از ‌انتخابِ ‌خود ‌اطمینان ‌دارید‪‌ .‬ممکن ‌است ‌شما ‌چیزی ‌معادلِ ‌«خیلی‌‬ ‫م‌‬
‫مطمئن‌نیستم»‌را‌به‌من‌پاسخ‌دهید‪‌.‬چند‌ورزشکارِ‌دوی‌ماراتن‌نیز‌قد‌و‌وزنی‌شبیه‌به‌این‌‬
‫داشتهاند‪.‬‬
‫‌‬
‫یتوان‌‬ ‫کترین ‌همسایه ‌(‪‌)nearest neighbor‬نم ‌‬ ‫تمهای ‌نزدی ‌‬ ‫خانوادهی ‌الگوری ‌‬
‫‌‬ ‫با ‌استفاده ‌از ‌‬
‫روشهای‌‬‫طبقهبندی ‌را ‌محاسبه ‌کرد‪‌ .‬در ‌این ‌حالی ‌است ‌که ‌با ‌ ‌‬ ‫به ‌سادگی‪‌ ،‬اطمینانِ ‌ ‌‬
‫یتوانیم‌‬‫روشهای ‌بیزین ‌(‪‌ –‌ )Bayesian‬نه ‌تنها ‌م ‌‬
‫طبقهبندیِ ‌مبتنی ‌بر ‌احتماالت ‌– ‌مانند ‌ ‌‬ ‫‌‬
‫یهای ‌احتمالی ‌( ‪probabilistic‬‬ ‫طبقهبند ‌‬
‫یتوانیم ‌ ‌‬ ‫طبقهبندی ‌را ‌انجام ‌دهیم‪‌ ،‬بلکه ‌م ‌‬ ‫‌‬
‫‪‌)classifications‬را ‌نیز ‌در ‌اختیار ‌داشته ‌باشیم‪‌.‬مثالً ‌بگوییم ‌این ‌ورزشکار‪‌ ،‬به ‌احتمالِ ‌‪‌11‬‬
‫نکه ‌بگوییم ‌این ‌بیمار ‌به ‌احتمال ‌‪‌ 41‬درصد ‌در ‌پنج ‌سالِ‌‬‫درصد ‌بازیکنِ ‌بسکتبال ‌است‪‌.‬یا ‌ای ‌‬
‫آینده ‌به ‌بیماریِ ‌دیابت ‌مبتال ‌خواهد ‌شد‪‌.‬یا ‌مثالً‪‌ ،‬احتمال ‌بارش ‌باران ‌در ‌شهرِ ‌الس ‌کروسز‌‬
‫(‪‌ )Las Cruces‬در ‌بیست ‌و ‌چهار‌‬
‫سالتِ‌آینده‪‌،‬برابر‌‪‌21‬درصد‌است‪.‬‬
‫کترین‌‬‫روشهای ‌مبتنی ‌بر ‌نزدی ‌‬ ‫‌‬
‫روشهای ‌تنبل ‌( ‪lazy‬‬ ‫همسایه ‌به ‌ ‌‬
‫‪‌)learners‬معروف‌هستند‪‌.‬دلیل‌تنبل‌‬
‫بودنِ ‌این ‌روش‌ها ‌این ‌است ‌که ‌وقتی‌‬
‫میدهیم‪‌،‬‬‫یک ‌مجموله ‌داده ‌به ‌آن‌ها ‌ ‌‬
‫آنها ‌فقط ‌این‌‬ ‫به ‌صورت ‌ساده‪‌ ‌ ،‬‬
‫یکنند ‌(یعنی ‌فقط ‌خودِ ‌مجموله‌ی ‌داده ‌را ‌بدون‌ساخت‌مدلِ‌‬ ‫مجمولهی ‌داده ‌را ‌ذخیره ‌م ‌‬
‫‌‬
‫طبقهبندیِ ‌جدید ‌انجام ‌دهیم‪‌ ،‬این‌‬
‫یسپارند)‪‌.‬و ‌هر ‌موقع ‌که ‌بخواهیم ‌یک ‌ ‌‬ ‫خاصی‪‌ ،‬به ‌یاد ‌م ‌‬
‫تمهای ‌تنبل ‌بایستی ‌تمامیِ ‌مجموله‌ی ‌داده ‌را ‌بررسی ‌کنند‪‌ .‬مثالً ‌اگر ‌‪‌ 211‬هزار‌‬ ‫الگوری ‌‬
‫دادههای‌‬
‫قطعهی ‌موسیقی ‌در ‌مجموله ‌ ‌‬ ‫‌‬
‫روشها ‌بایستی‌‬‫آموزشی ‌داشته ‌باشیم‪‌ ،‬این ‌ ‌‬
‫تمامیِ ‌این ‌‪‌ 211‬هزار ‌قطعه ‌را ‌برای ‌هر ‌بار‌‬
‫طبقهبندی‪‌،‬جستجو‌کنند‪.‬‬‫‌‬
‫روشهای‌بیزین‌(‪‌،)Bayesian‬‬ ‫اما‌در‌مقابل‪‌ ‌،‬‬
‫روشهای ‌مشتاق ‌(‪‌)eager learners‬‬ ‫به ‌ ‌‬
‫معروف ‌هستند‪‌.‬هنگامی ‌که ‌یک ‌مجموله‌ی‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪135‬‬

‫دادهها ‌را ‌تحلیل ‌کرده ‌و ‌یک‌‬


‫روشها‪‌ ،‬فوراً ‌ ‌‬
‫یدهیم‪‌ ،‬این ‌ ‌‬
‫رندهی ‌مشتاق‌م ‌‬
‫داده ‌را ‌به ‌یک ‌یادگی ‌‬
‫طبقهبندی‌کنند‪‌،‬از‌این‌‬
‫روشها‌بخواهند‌یک‌نمونه‌را‌ ‌‬ ‫یسازند‪‌.‬حال‌اگر‌این‌ ‌‬ ‫دادهها‌م ‌‬
‫مُدل‌از‌ ‌‬
‫بندی‌را‌انجام‌میدهند‪‌.‬برای‌همین‌‬
‫‌‬ ‫‌‬
‫کرده‌و‌لملیات‌طبقه‬ ‫مدلِ‌از‌پیش‌ساخته‌شده‌استفاده‌‬
‫طبقهبندی‌کنند‪.‬‬
‫نمونههای‌جدید‌را‌ ‌‬‫یتوانند‌ ‌‬ ‫روشها‪‌،‬با‌سرلتِ‌بیشتری‌م ‌‬
‫این‌ ‌‬
‫تواناییِ‌طبقه‌بندیِ‌احتمالی‪‌،‬و‌همچنین‌یادگیریِ‌مشتاق‪‌،‬دو‌مزیت‌برای‌روش‌هیا‌ی‌بیی‌زین‪‌،‬‬
‫یشوند‪.‬‬
‫شمرده‌م ‌‬
‫‌‬

‫احتماالت‬
‫یاندازیم‌‬
‫فرضِ ‌من ‌این ‌است ‌که ‌شما ‌یک ‌دانشِ ‌کمی ‌در ‌موردِ ‌احتماالت ‌دارید‪‌.‬یک ‌سکه ‌م ‌‬
‫یاندازیم‪‌ ،‬احتمالِ‌‬
‫نکه ‌شیر ‌بیاید ‌چقدر ‌است؟ ‌یک ‌تاس ‌(‪‌ 2‬تا ‌‪‌)9‬م ‌‬‫(شیر ‌یا ‌خط)‪‌.‬احتمالِ ‌ای ‌‬
‫نکه ‌لددِ ‌‪‌ 2‬بیاید ‌چقدر ‌است؟ ‌منظورم‌از‌احتمال‪‌،‬این ‌جور ‌چیزهاست‪‌.‬یک ‌فردِ ‌‪‌ 26‬ساله‌‬ ‫ای ‌‬
‫یخواهم ‌به ‌من ‌بگویید ‌که ‌با ‌احتمالِ ‌چند ‌درصد‪‌ ،‬این ‌فرد‪‌،‬‬‫یکنم ‌و ‌از ‌شما ‌م ‌‬‫را ‌انتخاب ‌م ‌‬
‫مثالهایی ‌از ‌احتماالتِ ‌پیشین ‌( ‪prior‬‬
‫نها‪‌ ‌ ،‬‬‫مونث ‌است‪‌.‬شما ‌خواهید ‌گفت ‌‪‌ 51‬درصد‪‌.‬ای ‌‬
‫یشوند‌–‌یعنی‌احتمالِ‌فرضی‌هی‌‪.h‬‬ ‫‪‌)probability‬بودند‌که‌با‌)‪‌P(h‬مشخص‌م ‌‬
‫پس‌مثالً‌برای‌یک‌سکه‪:‬‬
‫احتمال‌شیر‌آمدن‌=‌‪P(heads) = 0.5‬‬
‫نکه‌لددِ‌‪‌2‬بیاید‪:‬‬‫برای‌یک‌تاسِ‌‪‌9‬تایی‪‌،‬احتمال‌ای ‌‬
‫‪P(1) = 1/6‬‬
‫اینکه‌‬
‫اگر‌یک‌جمعیت‌از‌افرادِ‌‪‌26‬ساله‪‌،‬به‌صورت‌مساوی‌مرد‌یا‌زن‌داشته‌باشیم‪‌.‬احتمالِ‌ ‌‬
‫نفرِ‌انتخاب‌شده‌مونث‌باشد‪:‬‬
‫‪P(female) = 0.5‬‬
‫‌‬
‫یکنم‪‌.‬این‌شخص‌‬ ‫حاال‌فرض‌کنید‌بگویم‌از‌میان‌جمعتی‌از‌زنان‌و‌مردان‪‌،‬یکی‌را‌انتخاب‌م ‌‬
‫مدرسهی ‌‪‌ Frank Lloyd Wright‬در ‌شهرِ ‌آریزونا ‌است‪‌.‬شما ‌با ‌یک‌‬
‫‌‬ ‫دانشجوی ‌معماری ‌در ‌‬
‫یشوید ‌که ‌در ‌این ‌مدرسه‪‌ 19‌ ،‬درصدِ ‌دانشجویان ‌مونث ‌و ‌‪‌24‬‬
‫جستجوی ‌گوگل‪‌ ،‬متوجه ‌م ‌‬
‫درصدِ ‌دانشجویان ‌مذکر ‌هستند‪‌ .‬پس ‌می‌گویید ‌احتمالِ ‌این‌که ‌این ‌شخصِ ‌انتخاب ‌شده‪‌،‬‬
‫مونث‌باشد‪‌19‌،‬درصد‌است‌(نه‌‪‌51‬درصد)‪.‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌139‬‬
‫دادهکاوی‌برای‌ ‌‬

‫مشاهدهی‌‬
‫‌‬ ‫میگوییم– ‌یعنی ‌احتمالِ ‌فرضی‌هی ‌‪‌ h‬با ‌‬
‫این ‌چیزیست ‌که ‌ما ‌به ‌آن ‌)‪‌ ‌ P(h | D‬‬
‫دادهی‌‪‌ .D‬‬
‫‌‬
‫برای‌مثال‪‌ :‬‬

‫‪‌ P(female | attends Frank Lloyd Wright School) = 0.86‬‬


‫نکه‌یک‌شخص‌مونث‌(‪‌)female‬باشد‪‌،‬با‌فرضِ‌اینکه‌بدانیم‌این‌شخص‌‬ ‫(یعنی‌احتمال‌ای ‌‬
‫دانشجوی‌مدرسه‌ی‌‪‌Frank Lloyd Wright‬است)‬
‫‌‬
‫فرمولِ‌کلی‌به‌صورت‌زیر‌است‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫یک‌مثال‬
‫لپتاپ ‌(‪‌ )laptop‬و ‌تلفنِ ‌همراهشان ‌(‪‌ )phone‬را‌‬
‫در ‌زیر ‌لیستی ‌از ‌افراد ‌به ‌همراه ‌نوع ‌ ‌‬
‫آوردهام‪:‬‬
‫‌‬
‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪137‬‬

‫‌‬
‫‌‬
‫احتمال‌این‌که‌یک‌شخص‪‌،‬که‌به‌صورتِ‌تصادفی‌انتخیاب‌‌شیده‌‌اسیت‪‌‌،‬از‌‪‌iPhone‬اسیتفاده‌‌‬
‫کند‌چقدر‌است؟‬
‫تعدادِ‌‪‌5‬کاربر‌دارای‌‪‌iPhone‬در‌جدول‌هستند‌و‌تعداد‌کلِ‌کاربران‌نیز‌‪‌21‬نفر‌است‪‌.‬پس‪:‬‬
‫‌‬

‫‌‬

‫حال‌احتمالِ‌این‌که‌یک‌شخص‪‌،‬کیه‌‌بیه‌‌صیورتِ‌‌تصیادف‌ی‌انتخیاب‌‌شیده‌‌اسیت‪‌‌،‬از‌‪‌iPhone‬‬
‫لپتاپِ‌او‌‪‌Mac‬است‪‌،‬چیست؟‬ ‫استفاده‌کند‪‌،‬با‌این‌شرط‌که‌بدانیم‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌131‬‬
‫دادهکاوی‌برای‌ ‌‬

‫اوالً‌تعدادِ‌‪‌4‬نفر‌وجود‌دارند‌که‌هم‌‪‌Mac‬دارند‌و‌هم‌‪‌.iPhone‬پس‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫و‌احتمالِ‌این‌که‌یک‌شخص‌که‌به‌صورتِ‌تصادفی‌انتخاب‌شده‌باشد‪‌،‬لپ‌تیاپ‌‌‪‌Mac‬داشیته‌‌‬
‫یشود‪:‬‬‫باشد‌به‌صورت‌زیر‌محاسبه‌م ‌‬
‫‌‬

‫‌‬
‫‌‬
‫پس‌احتمالِ‌این‌که‌آن‌شخصِ‌انتخاب‌شده‪‌،‬دارای‌‪‌iPhone‬باشد‌در‌حالی‌که‌بدانیم‌لپِ‌تاپِ‌‬
‫یشود‪:‬‬‫او‌‪‌Mac‬است‪‌،‬به‌صورت‌زیر‌محاسبه‌م ‌‬
‫‌‬

‫‌‬

‫البته‌این‌تعریفِ‌رسمیِ‌احتمالِ‌پسین‌(‪‌)posterior probability‬اسیت‌‪‌.‬بعضی‌ی‌اوقیات‌‌کیه‌‌‬
‫یکنیم‪:‬‬‫ادهسازی‌کنیم‪‌،‬فقط‌از‌تعداد‌(به‌صورتِ‌خام)‌استفاده‌م ‌‬
‫بخواهیم‌این‌فرمول‌را‌پی ‌‬
‫‌‬

‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪136‬‬

‫مدادتان‌را‌تیز‌کنید‬
‫نکه‌شخصی‌دارای‌‪‌Mac‬باشد‪‌،‬به‌شرطی‌که‌بدانیم‌او‌‪‌iPhone‬دارد‌چیست؟‬‫احتمالِ‌ای ‌‬
‫یعنی‌)‪P(mac|iPhone‬؟‬

‫نکته‪:‬‬
‫دربارهی‌احتماالتِ‌مقدماتی‌نیاز‌دارید‪‌،‬لینیک‌‌هیا‌ی‌‬
‫یکنید‌به‌تمرین‌های‌بیشتری‌ ‌‬
‫اگر‌فکر‌م ‌‬
‫موجود‌در‌سایتِ‌‪‌guidetotdatamining.com‬و‌‪‌chistio.ir‬را‌مشاهده‌کنید‪.‬‬

‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‌‬
‫نکه‌شخصی‌دارای‌‪‌Mac‬باشد‪‌،‬به‌شرطی‌که‌بدانیم‌او‌‪‌iPhone‬دارد‌چیست؟‬ ‫احتمالِ‌ای ‌‬

‫یادگیری‌چند‌لبارت‬
‫نکه‌فرضی‌هی‌‪‌h‬درست‌باشد‪‌،‬احتمالِ‌پیشین‌(‪‌‌)prior probability‬‬ ‫)‪‌،p(h‬یعنی‌احتمالِ‌ای ‌‬
‫یشود‪‌.‬پیشین‌به‌معنای‌این‌است‌که‌قبل‌از‌هر‌گونه‌شواهدی‌باشد‪‌.‬بیرا‌ی‌‬ ‫برای‌‪‌h‬نامیده‌م ‌‬
‫مثال‪‌،‬احتمالِ‌این‌که‌یک‌شخص‪‌،‬لپ‌تاپِ‌‪‌Mac‬داشته‌باشد‌‪‌1.9‬است‌(شواهد‌ممکین‌‌اسیت‌‌‬
‫نشان‌دهند‌که‌این‌شخص‌همچنین‌یک‌‪‌iPhone‬هم‌داشته‌است)‬
‫)‪‌p(h | d‬را‌احتمالِ‌پَسی‌ین‌(‪‌)posterior probability‬بیرا‌ی‌‪‌h‬میی‌نامنید‌‪‌.‬یعنی‌ی‌بعید‌‌از‌‬
‫دادهی‌‪‌،d‬احتمالِ‌رخ‌دادنِ‌‪‌h‬چقدر‌است؟‌بیرا‌ی‌مثیال‪‌‌،‬بعید‌‌از‌ایی‌ن‌کیه‌‌متوجیه‌‌‬
‫مشاهدهی‌ ‌‬
‫‌‬
‫شدیم‌شخصی‌دارای‌‪‌iPhone‬است‪‌،‬چقدر‌احتمال‌دارد‌که‌همین‌شخص‌لپ‌تاپِ‌‪‌Mac‬هیم‌‌‬
‫داشته‌باشد؟‌همچنین‌به‌این‌احتمال‪‌،‬احتمیالِ‌‌شیرط‌ی‌(‪‌)conditional probability‬نیی‌ز‌‬
‫یشود‪.‬‬‫گفته‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌141‬‬
‫دادهکاوی‌برای‌ ‌‬

‫طبقهبندِ‌بیزین‌(‪‌)Bayesian classifier‬بسازیم‪‌،‬دو‌احتمالِ‌دیگر‌نیی‌ز‌‬ ‫حاال‌اگر‌بخواهیم‌یک‌ ‌‬


‫نیاز‌داریم‪‌P(D)‌،‬و‌)‪‌.P(D | h‬مثالِ‌زیر‌را‌برای‌فهمِ‌بهتر‪‌،‬نگاه‌کنید‪.‬‬

‫کارتِ‌خرید‌ماکروسافت‬
‫کارتهای ‌خریدِ ‌خرده‌فروشی ‌را ‌به ‌صورت ‌هوشمند ‌تولید‌‬ ‫یدانستید ‌که ‌ماکروسافت ‌ ‌‬ ‫آیا ‌م ‌‬
‫یکند؟ ‌بله‪‌ ،‬در ‌واقع‪‌ ،‬ماکروسافت ‌در ‌قرارداد ‌با ‌شرکتی ‌به ‌نامِ ‌چااوتیک ‌مون ‌( ‪Chaotic‬‬ ‫م‌‬
‫کارتها ‌اقدام ‌کرده ‌است‪‌.‬شعار ‌این ‌شرکت ‌این ‌است‪‌:‬ما ‌از ‌شما‌‬
‫توسعهی ‌این‌ ‌‬‫‌‬ ‫‪‌)Moon‬برای ‌‬
‫یتوانید ‌فکر ‌کنید ‌این ‌شرکت ‌خیلی ‌مغرور ‌و‌‬‫خالقتریم‪‌.‬البته ‌شما ‌م ‌‬
‫باهوشتریم‪‌.‬ما ‌از ‌شما ‌ ‌‬
‫‌‬
‫پررو‌یا‌هر‌چیز‌دیگری‌است‪ ‌.‬این‌شرکت‌برای‌انجام‌این‌کار‌یک‌کارت‌خرید‌را‌با‌یک‌تبلت‌‬
‫نکه‌کارت‌بتواند‌با‌‬‫ستملاملِ‌ویندوز‌‪‌،1‬یک‌کینکت‪‌،‬یک‌بلندگوی‌بلوتوثی‌برای‌ای ‌‬ ‫دارای‌سی ‌‬
‫شما‌صحبت‌کند‪‌،‬و‌یک‌پلتفرمِ‌رباتیِ‌موبایلی‌برای‌همراهیِ‌این‌کارت‌در‌سراسرِ‌فروشگاه‌با‌‬
‫شما‌همراه‌کرده‌است‪.‬‬
‫یشناسد‪‌.‬تمامیِ ‌خری‌دهای‌‬ ‫یشوید‪‌.‬کارت ‌شما ‌را ‌م ‌‬ ‫شما ‌با ‌کارتِ ‌التباری ‌خود ‌واردِ ‌مغازه ‌م ‌‬
‫قبلیِ‌شما‌را‌هم‌می‌داند‌(همانندِ‌خرید‌هر‌کس‌دیگری‌در‌این‌فروشگاه)‪‌ .‬‬
‫‌‬

‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪142‬‬

‫یخواهد ‌تصمیم ‌بگیرد ‌که ‌آیا ‌تبلیغی ‌از ‌یک ‌نوع‌‬


‫نرمافزارِ ‌پشت ‌این ‌کارت‪‌ ،‬م ‌‬
‫تصور ‌کنید ‌که ‌ ‌‬
‫«چای ‌سبزی ‌سِنشای ‌ژاپنی» ‌را ‌به ‌شما ‌نشان ‌دهد ‌یا ‌خیر‪‌ .‬این ‌نرم‌افزار ‌فقط ‌وقتی ‌این‌‬
‫تبلیغات‌را‌به‌شما‌نشان‌می‌دهد‌که‌احتمال‌دهد‌شما‌این‌چای‌را‌خواهید‌خرید‪.‬‬
‫جمعآوری ‌کرده‬‫دادهی ‌کوچک ‌را ‌از ‌تمامیِ ‌خریداران ‌ ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫نرمافزار‌پشت‌کارت‪‌ ،‬یک ‌‬‫‌‬
‫شمارهی‌‬
‫‌‬ ‫مجمولهی ‌داده‪‌ ،‬در ‌زیر ‌قابل ‌مشاهده ‌است‪(‌ .‬ستون ‌‪‌ Customer ID‬‬ ‫‌‬ ‫است‪‌ .‬این ‌‬
‫مشتری ‌را ‌نشان ‌می‌دهد‪‌ Zipcode‌ ،‬کد ‌پستی ‌است‪‌ ،‬ستونِ ‌‪‌bought organic product‬‬
‫ستونی‌است‌که‌نشان‌می‌دهد‌آیا‌شخص‌محصوالت‌ارگانیک‌خریده‌است‌یا‌خیر‌و‌ستون‌‬
‫‪‌ bought Sencha green tea‬نشان‌می‌دهد‌که‌آیا‌شخص‌چای‌سبز‌سنچا‌خریده‌است‌یا‌‬
‫خیر) ‌‬
‫‌‬

‫‌‬

‫)‪‌ ،P(D‬احتمالِ ‌این ‌است ‌که ‌یک ‌ ‌‬


‫دادهی ‌آموزشی ‌مشاهده ‌شده ‌باشد‪‌.‬برای ‌مثال‪‌ ،‬با ‌نگاه ‌به‌‬
‫دادههای ‌جدولِ ‌باال‪‌ ،‬مشاهده ‌می‌کنیم ‌که ‌احتمال ‌این ‌که ‌کدپستی ‌(‪‌ )zip code‬برابرِ‌‬ ‫‌‬
‫‪‌11115‬باشد‪‌ ⁄ ‌،‬یا‌همان‌‪‌1.5‬است‪.‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌141‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‪P(88005) = 0.5‬‬
‫‌‬
‫آنکه‌فرضی‌های‌داشته‌باشیم‪‌.‬برای‌‬ ‫)‪‌P(D | h‬احتمالِ‌این‌است‌که‌ ‌‬
‫دادهای‌رخ‌دهد‌با‌شرط‌ ‌‬
‫مثال‪‌ ،‬احتمالِ ‌این‌که ‌کد ‌پستی ‌(‪‌)zip code‬برابر ‌‪‌ 11115‬بوده ‌به ‌شرط ‌آن‌که ‌این ‌شخص‌‬
‫چای‌سبزِ‌سنچا‌را‌خرید‌باشد‌به‌صورت‌زیر‌است‪:‬‬
‫‌‬
‫)‪P(88005|Sencha Tea‬‬

‫یکنیم ‌که ‌شخصی ‌چای ‌سبز ‌سنشا ‌را ‌خریده‌‬ ‫برای‌حل‌این‌مسئله‪‌ ،‬ما ‌به ‌مواردی ‌نگاه ‌م ‌‬
‫آنها‪‌،‬کدِ‌پستیِ‌‪‌11115‬را‌دارند‪‌.‬پس‪:‬‬
‫باشد‪‌.‬تعدادِ‌این‌افراد‌‪‌5‬مورد‌است‪‌3‌.‬نفر‌از‌ ‌‬
‫‌‬
‫‪P(88005 | SenchaTea) = = 0.6‬‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‬
‫نکه‌کد‌پستی‌برابر‌‪‌11115‬باشد‌با‌این‌شرایط‌که‌بدانیم‌آن‌شخص‌چای‌سبزِ‌‬‫احتمالِ‌ای ‌‬
‫سنشا‌را‌نخریده‌است‌را‌به‌دست‌آورید؟‬

‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‬
‫نکه‌کد‌پستی‌برابر‌‪‌11115‬باشد‌با‌این‌شرایط‌که‌بدانیم‌آن‌شخص‌چای‌سبزِ‌‬ ‫احتمالِ‌ای ‌‬
‫سنشا‌را‌نخریده‌است‌را‌به‌دست‌آورید؟‬
‫محدودهی ‌کد‌‬
‫‌‬ ‫آنها‪‌ ،‬در ‌‬
‫دهاند‪‌ 1‌.‬مورد ‌از ‌ ‌‬
‫‪‌ 5‬مورد ‌وجود ‌دارد ‌که ‌چای ‌سبزِ ‌سنچا ‌را ‌نخری ‌‬
‫یکنند‪‌.‬پس‪:‬‬ ‫پستیِ‌‪‌11115‬زندگی‌م ‌‬
‫‌‬

‫‌‬
‫»‌به‌معنای‌نخریدنِ‌چای‌‬ ‫نشانهی‌« »‌به‌معنای‌«منفی»‌است‪‌.‬مثالً‌«‬
‫‌‬
‫سبز‌سنچا‌است‪‌ ‌.‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪143‬‬

‫مدادتان‌را‌تیز‌کنید‬
‫ادامهی‌این‌فصل‌است‪‌،‬پس‌اجازه‌دهید‌کمی‌بیشتر‌با‌آن‌سر‌‬ ‫این‌مثال‪‌،‬کلیدی‌برای‌فهمِ‌ ‌‬
‫و‌کله‌بزنیم‪.‬‬
‫نکه ‌شخصی ‌در ‌کد ‌پستیِ ‌‪‌ 11112‬باشد ‌چقدر ‌است ‌(بدون ‌دانستنِ ‌چیزِ‌‬ ‫‪‌ .2‬احتمالِ ‌ای ‌‬
‫دیگری)؟‬
‫نکه ‌شخص ‌در ‌کد ‌پستیِ ‌‪‌ 11112‬باشد ‌چقدر ‌است ‌با ‌این ‌شرط ‌که ‌بدانیم‌‬‫‪‌.1‬احتمالِ ‌ای ‌‬
‫این‌شخص‌چایِ‌سبزِ‌سنچا‌خریده‌است؟‬
‫نکه ‌شخصی ‌در ‌کد ‌پستیِ ‌‪‌ 11112‬باشد ‌چقدر ‌است ‌با ‌این ‌شرط ‌که ‌بدانیم‌‬‫‪‌.3‬احتمالِ ‌ای ‌‬
‫او‌چای‌سبزِ‌سنچا‌را‌نخریده‌است؟‬

‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‬
‫ادامهی‌این‌فصل‌است‪‌،‬پس‌اجازه‌دهید‌کمی‌بیشتر‌با‌آن‌سر‌‬
‫این‌مثال‪‌،‬کلیدی‌برای‌فهمِ‌ ‌‬
‫و‌کله‌بزنیم‪‌ .‬‬

‫نکه ‌شخصی ‌در ‌کد ‌پستیِ ‌‪‌ 11112‬باشد ‌چقدر ‌است ‌(بدون ‌دانستنِ ‌چیزِ‌‬ ‫‪‌ .2‬احتمالِ ‌ای ‌‬
‫دیگری)؟‬
‫آنها ‌در ‌کدپستیِ‌‬
‫دادههایمان ‌داریم ‌و ‌فقط ‌‪‌ 3‬نفر ‌از ‌ ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫تعدادِ ‌‪‌ 21‬نمونه ‌در ‌‬
‫‪‌11112‬هستند‪‌.‬پس‌)‪‌P(88001‬برابر‌‪‌1.3‬است‪‌ .‬‬

‫نکه ‌شخصی ‌در ‌کد ‌پستیِ ‌‪‌ 11112‬باشد ‌چقدر ‌است ‌با ‌این ‌شرط ‌که ‌بدانیم‌‬
‫‪‌.1‬احتمالِ ‌ای ‌‬
‫این‌شخص‌چایِ‌سبزِ‌سنچا‌خریده‌است؟‬
‫محدودهی‌‬
‫‌‬ ‫نها‌در‌‬
‫دهاند‌و‌فقط ‌یکی‌از‌آ ‌‬
‫تعداد‌‪‌5‬نمونه‌هستند‌که‌چای ‌سبزِ‌سنچا‌را‌خری ‌‬
‫کد‌پستیِ‌‪‌11112‬قرار‌دارد‪‌.‬پس‪:‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌144‬‬
‫دادهکاوی‌برای‌ ‌‬

‫نکه ‌شخصی ‌در ‌کد ‌پستیِ ‌‪‌ 11112‬باشد ‌چقدر ‌است ‌با ‌این ‌شرط ‌که ‌بدانیم‌‬ ‫‪‌.3‬احتمالِ ‌ای ‌‬
‫دهاست؟‬ ‫او‌چای‌سبزِ‌سنچا‌را‌نخری ‌‬
‫محدودهی ‌کد‌‬
‫‌‬ ‫آنها ‌در‌‬
‫دهاند‌و‌‪‌1‬نفر‌از‌ ‌‬
‫تعداد‌‪‌5‬نمونه‌هستند‌که‌چای‌سبزِ‌سنچا‌را‌نخری ‌‬
‫پستیِ‌‪‌11112‬هستند‪‌.‬پس‪:‬‬

‫‌‬

‫تئوریِ‌بیز‌(‪)Bayes Theorem‬‬
‫رابطهی‌بین‌)‪‌P(D)‌،P(h | D)‌،P(h‬و‌)‪‌P(D | h‬را‌بیان‌م ‌‬
‫یکند‪:‬‬ ‫تئوریِ‌بیز‪‌ ‌،‬‬

‫دادهکاوی ‌از ‌این ‌تئوری‌‬


‫روشهای ‌بیزین ‌است‪‌.‬معموالً ‌در ‌ ‌‬
‫هستهی ‌اصلیِ ‌تمامیِ ‌ ‌‬
‫این ‌تئوری‪‌ ‌ ،‬‬
‫یکنیم‪‌ .‬مثالً‌با ‌دادنِ ‌شواهد ‌خاص‪‌،‬‬‫برای ‌تصمیم‌گیری ‌بین ‌فرضیه‌های ‌جایگزین ‌استفاده ‌م ‌‬
‫ککار‪‌ ،‬ورزشکار ‌دوی ‌ماراتن ‌یا ‌بازیکن ‌بسکتبال‌‬‫بتوانیم ‌بفهمیم ‌که ‌آیا ‌یک ‌فرد‪‌ ،‬ژیمیناستی ‌‬
‫هست ‌یا ‌خیر؟ ‌و ‌یا ‌با ‌دادن ‌شواهدِ ‌خاصی‪‌ ،‬بتوانیم ‌بفهمیم ‌که ‌آیا ‌یک ‌شخص ‌چای ‌سبزِ‌‬
‫نها‌ما‌احتمالِ‌هر‌کدام‌از‌‬‫سنچا‌را‌خواهد‌خرید‌یا‌خیر؟‌برای‌تصمیم‌گیری‌در‌مورد‌جایگزی ‌‬
‫فرضی‌هها‌را‌محاسبه‌می‌کنیم‪‌.‬برای‌مثال‪:‬‬
‫یخواهیم ‌تبلیغی ‌برای ‌چای ‌سبزِ ‌سنچا ‌در ‌سبدِ ‌خریدِ ‌هوشمندِ ‌خود ‌داشته ‌باشیم‪‌ .‬این‌‬ ‫م‌‬
‫تبلیغ ‌زمانی ‌نمایش ‌داده ‌خواهد ‌شد ‌که ‌احتمال ‌بدهیم ‌این ‌شخص‪‌ ،‬چای ‌را ‌خواهد ‌خرید‪‌.‬‬
‫یکند‪.‬‬‫یدانیم‌که‌این‌شخص‌در‌کد‌پستیِ‌‪‌11115‬زندگی‌م ‌‬ ‫م‌‬
‫دو‌فرضی‌هی‌رقیب‌و‌متضاد‌هم‌وجود‌دارد‪:‬‬
‫‌‬
‫این‌شخص‪‌،‬چای‌سبزِ‌سنچا‌را‌خواهد‌خرید ‌‬
‫یکنیم‬ ‫در‌این‌شرایط‌ما‌)‪‌P(buySenchaTea | 88005‬را‌محاسبه‌م ‌‬
‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪145‬‬

‫این‌شخص‌چای‌سبزِ‌سنچا‌را‌نخواهد‌خرید‬
‫در‌این‌شرایط‌ما‌)‪‌P(¬buySenchaTea | 88005‬محاسبه‌م ‌‬
‫یکنیم‬

‫یکنیم‬
‫و‌آن‌فرضی‌را‌که‌احتمالِ‌باالتری‌دارد‌انتخاب‌م ‌‬
‫پس‌اگر‪‌ :‬‬

‫‪P(buySenchaTea | 88005) = 0.6‬‬


‫و‬
‫‪‌ P(¬buySenchaTea | 88005) = 0.4‬‬

‫باشد‪‌ ،‬احتمالِ ‌بیشتر ‌این ‌است ‌که ‌این ‌شخص‪‌ ،‬چای ‌سبزِ ‌سنچا ‌را ‌خواهد ‌خرید‪‌ ،‬پس ‌ما‌‬
‫یدهیم‪.‬‬
‫تبلیغ‌را‌به‌او‌نمایش‌م ‌‬

‫یکنیم‌و‌این‌فروشگاه‌سه‌نوع‌ایمیل‌‬ ‫فرض‌کنید‌ما‌برای‌یک‌فروشگاه‌الکترونیکی‌فعالیت‌م ‌‬
‫یکند‪‌ ،‬دومی ‌یک ‌کامپیوتر‌‬ ‫لپتاپ ‌را ‌تبلیغ ‌م ‌‬ ‫تبلیغاتی ‌دارد‪‌ .‬اولین ‌نوع ‌تبلیغات‪‌ ،‬یک ‌ ‌‬
‫دسکتاپ ‌را ‌و ‌آخری ‌یک ‌تبلت ‌را ‌تبلیغ ‌می‌کند‪‌ .‬بر ‌اساسِ ‌چیزی ‌که ‌ما ‌از ‌هر ‌مشتری‌‬
‫یکه‌بیشترین‌احتمال‌را‌برای‌‬ ‫یکنیم‌به‌صورت ‌‬ ‫لها‌را‌به‌او‌ارسال‌م ‌‬
‫یدانیم‪‌،‬یکی‌از‌این‌ایمی ‌‬ ‫م‌‬
‫خرید ‌داشته ‌باشد‪‌ .‬برای ‌مثال‪‌ ،‬ممکن ‌است ‌من ‌بدانم ‌که ‌یک ‌مشتری ‌در ‌محدوده‌ی ‌کد‌‬
‫یکند‪‌ ،‬یک ‌دختر ‌دانشگاهی ‌دارد ‌که ‌او ‌هم ‌در ‌همان ‌خانه ‌زندگی‌‬ ‫پستیِ ‌‪‌ 11115‬زندگی ‌م ‌‬
‫یرود‪‌.‬به ‌نظر ‌شما ‌کدام ‌یک ‌از ‌تبلیغات ‌را ‌برای ‌او ‌بفرستم؟‌‬
‫یکند ‌و ‌به ‌کالسِ ‌یوگا ‌هم ‌م ‌‬
‫م‌‬
‫لپتاپ‪‌،‬دسکتاپ‌یا‌تبلت‌را؟‬ ‫‌‬
‫فرض‌کنید‌‪‌D‬تمام‌چیزی‌است‌که‌از‌یک‌شخص‌م ‌‬
‫یدانم‪:‬‬
‫یکند‬
‫محدودهی‌کد‌پستیِ‌‪‌11115‬زندگی‌م ‌‬ ‫‌‬ ‫‪ ‬او‌در‌‬
‫‪ ‬یک‌دختر‌دانشگاهی‌دارد‬
‫‪ ‬به‌کالس‌یوگا‌م ‌‬
‫یرود‬
‫لپتاپ‪‌ ،‬دسکتاپ‌‬‫مناسبتر‌هستند‪‌ ‌:‬‬
‫‌‬ ‫فرضی‌هی‌من‌این‌است‌که‌کدام‌یک‌از‌تبلیغات‌برای‌او‌‬
‫یا‌تبلت‪‌.‬پس‌من‌بایستی‌احتماالت‌زیر‌را‌حساب‌کنم‪:‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌149‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫و‌فرضی‌های‌که‌بیشترین‌احتمال‌را‌دارد‌را‌انتخاب‌کنم‪.‬‬
‫‪‌.‬‬ ‫طبقهبندی‪‌ ،‬ما ‌چندین ‌فرضیه ‌داریم‪‌:‬‬
‫یتر ‌صحبت ‌کنم‪‌ ،‬در ‌ ‌‬ ‫اگر ‌بخواهم ‌انتزال ‌‬
‫طبقههای ‌مختلف ‌در ‌مسئله‌ی ‌ما ‌هستند‪‌ .‬برای ‌مثال‪‌ ،‬در‌‬
‫دستهها ‌و ‌ ‌‬
‫این ‌فرضی‌هها ‌همان ‌ ‌‬
‫مسئلهی ‌تشخیصِ ‌ورزشکاران ‌این ‌که ‌یک ‌شخص‪‌ ،‬بازیکنِ ‌بسکتبال‪‌ ،‬دوی ‌مارتن ‌یا‌‬ ‫‌‬
‫نکه‌آیا‌یک‌شخص‌دیابت‌خواهد‌‬ ‫شبینیِ‌دیابت‌ای ‌‬
‫مسئلهی‌پی ‌‬
‫‌‬ ‫ژیمیناستیک‌کار‌است‌و‌یا‌در‌‬
‫گرفت‌یا‌خیر‪.‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪147‬‬

‫همهی ‌این ‌احتماالت ‌را ‌حساب ‌کنیم‪‌ ،‬آن ‌فرضیه ‌را ‌انتخاب ‌می‌کنیم ‌که‌‬
‫هنگامی ‌که ‌ما ‌ ‌‬
‫نهی ‌پسین ‌( ‪the‬‬
‫بیشترین ‌احتمال ‌را ‌دارد‪‌ .‬به ‌این ‌کار ‌در ‌اصطالح ‌فرضی‌هی ‌بیشی ‌‬
‫یگویند‪.‬‬‫‌م ‌‬ ‫‪‌)maximum a posteriori hypothesis‬یا‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌141‬‬
‫دادهکاوی‌برای‌ ‌‬

‫ی‌بیشینهی‌پسین‌است‌به‌صورت‌زیر‌‬
‫‌‬ ‫‌‬
‫فرضیه‬‫جملهی‌باال‌را‌که‌در‌واقع‌محاسبه‌ی‌‬
‫یتوانیم‌ ‌‬
‫م‌‬
‫ترجمه‌به‌زبان‌ریاضیات‌ترجمه‌کنیم‪:‬‬

‫مجمولهی‌فرضیات‌است‪‌.‬پس‌‪‌h H‬به‌این‌معنی‌است‪«‌:‬برای‌هر‌فرضیه‌‬ ‫‌‬ ‫در‌این‌فرمول‌‪‌،H‬‬


‫را‌میگوید ‌که‪«‌:‬برای ‌هر ‌فرضیه‌‬
‫مجمولهی ‌فرضیات»‪‌.‬در ‌کل ‌فرمول ‌چیزی ‌شبیه ‌این‌ ‌‬
‫‌‬ ‫در ‌‬
‫مجمولهی‌فرضیات‪‌P(h|D)‌،‬را‌محاسبه‌کن‌و‌فرضی‌های‌که‌بیشترین‌احتمالِ‌وقوع‌دارد‌‬ ‫‌‬ ‫در‌‬
‫یتوانیم‌فرمول‌را‌به‌صورت‌زیر‌تبدیل‌کنیم‪:‬‬
‫را‌انتخاب‌کن»‪‌.‬با‌استفاده‌از‌تئوریِ‌بیزین‌م ‌‬
‫‌‬

‫‌‬
‫یخواهیم‌فرمول‌زیر‌را‌محاسبه‌کنیم‪:‬‬
‫پس‌برای‌هر‌فرضیه‪‌،‬ما‌م ‌‬
‫‌‬

‫‌‬
‫شدهاید ‌که ‌برای ‌تمامیِ ‌این ‌محاسبات‪‌ ،‬مخرجِ ‌کسر ‌یکتا ‌و ‌برابر ‌)‪‌ P(D‬است‪‌.‬‬
‫احتماالً ‌متوجه ‌ ‌‬
‫بنابراین‪‌،‬این‌محاسبات‪‌،‬مستقل‌از‌فرضیات‌هستند‪‌.‬اگر‌یک‌فرضی‌هی‌خاص‌دارای‌بیشترین‌‬
‫احتمالِ ‌وقوع ‌باشد‪‌ ،‬با ‌فرمول ‌باال‪‌ ،‬این ‌فرضیه ‌هنوز ‌هم ‌بیشترین ‌احتمال ‌وقوع ‌را ‌دارد ‌البته‌‬
‫اگر ‌ما ‌تمام ‌فرضیات ‌را ‌بر ‌)‪‌ P(D‬تقسیم ‌نکرده‌باشیم‪‌.‬اگر ‌هدف ‌ما ‌پیدا ‌کردن ‌فرضی‌های ‌با‌‬
‫یتوانیم‌محاسباتمان‌را‌به‌صورت‌زیر‌ساده‌کنیم‪:‬‬ ‫بیشترین‌احتمالِ‌وقوع‌باشد‪‌،‬م ‌‬
‫‌‬

‫‌‬
‫نکه‌ببینیم‌این‌فرمول‌چگونه‌کار‌می‌کند‪‌،‬از‌مثالی‌که‌‪‌Tom M. Mitchell‬در‌کتاب‌‬ ‫برای‌ای ‌‬
‫یادگیری ‌ماشینِ ‌خودش ‌آورده ‌است ‌استفاده ‌می‌کنیم‪‌ Tom M. Mitchell‌.‬رئیس ‌دپارتمان‌‬
‫یادگیری‌ماشین‌دانشگاه‌کارنی‌مِلُن‌(‪‌)Carnegie Mellon‬است‪‌.‬او‌یک‌محقق‌بزرگ‌و‌یک‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪146‬‬

‫حوزهی ‌پزشکی ‌را ‌فرض‌‬‫مرد‌خوشبرخورد‌و‌خوب‌است‪‌.‬به ‌سراغ ‌مثال ‌کتاب ‌برویم‪‌.‬یک ‌ ‌‬ ‫‌‬


‫یخواهیم ‌ببینیم ‌آیا ‌یک ‌بیمار‪‌ ،‬یک ‌سرطانِ ‌خاصی ‌را ‌دارد ‌یا ‌خیر‪‌.‬یک‌‬ ‫کنید ‌که ‌در ‌آن ‌م ‌‬
‫یتوانیم ‌بفهمیم ‌آیا ‌شخص ‌دارای ‌این‌‬ ‫آزمایش ‌خونِ ‌ساده ‌وجود ‌دارد ‌که ‌از ‌طریق ‌آن ‌م ‌‬
‫بیماری ‌هست ‌یا ‌نه‪‌ .‬آزمایش ‌یک ‌حالت ‌دودویی ‌دارد ‌– ‌یعنی ‌نتایج ‌را ‌به ‌صورت ‌مثبت‌‬
‫یگرداند‪‌ .‬هنگامی ‌که ‌سرطان ‌وجود ‌داشته ‌باشد‪‌ ،‬آزمایش‌‬ ‫(‪‌ )POS‬یا ‌منفی ‌(‪‌ )NEG‬برم ‌‬
‫جهی ‌مثبت ‌(‪‌)POS‬را ‌در ‌‪‌ 61‬درصدِ ‌مواقع ‌درست‌برخواهد ‌گرداند‪‌.‬این ‌آزمایش ‌نتایج‌‬ ‫نتی ‌‬
‫منفی ‌(‪‌ )NEG‬را ‌نیز ‌در ‌‪‌ 67‬درصد ‌مواقع ‌درست ‌نشان ‌خواهد ‌داد‪‌ .‬یعنی ‌در ‌مواقعی ‌که‌‬
‫یتواند ‌لدم ‌وجود ‌بیماری ‌را ‌نشان‌‬ ‫بیماری ‌وجود ‌نداشته ‌باشد‪‌ ،‬با ‌دقت ‌‪‌ 67‬این ‌آزمایش ‌م ‌‬
‫دهد‪‌.‬‬
‫فرضی‌ههای‌ما‪:‬‬
‫‪‌.‬بیمار‪‌،‬یک‌سرطان‌خاص‌را‌دارد‬
‫‪‌.‬بیمار‪‌،‬آن‌سرطان‌خاص‌را‌ندارد‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‬
‫اجازه‌بدهید‌چیزی‌که‌نوشته‌بودم‌را‌به‌نماد‌احتمالی‌ترجمه‌کنیم‪‌.‬لطفاً‌جمالت‌زیر‌را‌با‌‬
‫جملهای ‌باقی ‌نمانده ‌بود‪‌،‬‬
‫نمادهای ‌متناسب‪‌ ،‬مرتبط ‌کرده ‌و ‌احتماالت ‌را ‌بنویسید‪‌ .‬اگر ‌ ‌‬
‫خودتان‌بنویسید‪.‬‬
‫یدانیم‌که‌‪‌1.1‬درصد‌از‌افراد‌آمریکا‪‌،‬این‌نوع‌از‌سرطان‌را‌دارند‪.‬‬ ‫ما‌م ‌‬
‫هنگامی ‌که ‌این ‌بیماری ‌در ‌شخصی ‌وجود ‌داشته ‌باشد‪‌ ،‬آزمایش ‌در ‌‪‌ 61‬درصد ‌مواقع‌‬
‫یدهد‪.‬‬‫جهی‌مثبت‌(‪‌)POS‬را‌به‌درستی‌تشخیص‌م ‌‬ ‫نتی ‌‬
‫جهی ‌آزمایشِ ‌منفی ‌(‪‌)NEG‬را ‌درست ‌تشخیص‌‬ ‫این ‌آزمایش‪‌ ،‬در ‌‪‌ 67‬درصد ‌موارد ‌نیز ‌نتی ‌‬
‫یدهد‌(هنگامی‌که‌بیماری‌وجود‌ندارد)‬ ‫م‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌151‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‬
‫‌‬
‫یدانیم‌که‌‪‌1.1‬درصد‌از‌افراد‌آمریکا‪‌،‬این‌نوع‌از‌سرطان‌را‌دارند‪‌.‬پس‪‌ :‬‬
‫ما‌م ‌‬
‫‪P(cancer) = 0.008‬‬

‫‪‌66.1‬درصد‌افراد‌این‌نوع‌بیماری‌را‌ندارند‪‌.‬پس‪‌ :‬‬
‫‪‌ P(¬cancer) = 0.992‬‬
‫‌‬
‫جهی‌‬
‫هنگامی ‌که ‌بیماری ‌در ‌شخصی ‌وجود ‌داشته ‌باشد‪‌ ،‬آزمایش ‌در ‌‪‌ 61‬درصد ‌مواقع ‌نتی ‌‬
‫یدهد‪‌.‬پس‪‌ :‬‬ ‫مثبت‌(‪‌)POS‬را‌به‌درستی‌تشخیص‌م ‌‬
‫‪‌ ‌P(POS | cancer) = 0.98‬‬

‫هنگامی ‌که ‌بیماری ‌وجود ‌داشته ‌باشد‪‌ ،‬آزمایش ‌به ‌اشتباه ‌در ‌‪‌ 1‬درصد ‌مواقع‪‌ ،‬پاسخ ‌را‌‬
‫یکند‪‌.‬پس‪‌ :‬‬ ‫منفی‌(‪‌)NEG‬الالم‌م ‌‬
‫‪P(NEG | cancer) = 0.02‬‬

‫جهی ‌آزمایشِ ‌منفی ‌(‪‌)NEG‬را ‌درست ‌تشخیص‌‬


‫این ‌آزمایش‪‌ ،‬در ‌‪‌ 67‬درصد ‌موارد ‌نیز ‌نتی ‌‬
‫یدهد‌(هنگامی‌که‌بیماری‌وجود‌ندارد)‪‌.‬پس‪‌ :‬‬ ‫م‌‬
‫‪P(NEG | ¬cancer) = 0.97‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪152‬‬

‫این ‌آزمایش ‌در ‌‪‌ 3‬درصد ‌موارد‪‌ ،‬هنگامی ‌که ‌بیماری ‌وجود ‌ندارد‪‌ ،‬آن ‌را ‌به ‌اشتباه ‌مثبت‌‬
‫‌‬ ‫یکند‪‌.‬پس‪:‬‬‫(‪‌)POS‬الالم‌م ‌‬
‫‪‌ P(POS | ¬ cancer) = 0.03‬‬

‫‌‬

‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‌‬
‫فرض‌کنید‌‪‌Ann‬به‌مطب‌دکتر‌بیاید‪‌.‬یک‌آزمایش‌خون‌برای‌سرطان‌از‌او‌گرفته‌م ‌‬
‫یشود‌‬
‫و‌پاسخ‌مثبت‌(‪‌)POS‬است‪.‬‬
‫اتفاق‌خوشایندی‌برای‌‪‌Ann‬نیست‪‌.‬با‌این‌همه‪‌،‬آزمایش‌دقت‌‪‌61‬درصدی‌دارد‪.‬‬
‫یتوانیم ‌مشخص ‌کنیم ‌که ‌آیا ‌‪‌ Ann‬به ‌سرطان ‌مبتال ‌هست‌‬
‫و‌با ‌استفاده ‌از ‌تئوری ‌بیزین ‌م ‌‬
‫یا‌خیر‪‌ .‬‬

‫‪P(cancer) = 0.008‬‬
‫‪P(¬cancer) = 0.992‬‬
‫‪P(POS | cancer) = 0.98‬‬
‫‪P(POS | ¬ cancer) = 0.03‬‬
‫‪P(NEG | cancer) = 0.02‬‬
‫‪‌ P(NEG | ¬cancer) = 0.97‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌151‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‬
‫یشود‌‬‫فرض‌کنید‌‪‌Ann‬به‌مطب‌دکتر‌بیاید‪‌.‬یک‌آزمایش‌خون‌برای‌سرطان‌از‌او‌گرفته‌م ‌‬
‫و‌پاسخ‌مثبت‌(‪‌)POS‬است‪.‬‬
‫اتفاق‌خوشایندی‌برای‌‪‌Ann‬نیست‪‌.‬با‌این‌همه‪‌،‬آزمایش‌دقت‌‪‌61‬درصدی‌دارد‪.‬‬
‫یتوانیم‌مشخص‌کنیم‌که‌آیا‌‪‌Ann‬به‌سرطان‌مبتال‌هست‌یا‌‬ ‫با‌استفاده‌از‌تئوری‌بیزین‌م ‌‬
‫خیر‪.‬‬
‫‪P(cancer) = 0.008‬‬
‫‪P(¬cancer) = 0.992‬‬
‫‪P(POS | cancer) = 0.98‬‬
‫‪P(POS | ¬ cancer) = 0.03‬‬
‫‪P(NEG | cancer) = 0.02‬‬
‫‪‌ P(NEG | ¬cancer) = 0.97‬‬
‫‌‬
‫احتمال‌بشینهی‌پسین‌هستم‪‌ :‬‬
‫‌‬ ‫ما‌به‌دنبال‌پیدا‌کردن‌‬

‫‪P(POS | cancer) P(cancer) = 0.98 (0.008) = 0.0078‬‬


‫‪‌ P(POS | ¬cancer) P(¬cancer) = 0.03 (0.992) = 0.0298‬‬

‫دستهی ‌«بدون ‌بیماری ‌سرطان»‌‬


‫یکنیم ‌و ‌بیمار ‌را ‌در ‌ ‌‬
‫‌را ‌انتخاب ‌م ‌‬ ‫حاال ‌ما‌‬
‫یکنیم‪.‬‬ ‫طبقهبندی‌م ‌‬
‫‌‬
153 ■‌‫‌بِیز‌ساده‬.9‌‫‌فصل‬

‌.‫شدهی ‌این ‌مقادیر ‌را ‌داشته ‌باشیم‬


‌ ‫نرمال‬
‌ ‌ ‫یتوانیم‬ ‌ ‫ ‌م‬،‫اگر ‌بخواهیم ‌احتمال ‌دقیق ‌را ‌بدانیم‬
‌ :‫‌شود‬2‌‫آنها‌برابر‬
‌ ‌‫یدهیم‌که‌جمع‬ ‌ ‫این‌کار‌را‌طوری‌انجام‌م‬


‌ .‫‌درصد‌مبتال‌به‌سرطان‌است‬12‌‫‌به‌احتمال‬Ann‌‫پس‬



:‫‌مقاالت‌زیر‌را‌نگاهی‌بیندازید‬.‫‌درصد‌را‌زیاد‌نگفتم‬15‌‫من‌این‌مقدار‬
>> Casscells, W., Schoenberger, A., and Grayboys, T. (1978): "Interpretation
by physicians of clinical laboratory results." N Engl J Med. 299:999-1001
>> Gigerenzer, Gerd and Hoffrage, Ulrich (1995): "How to improve Bayesian
reasoning without instruction: Frequency formats." Psychological Review.
102: 684-704.
>> Eddy, David M. (1982): "Probabilistic reasoning in clinical medicine:
Problems and opportunities." In D. Kahneman, P. Slovic, and A. Tversky,
eds, Judgement under uncertainty: Heuristics and biases. Cambridge
University Press, Cambridge, UK
‫برنامهنویسان‬ ‫‪‌ ■‌154‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یبینند‌که‌‬ ‫در‌ادامه‌توضیح‌می‌دهم ‌که‌چرا‌نتایج‌با‌تصور‌شما‌مغایرت ‌داشت‪‌.‬بیشتر‌افراد‌م ‌‬


‫جهی‌‬
‫در‌گزارشهای‌آماری‌گفته‌است‌‪‌61‬درصد‌از‌افرادی‌که‌این‌نوع‌سرطان‌را ‌دارند‪‌،‬نتی ‌‬ ‫‌‬
‫جهی‌‬
‫آزمایششان‌مثبت‌است‌و‌با‌این‌فرض‪‌،‬نتیجه‌می‌گیرند‌که‌‪‌61‬درصد‌از‌افرادی‌که‌نتی ‌‬
‫آنها‌مثبت‌شود‪‌،‬یک‌همچین‌سرطانی‌را‌دارند‪‌.‬اشتباه‌است‌که‌به‌این‌صورت‌فکر‌‬ ‫آزمایش‌ ‌‬
‫کنیم ‌که ‌این ‌سرطان ‌فقط ‌‪‌ 1.1‬درصد ‌از ‌افراد ‌جمعیت ‌را ‌تحت ‌تاثیر ‌قرار ‌می‌دهد‪‌ .‬اجازه‌‬
‫میدهیم‪‌.‬این‌‬ ‫بدهید ‌بگوییم ‌که ‌آزمایش ‌را ‌بر ‌روی ‌تمام ‌یک‌میلیون ‌جمعیتِ ‌شهر ‌انجام ‌ ‌‬
‫بدان ‌معنی ‌است ‌که ‌‪‌ 1111‬نفر ‌در ‌شهر ‌این ‌سرطان ‌را ‌دارند‪‌.‬و ‌طبیعتاً ‌‪‌ 661111‬نفر ‌خیر‪‌.‬‬
‫ابتدا‪‌،‬تصور‌کنید‌که‌آزمایش‌را‌بر‌روی‌‪‌1111‬نفری‌که‌سرطان‌دارند‌انجام‌دهیم‪‌.‬می‌دانیم‌‬
‫که ‌‪‌ 61‬درصد ‌از ‌مواقع ‌هنگامی ‌که ‌آزمایش ‌را ‌بر ‌روی ‌افرادِ ‌دارای ‌سرطان ‌انجام ‌می‌دهیم‪‌،‬‬
‫جهی ‌آزمایش‌‬ ‫جهی ‌درست ‌را ‌(که ‌مثبت ‌است)‌برمی‌گرداند‪‌.‬پس ‌‪‌ 7141‬نتی ‌‬ ‫این ‌آزمایش ‌نتی ‌‬
‫جهی‌منفی‌را‌دریافت‌‬ ‫آنها‪‌،‬به‌اشتباه‪‌،‬نتی ‌‬‫کردهاند‌و‌‪‌291‬نفر‌از‌ ‌‬
‫مثبت‌را‌به‌درستی‌دریافت‌ ‌‬
‫نداشتهاند ‌برویم‪‌.‬هنگامی ‌که‌‬
‫‌‬ ‫کردهاند‪‌.‬حاال ‌اجازه ‌دهید ‌سراغ ‌‪‌ 661111‬نفری ‌که ‌سرطان ‌‬ ‫‌‬
‫جهی ‌درست ‌(که ‌همان‌‬ ‫یدهیم‪‌ ،‬در ‌‪‌ 67‬درصد ‌موارد ‌نتی ‌‬ ‫آنها ‌انجام ‌م ‌‬
‫آزمایش ‌را ‌بر ‌روی ‌ ‌‬
‫جهی ‌منفی‌‬‫آنها ‌را ‌به ‌درستی ‌نتی ‌‬
‫جهی ‌منفی ‌است)‌را ‌می‌گیریم‪‌.‬پس ‌‪‌ 691141‬نفر ‌از ‌ ‌‬ ‫نتی ‌‬
‫میکنیم‪‌.‬این ‌نتایج ‌در‌‬
‫جهی ‌آزمایششان‌را ‌مثبت ‌ارزیابی‌ ‌‬ ‫داده‌و ‌‪‌ 3111‬نفر ‌را ‌به ‌اشتباه‪‌ ،‬نتی ‌‬
‫جدول‌زیر‌خالصه‌شده‌است‪:‬‬
‫‌‬

‫‌‬

‫نتیجهی‌‬
‫‌‬ ‫دادهها ‌در ‌قسمتِ ‌«‬
‫جهی ‌مثبت ‌از ‌آزمایش ‌بگیرد ‌و ‌ ‌‬‫حاال‪‌ ،‬تصور ‌کنید ‌که ‌‪‌ ،Ann‬نتی ‌‬
‫آنها‌مثبت‌‬
‫جهی‌آزمایش‌ ‌‬ ‫آزمایش‌مثبت»‌را‌نیز‌به‌او‌بدهیم‪‌31111‌‌.‬نفر‌از‌افرادی‌که ‌نتی ‌‬
‫داشتهاند‪‌ .‬پس‌‬
‫‌‬ ‫آنها‪‌ ،‬سرطان ‌‬
‫نداشتهاند ‌و ‌فقط ‌‪‌ 7141‬نفر ‌از ‌ ‌‬
‫‌‬ ‫الالم ‌شده ‌است‪‌ ،‬سرطانی ‌‬
‫محتمل‌است‌که‌‪‌Ann‬سرطان‌نداشته‌باشد‪.‬‬
‫‌‬
‫نشدهاید؟‬
‫هنوز‌متوجه‌ ‌‬
‫یشوند‪.‬‬‫اشکالی‌ندارد‪‌.‬خیلی‌از‌افراد‌متوجه‌نم ‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪155‬‬

‫یرسید‪.‬‬
‫نهای‌بیشتری‪‌،‬به‌درك‌بهتری‌از‌این‌قضیه‌م ‌‬
‫با‌تمری ‌‬

‫چرا‌به‌تئوری‌بیزین‌احتیاج‌داریم؟‬
‫یشود‪:‬‬
‫تئوری‌بیز‌به‌صورت‌زیر‌نوشته‌م ‌‬

‫اجازه ‌بدهید ‌به ‌مثال ‌سبد ‌خرید ‌هوشمند‌ماکروسافت‌بازگردیم‪‌.‬در ‌آن ‌مثال‪‌ ،‬اطاللاتی ‌که‌‬
‫شمارهی‌‬
‫‌‬ ‫در ‌جدول ‌زیر ‌آمده ‌است ‌را ‌از ‌مشتریان ‌به ‌دست ‌آوردیم ‌(ستون‌‪‌ Customer ID‬‬
‫مشتری ‌را ‌نشان ‌می‌دهد‪‌ Zipcode‌ ،‬کد ‌پستی ‌است‪‌ ،‬ستونِ ‌‪‌bought organic product‬‬
‫ستونی‌است‌که‌نشان‌می‌دهد‌آیا‌شخص‌محصوالت‌ارگانیک‌خریده‌است‌یا‌خیر‌و‌ستون‌‬
‫‪‌ bought Sencha green tea‬نشان‌می‌دهد‌که‌آیا‌شخص‌چای‌سبز‌سنچا‌را‌خریده‌است‌‬
‫یا‌خیر)‪‌ :‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌159‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫یکند‪‌ .‬در‌‬
‫محدودهی ‌کدپستی ‌‪‌ 11115‬زندگی ‌م ‌‬
‫‌‬ ‫فرض ‌کنید ‌می‌دانیم ‌که ‌یک ‌مشتری ‌در ‌‬
‫نجا ‌دو ‌فرضی‌هی ‌متضاد ‌داریم ‌(دو ‌فرضی‌هی ‌رقیب)‪‌.‬یکی ‌اینکه ‌«این ‌مشتری ‌چای ‌سبز‌‬
‫ای ‌‬
‫یخرد»‪‌ .‬پس‌‬ ‫سنچا ‌را ‌خواهد ‌خرید» ‌و ‌دیگری‌اینکه‌«این ‌مشتری ‌چای ‌سبز ‌سنچا ‌را ‌نم ‌‬
‫فرمولها‌به‌صورت‌زیر‌خواهند‌بود‪:‬‬
‫‌‬
‫‌‬

‫و‌‬

‫‌‬
‫احتماالً‌تعجب‌کنید‌که‌چرا‌باید‌فرمول‌زیر‌را‌برای‌به‌دست‌آوردنِ‌این‌مقدار‌حساب‌کرد‪:‬‬
‫‌‬

‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪157‬‬

‫یتوانیم‌‬
‫‌م ‌‬ ‫‌راحتی‬ ‫‌به‬ ‫‌که‬ ‫‌است‬ ‫‌حالی‬ ‫‌در‬ ‫ای ن‬
‫‌را ‌به ‌صورت ‌مستقیم ‌از ‌جدول ‌باال ‌محاسبه‌‬
‫مثالهای ‌دنیای‌‬
‫کنیم‪‌.‬بله‪‌،‬در ‌این ‌مثالِ ‌ساده ‌حرف ‌شما ‌درست ‌است‪‌ ،‬ولی ‌در ‌بسیاری ‌از ‌ ‌‬
‫‌بسیار‌مشکل‌خواهد‌بود‪.‬‬ ‫محاسبهی‌‬
‫‌‬ ‫واقعی‪‌،‬‬
‫یخواستیم‌با‌توجه‌به‌جوابِ‌‬
‫‌مثال ‌قبلی ‌که ‌در‌مورد ‌پزشکی‌و‌سرطان‌بود‌را‌تصور‌کنید‪‌.‬م ‌‬
‫مثبت‌آزمایش‪‌،‬ببینیم‌که‌آیا‌آن‌شخص‌مبتال‌به‌بیماریِ‌سرطان‌هست‌یا‌خیر‪:‬‬
‫‌‬

‫‌‬

‫‌‬
‫‌را ‌تخمین‌‬ ‫یتوانیم‌‬
‫تمهای ‌سمت ‌راست ‌ساده ‌است‪‌ .‬ما ‌م ‌‬ ‫محاسبهی ‌آی ‌‬
‫‌‬
‫یتواند ‌با ‌دادنِ ‌جوابِ ‌آزمایش ‌به ‌یک ‌نمونه ‌از ‌افراد ‌که ‌سرطان ‌دارند‌‬‫بزنیم‪‌.‬این ‌تخمین ‌م ‌‬
‫یتوان ‌با ‌دادنِ ‌جواب ‌آزمایش ‌به‌‬ ‫‌را ‌نیز ‌م ‌‬ ‫محاسبه ‌شود‪‌ .‬همچنین‌‬
‫‌هم ‌یک ‌آماری ‌است ‌که‌‬ ‫نمونهای ‌از ‌افراد ‌که ‌سرطان ‌ندارند ‌محاسبه ‌کرد‪‌.‬‬
‫‌‬
‫‌هم ‌که ‌معادل ‌‬ ‫تهای ‌دولت ‌استخراج ‌کرد ‌و ‌‬ ‫یتوان ‌از ‌سای ‌‬ ‫م‌‬
‫‌است‪.‬‬
‫یتواند ‌چالشِ‌‬
‫‌به ‌صورت ‌مستقیم‪‌ ،‬م ‌‬ ‫ولی ‌در ‌طرف ‌مقابل‪‌ ،‬محاسبه‌ی‌‬
‫یخواهد ‌که ‌احتمالی‌را ‌به ‌دست ‌بیاوریم ‌که ‌جواب‌‬ ‫زیادی‌داشته ‌باشد‪‌.‬این ‌فرمول ‌از ‌ما ‌م ‌‬
‫آزمایش ‌را ‌به ‌یک ‌میانگین ‌تصادفی ‌از ‌افراد ‌در ‌کل ‌جمعیت ‌بدهیم ‌و ‌جواب ‌تست ‌هم ‌مثبت‌‬
‫(‪‌)POS‬باشد ‌و ‌نتیجتاً ‌آن ‌شخص ‌دارای ‌سرطان ‌باشد‪‌.‬برای ‌این ‌کار ‌ما ‌نیاز ‌به ‌یک ‌نمونه‌‬
‫انگر ‌جامعه ‌باشد ‌ولی ‌از ‌آن ‌جایی ‌که ‌‪‌ 1.1‬درصد ‌از ‌جامعه ‌سرطان ‌دارد‪‌،‬‬ ‫داریم‌که ‌بتواند ‌بی ‌‬
‫نمونهای ‌از ‌‪‌ 2111‬نفر‪‌ ،‬فقط ‌‪‌ 1‬بیمارِ ‌دارای ‌سرطان ‌دارد– ‌که ‌این‌‬‫به ‌این ‌معنی ‌است ‌که ‌ ‌‬
‫نمونهی ‌خیلی ‌بزرگ ‌داریم‪‌.‬و‌اینجاست‌که‌تئوری ‌بیز‌‬ ‫خیلی ‌کم ‌است‪‌.‬پس ‌احتیاج ‌به ‌یک ‌ ‌‬
‫یکند‪‌ .‬یعنی ‌این ‌استراتژی‌‬ ‫‌برای ‌ما ‌فراهم ‌م ‌‬ ‫یک ‌استراتژی ‌برای ‌محاسبه‌ی‌‬
‫هنگامی‌کارا‌است‌که‌محاسبه‌ی‌این‌فرمول‌به‌صورت‌مستقیم‌کار‌سختی‌باشد‪.‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌151‬‬
‫دادهکاوی‌برای‌ ‌‬

‫بیزین‌ساده‬
‫نمونهی‌داده‌‬
‫دادهها‪‌،‬تعداد‌بیشتری‌ ‌‬ ‫در‌اکثر‌اوقات‪‌،‬ما‌به‌جای‌داشتن‌یک‌قسمتِ‌کوچک‌از‌ ‌‬
‫داریم‪‌ .‬در ‌مثالِ ‌«چای ‌سبز ‌سنچا» ‌ما ‌دو ‌نوع ‌لالمت ‌یا ‌همان ‌ویژگی ‌داشتیم‪‌ :‬یکی ‌«کد‌‬
‫پستی» ‌بود ‌و ‌دیگری ‌اینکه ‌«آیا ‌شخص ‌غذای ‌ارگانیک ‌خریده ‌است ‌یا ‌خیر»‪‌ .‬برای‌‬
‫محاسبهی ‌احتمال ‌فرضیه‪‌ ،‬در ‌حالی ‌که ‌تمامیِ ‌لالئم ‌و ‌شواهد ‌به ‌ما ‌داده ‌شده ‌باشد‪‌ ،‬به‌‬
‫‌‬
‫سادگی‌هر‌یک‌از‌احتماالت‌را‌در‌هم‌ضرب‌می‌کنیم‪‌.‬برای‌مثال‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫یکند ‌و‌‬‫محدودهی ‌کدپستی ‌‪‌ 11115‬زندگی ‌م ‌‬‫‌‬ ‫یخواهیم ‌بدانیم‪‌ ،‬شخصی ‌که ‌در ‌‬‫ما ‌م ‌‬
‫محصوالت‌ارگانیک‌را‌نیز‌خریداری‌کرده‌است‪‌،‬چای‌سبز‌سنچا‌را‌خواهد‌خرید‌یا‌خیر‪:‬‬
‫محاسبهی ‌آن‌‬
‫‌‬ ‫فرمول ‌به ‌صورت ‌)‪‌ P(tea | 88005 & organic‬نوشته ‌م ‌‬
‫یشود ‌و ‌برای ‌‬
‫یکنیم‪:‬‬
‫احتماالت‌را‌با‌هم‌ضرب‌م ‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪156‬‬

‫محدودهی ‌کدپستیِ ‌‪‌ 11115‬زندگی ‌کرده‌و ‌غذاهای ‌ارگانیک ‌خریداری‌‬ ‫‌‬ ‫پس ‌شخصی ‌که ‌در ‌‬
‫نکه‌این‌محصول‌را‌خریداری‌‬ ‫کند‪‌،‬به‌احتمال‌بیشتری‌چای‌سبز‌سنچا‌را‌خواهد‌خرید‌تا‌ای ‌‬
‫میدهیم ‌تا‌‬
‫نکند‪‌.‬پس ‌به ‌این ‌خریدار ‌در ‌سبدِ ‌هوشمندِ ‌خریدش‪‌ ،‬چای ‌سبز ‌سنچا ‌را ‌نمایش ‌ ‌‬
‫در‌صورت‌نیاز‌خریداری‌کند‪.‬‬
‫یخواهم ‌جمل‌های ‌از ‌‪‌ Stephen Baker‬را ‌بیاورم ‌که ‌توضیحی ‌است ‌بر ‌تکنولوژی ‌سبد‌‬ ‫حاال ‌م ‌‬
‫خرید‪:‬‬
‫چگونه‌میتواند‌‬
‫‌‬ ‫یخواهیم ‌با ‌هم ‌ببینیم ‌که ‌خرید ‌از ‌این ‌سبدهای‌هوشمند ‌‬ ‫نجا ‌م ‌‬
‫«‪‌...‬در ‌ای ‌‬
‫کمککننده ‌باشد‪‌ .‬شما ‌سبد ‌خرید ‌خود ‌را ‌پر ‌کرده ‌و ‌کارتِ ‌مشتری ‌خود ‌را ‌رو ‌می‌کنید‪‌.‬‬ ‫‌‬
‫یشود ‌البته ‌همراه ‌با ‌لیست ‌خرید‪‌ .‬این ‌لیست ‌بر ‌اساس‌‬ ‫آمدگویی ‌باز ‌م ‌‬
‫خوش ‌‬
‫‌‬ ‫صفحهی ‌‬
‫‌‬
‫یتواند ‌در ‌این‌‬
‫تخممرغ‪‌ ،‬کدو ‌و ‌هر ‌چیز ‌دیگری ‌م ‌‬
‫الگوهای ‌خریدهای ‌قبلیِ ‌شماست‪‌.‬شیر‪‌ ‌ ،‬‬
‫عترین‌راه‌برای‌خرید‌هر‌آیتم‌‬ ‫سبد‌خرید ‌قرار‌بگیرد‪‌.‬سیستم‌های‌هوشمند‌ممکن‌است‌سری ‌‬
‫را ‌جلوی ‌پای ‌شما ‌قرار ‌دهند‪‌.‬یا ‌شاید ‌به ‌شما ‌اجازه ‌دهند ‌که ‌لیست ‌خرید ‌را ‌تغییر ‌دهید ‌و‌‬
‫به ‌سیستم ‌بگویید ‌که ‌برای ‌مثال ‌دیگر ‌گل ‌کلم ‌یا ‌بادام ‌زمینی ‌شور ‌را ‌پیشنهاد ‌ندهد‪‌.‬این‌‬
‫یک ‌کار ‌ساده ‌است‪‌.‬ولی ‌با ‌توجه ‌به ‌مطالعات ‌شرکت ‌اکسنچر ‌(‪‌)Accenture‬که ‌شرکتی ‌در‌‬
‫نهی ‌مشاوره ‌استراتژی ‌است‪‌ ،‬خریداران ‌به ‌طور ‌میانگین ‌‪‌ 22‬درصد ‌از ‌اقالمی ‌که‌‬ ‫زمی ‌‬
‫فروشگاهها‌به‌طور‌موثر‌به‌‬
‫‌‬ ‫یکنند‪‌.‬اگر‌‬‫یخواستند‌خرید‌کنند‌را‌در‌هنگامِ‌خرید‌فراموش‌م ‌‬ ‫م‌‬
‫یشود ‌که ‌کمتر ‌نصف ‌شب ‌مجبور‌‬ ‫ما ‌یادآوری ‌کنند ‌که ‌چه ‌چیزهایی ‌احتیاج ‌داریم‪‌ ،‬بالث ‌م ‌‬
‫یشود‪‌ ».‬‬ ‫آنها‌هم‌بیشتر‌م ‌‬‫شویم‌به‌فروشگاه‌برویم‌و‌خرید‌کنیم‌و‌البته‌فروش‌ ‌‬
‫‪Baker. 2008. P49‬‬
‫‌‬
‫کتاب‌شمارش‌(‪‌ )Numerati‬‬
‫من‌از‌این‌کتاب‌که‌توسط‌استفان‌بیکر ‌(‪‌)Stephen Baker‬نوشته‌شده‌است‌چندین‌بار‌‬
‫یکنم‌که‌این‌کتاب‌را‌بخوانید‪‌.‬کتاب‌کاغذی‌فقط‌‬
‫کردهام‪‌.‬به‌شما‌هم‌توصیه‌م ‌‬
‫نقل‌و‌قول‌ ‌‬
‫یخورد‪.‬‬
‫‪‌21‬دالر‌است‌و‌به‌دردِ‌خواندن‌قبل‌از‌خواب‌هم‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌191‬‬
‫دادهکاوی‌برای‌ ‌‬

‫مثالِ‌محصوالت‌‪‌i100‬و‌‪i500‬‬

‫لههای‌پوشیدنی‌برای‌‬‫نهی ‌فروشِ‌وسی ‌‬‫یخواهیم‌به‌شرکتِ‌‪‌iHealth‬که‌در‌زمی ‌‬ ‫فرض ‌کنید‌م ‌‬


‫(مثل‌دستبندهای‌هوشمند)‌فعالیت‌می‌کند‪‌ ،‬کمک ‌کنیم‪‌.‬این‌‬
‫‌‬ ‫مراقبت ‌و ‌نظارت ‌بر ‌تمرین ‌‬
‫لههایی ‌مانند ‌‪‌ Nike Fuel‬و ‌‪(‌ Fitbit Flex‬دو ‌محصول ‌مشابه ‌دیگر)‌است‪‌.‬‬ ‫شرکت ‌رقیب ‌وسی ‌‬
‫شرکت ‌‪‌ iHealth‬دو ‌مدل ‌از ‌این ‌محصول ‌را ‌می‌فروشد‪‌:‬مدل‌‪‌‌ i100‬و ‌مدل‌‪‌ i500‬که ‌تفاوت‌‬
‫آنها‌در‌لملکرد‌هر‌یک‌است‪.‬‬ ‫‌‬
‫‌‬
‫یهای‌محصول‌‪:iHealth100‬‬ ‫ویژگ ‌‬
‫محاسبهی‌‬
‫‌‬ ‫یاس ‌(برای ‌‬‫یپ ‌‬
‫نظارت ‌بر ‌ضربان ‌قلب‪‌ ،‬ج ‌‬
‫یفای ‌برای ‌اتصال ‌خودکار ‌به‌‬ ‫پیمودن ‌مسیر ‌و‪‌ ،)...‬وا ‌‬
‫سایت‌‪‌iHealth‬جهت‌فرستادن‌ ‌‬
‫دادهها‪.‬‬

‫‌‬
‫یهای‌محصول‌‪:iHealth500‬‬ ‫ویژگ ‌‬
‫یهای ‌‪‌ +‌ iHealth100‬نبض ‌اکسیمتری‌‬ ‫تمامی ‌ویژگ ‌‬
‫(اکسیژن ‌در ‌خون) ‌‪‌ +‬اتصال ‌‪‌ 3G‬خودکار ‌به ‌ ‌‬
‫وبسایت‌‬
‫‪iHealth‬‬
‫‌‬
‫‌‬
‫‌‬
‫یفروشد‌و‌ما‌را‌استخدام ‌کرده‌است‌تا‌سیستمِ‌‬ ‫این‌شرکت‪‌،‬محصوالت‌را‌به‌صورت‌آنالین‌م ‌‬
‫دادهها ‌در‌ساخت ‌سیستم‌‬ ‫جمعآوری ‌ ‌‬ ‫راهاندازی ‌کنیم‪‌.‬برای ‌ ‌‬‫توصیهگری‌را ‌برای ‌مشتریانشان ‌ ‌‬
‫‌‬
‫پرسشنامهای‌را‌پر‌‬
‫‌‬ ‫توصیهگر‪‌،‬هنگامی ‌که‌شخصی ‌یک‌دستگاه‌را‌خرید‪‌،‬از‌او‌می‌خواهیم‌که ‌‬ ‫‌‬
‫یپرسیم‌‬ ‫پرسشهای‌این‌پرسشنامه‪‌،‬به‌یک‌ویژگی‌مرتبط‌است‪‌.‬اول‪‌،‬از‌او‌م ‌‬ ‫‌‬ ‫کند‪‌.‬هر‌کدام‌از‌‬
‫نهای ‌ورزشی ‌بگوید ‌و ‌این ‌کار ‌را ‌بایستی ‌با ‌انتخاب‌‬
‫که ‌دلیل ‌اصلی ‌خود ‌را ‌برای ‌شروع ‌تمری ‌‬
‫نههای ‌زیر‌انجام ‌دهد‪‌:‬سالمتی ‌(‪‌،)health‬ظاهر‌(‪‌)appearance‬و‌یا‌هر‌دو ‌(‪‌.)both‬‬ ‫از‌گزی ‌‬
‫یپرسیم ‌که ‌در ‌حال ‌حاضر ‌در ‌چه ‌سطحی ‌تمرین ‌می‌کنند‪‌ :‬نشسته‌‬ ‫آنها ‌م ‌‬
‫سپس ‌‪‌ ،‬از ‌ ‌‬
‫یکنیم ‌که ‌تا ‌چه‌‬ ‫(‪‌ ،)sedentary‬متعادل ‌(‪‌ ،)moderate‬یا ‌فعال ‌(‪‌.)active‬از ‌ ‌‬
‫آنها ‌سوال ‌م ‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪192‬‬

‫لالقهمند ‌هستند‪‌ :‬به ‌صورت ‌نسبی ‌(‪‌ )moderate‬یا ‌بسیار ‌شدید‌‬ ‫اندازه ‌مشتاق ‌و ‌ ‌‬
‫دستگاههای ‌مبتنی ‌بر‌‬
‫‌‬ ‫(‪‌.)aggressive‬و ‌در ‌آخر ‌از ‌آن ها ‌این ‌سوال ‌را ‌می‌پرسیم ‌که ‌آیا ‌با ‌‬
‫آنها‌راحت‌هستند‌یا‌خیر‪‌.‬نتایج‌به‌صورت‌زیر‌درآمده‌است‌(ستون‌‬ ‫تکنولوژی‌و‌استفاده‌از‌ ‌‬
‫‪‌ Main Interest‬دلیل ‌اصلی ‌استفاده ‌را ‌نشان ‌می‌دهد‪‌ ،‬ستون ‌‪‌Current Exercise Level‬‬
‫دهندهی‌میزان ‌اشتیاق‌مشتری‌‬ ‫‌‬ ‫سطح‌فعلی‌خریدار‌است‪‌،‬ستون ‌‪‌ ‌ How Motivated‬‬
‫نشان‬
‫هم‌این‌معنا‌را‌میرساند‌که‌آیا‌کاربر‌در‌‬
‫‌‬ ‫بوده‌و‌ستون‌‪‌Comfortabe with tech. Devices‬‬
‫دهندهی ‌مدلی‌‬
‫‌‬ ‫استفاده ‌وسائل ‌تکنولوژی ‌راحت ‌است ‌یا ‌خیر‪‌ .‬ستون ‌‪‌ Model #‬هم ‌نشان‌‬
‫است‌که‌مشتری‪‌،‬خریده‌است)‪‌ :‬‬
‫‌‬

‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‬
‫برنامهنویسان‬ ‫‪‌ ■‌191‬‬
‫دادهکاوی‌برای‌ ‌‬

‫با‌استفاده‌از‌روش‌بیز‌ساده‌(‪‌،)Naïve Bayes‬کدام‌مدل‌را‌به‌شخصی‌که‪:‬‬
‫‌اولویت‌اولش‌سالمتی‌است‪‌.‬یعنی‌‪Main Interest = health‬‬
‫یکند‪‌.‬یعنی‌‪Current Exercise Level = moderate‬‬‫‌در‌سطح‌متعادل‌تمرین‌م ‌‬
‫‌به ‌صورت ‌نسبی ‌مشتاق ‌به ‌تمرین ‌کردن ‌است‪‌ .‬یعنی ‌ = ‪How Motivated‬‬
‫‪moderate‬‬
‫دستگاههای‌مبتنی‌بر‌تکنولوژی‌راحت‌است‪‌.‬یعنی‌ ‪Comfortable‬‬
‫‌‬ ‫‌و‌با‌استفاده‌از‌‬
‫‪‌ with tech. Devices = yes‬‬
‫یکنید؟‬
‫پیشنهاد‌م ‌‬
‫اگر‌دنبال‌کمک‌هستید‌قسمت‌زیر‌را‌بخوانید‬
‫‌‬
‫مداتان‌را‌تیز‌کنید‌–‌سرنخ‬
‫خب‪‌.‬در‌نهایت‌ما‌بایستی‌فرمول‌زیر‌را‌محاسبه‌کنیم‪‌ :‬‬
‫‌‬

‫و‌همچنین‪‌ :‬‬
‫‌‬

‫‌‬
‫محاسبهی‌این‌دو‪‌،‬مدلی‌با‌بیشترین‌احتمال‌را‌انتخاب‌کنیم‪.‬‬
‫‌‬ ‫و‌بعد‌از‌‬
‫محاسبهی‌فرمول‌اولی‌چه‌چیز‌نیاز‌داریم‪:‬‬
‫‌‬ ‫اجازه‌بدهید‌مشخص‌کنم‌که‌برای‌‬

‫پس‌این‌چیزی‌است‌که‌در‌ابتدا‌بایستی‌محاسبه‌کنیم‪:‬‬

‫‪P(health|i100) = 1/6‬‬
‫= )‪P(moderateExercise|i100‬‬
‫= )‪P(moderateMotivated|i100‬‬
‫= )‪P(techComfortable|i100‬‬
‫‪P(i100) = 6 / 15‬‬
193 ■‌‫‌بِیز‌ساده‬.9‌‫‌فصل‬

‫‌حاال‌امیدوارم‌که‌بتوانید‌مثال‌را‌حل‌کنید‬.‫این‌سر‌نخی‌بود‌که‌به‌شما‌دادم‬

‌ ‌–‌‫مدادتان‌را‌تیز‌کنید‬
‫راهحل‬
:‫اول‌بایستی‌فرمول‌زیر‌را‌محاسبه‌کنیم‬
P(i100 | health, moderateExercise, moderateMotivation,
techComfortable)
:‫که‌معادل‌ضرب‌تمامی‌جمالت‌زیر‌است‬
P(health|i100) P(moderateExercise|i100) P(moderateMotivated|i100)
P(techComfortable|i100) P(i100)

P(health|i100) = 1/6
P(moderateExercise|i100) = 1/6
P(moderateMotivated|i100) = 5/6
P(techComfortable|i100) = 2/6
P(i100) = 6 / 15
:‫پس‬
P(i100| evidence) = .167 * .167 * .833 * .333 * .4 = .00309

‌ ‫‌محاسبات‌را‌انجام‌م‬i500‌‫و‌حاال‌برای‬
:‫یدهیم‬
P(i500 | health, moderateExercise, moderateMotivation,
techComfortable)

P(health|i500) = 4/9
P(moderateExercise|i500) = 3/9
P(moderateMotivated|i500) = 3/9
P(techComfortable|i500) = 6/9
P(i500) = 9 / 15

P(i500| evidence) = .444 * .333 * .333 * .667 * .6 = .01975

.‫و‌نتیجه‌هم‌که‌مشخص‌است‬
‫برنامهنویسان‬ ‫‪‌ ■‌194‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یدهیم‬
‫حاال‌این‌کارها‌را‌در‌پایتون‌انجام‌م ‌‬
‫یکند‪‌،‬اجازه‌دهید‌ببینیم‌‬‫طبقهبند‌بیزین‌ساده‌چگونه‌کار‌م ‌‬
‫خیلی‌خوب!‌حاال‌که‌فهمیدیم‪‌ ‌،‬‬
‫لهای ‌داده ‌همانند ‌فرمت‌‬
‫ادهسازی ‌کنیم‪‌.‬فرمت ‌فای ‌‬
‫یتوانیم ‌آن ‌را ‌در ‌پایتون ‌پی ‌‬
‫که ‌چگونه ‌م ‌‬
‫فاصلهی ‌‪‌tab‬‬
‫فصل ‌قبل ‌است‪‌.‬در ‌فصل ‌قبل ‌فایل ‌متنی ‌موجود ‌بود ‌که ‌در ‌هر ‌خط ‌مقادیر ‌با ‌ ‌‬
‫از‌هم‌جدا‌شده‌بودند‪‌.‬حاال‌برای‌مثالِ‌‪‌،iHealth‬فایل‌داده‌چیزی‌مانند‌شکل‌زیر‌است‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫یخواهم‌‬ ‫کمی‌بیشتر‌از‌این‌دادهها‌را‌دارد‌و‌همچنین‌من‌م ‌‬
‫‌‬ ‫ما‌از‌مثالی‌استفاده‌می‌کنیم‌که‌‬
‫تکهای ‌(‪‌)10-fold cross validation‬که ‌در ‌فصل ‌قبلی ‌از ‌آن‌‬‫از ‌التبارسنجیِ ‌متقابل ‌‪‌ -21‬‬
‫دادهها ‌به ‌‪‌ 21‬سطل‌‬
‫نجا ‌هم ‌استفاده ‌کنم‪‌.‬اگر ‌خاطرتان ‌باشد‪‌ ،‬در ‌این ‌روش ‌ ‌‬
‫بهره ‌بردیم‪‌ ،‬ای ‌‬
‫یشدند‪‌.‬ما‌لملیات‌یادگیری‌را‌بر‌روی‌‪‌6‬قسمت‌انجام‌داده‌و‌‬ ‫(قسمت‌–‌‪‌)bucket‬تقسیم‌م ‌‬
‫میکردیم‪‌.‬و‌این‌کار‌را‌‪‌21‬‬‫یمانده)‌آزمایش‌ ‌‬ ‫نجا‌‪‌2‬قسمتِ‌باق ‌‬‫طبقهبند‌را‌بر‌روی‌بقیه‌(در‌ای ‌‬
‫‌‬
‫مرتبه ‌انجام ‌می‌دادیم‌و ‌هر ‌بار ‌یک ‌قسمت ‌خاصی ‌را ‌برای ‌آزمایش ‌کنار ‌می‌گذاشتیم‪‌.‬مثال‌‬
‫یتوانیم ‌لملیات ‌بیز ‌ساده ‌( ‪Naïve‬‬
‫‪‌ ،iHealth‬با ‌فقط ‌‪‌ 25‬نمونه ‌ساخته ‌شده ‌است‪‌ ،‬پس ‌م ‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪195‬‬

‫‪‌)Bayes‬را‌به‌صورت‌دستی‌بر‌روی‌آن‌انجام‌دهیم‪‌.‬احتماالً‌خیلی‌لاقالنه‌نیست‌که‌این‌‪‌25‬‬
‫نمونه ‌را ‌به ‌‪‌ 21‬قسمت ‌تقسیم ‌کنیم‪‌.‬یک ‌راه ‌حل‪‌ ،‬که ‌خیلی ‌هم ‌راه ‌حل ‌خوبی ‌نیست‪‌ ،‬این‌‬
‫است ‌که ‌همان ‌‪‌ 21‬قسمت ‌را ‌داشته ‌باشیم ‌ولی ‌تمام ‌‪‌ 25‬نمونه ‌در ‌یک ‌قسمت ‌(یک ‌سطل)‌‬
‫قسمتها‌خالی‌باشند‪.‬‬
‫‌‬ ‫قرار‌بگیرند‌و‌بقی‌هی‌‬
‫طبقهبندیِ ‌بیز ‌ساده ‌(‪‌ )Naïve Bayes‬از ‌دو ‌قسمت ‌تشکیل ‌شده ‌است‪‌ .‬یک‌‬ ‫کد ‌الگوریتم ‌ ‌‬
‫طبقهبندی‪.‬‬
‫قسمت‌برای‌آموزش‌و‌قسمت‌دیگر‌برای‌ ‌‬
‫قسمت‌آموزش‬
‫دادههای‌زیر‌باشد‪:‬‬
‫خروجی‌قسمت‌آموزش‌بایستی‌ ‌‬
‫مجمولهی‌احتماالت‌پیشین‌(‪‌–‌)prior probabilities‬برای‌مثال‌ = )‪P(i100‬‬ ‫‌‬ ‫‌یک‌‬
‫‪0.4‬‬
‫مجمولهی ‌احتماالت ‌شرطی ‌(‪‌ –‌ )conditional probabilities‬برای ‌مثال‌‬
‫‌‬ ‫‌یک ‌‬
‫‪P(health|i100) = 0.167‬‬
‫‌‬
‫درهمسازی ‌–‌ ‪hash‬‬
‫یخواهم‌احتماالت‌پیشین ‌را‌به‌صورت‌دیکشنری ‌در‌پایتون ‌(جدول‌ ‌‬
‫م‌‬
‫‪‌)table‬نمایش‌دهم‪:‬‬
‫‌‬

‫دهتر ‌هستند‪‌ .‬روش ‌من ‌– ‌که ‌احتماالً ‌ ‌‬


‫روشهای ‌بهتری ‌هم‌‬ ‫احتماالتِ ‌شرطی ‌کمی ‌پیچی ‌‬
‫مجمولهای ‌از ‌احتماالت ‌شرطی ‌را ‌به ‌هر ‌کالس ‌مرتبط ‌کنم‪‌.‬‬
‫‌‬ ‫موجود ‌باشد ‌– ‌این ‌است ‌که ‌‬
‫چیزی‌مانند‌کدِ‌زیر‪‌ :‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌199‬‬
‫دادهکاوی‌برای‌ ‌‬

‫الداد‌‪‌4‌،3‌،1‌،2‬بیان‌گر‌شماره‌های‌ستون‌ها‌است‪‌.‬پس‌اولین‌خط‌کد‌بیاال‌‌بیه‌‌ایی‌ن‌صیورت‌‌‬
‫یشود‪«‌:‬احتمال‌این‌که‌مقدار‌اولین‌ستون‌‪‌appearance‬باشد‪‌،‬بیه‌‌ایی‌ن‌شیرط‌‌کیه‌‌‬ ‫تفسیر‌م ‌‬
‫بدانیم‌دستگاه‪‌،‬مدل‌‪‌i500‬بوده‪‌،‬برابر‌‪‌1.333‬درصد‌است»‪.‬‬
‫محاسبهی‌این‌احتماالت‪‌،‬این‌است‌که‌به‌سادگی‌آیتم‌ها‌را‌شمارش‌کنی‌یم‪‌.‬در‌‬
‫‌‬ ‫اولین‌قدم‌در‌‬
‫زیر‌چند‌خطِ‌اول‌فایلِ‌ورودی‌به‌صورت‌زیر‌نمایش‌داده‌شده‌است‪:‬‬
‫‌‬

‫‌‬

‫کالسهایی‌است ‌که‌مشاهده‌‬
‫‌‬ ‫یها‌استفاده ‌کنم‪‌،classes‌.‬تعداد ‌‬
‫یخواهم‌از‌دیکشنر ‌‬
‫دوباره‌م ‌‬
‫کالسها‌(‪‌)classes‬مانند‌زیر‌خواهد‌بود‪:‬‬
‫‌‬ ‫شدهاند‪‌.‬پس‌بعد‌از‌اجرای‌خط‌اول‪‌،‬‬
‫‌‬
‫‌‬

‫‌‬
‫بعد‌از‌خط‌دوم‪:‬‬
‫‌‬

‫‌‬
‫و‌بعد‌از‌خط‌سوم‪‌ :‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪197‬‬

‫‌‬

‫‌‬
‫دادهها‪‌،‬مقدار‌‪‌classes‬به‌صورت‌زیر‌در‌م ‌‬
‫یآید‪:‬‬ ‫همهی‌ ‌‬
‫بعد‌از‌پردازش‌ ‌‬
‫‌‬

‫برای ‌به ‌دست ‌آوردنِ ‌احتمالِ ‌پیشین ‌(‪‌ ،)prior probabilities‬به ‌سادگی ‌این ‌الداد ‌را‌‬
‫یکنم ‌‬
‫نمونهها‌م ‌‬
‫تقسیم‌بر‌تعداد‌تمامی‌ ‌‬
‫‌‬

‫‌‬
‫‪.‬‬
‫برای‌مشخص‌کردن‌احتماالت‌شرطی‌(‪‌)conditional probabilities‬تعیداد‌‌پیشیامدها‌ی‌‬
‫یها‪‌،‬در‌ستون‌های‌مختلف‌را‌در‌یک‌دیکشنری‌به‌اسم‌‪‌count‬ذخیی‌ره‌کیرده‌‌و‌‬ ‫مقادیر‌ویژگ ‌‬
‫یکنم‪.‬‬
‫برای‌هر‌کالس‪‌،‬تعداد‌را‌جدا‌ذخیره‌م ‌‬
‫پس‌برای‌پردازش‌رشته‌ی‌«‪‌»both‬در‌خط‌اول‪‌،‬مقدار‌‪‌counts‬به‌صورت‌زیر‌خواهد‌بود‪:‬‬
‫‌‬

‫‌‬
‫دادهها‪‌،‬مقدار‌‪‌counts‬مانند‌کد‌زیر‌خواهد‌بود‪:‬‬
‫و‌در‌نهایت‌با‌پردازش‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌191‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬
‫پس‪‌ ،‬در ‌اولین ‌ستونِ ‌‪‌ ،i100‬دو ‌بار ‌ویژگی ‌«ظاهر ‌(‪‌ »)appearance‬و ‌یک ‌بار ‌ویژگی‌‬
‫«سالمتی‌(‪‌»)health‬مشاهده ‌شده‌است‪‌.‬مقدارِ‌«‪(‌both‬یعنی‌هر ‌دو)»‌برای‌ ‌‬
‫آنها‌نیز‌برابر‌‬
‫‪‌ 3‬خواهد ‌بود‪‌ .‬برای ‌به ‌دست ‌آوردن ‌احتماالت ‌شرطی‪‌ ،‬ما ‌آن ‌مقادیر ‌را ‌بر ‌تعداد ‌تمامی‌‬
‫یکنیم‪‌ .‬برای ‌مثال‪‌ ،‬تعداد ‌‪‌ 9‬نمونه ‌از ‌‪‌ i100‬وجود ‌دارد ‌که‌‬
‫نمونههای ‌آن ‌کالس‪‌ ،‬تقسیم ‌م ‌‬
‫‌‬
‫آنها‪‌،‬مقدار‌«ظاهر‌(‪‌»)apearance‬را‌برای‌ستون‌اولشان‌دارند‪‌.‬پس‪‌ :‬‬ ‫‪1‬تای‌ ‌‬

‫‪P(‘appearance’|i100) = 2/6 = .333‬‬

‫طبقهبند ‌قرار ‌داده ‌شده ‌است‌‬


‫با ‌استفاده ‌از ‌این ‌پیش‌زمینه‪‌ ،‬کد ‌پایتونِ ‌زیر ‌برای ‌آموزش ‌این ‌ ‌‬
‫یتوانید‌این‌کدها‌را‌از‌سایت‌‪‌guidetodatamining.com‬و‌‪‌chistio.ir‬‬ ‫(یادتان‌هست‌که‌م ‌‬
‫دانلود‌کنید)‪:‬‬
‫‌‬
‫‪class Classifier:‬‬
‫‪def __init__(self, bucketPrefix, testBucketNumber, data‬‬
‫‪Format):‬‬

‫‪""" a classifier will be built from files with the‬‬


‫‪bucketPrefix‬‬
‫‪excluding the file with textBucketNumber. dataForma‬‬
‫‪t is a string that‬‬
‫‪describes how to interpret each line of the data fi‬‬
‫‪les. For example,‬‬
‫‪for the iHealth data the format is:‬‬
‫‪"attr attr‬‬ ‫‪attr‬‬ ‫‪attr‬‬ ‫"‪class‬‬
‫"""‬

‫‪total = 0‬‬
‫}{ = ‪classes‬‬
196 ■‌‫‌بِیز‌ساده‬.9‌‫‌فصل‬

counts = {}

# reading the data in from the file

self.format = dataFormat.strip().split('\t')
self.prior = {}
self.conditional = {}
# for each of the buckets numbered 1 through 10:
for i in range(1, 11):
# if it is not the bucket we should ignore, rea
d in the data
if i != testBucketNumber:
filename = "%s-%02i" % (bucketPrefix, i)
f = open(filename)
lines = f.readlines()
f.close()
for line in lines:
fields = line.strip().split('\t')
ignore = []
vector = []
for i in range(len(fields)):
if self.format[i] == 'num':
vector.append(float(fields[i]))
elif self.format[i] == 'attr':
vector.append(fields[i])

elif self.format[i] == 'comment':


ignore.append(fields[i])
elif self.format[i] == 'class':
category = fields[i]
# now process this instance
total += 1
classes.setdefault(category, 0)
counts.setdefault(category, {})
classes[category] += 1
# now process each attribute of the ins
tance
col = 0
for columnValue in vector:
col += 1
counts[category].setdefault(col, {}
)
counts[category][col].setdefault(co
lumnValue, 0)
counts[category][col][columnValue]
+= 1
‫برنامهنویسان‬ ‫‪‌ ■‌171‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دهی‌ریاضی‌ی‌‬
‫یبینیی‌د‌هی‌یچ‌محاسیبات‌‌پیچیی‌ ‌‬
‫این‌کد‌فقط‌برای‌آموزش‌بود‪‌.‬همان‌طور‌که‌می‌ ‌‬
‫نداشت‪‌.‬فقط‌چند‌تا‌شمارش‌ساده‌بود‪.‬‬
‫‌‬
‫طبقهبندی‬
‫لملیات‌ ‌‬
‫طبقهبندی‌‬
‫نمونهی ‌مختلف ‌را ‌ ‌‬
‫یخواهیم ‌چند ‌ ‌‬ ‫طبقهبند ‌را ‌آموزش ‌دادیم‪‌ .‬حاال ‌م ‌‬
‫خب‪‌ ،‬ما ‌ ‌‬
‫درجهی‌اول‌به‌سالمت‌‬
‫کنیم‪‌.‬برای‌مثال‪‌،‬چه‌مدلی‌از ‌محصول‌را‌بایستی‌به‌شخصی ‌که ‌در‌ ‌‬
‫لالقهمند ‌است‪‌ ،‬به ‌صورت ‌نسبی ‌(‪‌ )moderated‬فعال ‌است‪‌ ،‬نسبتاً‌‬ ‫(‪‌ ‌ )health‬‬
‫(‪‌ )moderated‬مشتاق ‌است ‌و ‌در ‌نهایت ‌با ‌استفاده ‌از ‌تکنولوژی ‌هم ‌راحت ‌(‪ )yes‬است‪‌،‬‬
‫پیشنهاد‌دهیم‪:‬‬
‫)]'‪c.classify(['health', 'moderate', 'moderate', 'yes‬‬

‫محاسبهی‌کد‌باال‪‌،‬نیاز‌داریم‌تا‌فرمول‌زیر‌را‌محاسبه‌کنیم‪:‬‬
‫‌‬ ‫برای‌‬

‫قبالً ‌این ‌کار ‌را ‌به ‌صورت ‌دستی ‌انجام ‌دادیم‪‌ ،‬و ‌برای ‌این ‌کار ‌احتمالِ ‌وقوعِ ‌هر ‌فرضیه ‌را ‌با‌‬
‫میکردیم ‌و ‌حاال ‌به ‌سادگی ‌این ‌فرمول ‌را ‌به ‌کد‌‬ ‫توجه ‌به ‌اطاللاتی ‌که ‌داشتیم ‌محاسبه ‌ ‌‬
‫یکنیم‪:‬‬ ‫تبدیل‌م ‌‬
‫‌‬
‫‪def classify(self, itemVector):‬‬
‫"""‪"""Return class we think item Vector is in‬‬
‫][ = ‪results‬‬
‫‪for (category, prior) in self.prior.items():‬‬
‫‪prob = prior‬‬
‫‪col = 1‬‬
‫‪for attrValue in itemVector:‬‬
‫‪if not attrValue in self.conditional[categor‬‬
‫‪y][col]:‬‬
‫‪# we did not find any instances of this‬‬
‫‪attribute value‬‬
‫= ‪# occurring with this category so prob‬‬
‫‪0‬‬
‫‪prob = 0‬‬
‫‪else:‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪172‬‬

‫]‪prob = prob * self.conditional[category‬‬


‫]‪[col][attrValue‬‬
‫‪col += 1‬‬
‫))‪results.append((prob, category‬‬
‫‪# return the category with the highest probability‬‬
‫)]‪return(max(results)[1‬‬
‫‌‬
‫یکنیم‪‌،‬همان‌نتیجیه‌ای‌را‌میگیی‌ریم‌کیه‌‌قیبالً‌‌بیا‌‌محاسیبه‌ی‌‬
‫و‌هنگامی‌که‌کد‌را‌امتحان‌م ‌‬
‫دستی‌گرفته‌بودیم‪:‬‬
‫‌‬

‫‌‬

‫دموکراتها‬
‫‌‬ ‫یخواهان‌در‌مقابل‌‬
‫جمهور ‌‬
‫دادهی‌‬
‫دادهی ‌جدید‪‌ ،‬نگاهی ‌داشته ‌باشیم‪‌ .‬مجموله‌ی ‌ ‌‬ ‫اجازه ‌بدهید ‌به ‌یک ‌مجموله‌ی ‌ ‌‬
‫یهای ‌کنگره ‌(‪‌ ،)Congressional Voting Records‬که ‌از ‌سایت‌‬ ‫را ‌‬
‫مجمولهی ‌داده ‌در‌‬
‫‌‬ ‫‪‌ http://archive.ics.uci.edu/ml/index.html‬قابل ‌دانلود ‌است‪‌.‬این ‌‬
‫فرمتی ‌مطابق ‌با ‌برنامه‌ی ‌نوشته ‌شده ‌توسط ‌ما ‌استفاده ‌می‌شود‪‌ .‬برنامه‌ی ‌ما ‌در ‌سایت‌‬
‫یهای‌‬ ‫‪‌ guidetodatamining.com‬و ‌‪‌ chistio.ir‬قرار ‌دارد‪‌ .‬این ‌ ‌‬
‫دادهها ‌متشکل ‌از ‌را ‌‬
‫یشوند‪.‬‬‫ستونها‌شامل‌‪‌29‬ویژگی‌م ‌‬ ‫‌‬ ‫کنگرهی‌ایاالت‌متحده‌است‪‌.‬‬
‫‌‬ ‫نمایندگان‌‬
‫یها‪:‬‬‫اطاللات‌ویژگ ‌‬
‫یخواه)‬
‫‌نام‌کالس‪(1‌:‬دموکرات‪‌،‬جمهور ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌171‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌کودکان‌معلول‪(‌1:‬آری‪‌،‬خیر)‬
‫پروژهی‌آب‪(1‌:‬آری‪‌،‬خیر)‬
‫نهی‌ ‌‬ ‫‌به‌اشتراك‌گذاری‌هزی ‌‬
‫‌تصویب‌قطعنامه‌بودجه‪(‌1:‬آری‪‌،‬خیر)‬
‫‌ثابت‌نگه‌داشتن‌نرخ‌پزشکان‪(‌1:‬آری‪‌،‬خیر)‬
‫کمکهای‌السالوادور‪(‌1:‬آری‪‌،‬خیر)‬
‫‌ ‌‬
‫گروههای‌مذهبی‌در‌مدارس‪(‌1:‬آری‪‌،‬خیر)‬ ‫‌ ‌‬
‫ماهوارهای‪(‌1:‬آری‪‌،‬خیر)‬
‫‌‬ ‫‌جلوگیری‌از‌آزمایش‌ضد‌‬
‫‌کمک‌به‌گروه‌کانترا‌در‌نیکاراگوئه‪(‌1:‬آری‪‌،‬خیر)‬
‫‌موشک‌‪(‌1‌:mx‬آری‪‌،‬خیر)‬
‫‌ضد‌مهاجرت‪(‌1:‬آری‪‌،‬خیر)‬
‫‌تقلیل‌شرکت‌سینفیول‌(یک‌شرکت‌وابسته‌به‌دولت‌آمریکا)‪(‌1‌:‬آری‪‌،‬خیر)‬
‫‌هزینه‌برای‌تحصیالت‪(‌1:‬آری‪‌،‬خیر)‬
‫‌حق‌قانونی‌شکایت‪(‌1:‬آری‪‌،‬خیر)‬
‫‌جرم‌و‌جنایت‪(‌1:‬آری‪‌،‬خیر)‬
‫‌صادرات‌بدون‌مالیات‪(‌1:‬آری‪‌،‬خیر)‬
‫تهای‌صادراتی‌به‌آفریقای‌جنوبی‪(‌1:‬آری‪‌،‬خیر)‬ ‫‌فعالی ‌‬
‫‌‬
‫فایل‪‌ ،‬از ‌مقادیری ‌که ‌با ‌‪‌ tab‬از ‌هم ‌جدا ‌ ‌‬
‫شدهاند‪‌ ،‬تشکیل ‌شده ‌و‌چیزی‌شبیه‌به‌شکل‌زیر‌‬
‫است‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫یکند ‌‪.‬فرمت‌‬
‫طبقهبندی ‌بیز ‌ساده ‌(‪‌)Naïve Bayes‬برای ‌این ‌مثال‪‌ ،‬به ‌خوبی ‌کار ‌م ‌‬
‫الگوریتم ‌ ‌‬
‫یگوید‌که‌اولین‌ستون‌همان‌طبقه‌یا‌برچسب‌برای‌هر‌مورد‌است‌و‌بقیه‌ی‌‬ ‫رشتهها‌به‌ما‌م ‌‬
‫‌‬
‫یها‌(ابعاد)‌تفسیر‌شوند‪:‬‬
‫ستونها‪‌،‬بایستی‌به‌لنوان‌ویژگ ‌‬
‫‌‬
‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪173‬‬

‫لالی‌شد! ‌‬
‫‌‬

‫‌‬

‫برای ‌اینکه ‌یکی ‌از ‌مشکالتِ ‌این ‌روش ‌را ‌درك ‌کنید ‌چند ‌صندلیِ ‌نمایندگی ‌مختلف ‌در‌‬
‫دادهاند‪‌،‬یک‌‬
‫نمونهی‌مختلف‌که‌رای‌ ‌‬
‫ایاالت‌متحده‌را‌به‌لنوان‌نمونه‌در‌نظر‌بگیرید‪‌.‬از‌‪‌ ‌435‬‬
‫یخواه‪‌.‬‬‫کردهام ‌– ‌‪‌ 211‬نفر ‌دموکرات ‌و ‌‪‌ 211‬نفر ‌جمهور ‌‬
‫نمونهی ‌‪‌ 111‬تایی ‌از ‌استخراج ‌ ‌‬
‫‌‬
‫گفتهاند‪(‌ .‬هر‌‬
‫حهی ‌مختلف‪«‌،‬بلی» ‌ ‌‬ ‫از‌آنها‌به‌‪‌4‬الی ‌‬
‫یدهد‌که‌چند‌درصد‌ ‌‬ ‫جدول‌زیر‌نشان‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌174‬‬
‫دادهکاوی‌برای‌ ‌‬

‫کدام ‌از ‌ستون‌ها ‌یک ‌الیحه ‌است‪‌ .‬برای ‌مثال ‌‪‌ CISPA‬قانون ‌امنیت ‌و ‌اشتراك ‌هوشمند‌‬
‫سایبری‌است)‌‬
‫‌‬

‫‌‬
‫درصد‌رای‌به‌«بله» ‌‬

‫یخواهان ‌در ‌نمونه‪‌ ،‬به ‌‪(‌ CISPA‬قانون ‌امنیت ‌و‌‬


‫یدهد ‌‪‌ 66‬درصد ‌جمهور ‌‬ ‫این ‌جدول ‌نشان ‌م ‌‬
‫یخواهان ‌به ‌قانون‌‬‫دادهاند‪‌ .‬فقط ‌‪‌ 2‬درصد ‌جمهور ‌‬
‫اشتراك ‌هوشمند ‌سایبری) ‌جواب ‌«بله» ‌ ‌‬
‫حریم ‌خصوصیِ ‌خواننده ‌(‪‌ )Reader Privacy Act‬رای ‌بله ‌دادند‪‌ ،‬در ‌حالی ‌که ‌‪‌ 66‬درصد‌‬
‫آنها ‌به ‌مالیات ‌فروش ‌اینترنت ‌(‪‌ )Internet Sales Tax‬رای ‌داده ‌و ‌‪‌ 51‬درصد ‌ ‌‬
‫آنها ‌به‌‬ ‫‌‬
‫الیحهی‌شنود‌اینترنتی‌(‪‌)Internet Snooping Bill‬رای‌بله‌ ‌‬
‫دادهاند‌(البته‌من‌این‌مقادیر‌را‌‬ ‫‌‬
‫ندهی ‌ایاالت ‌متحده ‌را ‌انتخاب ‌می‌کنیم‌‬
‫از ‌خودم ‌ساختم‪‌ ،‬یعنی ‌واقعی ‌نیستند)‪‌.‬ما ‌یک ‌نمای ‌‬
‫ندهی ‌‪‌ X‬که ‌با ‌‪‌ Rep. X‬در ‌جدول ‌نشان ‌داده ‌می‌شود‪‌،‬‬ ‫نمونهی ‌ما ‌نباشد‪‌ .‬مثالً ‌نمای ‌‬
‫که ‌در ‌ ‌‬
‫نحوهی ‌رای‌‬
‫یخواه ‌است ‌یا ‌یک ‌دموکرات؟ ‌در ‌زیر‪‌ ‌ ،‬‬ ‫یخواهیم ‌ببینیم ‌آیا ‌او ‌یک ‌جمهور ‌‬ ‫وم ‌‬
‫آوردهام‪:‬‬
‫دادنِ‌این‌نماینده‌را‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫یخواه؟‬
‫به‌نظرتان‪‌،‬این‌شخص‪‌،‬دموکرات‌است‌یا‌جمهور ‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪175‬‬

‫به‌نظر ‌من ‌که ‌دموکرات ‌است‪‌.‬اجازه ‌بدهید ‌به ‌صورت ‌قدم ‌به ‌قدم ‌مثال ‌را ‌با ‌استفاده ‌از ‌بیز‌‬
‫دموکراتها)‌و‌‬
‫‌‬ ‫ساده ‌(‪‌)Naïve Bayes‬پیش ‌ببریم‪‌.‬احتماالتِ ‌پیشین ‌برای ‌)‪(‌ P(Democrat‬‬
‫خواهها) ‌هر ‌دو ‌برابر ‌‪‌ 1.5‬است‪‌ ،‬چون ‌دقیقاً ‌تعداد ‌‪‌ 211‬نفر‌‬ ‫ی ‌‬ ‫)‪(‌ P(Republican‬جمهور ‌‬
‫یدانیم ‌که‌‬ ‫دادهی‌ما‌موجود‌بودند‪‌.‬ما ‌م ‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬ ‫دموکرات ‌و ‌‪‌ 211‬نفر ‌جمهوری‌خواه ‌در ‌‬
‫یخواهیم ‌حزبِ ‌او ‌را ‌مشخص ‌کنیم‪‌ ،‬به ‌‪(‌ CISPA‬قانون ‌امنیت‌‬ ‫ندهی ‌‪‌ X‬یعنی‌همان ‌که ‌م ‌‬
‫نمای ‌‬
‫یدانیم‌که‪:‬‬ ‫و‌اشتراك‌هوشمند‌سایبری)‌رایِ‌«خیر‌‪‌»N‌-‬داده‌است‪‌.‬همچنین‌م ‌‬

‫‪P(Republican|C=no) = 0.01 and P(Democrat|C=no) = 0.99‬‬

‫که‌در‌این‌فرمول‪‌،‬منظورمان‌از‌‪‌،C‬همان‌‪(‌CISPA‬قانون‌امنیت‌و‌اشتراك‌هوشمند‌سایبری)‌‬
‫است‌و‌با‌همان‌شواهد‌کم‪‌،‬مقدار‌احتمال‌)‪‌P(h|D‬به‌صورت‌زیر‌محاسبه‌م ‌‬
‫یشود‌(منظور‌از‌‬
‫‪‌Republication‬جمهوری‌خواه‌و‌منظور‌از‌‪‌Democrat‬دموکرات‌است)‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫ندهی‌‪‌،X‬به‌قانون‌محافظت‌از‌خوانندگان‌(‪‌)Reader Privacy Act‬رای‌‬‫با‌توجه‌به‌اینکه‌نمای ‌‬
‫«بلی» ‌داده ‌و ‌رای‌«خیر» ‌که‌به ‌مالیات‌فروش‌اینترنت‌(‪‌ )Internet Sales Tax‬داده‌است‪‌،‬‬
‫یآید‪:‬‬
‫جدول‌زیر‌به‌دست‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌179‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬

‫نرمالسازی‌(‪‌)normalize‬کنیم‪‌،‬به‌لدد‌زیر‌م ‌‬
‫یرسیم‪‌ :‬‬ ‫اگر‌این‌احتماالت‌را‌ ‌‬

‫نمونهی ‌‪‌ ،X‬یک ‌نماینده‌ی‌‬


‫نجا ‌با ‌احتمال ‌‪‌ 66.66‬درصد ‌یقین ‌پیدا ‌کردیم ‌که ‌ ‌‬
‫پس ‌تا ‌به ‌ای ‌‬
‫دموکرات‌است‪.‬‬
‫الیحهی‌شنود‌اینترنت‌(‪‌)Internet Snooping Bill‬را‪‌،‬بیرا‌ی‌‬
‫در‌نهایت‪‌،‬ما‌رای‌«خیر»‌برای‌ ‌‬
‫یدهیم‪:‬‬‫این‌نماینده‌مورد‌محاسبه‌قرار‌م ‌‬

‫اوه‪‌ .‬ما ‌از ‌یقین ‌‪‌ 66.66‬درصدی ‌به ‌احتمال ‌‪‌ 1‬درصدی ‌برای ‌دموکرات ‌بودنِ ‌این ‌شخص‌‬
‫رسیدیم‪‌.‬این ‌به ‌آن ‌دلیل ‌است ‌که ‌تعداد ‌‪‌ 1‬لدد ‌(یعنی ‌هیچ)‌دموکرات ‌به ‌قبض ‌شنود ‌رایِ‌‬
‫یرسیم ‌که ‌شخصِ ‌‪‌ ،X‬یک‌‬ ‫«خیر» ‌داده ‌بودند‪‌ .‬بر ‌اساس ‌این ‌احتماالت‪‌ ،‬به ‌این ‌نتیجه ‌م ‌‬
‫جمهوری‌خواه‌است‪‌.‬که‌این‌بر‌خالف‌شهود‌اولی‌هیمان‌بود‪.‬‬
‫‌‬

‫تخمین‌احتماالت‬
‫احتماالت ‌در ‌الگوریتم ‌بیز ‌ساده ‌(‪‌ )Naïve Bayes‬در ‌واقع ‌تخمینی ‌از ‌احتماالت ‌واقعی‌‬
‫دادهها‌‬
‫آنهایی‌هستند‌که‌از‌تمام‌جمعیت ‌ ‌‬ ‫هستند‪‌.‬احتماالت‌واقعی ‌(‪‌ ‌)true probabilities‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪177‬‬

‫تکتکِ ‌افراد ‌در ‌جامعه‌‬


‫یتوانستیم ‌آزمایش ‌سرطان ‌را ‌به ‌ ‌‬
‫یآیند‪‌.‬برای ‌مثال‪‌ ،‬اگر ‌م ‌‬‫به ‌دست ‌م ‌‬
‫جهی‌منفی‌را‌‬ ‫یتوانستیم‪‌،‬برای‌مثال‪‌،‬با‌دریافت‌احتمال‌واقعی‌و‌دقیقِ‌آزمایش‪‌،‬نتی ‌‬ ‫بدهیم‪‌،‬م ‌‬
‫با ‌توجه ‌به ‌آگاه ‌بودن ‌از ‌این‌که ‌شخصی ‌سرطان ‌ندارد‪‌ ،‬مشخص ‌کنیم‪‌ .‬با ‌این ‌حال‪‌ ،‬انجام‌‬
‫یتوانیم‌این‌احتمال‌را‌‬ ‫تکتکِ‌افراد‌در‌جامعه‌تقریباً‌غیر‌ممکن‌است‪‌.‬ما‌م ‌‬ ‫آزمایش‌برای‌هر‌ ‌‬
‫ندهای‌از‌جمعیت‌مورد‌نظر‌باشد‪‌،‬تخمین‌بزنیم‪‌.‬برای‌‬ ‫نمونهی‌تصادفی‌که‌نمای ‌‬ ‫با‌انتخاب‌یک‌ ‌‬
‫آنها ‌انجام ‌می‌دهیم ‌و‌‬ ‫مثال ‌‪‌ 2111‬نفر ‌را ‌انتخاب ‌کرده‪‌ ،‬آزمایش ‌سرطان ‌را ‌بر ‌روی ‌ ‌‬
‫احتماالت‌را‌محاسبه‌می‌کنیم‪‌.‬در‌اکثر‌موارد‪‌،‬این‌کار‌تخمین‌خوبی‌از‌احتماالت‌واقعی‌را‌به‌‬
‫نها‪‌ ،‬رو ‌به‌‬
‫یدهد‪‌ ،‬ولی ‌هنگامی ‌که ‌احتماالت ‌واقعی ‌خیلی ‌کوچک ‌باشند‪‌ ،‬این ‌تخمی ‌‬ ‫ما ‌م ‌‬
‫نجا ‌یک ‌مثال ‌را ‌با ‌هم ‌مرور ‌می‌کنیم‪‌.‬فرض ‌کنید ‌که ‌احتمال ‌واقعیِ‌‬ ‫یروند‪‌.‬در ‌ای ‌‬
‫ضعف ‌م ‌‬
‫نکه ‌یک ‌دموکرات ‌به ‌الیحه‌ی ‌شنود ‌اینترنت ‌(‪‌ )Internet Snooping Bill‬رایِ ‌«خیر»‌‬ ‫ای ‌‬
‫بدهد‪‌،‬برابر‌‪‌1.13‬درصد‌است‪.P(S=no|Democrat) = 0.03‌.‬‬

‫ورزش‌سبکِ‌ذهنی‬
‫یخواه‪‌،‬‬
‫فرض ‌کنید‪‌،‬ما‌همین‌احتمال‌باال‌را‪‌،‬با‌انتخاب‌‪‌21‬نفر‌دموکرات‌و‌‪‌21‬نفر‌جمهور ‌‬
‫تخمین ‌بزنیم‪‌ .‬کدام ‌یک ‌از ‌الداد ‌زیر‪‌ ،‬بیشترین ‌احتمال ‌را ‌برای ‌فرد ‌دموکراتی ‌که ‌رای‌‬
‫الیحهی‌شنود‌اینترنتی‌داده‌باشد‪‌،‬دارد؟ ‌‬
‫«خیر»‌به‌ ‌‬
‫‌‬

‫‌‬

‫ورزش‌سبکِ‌ذهنی‌–‌راه‌حل‬
‫یخواه‪‌،‬‬
‫فرض ‌کنید‪‌،‬ما‌همین‌احتمال‌باال‌را‪‌،‬با‌انتخاب‌‪‌21‬نفر‌دموکرات‌و‌‪‌21‬نفر‌جمهور ‌‬
‫تخمین ‌بزنیم‪‌ .‬کدام ‌یک ‌از ‌الداد ‌زیر‪‌ ،‬بیشترین ‌احتمال ‌را ‌برای ‌فرد ‌دموکراتی ‌که ‌رای‌‬
‫«خیر»‌به‌قبض‌شنود‌اینترنتی‌داده‌باشد‪‌،‬دارد؟‬

‫‪0‬‬
‫پس‌بر‌اساس‌نمونه‪.P(S=no|Democrat) = 0‌،‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌171‬‬
‫دادهکاوی‌برای‌ ‌‬

‫همانطور ‌که ‌در ‌مثال ‌باال ‌دیدیم‪‌ ،‬هنگامی ‌که ‌احتمال ‌برابر ‌صفر ‌است‪‌ ،‬این ‌احتمالِ ‌صفر ‌بر‌‬
‫‌‬
‫سراسر ‌الگوریتم ‌بیز ‌ساده ‌(‪‌)Naïve Bayes‬تاثیر ‌می‌گذارد ‌– ‌مهم ‌نیست ‌که ‌بقیه‌ی ‌مقادیر‌‬
‫یشوند‪‌،‬‬‫چه‌هستند‪‌.‬مشکلِ ‌دیگر ‌این ‌است ‌که‪‌ ،‬احتماالتی ‌که ‌بر ‌اساس ‌یک ‌نمونه ‌ساخته ‌م ‌‬
‫به ‌سمتِ ‌دست ‌کم ‌گرفته ‌شدنِ ‌(‪‌ )underestimate‬احتمالِ‌واقعی ‌انحراف ‌پیدا ‌می‌کنند‪‌.‬‬
‫یعنی‌تمایل‌دارند‌که‌دست‌کم‌گرفته‌شوند‪.‬‬
‫‌‬

‫حل‌مشکل‬
‫اگر ‌سعی ‌کنیم ‌که ‌چیزی ‌شبیه ‌به ‌)‪‌ P(S=no|Democrat‬را ‌حساب ‌کنیم‪‌ ،‬محاسباتمان‌‬
‫یشود‪:‬‬‫مانند‌زیر‌م ‌‬

‫ها‌دموکرات‌بوده‌و‌به‌الیحهی‌شنود‌اینترنتی‌رایِ‌خیر‌‬
‫‌‬ ‫‌‬
‫تعدادی‌که‌هر‌دوی‌آن‬ ‫صورت‌کسر‪‌:‬‬
‫داده‌باشند ‌‬
‫مخرج‌کسر‪‌:‬تعداد‌کل‌دموکرات‌ها ‌‬
‫‌‬
‫کوتاهتر‪‌ ،‬این ‌فرمول ‌را ‌توضیح‌‬
‫سادهتر ‌اجازه ‌بدهید‪‌ ،‬با ‌استفاده ‌از ‌متغیرهای ‌ ‌‬
‫برای ‌توضیح ‌ ‌‬
‫دهم‪:‬‬
‫‌‬

‫‌‬
‫نمونههای‌موجود‌در‌کالسِ ‌‪‌y‬در‌مجموله‌ی‌آموزشی‌هستند‌و‌ ‌تعداد‌‬ ‫که‌در‌آن ‌‪‌n‬تعداد‌ ‌‬
‫نمونههای‌موجود‌از‌کالسِ‌‪‌y‬است‌که‌مقدار‌‪‌x‬را‌دارند‪.‬‬
‫تمامی‌ ‌‬
‫مشکلی ‌که ‌داریم ‌هنگامی ‌است ‌که‌ ‌برابر ‌صفر ‌است‪‌.‬ما ‌این ‌مشکل ‌را ‌با ‌تغییر ‌فرمول ‌به‌‬
‫یکنیم‪:‬‬
‫صورت‌زیر‌حل‌م ‌‬
‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪176‬‬

‫نمونهی‌مساوی‌( ‪equivalent sample‬‬ ‫در‌این‌فرمول‪‌m‌،‬یک‌لدد‌ثابت‌است‌که‌« ‌‬


‫اندازهی‌ ‌‬
‫یشود‪‌.‬روشِ ‌مشخص ‌کردنِ ‌‪‌ m‬متفاوت ‌است‪‌.‬اما ‌برای ‌االن‪‌ ،‬من ‌‪‌ m‬را ‌برابر‌‬ ‫‪‌ »)size‬نامیده‌م ‌‬
‫میتواند‌داشته‌باشد‪‌.‬برای ‌مثال‪‌،‬‬ ‫در‌نظر‌میگیرم‌که ‌این ‌یک‌ویژگی ‌ ‌‬
‫‌‬ ‫تعداد ‌مقادیر ‌متفاوتی ‌‬
‫نحوهی ‌رای ‌دادنِ ‌یک ‌شخص ‌به ‌الیحه‌ی‌شنود ‌اینترنت ‌وجود ‌دارد‪‌.‬‬ ‫‪‌ 1‬مقدارِ ‌متفاوت ‌برای ‌ ‌‬
‫مقادیر ‌«بلی» ‌و ‌«خیر»‪‌ .‬پس ‌مقدار ‌‪‌ m‬را ‌برابر ‌‪‌ 1‬قرار ‌می‌دهم‪‌ p‌ .‬هم ‌که ‌مقدار ‌تخمین‌‬
‫یگیریم‪‌.‬برای‌مثال‪‌،‬چقدر‌‬ ‫پیشین‌احتمال‌است‪‌.‬در‌اکثر‌موارد‪‌،‬احتمال‌یکپارچه‌را‌در‌نظر‌م ‌‬
‫الیحهی ‌شنود» ‌رایِ ‌«خیر» ‌بدهد‪‌ ،‬با ‌توجه ‌به ‌این‌که ‌هیچ‌‬
‫احتمال ‌دارد ‌که ‌شخصی ‌به ‌« ‌‬
‫چیزی‌در‌مورد‌این‌شخص‌ندانیم؟‌½‪‌.‬پس‌‪‌p‬در‌این‌مثال‌برابر‌½‌است‪.‬‬
‫یکنید‌‪‌.‬‬ ‫اجازه‌بدهید‌به‌سراغ‌همان‌مثال‌قبلی‌برویم‌تا‌ببنیم‌این‌فرمول‌به‌چه‌شکل‌کیار‌‌می‌ ‌‬
‫یدهد‪:‬‬
‫یها‌را‌نمایش‌م ‌‬ ‫ابتدا‪‌،‬جدول‌زیر‌را‌نگاه‌کنید‌که‌را ‌‬
‫‌‬
‫خواهها‌(‪‌ )Republican‬‬
‫های‌جمهوری ‌‬
‫‌‬ ‫‌‬
‫رای‬

‫‌‬
‫‌‬
‫های‌دموکراتها‌(‪‌ )Democrats‬‬
‫‌‬ ‫‌‬
‫رای‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌111‬‬
‫دادهکاوی‌برای‌ ‌‬

‫طبقهبندی ‌کنیم‪‌ ،‬به ‌‪‌ CISPA‬رایِ ‌«خیر» ‌ ‌‬


‫دادهاست‪‌ .‬ابتدا ‌ما‌‬ ‫یخواهیم ‌او ‌را ‌ ‌‬
‫شخصی ‌که ‌م ‌‬
‫یخواه ‌باشد ‌(با ‌این ‌شرظ ‌که ‌بدانیم ‌که ‌او ‌رایِ ‌«خیر» ‌را‌‬
‫احتمالِ ‌این‌که ‌این ‌شخص ‌جمهور ‌‬
‫یکنیم‪‌.‬فرمول‌جدیدمان‌به‌این‌صورت‌بود‪:‬‬ ‫به‌‪‌ ‌CISPA‬‬
‫دادهاست)‌محاسبه‌م ‌‬
‫‌‬

‫‌‬
‫خواهها ‌(یعنی ‌برابر ‌‪‌ )211‬است ‌و‌ ‌ ‌تعداد‌‬
‫ی ‌‬ ‫در ‌این ‌فرمول ‌‪‌ ،n‬برابر ‌تعداد ‌جمهور ‌‬
‫دادهاند‌(یعنی‌تعداد‌‪‌2‬نفر)‪‌m‌.‬هم‌که‌‬
‫خواههایی‌است‌که‌رایِ‌«خیر»‌را‌به‌‪‌ ‌CISPA‬‬ ‫ی ‌‬ ‫جمهور ‌‬
‫یشود‪‌.‬پس‌‬ ‫تعداد‌مقادیر‌مختلف‌برای‌رای‌است‌(یعنی‌همان‌«بلی»‌و‌«خیر»)‌که‌برابر‌‪‌1‬م ‌‬
‫یآید‪‌ :‬‬
‫با‌جایگذاری‌این‌الداد‌در‌فرمولِ‌باال‪‌،‬نتیجه‌به‌صورت‌زیر‌در‌م ‌‬
‫‌‬

‫حاال‌همین ‌فرآیند‌را‌برای‌شخصی‌استفاده‌می‌کنیم ‌که‌به ‌‪‌CISPA‬رایِ‌«خیر»‌داده‌باشد‌با‌‬


‫این‌شرط‌که‌بدانیم‌او‌دموکرات‌است‪‌ :‬‬
‫‌‬

‫‌‬
‫با‌این‌شواهد‪‌،‬احتماالت‌مربوط‌به‌)‪‌P(h|D‬مانند‌جدول‌زیر‌می‌شود‪:‬‬

‫الیحهی‌‪‌Reader Privacy Act‬و‌‬


‫یهای‌«بلی»‌که‌‪‌X‬به‌ ‌‬‫یتوانیم‌همین‌کار‌را‌برای‌را ‌‬
‫حال‌م ‌‬
‫یهای‌«خیر»‌که‌‪‌X‬به‌‪‌ ‌Internet Sales Tax‬‬
‫دادهاست‌محاسبه‌کنیم‪.‬‬ ‫همچنین‌را ‌‬
‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪112‬‬

‫مدادتان‌را‌تیز‌کنید‬
‫این ‌مسئله ‌را ‌حل ‌کنید‪‌ .‬ببینید ‌که ‌آیا ‌این ‌شخص ‌یک ‌دموکرات ‌است ‌یا ‌یک‌‬
‫یخواه‪.‬‬
‫جمهور ‌‬
‫الیحهی ‌ ‪Reader‬‬
‫یادتان ‌باشد ‌که ‌این ‌شخص‪‌ ،‬به ‌‪‌ CISPA‬رایِ ‌«خیر» ‌داده ‌است‪‌ ،‬به ‌ ‌‬
‫الیحهی‌‪‌Internet Sales Tax‬و‌ ‪Internet‬‬
‫‪‌Privacy Act‬رایِ‌«بلی» ‌داده‌است‌و‌به‌دو‌ ‌‬
‫‪‌Snooping Bill‬هم‌رای‌«خیر»‌داده‌است‪.‬‬

‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‬
‫این ‌مسئله ‌را ‌حل ‌کنید‪‌ .‬ببینید ‌که ‌آیا ‌این ‌شخص ‌یک ‌دموکرات ‌است ‌یا ‌یک‌‬
‫یخواه‪.‬‬
‫جمهور ‌‬
‫الیحهی ‌ ‪Reader‬‬
‫یادتان ‌باشد ‌که ‌این ‌شخص‪‌ ،‬به ‌‪‌ CISPA‬رایِ ‌«خیر» ‌داده ‌است‪‌ ،‬به ‌ ‌‬
‫الیحهی‌‪‌Internet Sales Tax‬و‌ ‪Internet‬‬ ‫‪‌Privacy Act‬رایِ‌«بلی» ‌داده‌است‌و‌به‌دو‌ ‌‬
‫‪‌Snooping Bill‬هم‌رای‌«خیر»‌داده‌است‪.‬‬
‫‌‬
‫محاسبهی ‌دو ‌ستون ‌دیگر ‌در ‌این ‌مسئله‪‌ ،‬دقیقاً ‌مانندِ ‌همان ‌فرمول ‌و ‌محاسباتی ‌که‌‬
‫‌‬ ‫برای ‌‬
‫الیحهی ‌ ‪Internet‬‬
‫نکه ‌این ‌شخص ‌به ‌ ‌‬ ‫یکنیم‪‌ .‬احتمال ‌ای ‌‬ ‫برای ‌‪‌ CISPA‬کردیم‪‌ ،‬لمل ‌م ‌‬
‫یخواه‌است‌‬‫‪‌Snooping Bills‬رای‌«خیر»‌داده‌باشد‌با‌این‌شرط‌که‌بدانیم‌او‌یک‌جمهور ‌‬
‫یشود‪:‬‬‫به‌صورت‌زیر‌محاسبه‌م ‌‬

‫و‌همین‌احتمال‌با‌شرط‌دموکرات‌بودنِ‌شخص‪:‬‬

‫یرسیم‪:‬‬
‫با‌ضرب‌این‌احتماالت‌با‌یکدیگر‪‌،‬به‌جدول‌زیر‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌111‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یکنیم‪‌.‬که ‌البته‌‬
‫طبقهبندی ‌م ‌‬
‫پس ‌بر ‌خالف ‌روش ‌قبلی‪‌ ،‬ما ‌این ‌شخص ‌را ‌یک ‌دموکرات ‌ ‌‬
‫یآید‪.‬‬
‫این‌با‌شهود‌ما‌هم‌جور‌در‌م ‌‬

‫رفع‌یک‌ابهام ‌‬
‫در ‌همین‌مثالِ ‌قبلی‪‌ ،‬مقدار ‌‪‌ m‬برای ‌تمامی ‌محاسبات ‌برابر ‌‪‌ 1‬بود‪‌ .‬با ‌این ‌حال‪‌ ،‬لزومی ‌ندارد‌‬
‫یها ‌(ابعاد)‌یک‌مقدار‌ثابت‌باشد‪‌.‬مثال‌نظارت‌بر‌سالمتی ‌که‌‬ ‫که‌مقدار ‌‪‌m‬برای‌تمامیِ‌ویژگ ‌‬
‫آنجا ‌داشتیم ‌به ‌صورت‌‬ ‫یهایی ‌که ‌ ‌‬ ‫قبالً ‌در ‌مورد ‌آن ‌صحبت ‌کردیم ‌را ‌به‌یاد‌بیاورید‪‌.‬ویژگ ‌‬
‫زیر‌بود‪:‬‬
‫پرسشنامه‪:‬‬
‫لالقهمندیِ‌شما‌برای‌خرید‌این‌محصول‌چیست؟‬ ‫دلیل‌اصلی‌ ‌‬
‫‪‌-‬سالمتی‌(‪‌ )health‬‬
‫‪‌-‬ظاهر‌(‪)appearance‬‬
‫‪‌-‬هر‌دو‌(‪‌ )both‬‬
‫(برای ‌این ‌ویژگی‪‌ ،‬مقدار ‌‪‌ m‬برابر ‌‪‌ 3‬است‪‌.‬چون ‌این ‌ویژگی ‌م ‌‬
‫یتواند ‌یکی ‌از ‌سه ‌مقدار‌‬
‫(سالمتی‪‌ ،‬ظاهر ‌یا ‌هر ‌دو) ‌را ‌داشته ‌باشد‪‌ .‬اگر ‌احتماالت ‌را ‌یکسان ‌(‪‌ )uniform‬در ‌نظر‌‬
‫یشود)‬ ‫بگیریم‪‌،‬پس‌در‌واقع‌‪‌p = 1/3‬م ‌‬
‫سطح‌تمرینی‌شما‌در‌حال‌حاضر‌چقدر‌است؟‬
‫‪‌-‬غیر‌متحرك‌یا‌نشسته‌(‪‌ )sedentary‬‬
‫‪‌-‬به‌صورت‌نسبی‌(‪‌ )moderate‬‬
‫‪‌-‬فعال‌(‪‌ )active‬‬
‫(در‌این‌ویژگی‌هم‪‌m‌،‬برابر‌‪‌3‬و‌‪‌p = 1/3‬است)‬
‫آیا‌شما‌با‌محصوالت‌فناوری‌راحت‌هستید؟‬
‫‪‌-‬بلی‌(‪‌ )yes‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪113‬‬

‫‪‌-‬خیر‌(‪‌ )No‬‬
‫‌(برای‌این‌ویژگی‪‌m‌ ،‬برابر‌‪‌1‬است‪‌،‬زیرا‌این‌ویژگی‌م ‌‬
‫یتواند ‌دو‌مقدار‌«بلی»‌یا‌«خیر»‌‬
‫نکه‌یکی‌از‌این‌دو‌انتخاب‌شود‌½‌است)‬ ‫را‌بپذیرد‌و‌‪‌p = 1/2‬است‌زیرا‌احتمال‌ای ‌‬

‫بیایید ‌فرض ‌کنیم ‌که ‌تعداد ‌افرادی ‌که ‌مورد ‌بررسی ‌قرار ‌گرفتند ‌و ‌محصول ‌‪‌ i500‬را‌‬
‫کردهاند ‌برابر ‌‪‌ 211‬نفر‌باشد ‌(یعنی ‌‪‌ n‬برابر ‌‪‌ 211‬است)‪‌.‬تعداد ‌افرادی ‌که ‌‪‌i500‬‬
‫خریداری ‌ ‌‬
‫آنها‌(در‌سوال‌دوم)‌برابر‌«غیر‌متحرك‌یا‌نشسته‌‪‌»sedentary‌-‬است‪‌،‬برابر‌‬ ‫دارند‌و‌سطح‌ ‌‬
‫‪‌1‬لدد‌است‌(یعنی‌ ‌برابر‌صفر)‪‌.‬پس‌احتمال‌این‌که‌شخصی‌در‌وضعیت‌«غیر‌متحرك‌یا‌‬
‫نشسته ‌‪‌ »sedentary‌ -‬باشد ‌(با ‌توجه ‌به ‌ویژگی ‌دوم‌یعنی ‌همان ‌سوال ‌دوم)‌با ‌این ‌شرط‌‬
‫یشود‪:‬‬‫که‌بدانیم‌او‌‪‌i500‬دارد‌توسط‌فرمول‌زیر‌م ‌‬
‫‌‬

‫‌‬

‫الداد‬
‫کترین‌‬‫روشهای ‌نزدی ‌‬ ‫دادهها ‌را ‌از ‌حالت ‌لددی ‌که ‌در ‌تمام ‌ ‌‬
‫احتماال ‌متوجه ‌شدید ‌که ‌من ‌ ‌‬
‫طبقهای‌(‪‌)categorical‬‬ ‫یکردم‪‌،‬به ‌حالت‌ ‌‬ ‫همسایه ‌(‪‌)nearest neighbor‬از‌ ‌‬
‫آنها‌استفاده‌م ‌‬
‫طبقهای‌‬
‫دادههای ‌ ‌‬ ‫در ‌الگوریتم ‌بیز ‌ساده ‌(‪‌ )Naïve Bayes‬تغییر ‌دادم‪‌ .‬منظورمان ‌از ‌« ‌‬
‫دستههای‌گسسته‌و‌جدا ‌قرار‌می‌گیرند‪‌.‬‬ ‫(‪‌»)categorical data‬این‌است‌که‌این‌ ‌‬
‫دادهها ‌در‌ ‌‬
‫یکنیم‪‌.‬مثالً ‌افرادی ‌که ‌به ‌یک‌‬‫دادهاند ‌تقسیم ‌م ‌‬
‫برای ‌مثال‪‌ ،‬ما ‌مردم ‌را ‌بر ‌اساس ‌رایی ‌که ‌ ‌‬
‫الیحه ‌رایِ ‌«بله» ‌داده ‌باشند ‌به ‌یک ‌دسته ‌تعلق ‌می‌گیرند ‌و ‌افرادی ‌که ‌رایِ ‌«خیر» ‌داده‌‬
‫مبندی‌‬ ‫ینوازند‌تقسی ‌‬ ‫دانها ‌را‌با‌سازی‌که‌م ‌‬
‫ی ‌‬ ‫دستهای‌دیگر‪‌.‬یا‌ممکن‌است‌موسیق ‌‬ ‫باشند‪‌،‬به‌ ‌‬
‫یکنند ‌و ‌تمامیِ‌‬ ‫وننوازها ‌به ‌یک ‌قسمت ‌تعلق ‌پیدا ‌م ‌‬ ‫کنیم‪‌ .‬در ‌نتیجه‪‌ ،‬تمامیِ ‌ساکسیف ‌‬
‫ستها‌نیز‌به‌یک‌قسمت‌دیگر‌و‪‌.‌...‬این‌‬ ‫نطور‌تمامیِ‌پیانی ‌‬ ‫درامنوازها‌به‌قسمتی‌دیگر‪‌،‬و‌همی ‌‬ ‫‌‬
‫فوننوازها ‌نسبت ‌به‌‬‫قسمتها ‌یک ‌مقیاس ‌مشخص ‌ندارد‪‌ .‬برای ‌مثال‪‌ ،‬ساکسی ‌‬ ‫‌‬ ‫دستهها ‌و ‌‬
‫‌‬
‫دادههای ‌لددی‪‌ ،‬در ‌یک‌‬ ‫کتر ‌نیستند‪‌.‬این ‌در ‌حالی ‌است ‌که ‌ ‌‬ ‫انونوازها ‌نزدی ‌‬
‫درامنوازها‪‌ ،‬به ‌پی ‌‬
‫‌‬
‫ساالنهی ‌‪‌ 215111‬دالری ‌به‌‬
‫‌‬ ‫یشوند‪‌.‬برای ‌مثال‪‌ ،‬دستمزدِ ‌‬‫مقیاس ‌مشخص ‌به ‌کار ‌گرفته ‌م ‌‬
‫کتر‌است‪.‬‬ ‫نسبتِ‌دستمزدِ‌‪‌41111‬دالری‪‌،‬به‌دستمزدِ‌‪‌221111‬دالری‌نزدی ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌114‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یشماریم‌–‌چیه‌‌تعیداد‌ی‌از‌افیراد‌‌‬
‫در‌روش‌های‌بیزین‌(‪‌)Bayesian‬ما‌چیزهای‌مختلف‌را‌م ‌‬
‫غیر‌متحرك‌یا ‌نشسته ‌(در‌مثال‌خرید‌دستگاه‌نظارت‌بر‌سالمتی)‌هستند‌–‌و‌البته‌در‌ابتدا‌‬
‫یتوانیم‌چیزهایی‌را‌که‌در‌یی‌ک‌مقیی‌اس‌هسیتند‌‌(میثال‌‌لیدد‌ی‌‬ ‫مشخص‌نیست‌که‌چگونه‌م ‌‬
‫یتوانیم‌میانگینِ‌نمرات‌را‌بشماریم؟‌بیرا‌ی‌پاسیخ‌‌بیه‌‌‬
‫هستند)‌بشماریم‪‌.‬برای‌مثال‪‌،‬چگونه‌م ‌‬
‫این‌سوال‌دو‌روش‌وجود‌دارد‪:‬‬
‫‌‬

‫و‌دستهبندی‬
‫‌‬ ‫طبقهها‌‬
‫روش‌‪‌:2‬ساخت‌ ‌‬
‫یک‌روش‌این‌است‌که‌طبقیه‌هیا‌‌و‌دسیته‌بنیدی‌هیا‌ی‌مختلفی‌ی‌را‌بیا‌‌اسیتفاده‌‌از‌روش‌هیا‌ی‌‬
‫یها‌انجام‌دهیم‪‌.‬این‌کار‌را‌معموالً‌در‌وب‌سایت‌ها‌یا‌فرم‌های‌پرسش‌نامیه‌‌‬ ‫گسسته‌سازیِ‌ویژگ ‌‬
‫دهاید‪‌.‬برای‌مثال‪:‬‬
‫دی ‌‬
‫سن‪:‬‬
‫کوچکتر‌از‌‪21‬‬
‫‌‬ ‫‪‌.‬‬
‫‪‌21‌.‬تا‌‪11‬‬
‫‪‌13‌.‬تا‌‪31‬‬
‫‪‌31‌.‬تا‌‪41‬‬
‫بزرگتر‌از‌‪41‬‬
‫‪‌ ‌.‬‬

‫درآمد‌سالیانه‪:‬‬
‫‪‌.‬بیشتر‌از‌‪‌111111‬دالر‬
‫‪‌.‬بین‌‪‌251111‬تا‌‪111111‬‬
‫‪‌.‬بین‌‪‌211111‬تا‌‪251111‬‬
‫‪‌.‬بین‌‪‌91111‬تا‌‪211111‬‬
‫‪‌.‬بین‌‪‌41111‬تا‌‪91111‬‬
‫‌‬
‫هنگامی‌که‌ما‌این‌اطاللات‌را‌(که‌مقادیر‌پیوسته‌هستند)‌به‌مقادیر‌گسسته‌تبید‌یل‌کنی‌یم‪‌،‬‬
‫یتوانیم‌از‌روش‌بیز‌ساده‌(‪‌)Naïve Bayes‬مانند‌قبل‌استفاده‌کنیم‪.‬‬ ‫م‌‬
‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪115‬‬

‫عهای‌گوسی‌(‪)Gussian‬‬
‫روش‌‪‌:1‬توزی ‌‬

‫لبارتهای ‌«توزیع ‌گوسی ‌(‪‌ »)Gussian Distribution‬و ‌«تابع ‌چگالی ‌احتمال‌‬ ‫‌‬
‫یآیند‪‌ ،‬اما ‌این ‌لبارات ‌بیشتر ‌از ‌یک‌‬ ‫(‪‌ »)Probability Density Function‬به ‌نظر ‌جالب ‌م ‌‬
‫آنها ‌چیست ‌و ‌چگونه‌‬ ‫لبارتِ ‌لادی ‌و ‌ساده‪‌ ،‬جذاب ‌هستند‪‌ .‬اجازه ‌بدهید ‌ببینیم ‌معنی ‌ ‌‬
‫آنها ‌در ‌بیز ‌ساده ‌(‪‌)Naïve Bayes‬استفاده ‌کرد‪‌ .‬مثالی ‌که ‌را ‌تا ‌ای ‌‬
‫نجا ‌(در ‌مورد‌‬ ‫یتوان ‌از ‌ ‌‬
‫م‌‬
‫نظارت‌بر‌سالمت‌با‌محصوالت ‌‪‌i100‬و ‌‪‌)i500‬مرور‌می‌کردیم ‌را‌در‌نظر‌بگیرید‪‌.‬یک‌ویژگیِ‌‬
‫دادهها‌اضافه‌شده‌است‪:‬‬‫دیگر‌به‌اسم‌درآمد‌(‪‌)Income‬نیز‌به‌این‌ ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌119‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫یک ‌خریدارِ ‌لادی‪‌ ،‬که ‌محصول ‌‪‌ i500‬ما ‌را ‌خریداری ‌کرده ‌است ‌در ‌نظر ‌بگیرید‪‌ .‬این‌‬
‫فوقالعاده ‌و ‌درجه ‌یک ‌است‪‌.‬اگر ‌از ‌شما ‌بخواهم ‌این ‌شخص ‌را ‌توصیف‌‬
‫محصول‪‌ ،‬محصولی ‌ ‌‬
‫کنید‪‌،‬امکان‌دارد‌میانگین‌درآمد‌را‌برای‌خریداران‌این‌محصول‌به‌من‌بگویید‪‌ :‬‬
‫‌‬

‫‌‬
‫مطالعهی‌فصل‌چهارم‌از‌این‌کتاب‪‌،‬انحراف‌استاندارد‌را‌هم‌محاسبه‌کنید‪‌ :‬‬
‫‌‬ ‫و‌شاید‌با‌‬
‫‌‬
‫∑‬ ‫̅‬
‫√‬

‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪117‬‬

‫یداد‪‌.‬اگر ‌تمامی‌‬ ‫یآید ‌که ‌انحراف ‌استاندارد ‌(‪‌ ‌)sd‬‬


‫بازهی ‌پراکندگی ‌را ‌نشان ‌م ‌‬ ‫حتماً ‌یادتان ‌م ‌‬
‫محدودهی ‌نزدیک ‌به ‌میانگین ‌قرار ‌داشته ‌باشند‪‌ ،‬انحراف ‌استاندارد ‌هم ‌کم ‌است‪‌.‬‬
‫‌‬ ‫مقادیر ‌در ‌‬
‫ولی‌اگر‌مقادیر‌پراکنده‌باشند‪‌،‬انحراف‌استاندارد‌نیز‌زیاد‌است‪.‬‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‬
‫انحراف ‌استاندارد ‌درآمد ‌برای ‌افرادی ‌که ‌‪‌ i500‬خری ‌‬
‫دهاند‪‌ ،‬چقدر ‌است؟ ‌(این ‌مقادیر ‌در‌‬
‫جدول‌زیر‌آمده‌است)‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌ ‌‬
‫راهحل‬
‫انحراف ‌استاندارد ‌درآمد ‌برای ‌افرادی ‌که ‌‪‌ i500‬خری ‌‬
‫دهاند‪‌ ،‬چقدر ‌است؟ ‌(این ‌مقادیر ‌در‌‬
‫جدول‌زیر‌آمده‌است)‪:‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌111‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫انحراف‌استانداردِ‌جمعیت‌و‌انحراف‌استاندارد‌نمونه‬
‫فرمولی ‌که ‌در ‌مثال ‌باال ‌برای ‌انحراف ‌استاندارد ‌استفاده ‌کردیم‪‌ ،‬انحراف ‌استاندارد ‌جمعیت‌‬
‫گذاشتهاند‪‌،‬زیرا‌‬
‫‌‬ ‫(‪‌)population standard deviation‬نام‌دارد‪‌.‬این‌نام‌را‌برای‌این‌فرمول‌‬
‫یشود ‌که‌‬ ‫دادههایمان ‌شامل ‌تمامی ‌جمعیتی ‌م ‌‬
‫یکنیم ‌که ‌ ‌‬‫هنگامی ‌از ‌این ‌فرمول ‌استفاده ‌م ‌‬
‫آنها ‌مطالعه ‌و ‌تحلیل ‌کنیم‪‌ .‬برای ‌مثال‪‌ ،‬ممکن ‌است ‌بخواهیم ‌یک‌‬ ‫یخواهیم ‌در ‌مورد ‌ ‌‬ ‫م‌‬
‫دانشآموز‌انجام‌دهیم‌و‌سپس‌میانگین‌و‌انحراف‌استاندارد‌را‌برای‌‬ ‫آزمایش‌را‌بر‌روی‌‪‌ ‌511‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪116‬‬

‫جهی ‌آن ‌آزمایش ‌به ‌دست ‌آوریم‪‌.‬در ‌این ‌مورد‪‌ ،‬ما ‌از ‌انحراف ‌استاندارد ‌جمعیت ‌استفاده‌‬ ‫نتی ‌‬
‫دادههای ‌مربوط ‌به ‌تمامیِ‌‬
‫دادههای ‌ما ‌کامل ‌نیستند‪‌ ،‬یعنی ‌ ‌‬ ‫یکنیم‪‌ .‬با ‌این ‌حال‪‌ ،‬معموالً ‌ ‌‬‫م‌‬
‫موشهای‌‬
‫یخواهم‌تاثیر‌خشکسالی‌را‌بر‌ ‌‬ ‫جمعیت‌را‌نداریم‪‌.‬برای‌مثال‪‌،‬فرض‌کنید‌که‌من‌م ‌‬
‫اندازهگیری ‌کنم ‌و ‌به ‌لنوان ‌بخشی ‌از ‌تحقیق‪‌ ،‬میانگین ‌و ‌انحراف‌‬
‫نَر ‌در ‌نیومکزیکوی ‌شمالی ‌ ‌‬
‫موشهای‌‬
‫تکتکِ ‌ ‌‬ ‫موشها ‌را ‌اندازه ‌بگیرم‪‌ .‬در ‌این ‌مورد‪‌ ،‬طبیعتاً ‌ ‌‬‫استاندارد ‌وزنِ ‌این ‌ ‌‬
‫نمونهی ‌کوچکتری ‌از‌‬
‫یکنم‪‌ .‬به ‌جای ‌این ‌کار‪‌ ،‬یک ‌ ‌‬ ‫وزنکشی ‌نم ‌‬
‫نیومکزیکوی ‌شمالی ‌را ‌ ‌‬
‫اندازه‌میگیرم‪.‬‬
‫‌‬ ‫آنها‌را‌‬
‫جمعآوری‌کرده‌و‌وزنِ‌ ‌‬
‫موشها‌را‌ ‌‬ ‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫یتوانم ‌از ‌فرمول ‌باال‪‌ ،‬برای ‌انحراف ‌استاندراد ‌استفاده ‌کنم‪‌ ،‬ولی‌‬
‫در ‌این ‌مثال‪‌ ،‬با ‌این‌که ‌م ‌‬
‫قتر ‌انحراف ‌استاندارد ‌را ‌برای ‌تمامیِ‌‬
‫یتواند ‌بهتر ‌و ‌دقی ‌‬
‫فرمول ‌دیگری ‌وجود ‌دارد ‌که ‌م ‌‬
‫جمعیت‪‌ ،‬تخمین ‌بزند‪‌ .‬این ‌فرمول ‌به ‌انحراف ‌استانداردِ ‌نمونه ‌( ‪sample standard‬‬
‫‪‌)deviation‬معروف‌است‌و‌با‌تغییر‌کمی‌نسبت‌به‌فرمول‌قبل‪‌،‬به‌این‌فرمول‌می‌رسیم‪‌ :‬‬
‫‌‬
‫∑‬ ‫̅‬
‫√‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌161‬‬
‫دادهکاوی‌برای‌ ‌‬

‫پس‌انحراف‌استاندارد‌برای‌ویژگیِ‌«درآمد‌(‪‌»)Income‬با‌توجه‌به‌این‌فرمول‌به‌صورت‌زیر‌‬
‫یشود‪‌ :‬‬‫محاسبه‌م ‌‬
‫‌‬

‫√‬ ‫√‬

‫‌‬
‫ادامهی‌این‌فصل‪‌،‬ما‌از‌انحراف‌استانداردِ‌نمونه‌استفاده‌خواهیم‌کرد‪.‬‬
‫در‌ ‌‬
‫زنگولهای‌یا‌توزیع‌‬
‫‌‬ ‫دربارهی‌توزیع‌نرمال‌(‪‌،)normal distribution‬نمودار‌‬‫احتماالً‌چیزهایی‌ ‌‬
‫دهاید‪‌ .‬توزیع ‌گوسی ‌در ‌واقع ‌همان ‌توزیع ‌نرمال ‌است‪‌ .‬تابعی ‌که ‌این ‌توزیع ‌را‌‬
‫گوسی ‌شنی ‌‬
‫معرفی ‌می‌کند‪‌ ،‬تابع ‌گوسی ‌(‪‌ )gussian‬یا ‌تابع ‌زنگوله ‌(‪‌ )bell‬است‪‌ .‬در ‌اکثر ‌مواقع‪‌،‬‬
‫یها ‌از ‌یک ‌توزیع ‌گوسی ‌پیروی‌‬ ‫محاسبهگران ‌(همان ‌داده‌کاوها)‌فرضشان ‌این ‌است ‌که ‌ویژگ ‌‬
‫‌‬
‫نمونهها ‌در ‌یک ‌توزیع ‌گوسی‪‌ ،‬در‌‬
‫یکنند‪‌.‬و ‌منظورشان ‌این ‌است ‌که ‌حدود ‌‪‌ 91‬درصد ‌از ‌ ‌‬ ‫م‌‬
‫نمونهها‪‌ ،‬در‌‬
‫فاصله‌ی ‌یک ‌انحراف ‌استاندارد‪‌ ،‬نسبت ‌به ‌میانگین‪‌ ،‬قرار ‌دارند ‌و ‌‪‌ 65‬درصد ‌ ‌‬
‫فاصله‌ی‌‪‌1‬برابریِ‌انحراف‌استاندارد‌نسبت‌به‌میانگین‌قرار‌می‌گیرند‪:‬‬
‫‌‬

‫‌‬
‫(در‌شکلِ‌باال‪‌µ‌،‬میانگین‌است‌و‌‪‌σ‬انحراف‌استاندارد) ‌‬
‫‌‬
‫در‌مثال‌ما‪‌،‬میانگین‌درآمد‌‪‌219.222‬و‌انحراف‌استاندارد‌نمونه‌برابر‌‪‌12.317‬بود‪‌.‬پس‌‪‌65‬‬
‫محدودهی‌‪‌ 41991‬دالر‌تا‌‪‌246771‬دالر‌درآمد‌‬
‫‌‬ ‫درصد‌از‌افرادی ‌که ‌‪‌i500‬خریده‌بودند‪‌،‬در‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪162‬‬

‫یشود ‌–‌‬ ‫دارند ‌(با ‌توجه ‌به ‌توزیع ‌گوسی)‪‌.‬اگر ‌از ‌شما ‌سوال ‌کنم ‌)‪‌ P(100k| i500‬چقدر ‌م ‌‬
‫نکه ‌شخصی ‌که ‌‪‌ i500‬خریده ‌است‪‌ ،‬درآمد ‌‪‌ 211111‬دالری ‌داشته ‌باشد ‌–‌‬ ‫یعنی ‌احتمال ‌ای ‌‬
‫یکنید ‌که ‌این ‌درآمد ‌برای ‌این ‌شخص ‌محتمل ‌است‪‌.‬حاال ‌اگر ‌سوال ‌کنم ‌که‌‬ ‫احتماالً ‌فکر ‌م ‌‬
‫نکه ‌شخصی ‌که ‌‪‌ i500‬خریده ‌است‪‌ ،‬درآمد‌‬ ‫احتمال ‌)‪‌ –‌ P(20k| i500‬یعنی ‌احتمال ‌ای ‌‬
‫یکنید ‌که ‌این ‌درآمد ‌برای ‌این‌‬‫‪‌ 11111‬دالری ‌داشته ‌باشد ‌– ‌چقدر ‌است‪‌ ،‬احتماالً ‌فکر ‌م ‌‬
‫شخص‪‌،‬کمی‌غیر‌معقول‌است‪.‬‬
‫یرویم ‌تا‌‬
‫نکه ‌این ‌قضیه ‌را ‌فرموله ‌کنیم‪‌ ،‬به ‌سراغ ‌میانگین ‌و ‌انحراف ‌استاندارد ‌م ‌‬
‫برای ‌ای ‌‬
‫آنها‪‌،‬این‌احتمال‌را‌به‌صورت‌زیر‌محاسبه‌کنیم‪:‬‬ ‫بتوانیم‌با‌کمک‌ ‌‬

‫سادهتر‌به‌نظر‌برسد!‬
‫بزرگتر‌کنیم‪‌ ‌،‬‬
‫شاید‌اگر‌کمی‌این‌فرمول‌را‌ ‌‬
‫ینویسم‪‌،‬حس‌می‌کنم‌باید‌سریعاً‌‬ ‫هر‌وقت‌که‌یک‌فرمول‌به‌ظاهر‌پیچیده‌را‌در‌این‌کتاب‌م ‌‬
‫بگویم‌«نترسید»‪‌.‬البته‌ممکن‌است‌که‌‬
‫چکدام ‌از ‌شما ‌خوانندگان ‌نترسیده‌‬ ‫هی ‌‬
‫باشید ‌و ‌من ‌تنها ‌کسی ‌باشم ‌که ‌دچار‌‬
‫ترس‌شده‌است‪.‬‬
‫نحال ‌اجازه ‌بدهید ‌که ‌این ‌را‌‬ ‫با ‌ای ‌‬
‫فرمولها ‌و‌‬
‫‌‬ ‫دادهکاوی ‌دارای ‌‬
‫بگویم‪‌ ‌ .‬‬
‫نکه‌به‌‬
‫حرفهای‌است‪‌.‬قبل‌از‌ای ‌‬
‫واژگان‌ ‌‬
‫دادهکاوی ‌وارد ‌بشوید‪‌ ،‬ممکن‌‬
‫حوزهی ‌ ‌‬
‫‌‬
‫آنها‪‌ ،‬حتی ‌برای‌‬
‫یآیند‪‌.‬ولی ‌بعد ‌از ‌خواندنِ ‌ ‌‬
‫است ‌فکر ‌کنید‌که ‌این ‌چیزها ‌به ‌نظر ‌سخت ‌م ‌‬
‫فرمولها‌چیز‌خاصی‌نیستند‪‌.‬در‌واقع‌فقط‌باید‌قدم‌‬ ‫‌‬ ‫یشوید ‌که‌این ‌‬ ‫مدت ‌کوتاهی‪‌،‬متوجه‌م ‌‬
‫به‌قدم‌با‌فرول‌جلو‌برویم‌و‌روی‌آن‌کار‌کنیم‪.‬‬
‫حال‌اجازه‌دهید‌سریعاً‌به‌واکاویِ‌این‌فرمول‌بپردازیم‪‌،‬تا‌بفهمیم‌که‌چقدر‌این‌فرمول‌ساده‌‬
‫نکه‌شخصی‌‬ ‫یخواهیم ‌)‪‌P(100k|i500‬را‌حساب ‌کنیم‪‌.‬یعنی‌احتمال‌ای ‌‬ ‫است‪‌.‬فرض‌کنید‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌161‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‪‌ 211111‬دالر ‌درآمد ‌داشته ‌باشد ‌به ‌شرطی ‌که ‌بدانیم ‌این ‌شخص ‌‪‌ i500‬خریده ‌است‪‌.‬چند‌‬
‫صفحه ‌قبل‪‌ ،‬ما ‌میانگین ‌درآمد ‌برای ‌افرادی ‌را ‌که ‌‪‌ i500‬خری ‌‬
‫دهاند ‌را ‌محاسبه ‌کردیم‪‌.‬‬
‫همچنین ‌انحراف ‌استاندارد ‌نمونه ‌را ‌هم ‌حساب ‌کردیم‪‌ .‬این ‌مقادیر ‌در ‌زیر ‌قابل ‌مشاهده‌‬
‫هستند‪‌ .‬اگر ‌بخواهیم ‌به ‌صورت ‌محاسباتی ‌صحبت ‌کنیم‪‌ ،‬ما ‌میانگین ‌را ‌به ‌صورت ‌حروف‌‬
‫دادهایم‪‌.‬همچنین‌انحراف‌استاندارد‌را‌با‌‪‌σ‬نشان‌می‌دهیم‪:‬‬‫یونانی‌‪‌µ‬نشان‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫حاال‌اجازه‌دهید‌این‌مقادیر‌را‌به‌فرمول‌تبدیل‌کنیم‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫حاال‌کمی‌محاسباتش‌را‌انجام‌دهیم‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫و‌کمی‌بیشتر‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫کار‌میکند‪‌.‬مقدار ‌آن ‌به ‌طور‌‬
‫‌‬ ‫حرف ‌‪‌ ،e‬یک ‌ثابت ‌ریاضی ‌است ‌که ‌بر ‌مبنای ‌لگاریتم ‌طبیعی ‌‬
‫تقریبی‌برابر‌‪‌1.721‬است‪‌.‬پس‪:‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪163‬‬

‫‌‬

‫‌‬
‫‌‬
‫نکه ‌درآمد ‌شخصی ‌که ‌‪‌ i500‬خریده ‌است‪‌ 211111‌ ،‬دالر ‌باشد‪‌ ،‬برابر‌‬ ‫پس ‌احتمال ‌ای ‌‬
‫‪‌1.1211‬است‪.‬‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‬
‫لهایی ‌که ‌‪‌ 35‬مایل ‌به ‌ازای ‌هر‌‬‫در ‌جدول ‌زیر‪‌ ،‬من ‌قدرت ‌اسب ‌بخار ‌(‪‌ )HP‬را ‌برای ‌اتومبی ‌‬
‫نکه‌یک‌‪‌Datsun 210‬‬ ‫میخواهم‌بدانم‪‌،‬احتمال‌ای ‌‬ ‫آوردهام‪‌ ‌.‬‬
‫یکنند‌را‌ ‌‬ ‫گالن‌بنزین‌مصرف‌م ‌‬
‫دارای ‌‪‌ 231‬اسب ‌بخار ‌باشد ‌با ‌این ‌شرط ‌که ‌بدانیم ‌این ‌اتومبیل ‌‪‌ 35‬مایل ‌را ‌با ‌یک ‌گالن‌‬
‫یپیماید‪‌،‬چقدر‌است‪.‬‬ ‫بنزین‌م ‌‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬

‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‌–‌بخش‌‪2‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌164‬‬
‫دادهکاوی‌برای‌ ‌‬

‫لهایی ‌که ‌‪‌ 35‬مایل ‌به ‌ازای ‌هر ‌گالن‌‬‫در ‌جدول ‌زیر‪‌ ،‬من ‌قدرت ‌اسب ‌بخار ‌را ‌برای ‌اتومبی ‌‬
‫نکه‌یک‌‪‌Datsun 210‬‬ ‫آوردهام‪‌.‬تمایل ‌دارم‌که‌بدانم‪‌،‬احتمال‌ای ‌‬
‫یکنند ‌را‌ ‌‬ ‫بنزین‌مصرف‌م ‌‬
‫دارای ‌‪‌ 231‬اسب ‌بخار ‌باشد ‌با ‌این ‌شرط ‌که ‌بدانیم ‌این ‌اتومبیل ‌‪‌ 35‬مایل ‌را ‌با ‌یک ‌گالن‌‬
‫یپیماید‪‌،‬چقدر‌است‪.‬‬ ‫بنزین‌م ‌‬
‫‌‬

‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬
‫راهحل‌–‌بخش‌‪1‬‬ ‫مدادتان‌را‌تیز‌کنید‌–‌ ‌‬
‫لهایی ‌که ‌‪‌ 35‬مایل ‌به ‌ازای ‌هر ‌گالن‌‬
‫در ‌جدول ‌زیر‪‌ ،‬من ‌قدرت ‌اسب ‌بخار ‌را ‌برای ‌اتومبی ‌‬
‫نکه‌یک‌‪‌Datsun 210‬‬ ‫آوردهام‪‌.‬تمایل ‌دارم‌که‌بدانم‪‌،‬احتمال‌ای ‌‬
‫یکنند ‌را‌ ‌‬‫بنزین‌مصرف‌م ‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪165‬‬

‫دارای ‌‪‌ 231‬اسب ‌بخار ‌باشد ‌با ‌این ‌شرط ‌که ‌بدانیم ‌این ‌اتومبیل ‌‪‌ 35‬مایل ‌را ‌با ‌یک ‌گالن‌‬
‫یپیماید‪‌،‬چقدر‌است‪.‬‬ ‫بنزین‌م ‌‬
‫‌‬

‫‌‬
‫‌‬
‫یرسد ‌که ‌‪‌ ،Datsun 280z‬با ‌این ‌شرط ‌که ‌بدانیم ‌‪‌35‬‬
‫خب!‌به ‌نظر ‌خیلی ‌غیر ‌محتمل ‌م ‌‬
‫اینطور‌‬
‫یکند‪‌ 231‌ ،‬اسب ‌بخار ‌قدرت ‌داشته‌باشد‪(‌.‬ولی ‌ ‌‬ ‫مایل ‌به ‌ازای ‌هر ‌گالن ‌مصرف ‌م ‌‬
‫شد!)‪.‬‬
‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌169‬‬
‫دادهکاوی‌برای‌ ‌‬

‫ادهسازی‬
‫یک‌سری‌نکات‌برای‌پی ‌‬
‫در ‌فاز ‌آموزش ‌برای ‌الگوریتم ‌بیزین ‌ساده ‌(‪‌ ،)Naïve Bayes‬ما ‌میانگین ‌و ‌انحراف ‌استانداردِ‌‬
‫نمونه ‌را ‌برای ‌ویژگی ‌لددی ‌محاسبه ‌خواهیم ‌کرد‪‌ .‬کمی ‌جلوتر‪‌ ،‬خواهیم ‌دید ‌که ‌چگونه‌‬
‫ادهسازی‌کنیم‪.‬‬‫نها‌را‌پی ‌‬
‫یتوانیم‌ای ‌‬
‫م‌‬
‫ادهسازی‌شود‪:‬‬ ‫یتواند‌توسط‌چند‌خط‌کد‌پایتون‪‌،‬پی ‌‬ ‫طبقهبندی‪‌،‬فرمول‌باال‪‌،‬م ‌‬
‫در‌فاز‌ ‌‬

‫‪import math‬‬
‫‪def pdf(mean, ssd, x):‬‬
‫)‪"""Probability Density Function computing P(x|y‬‬
‫‪input is the mean, sample standard deviation for all‬‬
‫‪the items in y,‬‬
‫"""‪and x.‬‬
‫))‪ePart = math.pow(math.e, -(x-mean)**2/(2*ssd**2‬‬
‫‪return (1.0 / (math.sqrt(2*math.pi)*ssd)) * ePart‬‬

‫بیایید‌این‌تابع‌را‌با‌همان‌مثال‌باال‌امتحان‌کنیم‪:‬‬

‫خب!‌حاال‌کمی‌استراحت‌نیاز‌داریم‪.‬‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪167‬‬

‫ادهسازی‌پایتون‬
‫پی ‌‬

‫فاز‌یادگیری‬
‫روش‌بیزین‌ساده‪‌،‬بر‌اساس‌احتماالت‌پیشین‌و‌احتماالت‌شرطی‌استوار‌است‪‌.‬اجازه‌بدهید‌‬
‫یخواه ‌برگردیم‪‌ .‬احتمال ‌پیشین ‌(‪‌ )prior probability‬احتمالی‌‬ ‫به ‌مثال ‌دموکرات‪/‬جمهور ‌‬
‫یشوند‪‌.‬برای ‌مثال‪‌ ،‬اگر ‌من ‌بدانم ‌که‌‬
‫مشاهدهی ‌هر ‌رخدادی‪‌ ،‬نگه ‌داشته ‌م ‌‬
‫‌‬ ‫است ‌که ‌قبل ‌از ‌‬
‫نکه‌‬
‫یخواه ‌و ‌‪‌ 111‬دموکرات ‌وجود ‌دارند‪‌ ،‬پس ‌احتمال ‌پیشین‪‌ ،‬برای ‌ای ‌‬ ‫تعداد ‌‪‌ 133‬جمهور ‌‬
‫یخواه ‌(‪‌)republican‬باشد ‌به ‌صورت‌‬ ‫یک ‌فرد ‌دلخواه ‌در ‌مجلس ‌نمایندگان ‌آمریکا ‌جمهور ‌‬
‫زیر‌محاسبه‌می‌شود‪‌ :‬‬
‫‌‬

‫دهندهی ‌)‪‌ P(h‬است‪‌ .‬احتمال ‌شرطی ‌(‪‌ )conditional probability‬یا ‌همان‌‬ ‫‌‬ ‫که ‌این ‌نشان‌‬
‫)‪‌ P(h|D‬احتمال ‌این ‌است ‌که ‌‪‌ h‬را‌به ‌دست ‌آوریم ‌با ‌این ‌شرط ‌که ‌‪‌ D‬را ‌بدانیم‪‌.‬برای ‌مثال‪‌،‬‬
‫)‪‌.P(democrat|bill1Vote=yes‬در‌بیز‌ساده‌(‪‌)Naïve Bayes‬ما‌احتمال‌را‌لوض‌می‌کنیم‌‬
‫و‌)‪‌P(D|h‬را‌محاسبه‌می‌کنیم‪‌.‬برای‌مثال‪.P(bill1Vote=yes|democrat)‌،‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌161‬‬
‫دادهکاوی‌برای‌ ‌‬

‫در‌این‌کدِ‌پایتون‪‌،‬ما‌این‌احتماالت‌شرطی‌را‌در‌یک‌دیکشنری‌(‪‌dictionary‬در‌پایتون)‌به‌‬
‫یکنیم‪:‬‬
‫نگهداری‌م ‌‬
‫صورت‌زیر‌ ‌‬
‫‌‬

‫شمارهی ‌‪‌)bill 1(‌ 2‬رای ‌«بلی» ‌داده ‌باشد ‌با ‌این‌‬


‫‌‬ ‫حهی ‌‬
‫پس ‌احتمال ‌این‌که ‌شخصی ‌به ‌الی ‌‬
‫یشود‪.‬‬ ‫شرط‌که‌بدانیم‌او‌یک‌دموکرات‌است‪‌P(bill 1=yes|democrat)‌،‬برار‌‪‌1.333‬م ‌‬
‫یکنیم ‌که ‌مقادیرشان ‌گسسته ‌است‌‬ ‫یهایی ‌استفاده ‌م ‌‬
‫دادهای ‌را ‌برای ‌ویژگ ‌‬
‫ما ‌این ‌ساختار ‌ ‌‬
‫یها‪‌ ،‬مقادیر‌‬
‫(برای ‌مثال ‌«بلی» ‌و ‌«خیر»‪‌ ،‬یا ‌«مرد» ‌و ‌«زن»)‪‌.‬با ‌این ‌حال‪‌ ،‬هنگامی ‌که ‌ویژگ ‌‬
‫لددی ‌هستند‪‌ ،‬ما ‌از ‌تابع ‌چگالی ‌احتمال ‌(‪‌ )probability density function‬استفاده‌‬
‫یکنیم‌و‌برای‌این‌کار‌بایستی‌میاگین‌و‌انحراف‌استانداردِ‌نمونه‌را‌برای‌آن‌ویژگیِ‌خاص‪‌،‬‬ ‫م‌‬
‫نگه‌داریم‪‌.‬برای‌این‌مقادیرِ‌لددی‪‌،‬از‌ساختار‌زیر‌استفاده‌خواهم‌کرد‪:‬‬
‫‌‬

‫یهای‌‬‫نمونهها ‌با ‌یک ‌خط ‌در ‌فایل ‌داده ‌نشان ‌داده ‌می‌شود‪‌.‬ویژگ ‌‬
‫مانند ‌گذشته‪‌ ،‬هر ‌کدام ‌از ‌ ‌‬
‫نمونهها ‌با ‌‪‌ tab‬از ‌هم ‌جدا ‌م ‌‬
‫یشوند‪‌.‬برای ‌مثال‪‌ ،‬چند ‌خط ‌اول ‌فایل ‌داده‪‌ ،‬برای‌‬ ‫هر ‌کدام ‌از ‌ ‌‬
‫دادهی‌دیابت‌پیما‌در‌هند‌(‪‌)Pima Indians Diabetes‬به‌صورت‌زیر‌است‪‌ :‬‬ ‫مجمولهی‌ ‌‬
‫‌‬
‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪166‬‬

‫‌‬
‫‌‬
‫انگر‪‌ ،‬تعداد ‌دفعات ‌باردار ‌شدن‪‌ ،‬غلظت ‌گلوکز ‌پالسما‪‌ ،‬فشار ‌خون‪‌،‬‬ ‫ستونها ‌به ‌ترتیب ‌بی ‌‬
‫‌‬
‫شجرهنامه ‌دیابت‪‌،‬‬
‫‌‬ ‫تودهی ‌بدنی‪‌ ،‬‬
‫چهی ‌سه ‌سر‪‌ ،‬سطح ‌انسولین ‌سرم‪‌ ،‬شاخص ‌ ‌‬ ‫ضخامت ‌ماهی ‌‬
‫دهندهی ‌نداشتن‌‬
‫‌‬ ‫نشاندهنده‌ی ‌داشتن ‌دیابت ‌و ‌‪‌ ‌ 1‬‬
‫نشان‬ ‫سن ‌است‪‌.‬و ‌در ‌ستون ‌آخر ‌هم ‌‪‌ ‌ 2‬‬
‫دیابت‌است‪‌.‬‬
‫ستونها ‌را‌به‌‬
‫‌‬ ‫یخواهیم ‌نشان‌دهیم ‌که ‌چگونه ‌برنامه‪‌ ،‬هر ‌کدام ‌از ‌‬ ‫همچنین ‌مانند ‌گذشته‪‌ ،‬م ‌‬
‫یکند‪‌ :‬‬ ‫نها‌تفسیر‌می‌کند‪‌.‬این‌برنامه‌از‌لبارات‌زیر‌استفاده‌م ‌‬‫لهی‌فرمت‌آ ‌‬ ‫وسی ‌‬

‫ستونهایی‌هستند‌که ‌دارای‌مقدار‌غیر ‌لددی‌هستند‌و‌از ‌روش‌بیز‌(‪‌)Bayes‬‬ ‫لبارت‌‪‌ ‌،attr‬‬


‫که‌قبالً‌در‌این‌فصل‌نشان‌داده‌شد‪‌،‬استفاده‌می‌کنند‪.‬‬
‫یکند ‌که ‌بایستی ‌به ‌لنوان ‌ویژگیِ ‌لددی ‌تفسیر‌‬ ‫ستونهایی ‌را ‌مشخص ‌م ‌‬‫لبارت ‌‪‌ ‌ ،num‬‬
‫ستونها ‌از ‌تابع ‌چگالی ‌احتمال ‌(‪‌)probability density function‬بهره ‌م ‌‬
‫یبرند‪‌.‬‬ ‫شوند‪‌.‬این ‌ ‌‬
‫ستونها ‌بایستی ‌مقدار ‌میانگین ‌و ‌انحراف ‌استاندارد ‌را ‌در ‌هنگام ‌آموزش‌‬
‫‌‬ ‫یعنی ‌برای ‌این ‌‬
‫محاسبه‌کنیم‪.‬‬
‫طبقهی ‌یک ‌نمونه ‌را ‌مشخص ‌می‌کند ‌(در ‌واقع‌‬‫انگر ‌ستونی ‌است ‌که ‌ ‌‬ ‫لبارت ‌‪‌ class‬نمای ‌‬
‫یخواهیم‌یاد‌بگیریم)‬ ‫چیزی‌که‌م ‌‬
‫دادهی ‌دیابت ‌پیما‌در‌هند‌(‪‌ ،)Pima Indian Diabetes‬فرمت ‌به ‌صورت ‌زیر‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬ ‫در ‌‬
‫خواهد‌بود‪:‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌311‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬

‫دادهایِ ‌موقتی ‌احتیاج‌‬


‫محاسبهی ‌میانگین ‌و ‌انحراف ‌استانداردِ ‌نمونه‪‌ ،‬به ‌یک ‌ساختار ‌ ‌‬
‫‌‬ ‫برای ‌‬
‫داریم ‌تا ‌از ‌آن ‌در ‌فاز ‌آموزش ‌استفاده ‌کنیم‪‌ .‬پدوباره‪‌ ،‬اجازه ‌دهید ‌به ‌یک ‌قسمتی ‌از‌‬
‫دادهی‌دیابت‌پیما‌(‪‌،)Pima‬نگاهی‌بیندازیم‪:‬‬ ‫مجمولهی‌ ‌‬
‫‌‬
‫‌‬

‫‌‬

‫نمونهی‌اول‌(یعنی‌سه‌نفر‌اول)‌دیابت‌‬ ‫طبقهی‌هر‌نمونه‌است‪‌.‬پس‌سه‌ ‌‬ ‫نشانگر‌ ‌‬‫ستون‌آخر‪‌ ‌،‬‬


‫یهای‌‬ ‫ستونهای ‌دیگر‪‌ ،‬ویژگ ‌‬
‫نمونهی ‌آخر ‌در ‌شکل ‌باال ‌دیابت ‌ندارند‪‌ .‬تمامیِ ‌ ‌‬
‫دارند ‌و ‌سه ‌ ‌‬
‫میخواهیم ‌میانگین ‌و ‌انحراف ‌استاندارد ‌برای ‌هر ‌کدام ‌از ‌این ‌دو ‌طبقه‌‬‫لددی ‌هستند‪‌.‬حاال‌ ‌‬
‫محاسبهی ‌میانگین ‌در ‌هر ‌طبقه ‌و ‌هر ‌ویژگی‪‌ ،‬نیاز ‌دارم ‌تا ‌حواسم ‌را ‌به‌‬
‫‌‬ ‫محاسبه ‌کنیم‪‌.‬برای ‌‬
‫نمونهها ‌را ‌ذخیره‌‬
‫همهی ‌ ‌‬ ‫آنها ‌جمع ‌کنم‪‌ .‬در ‌کدِ ‌فعلی ‌ما‪‌ ،‬در ‌حال ‌حاضر ‌تعداد ‌ ‌‬ ‫همهی ‌ ‌‬
‫‌‬
‫کردهام‪‌ :‬‬
‫ادهسازی‌ ‌‬ ‫کردهایم‪‌.‬من‌این‌را‌با‌استفاده‌از‌یک‌دیکشنری‪‌،‬پی ‌‬
‫‌‬
‫‌‬

‫طبقهی ‌‪‌ ،)class 1(‌ 2‬جمع ‌ستونِ ‌‪‌ 2‬برابر ‌‪‌ 1‬است ‌(‪‌ ،)2‌+‌ 4‌+‌ 3‬جمع ‌ستونِ ‌‪‌1‬‬
‫پس ‌برای ‌ ‌‬
‫طبقهی‌‪‌،)class 0(‌1‬جمع‌ستون‌‪‌2‬برابر‌‪‌+‌1(‌3‬‬ ‫نطور‌تا‌آخر‌است‪‌.‬برای‌ ‌‬ ‫برابر‌‪‌371‬و‌همی ‌‬
‫نطور‌تا‌آخر‪.‬‬ ‫‪‌،)1‌+‌2‬جمع‌ستون‌‪‌1‬برابر‌‪‌313‬است‌و‌همی ‌‬
312 ■‌‫‌بِیز‌ساده‬.9‌‫‌فصل‬

‌‫ ‌یک‬،‫ ‌و ‌برای ‌آن‬،‫دادههای ‌اصلی ‌و ‌اولیه ‌را ‌نیز ‌نگه ‌داریم‬


‌ ‌ ‫ ‌بایستی‬،‫برای ‌انحراف ‌استاندارد‬
:‫یسازیم‬
‌ ‫دیکشنری‌با‌فرمت‌زیر‌م‬

‌‫__ ‌در ‌کالس‬init__()‌ ‫دادهای ‌موقت ‌را ‌در ‌تابع‬


‌ ‌ ‫من ‌این ‌کدها ‌را ‌اضافه ‌کردم ‌تا ‌این ‌ساختار‬
:‫‌مانند‌کد‌زیر‌بسازم‬Classifier

import math
class Classifier:
def __init__(self, bucketPrefix, testBucketNumber, d
ataFormat):
""" a classifier will be built from files with t
he bucketPrefix
excluding the file with textBucketNumber. dataFo
rmat is a string that
describes how to interpret each line of the data
files. For example,
for the iHealth data the format is:
"attr attr attr attr class"
"""
total = 0
classes = {}
# counts used for attributes that are not numeri
c
counts = {}
# totals used for attributes that are numereric
# we will use these to compute the mean and samp
le standard deviation
# for each attribute - class pair.
totals = {}
numericValues = {}
# reading the data in from the file
self.format = dataFormat.strip().split('\t')
#
self.prior = {}
self.conditional = {}
# for each of the buckets numbered 1 through 10:
‫برنامهنویسان‬ ‌ ■‌311
‌ ‌‫دادهکاوی‌برای‬

for i in range(1, 11):


# if it is not the bucket we should ignore,
read in the data
if i != testBucketNumber:
filename = "%s-%02i" % (bucketPrefix, i)
f = open(filename)
lines = f.readlines()
f.close()
for line in lines:
fields = line.strip().split('\t')
ignore = []
vector = []
nums = []
for i in range(len(fields)):
if self.format[i] == 'num':
nums.append(float(fields[i])
)
elif self.format[i] == 'attr':
vector.append(fields[i])
elif self.format[i] == 'comment'
:
ignore.append(fields[i])
elif self.format[i] == 'class':
category = fields[i]
# now process this instance
total += 1
classes.setdefault(category, 0)
counts.setdefault(category, {})
totals.setdefault(category, {})
numericValues.setdefault(category, {
})
classes[category] += 1
# now process each non-numeric attri
bute of the instance
col = 0
for columnValue in vector:
col += 1
counts[category].setdefault(col,
{})
counts[category][col].setdefault
(columnValue, 0)
counts[category][col][columnValu
e] += 1
# process numeric attributes
col = 0
for columnValue in nums:
313 ■‌‫‌بِیز‌ساده‬.9‌‫‌فصل‬

col += 1
totals[category].setdefault(col,
0)
#totals[category][col].setdefaul
t(columnValue, 0)
totals[category][col] += columnV
alue
numericValues[category].setdefau
lt(col, [])
numericValues[category][col].app
end(columnValue)
#
# ok done counting. now compute probabilities
# first prior probabilities p(h)
#
for (category, count) in classes.items():
self.prior[category] = count / total
#
# now compute conditional probabilities p(h|D)
#
for (category, columns) in counts.items():
self.conditional.setdefault(category, {})
for (col, valueCounts) in columns.items():
self.conditional[category].setdefault(co
l, {})
for (attrValue, count) in valueCounts.it
ems():
self.conditional[category][col][attr
Value] = (
count / classes[category])
self.tmp = counts
#
# now compute mean and sample standard deviation
#

‫کد‌بزنید‬
‌‫یتوانید ‌کدی ‌بزنید ‌که ‌میانگین ‌و ‌انحراف ‌استاندارد ‌را ‌محاسبه ‌کند؟ ‌فایل‬‌ ‫آی ا ‌ م‬
‌guidetodatamining.com‌‫‌را‌از‌سایت‬naiveBayesDensityFunctionTraining.py
.‫‌دانلود‌کنید‬chistio.ir‌‫یا‬
‫برنامهنویسان‬ ‌ ■‌314
‌ ‌‫دادهکاوی‌برای‬

‌‫برنامهی‌شما‌بایستی‌ساختارهای‌داده‌های‌«انحراف‌اسیتاندارد‌‌نمونیه‌»‌و‌«میی‌انگین»‌را‬

:‫مانند‌زیر‌تولید‌کند‬

‫کد‌بزنید‌–‌راه‌حل‬
:‫این‌راه‌حل‌من‌است‬

#
# now compute mean and sample standard deviation
#
self.means = {}
self.ssd = {}
self.totals = totals
for (category, columns) in totals.items():
self.means.setdefault(category, {})
for (col, cTotal) in columns.items():
self.means[category][col] = cTotal / classes[c
ategory]
# standard deviation
for (category, columns) in numericValues.items():
self.ssd.setdefault(category, {})
for (col, values) in columns.items():
SumOfSquareDifferences = 0
theMean = self.means[category][col]
for value in values:
SumOfSquareDifferences += (value - theMean
)**2
columns[col] = 0
self.ssd[category][col] = math.sqrt(SumOfSquar
eDifferences
/ (classes[category] - 1))

315 ■‌‫‌بِیز‌ساده‬.9‌‫‌فصل‬

‌‫‌اسم‬ ‫‌به‬ ‫‌دارد‬ ‫‌را‬ ‫راهحل‬


‌ ‌ ‫‌ ای ن‬ ‫‌که‬ ‫فایلی‬
‌ ‌ ‫ ‌در‬naiveBayesDensityFunctionTrainingSolution.py
‌‫وبسایت ‌ما ‌قابل ‌دانلود‬
.‫است‬


1‌‫کد‌بزنید‬
‌‫طبقهبندی ‌را ‌طوری ‌بازنگری ‌کنید ‌که ‌از ‌تابع ‌«چگالیِ ‌احتمالی‬
‌ ‌ ‫یتوانید ‌تابع‬
‌ ‫آی ا ‌ م‬
‌‫)» ‌برای ‌مقادیر ‌لددی ‌استفاده ‌کند؟ ‌فایلی ‌که ‌باید‬probability density function(
‌‫‌در‌زیر‬.‫‌است‬naiveBayesDensityFunctionTemplate.py‌‫تغییرات‌در‌آن‌انجام‌شود‬
:‫طبقهبندیِ‌اصلی‌نمایش‌داده‌شده‌است‬
‌ ‌‫تابع‬

def classify(self, itemVector, numVector):
"""Return class we think item Vector is in"""
results = []
sqrt2pi = math.sqrt(2 * math.pi)
for (category, prior) in self.prior.items():
prob = prior
col = 1
for attrValue in itemVector:
if not attrValue in self.conditional[categ
ory][col]:
# we did not find any instances of thi
s attribute value
# occurring with this category so prob
= 0
prob = 0
else:
prob = prob * self.conditional[categor
y][col][attrValue]
col += 1
# return the category with the highest probability
#print(results)
return(max(results)[1])
‫برنامهنویسان‬ ‌ ■‌319
‌ ‌‫دادهکاوی‌برای‬

‫‌–‌راه‌حل‬1‌‫کد‌بزنید‬
‌‫طبقهبندی ‌را ‌بازنگری ‌کنید ‌به ‌طوری ‌که ‌از ‌تابع ‌«چگالی ‌احتمالی‬
‌ ‌ ‫یتوانید ‌تابع‬
‌ ‫آی ا ‌ م‬
‌‫)» ‌برای ‌مقادیر ‌لددی ‌استفاده ‌کند؟ ‌فایلی ‌که ‌باید‬probability density function(
.‫‌است‬naiveBayesDensityFunctionTemplate.py‌‫تغییرات‌در‌آن‌انجام‌شود‬
:‫راه‌حل‬
def classify(self, itemVector, numVector):
"""Return class we think item Vector is in"""
results = []
sqrt2pi = math.sqrt(2 * math.pi)
for (category, prior) in self.prior.items():
prob = prior
col = 1
for attrValue in itemVector:
if not attrValue in self.conditional[categ
ory][col]:
# we did not find any instances of thi
s attribute value
# occurring with this category so prob
= 0
prob = 0
else:
prob = prob * self.conditional[categor
y][col][attrValue]
col += 1
col = 1
for x in numVector:
317 ■‌‫‌بِیز‌ساده‬.9‌‫‌فصل‬

mean = self.means[category][col]
ssd = self.ssd[category][col]
ePart = math.pow(math.e, -(x - mean)**2/(2
*ssd**2))
prob = prob * ((1.0 / (sqrt2pi*ssd)) * ePa
rt)
col += 1
results.append((prob, category))
# return the category with the highest probability
#print(results)
return(max(results)[1])

‫)»‌است؟‬Nearest Neighbor(‌‫کترین‌همسایه‬ ‌ ‫آیا‌این‌راه‌حل‌بهتر‌از‌روش«‌نزدی‬


‌ ‌ ‫)‌را ‌بر ‌روی ‌مجموله‬KNN(‌ ‫کترین ‌همسایه‬
‌‫دادههای ‌دیابت‬ ‌ ‫ ‌نزدی‬k‌ ‫ ‌ما ‌الگوریتم‬،5‌ ‫در ‌فصل‬
‌‫ ‌اگر‬.‫ ‌آزمایش ‌کردیم‬،‫ ‌نام‌داشت‬pimaSmall‌‫مجمولهای ‌از ‌آن ‌که‬
‌ ‌ ‫)‌و ‌یک ‌زیر‬Pima(‌ ‫پیما‬
:‫‌نتایج‌به‌صورت‌زیر‌بود‬،‫خاطرتان‌باشد‬



:‫)»‌به‌صورت‌زیر‌است‬Naïve Bayes(‌‫نتایج‌برای‌الگوریتم‌«بیز‌ساده‬



‫برنامهنویسان‬ ‫‪‌ ■‌311‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬
‫امتیاز‌کاپا‌برا‌بیز‌ساده‌برابر‌‪‌1.4175‬شد‪‌،‬که‌به‌صورت‌نسبی‌لدد‌خوبی‌است‪.‬‬
‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪316‬‬

‫کترین ‌همسایه ‌(‪‌)KNN‬شده‌‬


‫پس ‌برای ‌این ‌مثال‪‌ ،‬بیز ‌ساده ‌(‪‌ )Naïve Bayes‬بهتر ‌از ‌‪‌ k‬نزدی ‌‬
‫است‪.‬‬
‫‌‬

‫مزایای‌روش‌بیز‬
‫ادهسازی‌ساده‌(فقط‌نیاز‌به‌شمارش‌چیزهای‌مختلف‌دارد)‬ ‫‪ ‬پی ‌‬
‫روشهای‌دیگر‌دارد‬‫دادههای‌کمتر‌برای‌آموزش‌نسبت‌به‌ ‌‬ ‫‪ ‬نیاز‌به‌ ‌‬
‫‪ ‬روش ‌خوبی ‌است ‌برای ‌وقتی ‌که ‌هم ‌کیفیت ‌و ‌دقت ‌باال ‌و ‌هم ‌سرلت ‌اجرای‌‬
‫مناسب‌را‌احتیاج‌دارید‬

‫مزایای‌‪KNN‬‬
‫‪ ‬پی ‌‬
‫ادهسازی‌ساده‬
‫‪ ‬فرضِ‌این‌که‌ ‌‬
‫دادهها‌دارای‌یک‌ساختار‌مشخص‌هستند‌را‌ندارد‌–‌یک‌ویژگی‌مهم!‬
‫دادههای‌آموزشی‌احتیاج‌دارد‬ ‫‪ ‬مقدار‌زیادی‌حافظه‌برای‌ذخی ‌‬
‫رهی‌ ‌‬

‫لیب‌اصلی‌روش‌بیز‬
‫یتواند ‌این ‌نکته ‌را ‌یاد‌‬
‫یگیرد‪‌ .‬برای ‌مثال‪‌ ،‬نم ‌‬
‫یها ‌را ‌یاد ‌نم ‌‬
‫این ‌روش‪‌ ،‬تعامالت ‌بین ‌ویژگ ‌‬
‫بگیرد ‌که ‌من ‌غذاهای ‌پنیری ‌را ‌دوست ‌دارم ‌و ‌همچنین ‌غذاهای ‌برنجی ‌را ‌هم‌دوست‌دارم‪‌.‬‬
‫ولی‌غذاهایی‌که‌هم‌پنیر‌و‌هم‌برنج‌داشته‌باشد‌را‌دوست‌ندارم‪.‬‬
‫‌‬
‫روش‌‪KNN‬‬
‫مجمولهی ‌آموزشی ‌بزرگ‌‬‫‌‬ ‫روش ‌‪‌ KNN‬یک ‌انتخاب ‌معقول‌و‌منطقی‌برای ‌زمانی ‌هست‌که ‌‬
‫یتواند ‌در‌‬‫همهکاره ‌(مثل ‌چاقوی ‌سوییسی) ‌است ‌و ‌م ‌‬ ‫باشد‪‌ .‬روش ‌‪‌ KNN‬یک ‌روش ‌کامالً ‌ ‌‬
‫ستمهای ‌پیشنهادگر‪‌،‬‬ ‫مثالهای ‌متعددی ‌کاربرد ‌داشته ‌باشد‪‌ .‬برای ‌مثال ‌سی ‌‬ ‫رشتهها ‌و ‌ ‌‬
‫‌‬
‫نها ‌در ‌یک ‌ارگان)‪‌ ،‬تعامالت ‌بین‌‬ ‫مجمولهای ‌از ‌پروتئی ‌‬
‫‌‬ ‫پروتئومیکس ‌(دانش ‌بررسی ‌‬
‫نمونههایی‌هستند‌که‌‪‌KNN‬در‌ ‌‬
‫آنها‌کاربرد‌دارد‪.‬‬ ‫طبقهبندی‌تصاویر‌از‌ ‌‬ ‫نها‪‌،‬و‌ ‌‬ ‫پروتئی ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌321‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫یکند ‌این ‌حقیقت ‌است ‌این‌‬ ‫چیزی ‌که ‌ما ‌را ‌برای ‌ضرب ‌احتماالت ‌در ‌یکدیگر ‌توانمند ‌م ‌‬
‫احتماالت‌از‌یکدیگر‌مستقل‌هستند‪‌.‬برای‌مثال‪‌،‬یک‌بازی‌را‌تصور‌کنید‌که‌در‌آن‌یک‌سکه‌‬
‫یاندازیم‪‌.‬این ‌دو ‌رویداد ‌از ‌یکدیگر ‌مستقل ‌هستند ‌به ‌این‌‬ ‫را ‌پرتاب ‌می‌کنیم ‌و ‌یک ‌تاس ‌م ‌‬
‫یافتد ‌به ‌رو ‌یا ‌پشت ‌آمدنِ ‌سکه ‌ارتباطی ‌ندارد ‌و ‌در‌واقع‌به‌‬‫معنا ‌که ‌مقداری ‌که ‌در ‌تاس ‌م ‌‬
‫یتوانیم‌‬
‫همانطورکه ‌گفتم‪‌ ،‬اگر ‌رخدادها ‌مستقل ‌(غیر ‌وابسته)‌باشند ‌م ‌‬ ‫آن ‌وابسته ‌نیست‪‌.‬و ‌ ‌‬
‫احتمال ‌توام ‌(‪‌ )joint probability‬را ‌با ‌ضرب ‌احتماالت ‌هر ‌کدام ‌از ‌رخدادها ‌در ‌یکدیگر ‌به‌‬
‫دست‌بیاوریم ‌(منظور‌از‌احتمال‌توام‌یا‌همان ‌‪‌،joint probability‬احتمال‌اتفاق‌افتادن‌هر‌‬
‫دو ‌رخداد ‌با ‌هم ‌است)‪‌.‬پس ‌احتمال ‌این‌که ‌سکه ‌به ‌رو ‌بیاید ‌و ‌تاس ‌هم ‌لدد ‌شش ‌بشود ‌به‌‬
‫یگردد‪‌ :‬‬‫صورت‌زیر‌محاسبه‌م ‌‬
‫‌‬

‫‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪322‬‬

‫فرض‌کنید‌من‌یک‌سری‌کارت‌بازی‌دارم‌که‌دارای‌‪‌51‬ورق‌است‪‌19‌.‬ورق‌سیاه‌و‌‪‌19‬ورق‌‬
‫لکسدار ‌نیستند‪‌.‬‬
‫ورقها ‌دارای ‌لکس ‌هستند ‌و ‌بقی‌هی ‌‪‌ 41‬تای ‌دیگر‪‌ ‌ ،‬‬ ‫قرمز‪‌ 21‌.‬تا ‌از ‌این ‌ ‌‬
‫ورقهای ‌سیاه‪‌،‬‬
‫یکنم ‌(‪‌ 19‬لدد) ‌ولی ‌از ‌میان ‌ ‌‬ ‫ورقهای ‌قرمز ‌را ‌انتخاب ‌م ‌‬
‫حاال ‌من ‌فقط ‌ ‌‬
‫یکنم ‌(‪‌ 9‬لدد) ‌که ‌جمعاً ‌برابر ‌‪‌ 31‬کارت‌‬
‫لکسدار ‌هستند ‌را ‌هم ‌انتخاب ‌م ‌‬
‫آنهایی ‌که ‌ ‌‬ ‫‌‬
‫لکسدار‌(‪‌)facecard‬چقدر‌است؟‬ ‫یشود‪‌.‬احتمال‌انتخاب‌یک‌ورق‌ ‌‬ ‫م‌‬
‫‌‬

‫‌‬
‫احتمال‌انتخاب‌یک‌کارت‌قرمز؟ ‌‬
‫‌‬

‫نجا ‌ما‌‬
‫لکسدار ‌چقدر ‌است؟ ‌در ‌ای ‌‬
‫احتمال ‌انتخاب ‌یک ‌کارت‪‌ ،‬که ‌هم ‌قرمز ‌باشد ‌و ‌هم ‌ ‌‬
‫یدهیم‪‌ :‬‬
‫احتماالت‌را‌در‌هم‌ضرب‌نمی‌کنیم‪‌.‬در‌واقع‌ما‌لملیات‌زیر‌را‌انجام‌نم ‌‬
‫‌‬

‫نجا‪‌ ،‬حس‌ششمِ‌ما ‌به ‌ما ‌می‌گوید ‌که ‌احتمال ‌انتخاب ‌یک ‌کارت ‌قرمز ‌برابر ‌‪‌1.2175‬‬ ‫در ‌ای ‌‬
‫است‪‌.‬ولی ‌اگر ‌ما ‌یک ‌کارت ‌قرمز ‌را ‌برداریم‪‌ ،‬به ‌احتمال ‌‪‌ 211‬درصد ‌این ‌کارت ‌یک ‌کارت‌‬
‫لکسدار ‌است‪‌.‬پس ‌به ‌نظر ‌می‌رسد ‌که ‌احتمال ‌انتخاب ‌یک ‌کارت ‌که ‌هم ‌قرمز ‌باشد ‌و ‌هم‌‬ ‫‌‬
‫لکسدار‪‌،‬برابر‌‪‌1.2175‬است‪.‬‬ ‫‌‬
‫لکسدار ‌انتخاب ‌شود‪‌ ،‬برابر‌‬
‫نکه ‌یک ‌کارت ‌ ‌‬ ‫یتوانیم ‌یک ‌راه ‌دیگر ‌را ‌برویم‪‌.‬احتمال ‌ای ‌‬
‫یا ‌م ‌‬
‫کارتهای‌‬
‫شدهاند‪‌ ،‬نصف ‌ ‌‬ ‫کارتها‪‌ ،‬پشت ‌سر ‌هم ‌قرار ‌داده ‌ ‌‬
‫‪‌ 1.375‬است‪‌ .‬به ‌صورتی ‌که ‌ ‌‬
‫لکسدار‌‬
‫لکسدار‪‌ ،‬قرمز ‌هستند‪‌.‬پس ‌احتمال ‌انتخاب ‌یک ‌کارت ‌که ‌هم ‌قرمز ‌باشد ‌و ‌هم ‌ ‌‬ ‫‌‬
‫برابر‌‪‌1.375‬ضربدر‌‪‌1.5‬یعنی‌برابر‌‪‌1.2175‬است‪.‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌321‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یها‌مستقل‌‬ ‫نکه‌ویژگ ‌‬ ‫یتوانیم‌احتماالت‌را‌در‌یکدیگر‌ضرب‌کنیم‌به‌خاطر‌ای ‌‬ ‫نجا‌ما‌نم ‌‬ ‫در‌ای ‌‬


‫یکند‌–‌و‌‬ ‫نیستند‌–‌اگر‌یک‌کارت‌قرمز‌را‌برداریم‪‌،‬احتمال‌یک‌کارت‌ ‌‬
‫لکسدار‌تغییر‌پیدا‌م ‌‬
‫بالعکس‪.‬‬
‫یها ‌از ‌یکدیگر ‌مستقل‌‬ ‫دادهکاوی‪‌ ،‬ویژگ ‌‬‫در ‌بسیاری ‌از ‌موارد ‌(اگر ‌نه ‌همه)‌در ‌مسائلِ‌واقعیِ‌ ‌‬
‫نیستند‌و‌به‌هم‌وابسته‌هستند‪.‬‬
‫دادهی‌ورزشی‌را‌تصور‌کنید‪‌.‬در‌این‌مجموله‪‌،‬ما‌دو‌ویژگی‌داشتیم‌(قد‌و‌وزن)‪‌.‬‬ ‫مجمولهی‌ ‌‬
‫‌‬
‫قد ‌و ‌وزن ‌از ‌یکدیگر ‌مستقل ‌نبودند‪‌.‬هر ‌چقدر ‌شما ‌قد ‌بلندتر ‌باشید‪‌ ،‬احتمال ‌این‌که ‌سنگین‌‬
‫وزنتر‌هم‌باشید‪‌،‬بیشتر‌است‪.‬‬ ‫‌‬
‫یها ‌مستقل ‌از ‌هم‌‬ ‫یهای ‌کدپستی‪‌ ،‬درآمد ‌و ‌سن ‌را ‌دارم‪‌ .‬این ‌ویژگ ‌‬ ‫فرض ‌کنید ‌من ‌ویژگ ‌‬
‫خانههای ‌بزرگی ‌دارند ‌و ‌بعضی ‌دیگر ‌که‌‬ ‫یهای ‌خاص ‌هستند ‌که ‌ ‌‬ ‫نیستند‪‌.‬یک ‌سری ‌کدپست ‌‬
‫منطقهی ‌‪‌ ،Palo Alto‬ممکن‌‬ ‫‌‬ ‫ساخته‌شدهاند‪‌.‬مثالً ‌کدپستی ‌‬
‫‌‬ ‫پاركهای ‌آزمایشی ‌‬
‫بر‌اساس‌ ‌ ‌‬
‫منطقهی ‌‪‌ Arizona‬ممکن ‌است ‌ ‌‬
‫خانهی‌‬ ‫‌‬ ‫است ‌توسط ‌افراد ‌‪‌ 11‬ساله ‌تصرف ‌شده ‌باشد ‌یا ‌‬
‫بسیاری‌از‌بازنشستگان‌باشد‪.‬‬
‫یهای ‌موسیقی ‌نیز ‌کمی ‌فکر ‌کنید ‌– ‌چیزهایی ‌مانند ‌تعداد ‌صداهای ‌گیتار‌‬ ‫دربارهی ‌ویژگ ‌‬
‫‌‬
‫نجا ‌هم ‌تعداد ‌زیادی ‌از‌‬ ‫ناهمگون ‌(از ‌‪‌ 1‬تا ‌‪‌ )5‬یا ‌تعداد ‌صداهای ‌ویولن ‌کالسیک‪‌ .‬در ‌ای ‌‬
‫یها‪‌ ،‬مستقل ‌نیستند‪‌ .‬برای ‌مثال ‌اگر ‌من ‌مقدار ‌زیادی ‌صدای ‌گیتار ‌ناهمگون ‌داشته‌‬ ‫ویژگ ‌‬
‫یشود‪.‬‬‫کمتر‌م ‌‬
‫باشم‪‌،‬احتمال‌وجود‌صدای‌ویولن‌کالسیک‌کم‌و‌ ‌‬
‫دادهای ‌از ‌نتایج ‌آزمایش ‌خون ‌داشته ‌باشم‪‌.‬تعداد ‌زیادی ‌از ‌این‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬ ‫فرض ‌کنید ‌من ‌‬
‫مقادیر‪‌ ،‬مستقل ‌از ‌هم ‌نیستند‪‌.‬برای ‌مثال‪‌ ،‬تعدادی‌از ‌آزمایش‌های ‌تیروئید ‌مانند ‌‪‌ T4‬آزاد ‌و‌‬
‫‪‌TSH‬موجود‌هستند‌که‌ارتباط‌معکوسی‌بین‌مقادیر‌این‌دو‌آزمایش‌وجود‌دارد‪.‬‬
‫یهای‌‬ ‫خورد‌کردهاید‪‌،‬تفکر ‌کنید‪‌.‬برای ‌مثال‪‌ ،‬ویژگ ‌‬
‫‌‬ ‫خودتان ‌هم ‌در ‌موارد ‌مختلف ‌که ‌با ‌آن ‌بر‬
‫لمهای‌‬‫یهای ‌فی ‌‬ ‫آنها ‌مستقل ‌هستند؟ ‌ویژگ ‌‬ ‫لها ‌را ‌در ‌ذهن ‌خود ‌متصور ‌شوید‪‌ .‬آیا ‌ ‌‬ ‫اتومبی ‌‬
‫یهای‌خری‌دهای‌سایت‌آمازون؟‬ ‫مختلف‌چطور؟‌یا‌ویژگ ‌‬
‫یهایی‌استفاده‌‬ ‫نکه‌روش‌بیز‌(‪‌)Bayes‬خوب‌لمل‌کند‪‌،‬ما‌نیاز‌داریم‌تا‌از‌ویژگ ‌‬ ‫پس‪‌،‬برای‌ای ‌‬
‫کنیم ‌که ‌مستقل ‌از ‌هم ‌باشند‪‌ ،‬ولی ‌بسیاری ‌از ‌مسائل ‌دنیای ‌واقعی ‌این ‌رفتارِ ‌مستقل ‌را‌‬
‫یها‌مستقل‌هستند!‌ما‌از‌‬ ‫یکنیم‌این‌است‌که‌فرض‌می‌کنیم‌این‌ویژگ ‌‬ ‫ندارند‪‌.‬کاری‌که‌ما‌م ‌‬
‫لصای ‌جادوییِ ‌قایم ‌کردن ‌چیزهای ‌مختلف ‌زیر ‌فرش ‌استفاده ‌می‌کنیم ‌و ‌این ‌مشکل ‌را‌‬
‫ینامیم ‌زیرا ‌که ‌به ‌صورت‌‬ ‫یگیریم‪‌ .‬ما ‌این ‌روش ‌را ‌بیز ‌ساده ‌(‪‌ )Naïve Bayes‬م ‌‬ ‫نادیده ‌م ‌‬
‫‌فصل‌‪‌.9‬بِیز‌ساده‌■ ‪323‬‬

‫یها ‌را ‌(حتی ‌اگر ‌واقعاً ‌مستقل ‌نباشند) ‌در ‌مسئله‪‌ ،‬در ‌نظر‌‬
‫سادهای ‌فرضِ ‌استقاللِ ‌ویژگ ‌‬
‫‌‬
‫یکند‪‌ ،‬حتی ‌با ‌این‌‬
‫یرسد ‌که ‌روش ‌بیز ‌ساده‪‌ ،‬بسیار ‌بسیار ‌خوب ‌لمل ‌م ‌‬‫یگیریم‪‌.‬به ‌نظر ‌م ‌‬‫م‌‬
‫فرض‌ساده! ‌‬

‫کد‌بزنید‬
‫دادههای ‌دیگرمان ‌اجرا ‌کنید؟ ‌برای‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫یتوانید ‌الگوریتم ‌بیز ‌ساده ‌را ‌بر ‌روی ‌‬
‫آیا ‌م ‌‬
‫لها ‌به ‌ازای ‌یک‌‬
‫دادهی ‌مصرف ‌سوخت ‌اتومبی ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫مثال‪‌ ،‬الگوریتم ‌‪‌ KNN‬بر ‌روی ‌‬
‫مجمولهی‌‬
‫‌‬ ‫یداد‪‌.‬آیا‌روش‌بیز‪‌،‬راه‌حل‌بهتری‌برای‌این‌‬‫گالن‌(‪‌،)MPG‬دقت‌‪‌53‬درصدی‌م ‌‬
‫داده‌است؟ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫فصل ‪ .7‬پردازش متون بدون ساختار‬
‫طبقهبندي متون بدون ساختار‬

‫‌‬
‫آنها ‌مردم ‌به‌‬
‫فصلهای ‌قبلی‪‌ ،‬به ‌سیستم‌های ‌پیشنهاددهنده ‌نگاهی ‌انداختیم ‌که ‌در ‌ ‌‬ ‫در ‌ ‌‬
‫یکردند‪‌.‬برای ‌مثال‌‬ ‫ستارهای ‌امتیاز ‌دهی ‌م ‌‬
‫ستمهای ‌ ‌‬ ‫صورت ‌صریح ‌چیزهای ‌مختلف ‌را ‌با ‌سی ‌‬
‫نشانهی ‌موافقت ‌(‪thumbs-‬‬ ‫‪‌ 5‬ستاره ‌برای ‌گروه ‌موسیقیِ ‌‪‌ ،Phoenix‬شصت ‌باال ‌به ‌ ‌‬
‫اسهای‌مختلفِ‌لددی‌از‌‬ ‫نشانهی‌مخالفت‌(‪‌،)thumbs-down‬و‌یا‌مقی ‌‬ ‫‪/)up‬شصت‌پایین‌به‌ ‌‬
‫نمونههای ‌این ‌امتیازدهی ‌بودند‪‌.‬همچنین ‌به ‌چیزهایی ‌که ‌به ‌صورت ‌ضمنی ‌برای‌ما‌تولیدِ‌‬ ‫‌‬
‫داده‌می‌کردند‌نیز ‌نگاه ‌کردیم‪‌.‬مثالی ‌از ‌این ‌روش‪‌ ،‬رفتار ‌کاربران ‌است ‌– ‌برای‌مثال‌آیا ‌این‌‬
‫کردهاند؟‌‬
‫دهاند ‌یا ‌آیا ‌بر ‌روی ‌یک ‌لینکِ ‌خاص‪‌ ،‬کلیک ‌ ‌‬ ‫کاربران ‌یک ‌آیتمِ ‌خاص ‌را ‌خری ‌‬
‫یهایی‌مانند‌قد‪‌،‬‬ ‫ستمها‌از‌ویژگ ‌‬
‫طبقهبندی‌نگاهی‌انداختیم‪‌.‬این‌سی ‌‬ ‫ستمهای‌ ‌‬ ‫همچنین‌به‌سی ‌‬
‫وزن ‌و ‌یا ‌حتی ‌این‌که ‌چگونه ‌شخصی ‌به ‌یک ‌الیحه ‌در ‌مجلس‪‌ ،‬رای ‌داده ‌است‪‌ ،‬استفاده‌‬
‫یتوانست ‌توسط‌‬ ‫مجمولهی ‌داده ‌به ‌سادگی ‌م ‌‬
‫‌‬ ‫یکردند‪‌.‬در ‌تمامی ‌این ‌نمونه‌ها‪‌ ،‬اطاللات ‌در ‌‬
‫م‌‬
‫یک‌جدول‌نمایش‌داده‌شود‪.‬‬
‫‌‬

‫‪305‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌329‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫دادههای ‌ساختاریافته ‌(‪‌ »)structured data‬معروف ‌هستند ‌–‌یعنی‌‬ ‫دادهها ‌به ‌« ‌‬


‫این ‌نوع ‌از ‌ ‌‬
‫لهی‌‬‫نمونهها ‌یعنی ‌همان ‌سطرها ‌در ‌جدولی ‌مانند ‌جدول ‌باال‪‌ ،‬به ‌وسی ‌‬
‫آنها ‌ ‌‬ ‫دادهای ‌که ‌در ‌ ‌‬
‫‌‬
‫تعدادی ‌ویژگی ‌مشخص ‌می‌شوند ‌‪.‬برای ‌مثال‪‌ ،‬یک ‌سطر ‌در ‌جدول ‌ممکن ‌است ‌به ‌یک‌‬
‫یها‌مانند‪‌:‬مسافت‌به‌ازای‌یک‌‬ ‫مجمولهای‌از‌ویژگ ‌‬
‫‌‬ ‫لهی‌‬‫خودرو‌اشاره‌کند‌و‌این‌کار‌را‌به‌وسی ‌‬
‫دادههای ‌بدون ‌ساختار ‌یا‌‬ ‫گالن ‌(‪‌ ،)mpg‬تعداد ‌سیلندر ‌(‪‌ )cylinders‬و‪‌ ...‬انجام ‌دهد‪‌ ‌ .‬‬
‫وبالگها ‌یا‌‬
‫‌‬ ‫نوشتههای ‌‬
‫‌‬ ‫وبسایت ‌توییتر‪‌ ،‬‬
‫امهای ‌ ‌‬
‫امهای ‌ایمیلی‪‌ ،‬پی ‌‬‫غیرِساختاریافته‪‌ ،‬مانند ‌پی ‌‬
‫یتوان‌به‌صورت‌‬ ‫روزنامهها‌هستند‪‌.‬این‌نوع‌چیزها‌را‌(حداقل‌در‌یک‌نگاه‌اجمالی)‌نم ‌‬ ‫‌‬ ‫مقاالت‌‬
‫تمیز‌و‌مرتب‌در‌یک‌جدول‌جای‌داد‪.‬‬
‫لالقهمند ‌هستیم ‌که ‌مشخص ‌کنیم ‌آیا ‌یک ‌سری ‌فیلم‪‌ ،‬خوب‌‬ ‫برای ‌مثال‪‌ ،‬فرض ‌کنید ‌ما ‌ ‌‬
‫امهای‌توییتر‌در‌مورد‌این‌فیلم‌ها‌را‌تحلیل‌کنیم‪:‬‬ ‫یخواهیم‌پی ‌‬ ‫هستند‌یا‌خیر‌و‌م ‌‬
‫‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪327‬‬

‫‌‬
‫‌‬
‫تهای ‌باال ‌ببینیم ‌که ‌مثالً ‌‪‌ Andy Gavin‬از ‌فیلم‌‬ ‫یتوانیم ‌از ‌تویی ‌‬
‫زبانها‪‌ ،‬م ‌‬
‫ما ‌انگلیسی ‌ ‌‬
‫‪‌ Gravity‬خوشش ‌آمده ‌است‪‌.‬چون ‌او ‌در ‌یک ‌توییت ‌گفته ‌است ‌که ‌«آدم ‌را ‌به ‌هیجان ‌وا‌‬
‫یدارد ‌(‪‌ »)puts the thrill back in thriller‬و ‌یا ‌گفته ‌است ‌که ‌«بازی ‌خوبی ‌داشت‌‬ ‫م‌‬
‫یدانیم ‌که ‌‪‌ Debra Murphy‬به ‌نظر ‌خیلی ‌از ‌فیلم ‌خوشش ‌نیامده‌‬ ‫(‪‌.»)good acting‬ما ‌م ‌‬
‫است ‌چون ‌او ‌در ‌توییتی ‌نوشته ‌«پوالتون ‌رو ‌ذخیره ‌کنید ‌(‪‌ »)$$$‌ save your‬و ‌اگر ‌کسی‌‬
‫یخواهم‌فیلم‌‪‌Gravity‬را‌ببینم‪‌،‬همه‌باید‌این‌فیلم‌را‌ببینیم‌‬ ‫نوشته‌باشد‌«خیلی‌خیلی‌بد‌م ‌‬
‫(‪‌ »)!!!I wanna see Gravity sooo bad, we should all go see it‬این ‌شخص ‌احتماالً‌‬
‫کلمهی‌«بد‌(‪‌»)bad‬استفاده‌کرده‌است‪.‬‬ ‫فیلم‌را‌دوست‌داشته‌است‌اگر‌چه‌که‌از‌ ‌‬
‫مغازهی ‌اغذی‌هفروشی ‌باشم ‌و ‌چیزی ‌به ‌اسم ‌ماست ‌یونانی ‌چبانی‌‬ ‫فرض ‌کنید ‌من ‌در ‌ ‌‬
‫یدارم ‌و‌‬ ‫(‪‌)Chobani‬را ‌ببینم‪‌.‬به ‌نظر ‌جذاب ‌م ‌‬
‫یآید ‌ولی ‌آیا ‌واقعاً ‌خوب ‌است؟ ‌موبایلم ‌را ‌برم ‌‬
‫یکنم‌و‌چیزی‌شبیه‌به‌این‌را‌در‌یک‌وبالگ‌با‌لنوان‌«زن‪‌،‬تنها‌با‌نان‌‬ ‫در‌گوگل‌جستجو‌م ‌‬
‫یکند ‌(‪‌ »)Woman Does Not Live on Bread Alone‬خواندم ‌که ‌محتوایش‌‬ ‫زندگی ‌نم ‌‬
‫چیزی‌مانند‌زیر‌بود‪:‬‬
‫خوردهاید؟‌اگر‌نه‪‌،‬کلیدهایتان‌را‌بردارید‌(و‌البته‌اگر‌در‌نیویورك‌‬ ‫‌‬ ‫آیا‌تا‌به‌حال‌ماست‌یونانی‌‬
‫این‌ماستها‌‬
‫‌‬ ‫یکنید‪‌،‬یک ‌کت‌هم‌بردارید)‌و‌به‌بقالیِ‌محل‌خود‌بروید‪‌.‬حتی‌وقتی‌‬ ‫زندگی‌م ‌‬
‫آنها‌‬‫خامهای ‌بوده‪‌ ،‬و ‌من ‌بعد ‌از ‌خوردن ‌ ‌‬
‫بدونچربی ‌و ‌ساده ‌باشند‪‌ ،‬باز‌هم‌خیلی ‌ضخیم ‌و ‌ ‌‬ ‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌321‬‬
‫دادهکاوی‌برای‌ ‌‬

‫احساس ‌گناه ‌می‌کنم‪‌ .‬هدف ‌اصلی ‌ماست ‌هم ‌همین ‌است‪‌ .‬طعم ‌ساده‌ی ‌آن ‌ترش ‌و ‌لالی‌‬
‫یتوانند‌این‌ماست‌را‌تهیه ‌کنند‪‌،‬نوع‌لسلیِ‌آن‌را‌بخرند‪‌.‬شکری‌در ‌کار‌‬ ‫آنهایی‌که‌م ‌‬ ‫است‪‌ ‌.‬‬
‫نیست‪‌ ،‬ولی ‌مقداری ‌لسل ‌برای ‌ایجاد ‌طعم ‌شیرین ‌به ‌آن ‌اضافه ‌شده ‌است ‌(همچنین‌‬
‫یها‌خوب‌است!)‪‌.‬‬ ‫یتوانید‌خودتان‌به‌آن‌لسلِ‌محلی‌اضافه‌کنید‌–‌لسل‌محلی‌برای‌آلرژ ‌‬ ‫م‌‬
‫اگر ‌چه ‌که ‌من ‌نباید ‌از ‌لحاظ ‌فنی ‌لسل ‌مصرف ‌کنم‪‌ ،‬ولی ‌اگر ‌یک ‌روز ‌بد ‌را ‌پشت ‌سر‌‬
‫یخوری ‌لسل ‌به‌‬ ‫گذاشته‪‌ ،‬و ‌نامیدانه ‌فقط ‌به ‌شیرینی ‌احتیاج ‌داشته ‌باشم‪‌ ،‬یک ‌قاشق ‌چا ‌‬
‫وهای ‌از ‌شرکت ‌چوبانی‌‬ ‫طعمهای ‌می ‌‬
‫ماستم ‌اضافه ‌می‌کنم ‌و ‌کامالً ‌ارزشش ‌را ‌دارد‪‌ ‌ .‬‬
‫(‪‌ ،)Chobani‬تمامشان ‌در ‌خود ‌مقداری ‌شکر ‌دارند‪‌ ،‬این ‌در ‌حالی ‌است ‌که ‌میوه ‌در ‌این‌‬
‫ماستها‌کامالً‌غیرضروری‌هستند‪‌.‬اگر‌بقالی‌شما‪‌،‬ماركِ‌چوبانی‌(‪‌)Chobani‬را‌ندارد‪‌،‬مارك‌‬ ‫‌‬
‫‪‌،Fage‬نیر‌شناخته‌شده‌است‌و‌به‌همان‌مقدار‌خوشمزه‌است‪.‬‬
‫یکنید ‌و ‌مقدار‌‬‫حاال ‌برای ‌ماست ‌یونانی‪‌ ،‬شما ‌مقدار ‌‪‌ 51‬سنت ‌تا ‌‪‌ 2‬دالر ‌بیشتر ‌پرداخت ‌م ‌‬
‫یشود‪‌.‬ولی ‌ارزشش ‌را ‌دارد‪‌ ،‬حداقل‌‬ ‫حدوداً ‌‪‌ 11‬کالری ‌در ‌هر ‌بار ‌مصرف ‌بیشتر ‌وارد ‌بدنتان ‌م ‌‬
‫برای‌من‪‌،‬تا‌حس‌ناامیدی‌و‌ناراحتی‌بعد‌از‌یک‌اسنک‌لصرانه‌را‌نداشته‌باشم‪.‬‬
‫‪http://womandoesnotliveonbreadalone.blogspot.com/2009/03/sugar-free-yogurt-reviews.html‬‬

‫آیا ‌این ‌متن‪‌ ،‬برای ‌شرکت ‌چوبانی ‌(‪‌)Chobani‬یک ‌متن ‌مثبت ‌بود ‌یا ‌منفی؟ ‌فقط ‌بر ‌اساس‌‬
‫جملهی ‌دوم ‌که‌گفته‌بود‪«‌:‬اگر ‌نه‪‌ ،‬خواندن ‌را ‌متوقف ‌کنید ‌و ‌کلی‌دهایتان ‌را ‌جمع ‌کنید‪‌...‬و‌‬
‫‌‬
‫یرسد‌که‌این‌متن‌یک‌متن‌مثبت‌است‪‌.‬این‌‬ ‫خودتان‌را‌به‌بقالی‌محلتان‌برسانید»‪‌،‬به‌نظر‌م ‌‬
‫یدهد‌که‌طعم‌و‌مزه‌بسیار‌خوشمزه‌و‌لالی‌است‌و‌در‌واقع‌این‌ماست‌را‌یک‌‬ ‫متن‌توضیح‌م ‌‬
‫یرسد‌که‌باید‌این‌ماست‌را‌خریده‌و‌امتحانش‌‬ ‫ماست‌خوشمزه‌توصیف‌کرده‌است‪‌.‬به‌نظر‌م ‌‬
‫کنم‪‌.‬االن‌برمی‌گردم‪...‬‬
‫‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪326‬‬

‫‌‬

‫یک‌سیستم‌خودکار‌برای‌تشخیص‌مثبت‌یا‌منفی‌بودن‌متون‬
‫‌‬

‫‌‬
‫آقای‌‪‌،John‬به‌نظر‌یک‌توییت‌مثبت‌در‌مورد‌فیلم‌‪‌Gravity‬آمده‌است!‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌311‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یتواند‌متنی‌را‌خوانده‌و‌تصمیم‌بگیرد‌که‌آیا‌این‌متن‌‬ ‫فرض‌کنید‌یک‌سیستم‌خودکار‌که‌م ‌‬
‫که ‌در‌مورد‌یک‌محصولِ‌خاص‌نوشته‌شده‪‌،‬نظری‌مثبت‌است‌یا‌منفی‪‌.‬حال‌بیایید‌ببینیم‌‬
‫فروشندهی‌محصولی‌‬
‫‌‬ ‫اصالً‌چرا‌به‌یک‌همچین‌سیستمی‌نیاز‌داریم؟‌فرض‌کنید‌یک‌شرکت‪‌،‬‬
‫یخواهد‌بداند‌که‌مردم‌در‌مورد‌محصوالتش‌چه‌‬ ‫است‌که‌بر‌سالمت‌نظارت‌دارد‌و‌احتماالً‌م ‌‬
‫یگویند‪‌ ،‬غالباً ‌مثبت ‌است ‌یا ‌منفی؟ ‌این ‌شرکت ‌یک‌‬ ‫نظری ‌دارند؟ ‌آیا ‌چیزی ‌که ‌مردم ‌م ‌‬
‫راهاندازی ‌کرده ‌است‪‌.‬آیا ‌مردم ‌از ‌محصول ‌راضی‌‬
‫کمپین ‌تبلیغاتی ‌برای ‌یک ‌محصول ‌جدید ‌ ‌‬
‫هستند ‌(مثالً ‌جمالتی ‌مثل‪«‌:‬من ‌حتماً ‌به ‌یک ‌همچین ‌چیزی ‌احتیاج ‌دارم!»‌را‌می‌گویند؟)‌‬
‫و‌یا‌ناراضی‌هستند‌(مثالً‌جمالتی‌مثل‪«‌:‬به‌نظر‌مزخرف‌میاد»‌را‌می‌گویند)‪‌.‬یا‌مثالً‌شرکت‌‬
‫جمعبندی ‌مثبت‌‬
‫یکند‪‌.‬آیا ‌ ‌‬ ‫اپل ‌یک ‌کنفراس ‌دارد ‌که ‌در ‌مورد ‌مشکالت ‌آی‌فون ‌صبحت ‌م ‌‬
‫بوده ‌است؟ ‌یا ‌برای ‌مثالی ‌دیگر ‌یکی ‌از ‌نامزدهای ‌مجلس ‌سنای ‌آمریکا‪‌ ،‬یک ‌سخنرانی‌‬
‫سیاسی‌برگزار‌کرده‌است‌و‌می‌خواهیم‌بدانیم‌آیا‌بالگرهای‌سیاسی‪‌،‬این‌سخنرانی‌را‌مثبت‌‬
‫یرسد‪.‬‬‫ارزیابی‌کردند‌یا‌خیر؟‌پس‌با‌این‌اوصاف‌یک‌سیستم‌خودکار‌به‌نظر‌مفید‌و‌کارا‌م ‌‬
‫‌‬

‫‌‬
‫‌‬
‫فرض ‌کنید ‌من ‌بخواهم ‌یک ‌سیستم ‌توسعه ‌دهم ‌و‌این ‌سیستم ‌بتواند ‌تشخیص‌دهد‌که ‌آیا‌‬
‫یک ‌شخص‪‌ ،‬محصول ‌غذایی ‌را ‌دوست ‌داشته ‌است ‌یا ‌خیر‪‌.‬ممکن ‌است ‌با ‌این ‌ایده ‌شروع‌‬
‫انگر ‌دوست ‌داشتنِ ‌یک ‌محصول ‌توسط‌‬ ‫مجمولهای ‌از‌کلمات ‌که ‌بی ‌‬
‫‌‬ ‫کنیم ‌که‪‌:‬بیاییم ‌یک ‌‬
‫انگر ‌دوست‌‬‫مجمولهی ‌دیگر ‌از ‌کلمات ‌که ‌بی ‌‬
‫‌‬ ‫جمعآوری ‌کنیم ‌و ‌یک ‌‬
‫یک ‌کاربر‌هستند ‌را ‌ ‌‬
‫جمعآوری‌کنیم‪.‬‬
‫نداشتن‌یک‌محصول‌توسط‌کاربر‌هستند‌را‌نیز‌ ‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪312‬‬

‫کلماتی‌که‌مربوط‌به‌«دوست‌داشتن‌–‌‪‌»like‬یک‌محصول‌هستند‪‌ :‬‬
‫خوشمزه‌(‪‌ )delicious‬‬
‫خوش‌طعم‌(‪‌ )tasty‬‬
‫خوب‌(‪‌ )good‬‬
‫لشق‌(‪‌ )love‬‬
‫مالیم‌(‪‌ )smooth‬‬
‫‌‬
‫کلماتی‌که‌مربوط‌به‌«دوست‌نداشتن‌–‌‪‌»dislike‬یک‌محصول‌هستند‪‌ :‬‬
‫افتضاح‌(‪‌ )awful‬‬
‫پرهیز‌(‪‌ )bad‬‬
‫بد‌(‪‌ )bad‬‬
‫متنفر‌(‪)hate‬‬
‫ریگدار‌(‪‌ )gritty‬‬
‫‌‬
‫‌‬
‫اگر ‌بخواهیم ‌تالش ‌کنیم ‌تا ‌ببینیم‌آیا ‌یک ‌شخص ‌برای ‌مثال ‌ماست ‌‪‌ Chobani‬را ‌دوست‌‬
‫مجمولهی‌کلمات‌مثبت‌هستند‌‬ ‫‌‬ ‫یتوانیم‌به‌صورت‌ساده‪‌،‬فقط‌کلماتی‌که‌در‌‬ ‫دارد‌یا‌خیر‪‌،‬م ‌‬
‫را ‌در ‌متنی ‌که ‌کاربر ‌گذاشته‪‌ ،‬شمارش‌کنیم ‌و ‌بعد ‌از ‌آن ‌کلماتی ‌که ‌در ‌مجموله ‌کلمات‌‬
‫منفی‌هم‌هستند‌را‌نیز‌بشماریم‪‌.‬بر‌اساس‌این‌که‌کدام‌مجموله‌کلمات ‌در‌این‌متنِ ‌کاربر‪‌،‬‬
‫یشود‪‌ .‬این ‌کار ‌را‌‬‫طبقهبندی ‌م ‌‬
‫بیشتر ‌استفاده ‌شده ‌باشد‪‌ ،‬این ‌متن ‌به ‌مثبت ‌یا ‌منفی ‌ ‌‬
‫طبقهبندیِ ‌دیگر ‌نیز ‌انجام ‌دهیم‪‌.‬برای ‌مثال‪‌ ،‬آیا ‌یک ‌گروه‌‬
‫یتوانیم ‌برای ‌لملیات ‌ ‌‬ ‫همچنین ‌م ‌‬
‫‪(‌ pro-choice‬موافق ‌حق ‌سقط ‌جنین ‌در ‌آمریکا) ‌است ‌یا ‌‪(‌ pro-life‬مخالف ‌حق ‌سقط‌‬
‫یکند‪‌،‬‬ ‫یتوانیم ‌بر ‌اساس ‌کلماتی ‌که ‌این ‌گروه ‌استفاده ‌م ‌‬‫طبقهبندی ‌را ‌نیز ‌م ‌‬
‫جنین)؟ ‌این ‌ ‌‬
‫آنها‌از‌کلماتی‌مانند‌«کودك‌نابالغ‌(‪‌»)unborn child‬استفاده‌کنند‪‌،‬این‌بدان‌‬ ‫بفهمیم‪‌.‬اگر‌ ‌‬
‫کلمهی‌«جنین ‌‪‌»fetus‌-‬استفاده ‌کنند‪‌،‬‬ ‫معنا‌است ‌که‌این‌گروه ‌‪‌pro-life‬است‪‌.‬ولی‌اگر‌از ‌ ‌‬
‫با‌احتمال‌باالتری‪‌pro-choice‌،‬هستند‪‌.‬خیلی‌لجیب‌نیست‌که‌بتوانیم‌از‌وجودِ‌کلمات‌در‌‬
‫طبقهبندیِ‌متن‌استفاده‌کنیم‪.‬‬
‫یهای‌مختلف‪‌،‬برای‌ ‌‬ ‫دستهبند ‌‬
‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌311‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬

‫‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪313‬‬

‫ما‌از ‌روش‌بیز‌ساده ‌(‪‌)Naïve Bayes‬که‌در‌فصل‌قبل ‌در‌مورد‌آن‌صحبت‌کردیم‪‌،‬استفاده‌‬


‫آنجایی ‌که ‌حاال‌‬‫دادهی ‌آموزشی ‌شروع ‌کرده ‌و ‌از ‌ ‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬ ‫یکنیم‪‌ .‬با ‌استفاده ‌از ‌‬‫م‌‬
‫مجمولهی‌اسناد‌آموزشی‌‬
‫‌‬ ‫یخواهیم‌از‌متون‌بدون‌ساختار‌استفاده‌کنیم‪‌،‬به‌این‌مجموله‪‌،‬‬ ‫م‌‬
‫نمونههای ‌وارد ‌شده‪‌ ،‬یک ‌سند‌‬ ‫یشود‪‌ .‬هر ‌کدام ‌از ‌ ‌‬ ‫(‪‌ )corpus training‬گفته ‌م ‌‬
‫یشود‪‌،‬حتی‌اگر‌کالً‌‪‌241‬کاراکتر‌(مانند‌یک‌پست‌توییتر)‌شود‪‌.‬هر‌‬ ‫(‪‌)document‬نامیده‌م ‌‬
‫یشوند‪‌.‬پس ‌برای ‌مثال‪‌،‬‬ ‫برچسبزنی ‌(‪‌)label‬م ‌‬
‫‌‬ ‫طبقهی ‌مربوط ‌به ‌خودش ‌‬
‫کدام ‌از ‌سندها‪‌ ،‬با ‌ ‌‬
‫لمها ‌را‌‬
‫پستهای ‌توییتر ‌داشته ‌باشیم‪‌ ،‬که ‌یک ‌سری ‌فی ‌‬ ‫مجمولهای ‌از ‌ ‌‬
‫‌‬ ‫ما ‌ممکن ‌است ‌‬
‫برچسبها‌‬
‫‌‬ ‫یشوند‪‌.‬برای ‌‬‫پستها‪‌ ،‬به ‌نولی ‌برچسب‌زده ‌م ‌‬
‫امتیازدهی ‌کرده ‌باشند‪‌.‬هر ‌کدام ‌از ‌ ‌‬
‫نههای ‌«مطلوب ‌(‪‌ »)favorable‬یا ‌ ‌«نامطلوب ‌(‪‌ »)unfavorable‬استفاده‌‬ ‫یتوانیم ‌از ‌گزی ‌‬
‫م‌‬
‫دادهی ‌متنی ‌و‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫طبقهبندیمان ‌را ‌بر ‌اساس ‌این ‌‬
‫یخواهیم ‌الگوریتم ‌ ‌‬ ‫کنیم‪‌.‬و ‌حاال ‌م ‌‬
‫آنها‪‌ ،‬آموزش ‌دهیم‪‌ .‬در ‌این ‌حالت‪‌ ،P(h)‌ ،‬در ‌فرمول ‌باال‪‌ ،‬احتمال ‌این‌‬ ‫برچسبهای ‌ ‌‬
‫‌‬
‫برچسبها ‌است‪‌.‬اگر ‌‪‌ 2111‬سندِ ‌متنی ‌در ‌مجموله‌ی ‌آموزشی ‌داشته ‌باشیم ‌و ‌‪‌ 511‬سند ‌از‌‬ ‫‌‬
‫آنها‪‌،‬برچسب‌«مطلوب»‌و‌‪‌511‬سند‪‌،‬برچسب‌«نامطلوب»‌داشته‌باشند‪‌،‬پس‪:‬‬ ‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌314‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫اوکی‪‌،‬برگردیم‌به‪:‬‬
‫‌‬

‫‌‬
‫دادهای‌‬
‫مشاهدهی‌یک‌رخداد‌خاص‌ ‌‬ ‫‌‬ ‫حاال‌بیایید‌قسمت‌)‪‌P(D|h‬را‌هم‌مرور‌کنیم‌–‌احتمال‌‬
‫یخواهیم ‌از‌‬‫دادهی ‌‪‌ D‬که ‌م ‌‬
‫مانند ‌‪‌ D‬با ‌این ‌شرط ‌که ‌فرضی‌هی ‌‪‌ h‬را ‌داشته ‌باشیم‪‌.‬در‌این‌جا‌ ‌‬
‫ناست ‌که ‌اولین ‌جمله ‌از ‌سند ‌را‌‬ ‫آن ‌استفاده ‌کنیم‪‌ ،‬کلمات ‌در ‌متن ‌هستند‪‌.‬یک ‌روش‪‌ ،‬ای ‌‬
‫بررسی ‌کنیم‪‌ .‬برای ‌مثال‪‌ ،‬جمله‌ی‌«‪‌»Puts the Thrill back in Thriller‬را ‌در ‌نظر ‌بگیرید‪‌.‬‬
‫کلمهی ‌«‪‌»puts‬شروع ‌شده‌‬ ‫جملهای‌مثبت ‌بوده ‌و ‌با ‌ ‌‬
‫نکه ‌یک ‌ ‌‬ ‫بیایید ‌ببینیم ‌که ‌احتمال ‌ای ‌‬
‫کلمهی ‌دومِ ‌«‪‌ »the‬باشد‌‬
‫نکه ‌یک ‌جمله‌ی ‌مثبت‪‌ ،‬دارای ‌ ‌‬ ‫باشد‪‌ ،‬چقدر ‌است؟ ‌حاال ‌احتمال ‌ای ‌‬
‫نکه‌‬ ‫کلمهی ‌دومش‌«‪‌»the‬است)‌چقدر‌است؟‌و‌همچنین‌احتمال‌ای ‌‬ ‫(مثل‌همین‌جمله‌که‌ ‌‬
‫نطور ‌الی ‌آخر‌‬ ‫کلمهی ‌«‪‌»Thrill‬باشد ‌چقدر ‌است ‌و ‌همی ‌‬
‫یک ‌جمل‌هی ‌مثبت‪‌ ،‬دارای ‌سومین ‌ ‌‬
‫برای ‌تمامی ‌کلماتِ ‌موجود ‌در ‌این ‌جمله‪‌.‬و ‌همچنین ‌احتمال ‌هر ‌کدام ‌از ‌کلمات ‌را ‌برای‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪315‬‬

‫جمالت ‌منفی ‌نیز ‌محاسبه ‌می‌کنیم ‌تا ‌ببینیم ‌احتمال ‌مثبت ‌بودن ‌آن ‌جمله ‌بیشتر ‌است ‌یا‌‬
‫منفی‌بودن‌آن‌جمله‪‌ .‬‬

‫گوگل‌تخمین‌زده‌است‌که‌تعداد‌حدود‌‪‌2‬میلیون‌کلمه‌در‌زبان‌انگلیسی‌وجود‌دارد‪.‬‬
‫غامهای‌توییتر‌تقریباً‌‪‌24‬کلمه‌داشته‌باشند‪‌،‬بایستی‌احتماالت‌زیر‌را‌محاسبه‌کنیم‪:‬‬
‫اگر‌پی ‌‬
‫‌‬
‫‪1,000,000 x 1,000,000 x 1,000,000 x , 1,000,000 x 1,000,000 x‬‬
‫‪1,000,000 x ,1,000,000 x 1,000,000 x 1,000,000 x 1,000,000 x‬‬
‫‪‌ 1,000,000 x 1,000,000 x 1,000,000 x 1,000,000‬‬
‫‌‬
‫مشاهده‌میکنید‌که‌تعداد‌خیلی‌زیادی‌از‌احتماالت‌را‌بایستی‌محاسبه‌کرد!‌باید‌یک‌روش‌‬ ‫‌‬
‫بهتری‌هم‌وجود‌داشته‌باشد!‬
‫‌‬
‫یشیود‌‌کیه‌‌‬ ‫خب‪‌.‬تعداد‌بسیار‌زیادی‌از‌احتماالت‌باید‌محاسبه‌شوند‌و‌همین‌موضوع‌بالث‌م ‌‬
‫یخواهیم‌مقداری‌چیزهیا‌ی‌‬ ‫این‌روش‌غیرکارا‌شود‪‌.‬و‌خوشبختانه‪‌،‬یک‌راه‌بهتر‌وجود‌دارد‪‌.‬م ‌‬
‫مختلف‌را‌ساده‌کنیم‌و‌این‌کار‌را‌با‌استفاده‌از‌کلمات‌بیه‌‌صیورت‌‌غیی‌ر‌ترتیبی‌ی‌(یعنی‌ی‌بیه‌‌‬
‫نکیه‌‌سیوم‌ین‌‬ ‫یدهیم‪‌.‬یعنی‌به‌جای‌این‌که‌مثالً‌بپرسیم‌«احتمال‌ای ‌‬ ‫صورت‌کوله‌ای)‌انجام‌م ‌‬
‫یپرسیم‌«احتمال‌این‌که‌کلمیه‌ی‌‬ ‫کلمه‌در‌جمله‌ی‌مثبت‪‌»thrill«‌،‬باشد‪‌،‬چقدر‌است؟»‪‌،‬م ‌‬
‫«‪‌»thrill‬در‌یک‌ ‌‬
‫جملهی‌مثبت‌باشد‪‌،‬چقدر‌اسیت‌؟»‌در‌ادامیه‪‌‌،‬ایی‌ن‌احتمیاالت‌‌را‌بیا‌‌هیم‌‌‬
‫محاسبه‌خواهیم‌کرد‪.‬‬

‫فاز‌آموزش‬
‫یکنیم ‌–‌کلمات ‌یکتا ‌را‪‌ .‬از ‌تمامی ‌اسناد ‌موجود ‌(یعنی ‌از ‌تمامی‌‬‫ابتدا‪‌ ،‬کلمات ‌را ‌مشخص ‌م ‌‬
‫کلمهی‌‬
‫اسناد ‌که ‌مثبت ‌یا ‌منفی ‌باشند ‌کلمات ‌را ‌استخراج ‌می‌کنیم)‪‌.‬پس ‌برای ‌مثال‪‌ ،‬اگر ‌ ‌‬
‫«‪‌ »the‬هزار ‌بار ‌در ‌تمامی ‌اسناد ‌تکرار ‌شده ‌باشد‪‌ ،‬فقط ‌یکبار ‌در ‌لیست ‌کلمات ‌آن ‌را‌‬
‫یآوریم‪‌.‬خب!‌حاال‌فرض‌کنید‪:‬‬ ‫م‌‬
‫|‪|Vocabulary‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌319‬‬
‫دادهکاوی‌برای‌ ‌‬

‫نشانگرِ‌تعدادِ ‌کلمات‌باشد‪‌.‬بعد‌از‌آن‪‌،‬برای‌هر‌کدام‌از‌کلمات‌که‌با‌ ‌مشخص‌می‌شوند‪‌،‬‬ ‫‌‬


‫یخواهیم ‌احتمال ‌وقوع ‌یک ‌کلمه ‌را ‌با ‌این ‌شرط ‌که ‌بدانیم ‌یک‌‬ ‫مجمولهی ‌کلمات‪‌ ،‬م ‌‬
‫‌‬ ‫در ‌‬
‫یافتد‪‌،‬محاسبه‌کنیم‪‌.‬یعنی‌‬‫فرض‌خاص‌اتفاق‌م ‌‬
‫یخواهیم ‌این ‌فرمول ‌را ‌به ‌صورت ‌زیر ‌محاسبه ‌کنیم‪‌ .‬برای ‌هر ‌فرضی‌های ‌(در ‌این ‌مورد‪‌،‬‬ ‫م‌‬
‫«مثبت»‌یا‌«منفی»)‪:‬‬
‫یکنیم‬ ‫خوردهاند‌در‌یک‌فایل‌ترکیب‌م ‌‬ ‫‌‬ ‫‪‌ .2‬اسنادی‌که‌با‌آن‌فرضی‌هی‌خاص‌برچسب‌‬
‫یشماریم‪‌.‬ایی‌ن‌بیار‪‌‌،‬میثالً‌‌اگیر‌‌کلمیه‌ی‌‬‫‪‌ .1‬تعداد‌تکرار‌کلمات‌موجود‌در‌این‌فایل‌را‌م ‌‬
‫یدهیم‪‌.‬اجازه‌دهید‌ایی‌ن‌‬ ‫«‪‌511‌ ،»the‬مرتبه ‌تکرار‌شده‌باشد‪‌،‬این‌تعداد‌را‌برابر‌‪‌511‬قرار‌م ‌‬
‫تعداد‌را‌‪‌n‬بنامیم‪.‬‬
‫یدادیی‌م‪‌،‬تعیداد‌‌تکیرار‌‌آن‌‬‫مجمولهی‌کلمات‌که‌با‌ ‌نشان‌می‌ ‌‬‫‌‬ ‫‪‌ .3‬برای‌هر‌کلمه‪‌،‬در‌‬
‫یدهیم‪.‬‬‫یشماریم‪‌.‬آن‌را‌با‌ ‌نمایش‌م ‌‬ ‫کلمه‌را‌در‌متن‌م ‌‬
‫یکنیم‪:‬‬‫‪‌ .4‬برای‌هر‌کلمه‌در‌مجموله‪‌،‬یعنی‌همان‌ ‪‌،‬با‌فرمول‌زیر‌محاسبه‌م ‌‬
‫‌‬

‫طبقهبندی‌بیز‌ساده‌(‪)Naïve Bayes‬‬
‫فاز‌ ‌‬
‫یتوانیم‌سند‌ها‌را‌طبقه‌بندی‌کنی‌یم‪‌.‬ایی‌ن‌کیار‌‌را‌بیا‌‌‬
‫هنگامی‌که‌فاز‌آموزش‌را‌انجام‌دادیم‪‌،‬م ‌‬
‫یدهیم‪:‬‬
‫استفاده‌از‌فرمولی‌که‌معرفی‌کردیم‪‌،‬انجام‌م ‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪317‬‬

‫‌‬
‫مجمولهی‌آموزشیِ‌ما‌شیامل‌‌‪‌511‬توییی‌ت‌بیا‌‌محتیوا‌ی‌مثبیت‌‌و‌‪‌511‬‬
‫‌‬ ‫دادههای‌‬
‫فرض‌کنید‌ ‌‬
‫توییت‌با‌محتوای‌منفی‌در‌مورد‌یک‌محصول‌باشند‪‌.‬پس‪:‬‬
‫‌‬

‫‌‬
‫بعد ‌از ‌آموزش‪‌ ،‬احتماالت ‌به ‌صورت ‌زیر ‌در ‌آمده ‌است ‌(ستون ‌اول ‌یعنی ‌‪‌word‬‬
‫ی‌کلمهی‌مورد‌نظر‌ماست)‪:‬‬
‫‌‬ ‫‌‬
‫دهنده‬ ‫‌‬
‫نشان‬
‫برنامهنویسان‬ ‫‪‌ ■‌311‬‬
‫دادهکاوی‌برای‌ ‌‬

‫طبقهبندی‌کنیم‌(که‌آیا‌مثبت‌است‌یا‌منفی)‪:‬‬
‫یخواهیم‌توییتِ‌زیر‌را‌ ‌‬
‫حاال‌فرض‌کنید‌م ‌‬
‫‪I am stunned by the hype over gravity‬‬
‫یخواهیم‌احتمال‌زیر‌را‌حساب‌کنیم‪:‬‬
‫حاال‌ما‌م ‌‬
‫‌‬

‫‌‬
‫و‌همچنین‌احتمال‌زیر‌را‪‌ :‬‬
‫‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪316‬‬

‫و‌در‌نهایت‌فرضی‌های‌را ‌قبول ‌کنیم ‌که‌دارای‌بیشترین‌احتمال‌است‌(مثبت ‌=‌‪‌like‬و‌منفی‌‬


‫=‌‪)dislike‬‬
‫‌‬

‫‌‬
‫(ستون‌آخر‪‌،‬همان‌ضرب‌احتماالت‌است) ‌‬
‫‌‬
‫یشود‪:‬‬
‫پس‌احتماالت‌به‌صورت‌زیر‌محاسبه‌م ‌‬
‫‪like= 0.000000000000000000000622‬‬
‫‪dislike= 0.000000000000000000004720‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌331‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یک‌یادآوری‌کوچک‬
‫لبارت‌‪‌e‬در‌ریاضیات‪‌،‬نشان‌م ‌‬
‫یداد‌که‌چقدر‌باید‌بعد‌از‌الشار‌جلو‌برویم‪‌.‬اگر‌لدد‌مثبت‌‬
‫بود‪‌،‬یعنی‌باید‌الشار‌را‌به‌سمت‌راست‌برد‌و‌اگر‌لدد‌منفی‌بود‪‌،‬یعنی‌بایستی‌الشار‌را‌به‌‬
‫سمت‌چپ‌هدایت‌کرد‪‌.‬پس‪‌ :‬‬

‫‌‬
‫‌‬
‫نجا‪‌،‬این‌‬ ‫در‌باال‪‌،‬احتمال‌منفی‌بودن‌(‪‌)dislike‬بیشتر‌از‌مثبت‌بودن‌(‪‌)like‬است‪‌.‬پس‌در‌ای ‌‬
‫یکنیم‪‌ .‬به ‌این ‌معنی ‌که ‌این ‌توییت ‌در ‌نقد ‌و‌‬
‫طبقهبندی ‌م ‌‬
‫یها ‌ ‌‬
‫دستهی ‌منف ‌‬
‫توییت ‌را ‌به ‌ ‌‬
‫دوستنداشتنِ‌یک‌محصول‌خاص‌بوده‌است‪.‬‬
‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫راهحل ‌آن ‌به ‌این‌‬
‫همانطور ‌که ‌متوجه ‌شدید ‌مشکلی ‌در ‌الداد ‌الشار ‌کوچک ‌وجود ‌دارد ‌و ‌ ‌‬
‫‌‬
‫صورت ‌است‪‌.‬فرض ‌کنید ‌ما ‌‪‌ 211‬کلمه ‌در ‌سند ‌داریم ‌و ‌به ‌طور ‌میانگین ‌احتمال ‌هر ‌کلمه‌‬
‫‪‌1.112‬است‌(کلماتی‌مانند ‌‪‌،morninig‌،average‌،reported‌،tell‬و‌‪‌and‬حدوداً‌احتمال‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪332‬‬

‫‪‌ 1.112‬دارند)‪‌ .‬اگر ‌این ‌احتماالت ‌را ‌در ‌زبان ‌پایتون ‌با ‌هم ‌ضرب ‌کنیم‪‌ ،‬نتیجه ‌لدد ‌صفر‌‬
‫خواهد‌شد‪.‬‬
‫‌‬

‫‌‬
‫یرسیم‪:‬‬
‫ولی‌اگر‌لگاریتمِ‌احتماالت‌با‌هم‌جمع‌کنیم‪‌،‬به‌یک‌لددی‌غیر‌از‌صفر‌م ‌‬

‫‌‬
‫ممکن‌است‌فراموش‌کرده‌باشید‪‌...‬‬
‫لگاریتم‌(یا‌همان‌‪‌)log‬برای‌یک‌لدد‌(مثالً‌لدد‌‪‌x‬در‌باال)‌همان‌توان‌(لدد‌‪‌n‬در‌باال)‌است‌‬
‫یتواند‌لدد‌پایه‌(‪‌)b‬را‌به‌لدد‌‪‌x‬برساند‪‌.‬برای‌مثال‪‌،‬فرض‌کنید‌لدد‌پایه‌(‪‌)b‬برابر‌‪‌21‬‬
‫که‌م ‌‬
‫باشد‪‌ :‬‬
‫‌‬

‫یشود‪.‬‬ ‫چون‌‪‌21‬به‌توان‌‪‌3‬برابر‌‪‌2111‬م ‌‬
‫در ‌پایتون ‌لدد ‌پایه ‌برای ‌تابع ‌لگاریتم‪‌ ،‬لدد ‌‪‌ e‬است‪‌.‬فعالً ‌به ‌لدد ‌‪‌ e‬کاری ‌نداریم‪‌.‬چیزی ‌که‌‬
‫االن‌برای‌ما‌جذاب‌است‌دو‌مورد‌زیر‌است‪:‬‬
‫یتوانیم‌الدادِ‌‬
‫یکنند‌(یعنی‌با‌استفاده‌لگاریتم‌م ‌‬ ‫تمها‪‌،‬مقیاس‌الداد‌را‌فشرده‌م ‌‬ ‫‪‌.2‬لگاری ‌‬
‫کوچکتر‌را‌در‌پایتون‌نمایش‌دهیم)‬
‫برای‌مثال‪‌ :‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌331‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫یشود‪‌ :‬‬
‫لگاریتمِ‌الداد‌باال‌به‌صورت‌زیر‌م ‌‬
‫‌‬

‫‌‬
‫نکه ‌احتماالت ‌را ‌با ‌یکدیگر ‌ضرب ‌کنیم‪‌ ،‬لگاریتمِ ‌احتماالت ‌را ‌با ‌هم ‌جمع‌‬
‫‪‌.1‬به ‌جای ‌ای ‌‬
‫یکنیم‪.‬‬
‫م‌‬

‫دادهی‌متون‌خبری‌(‪)Newsgroup Corpus‬‬
‫مجمولهی‌ ‌‬
‫‌‬
‫نحوهی ‌کارکرد ‌این ‌الگوریتم ‌را ‌برررسی ‌می‌کنیم‪‌ .‬این ‌کار ‌را ‌با ‌استفاده ‌از ‌یک‌‬
‫ابتدا ‌ ‌‬
‫نوشتههای ‌خبریِ ‌‪‌ usenet‬استخراج ‌شده ‌است‪‌ ،‬انجام‌‬ ‫‌‬ ‫دادهی ‌مرجع ‌که ‌از ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬
‫دستهها ‌یا ‌همان‌‬
‫نوشتهها ‌شامل‪‌ 11‬گروه ‌خبری ‌( ‌‬ ‫‌‬ ‫مجمولهای ‌از ‌‬
‫‌‬ ‫دادهها‪‌ ،‬شامل ‌‬
‫یدهیم‪‌ ‌ .‬‬ ‫م‌‬
‫طبقهها)‌هستند‪(‌ :‬برای‌مثال‌گروه‌«کامپیوتر‪.‬گرافیک»‌که‌با‌‪‌ comp.graphics‬نشان‌داده‌‬ ‫‌‬
‫میشود) ‌‬
‫‌‬

‫‪comp.graphics - misc.forsale - soc.religion.christian - alt.atheism -‬‬


‫‪comp.os.ms-windows-misc - rec.autos - talk.politics.guns - sci.space -‬‬
‫‪comp.sys.ibm.pc.hardware - rec.motorcycles - talk.politics.mideast -‬‬
‫‪sci.crypt - comp.sys.mac.hardware - rec.sport.baseball - talk.politics.misc‬‬
‫‪- sci.electronics - comp.windows.x - rec.sport.hockey - talk.religion.misc -‬‬
‫‪sci.med‬‬

‫طبقهبند ‌را ‌توسعه ‌دهیم ‌که‌مشخص ‌کند ‌هر ‌کدام ‌از‌‬


‫‌ما ‌به ‌دنبال ‌این ‌هستیم ‌که ‌یک ‌نوع‌ ‌‬
‫یخواهیم‌‬ ‫گروههای ‌باال) ‌اختصاص ‌دارد‪‌ .‬برای ‌مثال ‌م ‌‬
‫نوشتهها ‌در ‌کدام ‌گروه ‌خبری ‌(از ‌ ‌‬
‫‌‬
‫طبقهبندی‌کنیم‪‌ :‬‬
‫نوشتهی‌زیر‌را‌ ‌‬
‫‌‬

‫‪From: essbaum@rchland.vnet.ibm.com‬‬
‫)‪(Alexander Essbaum‬‬
‫‪Subject: Re: Mail order response time‬‬
‫‪Disclaimer: This posting represents the poster's views, not necessarily those‬‬
‫‪of IBM Nntp-Posting-Host: relva.rchland.ibm.com‬‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪333‬‬

‫‪Organization: IBM Rochester‬‬


‫‪Lines: 18‬‬
‫‪> I have ordered many times from Competition‬‬
‫‪> accesories and ussually get 2-3 day delivery.‬‬
‫‪ordered 2 fork seals and 2 guide bushings from CA for my FZR. two weeks‬‬
‫‪later get 2 fork seals and 1 guide bushing. call CA and ask for remaining‬‬
‫‪*guide* bushing and order 2 *slide* bushings (explain on the phone which‬‬
‫‪bushings are which; the guy seemed to understand). two weeks later get 2‬‬
‫‪guide bushings.‬‬
‫*‪*sigh‬‬
‫‪how much you wanna bet that once i get ALL the parts and take the fork‬‬
‫?‪apart that some parts won't fit‬‬

‫که‌در‌واقع‌متن‌باال‌به‌گروه‌‪‌rec.motorcycles‬تعلق‌دارد‪.‬‬
‫توجه ‌کنید ‌که ‌در ‌پُستِ ‌باال‪‌ ،‬بعضی ‌از ‌کلمات ‌دارای ‌اشتباهات ‌امالیی ‌هستند ‌(برای ‌مثال‌‬
‫چالشهایی ‌را ‌برای ‌الگوریتمِ‌‬
‫‌‬ ‫یتواند ‌‬ ‫کلمات ‌‪‌ accesories‬یا ‌‪‌ )ussually‬که ‌این ‌خود ‌م ‌‬
‫طبقهبندی‌ایجاد‌کند‪.‬‬ ‫‌‬
‫مجمولهی ‌داده ‌در ‌‪‌ /http://qwone.com/~jason/20Newsgroups‬قابل ‌دانلود‌‬ ‫‌‬ ‫ای ن ‌‬
‫دادهی ‌‪‌ 20news=bydate‬استفاده ‌کردیم)‪‌.‬همچنین ‌این ‌ ‌‬
‫دادهها ‌در‌‬ ‫مجمولهی ‌ ‌‬
‫‌‬ ‫است ‌(ما ‌از ‌‬
‫وبسایت ‌کتاب ‌به ‌نشانی ‌‪‌ guidetodatamining.com‬و ‌‪‌ chistio.ir‬قابل ‌مشاهده ‌و ‌دانلود‌‬ ‫‌‬
‫مجمولهی‌داده‌شامل‌‪‌21149‬سند‌است‌و‌به‌دو‌قسمت‌آموزشی ‌(که‌‪‌91‬درصد‌‬ ‫‌‬ ‫است‪‌.‬این‌‬
‫قسمتهای‌‬
‫‌‬ ‫دادهها)‌تقسیم‌شده‌است‪‌.‬‬ ‫دادهها‌را‌تشکیل‌می‌دهد)‌و‌آزمون‌(شامل‌‪‌41‬درصد‌ ‌‬ ‫‌‬
‫جداگانهای‌قرار‌دارند‪‌.‬در‌هر‌‬
‫‌‬ ‫آموزشی‌و‌آزمون‌در‌دایرکتوری‌های‌‬
‫یهایی ‌قرار ‌دارند ‌که‌‬ ‫یها‌یک‌سری‌زیردایرکتور ‌‬ ‫کدام‌از‌دایرکتور ‌‬
‫یدهند‪‌.‬در ‌هر ‌کدام ‌از ‌این‌‬ ‫هر ‌کدام ‌یک ‌گروه ‌خبری ‌را ‌پوشش ‌م ‌‬
‫نوشتههای‌‬
‫‌‬ ‫یها‪‌ ،‬اسناد ‌مختلف ‌موجودند‌که ‌در ‌واقع ‌‬‫زیردایرکتور ‌‬
‫آن‌گروه‌خبری‌هستند‪.‬‬

‫همه‌چیزی‌را‌به‌بیرون‌پرت‌کنید!‬
‫قبل ‌از ‌این‌که ‌شروع ‌به ‌کد ‌زدن ‌بکنیم‪‌ ،‬کمی ‌بیشتر ‌در ‌مورد ‌این‌‬
‫مثال‌فکر‌کنید‪.‬‬
‫‌‬
‫برنامهنویسان‬ ‌ ■‌334
‌ ‌‫دادهکاوی‌برای‬


‌‫‌تالشمان‌را‬،‫‌فقط‌بر‌اساس‌کلماتِ‌داخل‌متن‬...‌‫‌در‌صحنهی‌اصلی‬.‫ها‌و‌آقایان‬
‌ ‌
‫(خانم‬
‌ )‫ی‌خبری‌میشوند‬
‌ ‌
‫مربوط‌به‌کدام‌دسته‬ ‌‫نوشتهها‬
‌ ‌‫میکنیم‌که‌بگوییم‌هر‌کدام‌از‬


‌‫یخواهیم ‌سیستمی ‌داشته ‌باشیم ‌که ‌بتواند ‌پستی ‌مانند ‌پست ‌زیر ‌را ‌به‬
‌ ‫ ‌ما ‌م‬،‫برای ‌مثال‬
‌ .‫طبقهبندی‌کند‬
‌ ‌‫برچسبزنی‌یا‌همان‬
‌ ‌rec.motocycle‌‫دستهی‬‌

I am looking at buying a Dual Sport type motorcycle. This is my first cycle as


well. I am interested in any experiences people have with the following
motorcycles, good or bad.
Honda XR250L
Suzuki DR350S
Suzuki DR250ES
Yamaha XT350
Most XXX vs. YYY articles I have seen in magazines pit the Honda XR650L
against another cycle, and the 650 always comes out shining. Is it safe to
assume that the 250 would be of equal quality?‌

:‫طبقهبندی‌کمک‌کند‬
‌ ‌‫بیایید‌ببینیم‌که‌کدام‌کلمات‌ممکن‌است‌برای‬

‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪335‬‬

‫‌‬
‫‌‬
‫کلمهی ‌پرتکرار ‌انگلیسی ‌را ‌از ‌میان ‌متن ‌حذف ‌کنیم‪‌ ،‬سند ‌ما ‌به ‌صورت ‌زیر‌‬
‫اگر ‌ما ‌‪‌ ‌ 111‬‬
‫یشود‪:‬‬ ‫م‌‬
‫‌‬

‫‌‬
‫‌‬
‫یرسد‌‬ ‫یشود‪‌.‬به ‌لالوه‪‌ ،‬به ‌نظر ‌م ‌‬
‫حذف ‌این ‌کلمات‪‌ ،‬بالث ‌کاهش ‌‪‌ 51‬درصدی ‌حجم ‌متن ‌م ‌‬
‫دادهکاوها‌این‌کلمات‌را‪‌،‬‬‫طبقهبندِ‌ما‌ندارد‪‌.‬در‌واقع‪‌ ‌،‬‬
‫که‌حذفِ‌این‌کلمات‪‌،‬تاثیری‌بر‌لملکردِ‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌339‬‬
‫دادهکاوی‌برای‌ ‌‬

‫ینامند‪‌ H. P. Luhn‌.‬در ‌ ‌‬
‫مقالهی ‌اصلیِ‌‬ ‫کلماتِ ‌بدون ‌محتوا ‌یا ‌کلمات ‌پرت ‌(‪‌ )fluff words‬م ‌‬
‫انتزاعهای ‌زبانی ‌( ‪The automatic creation of literature‬‬ ‫خود ‌با ‌نام ‌«ساخت ‌خودکار ‌ ‌‬
‫‪‌ »)abstracts‬گفته ‌است ‌که ‌این ‌کلمات ‌اینقدر ‌معمول ‌هستند ‌که ‌تاثیرِ ‌مطلوبی ‌نداشته‌‬
‫یشوند‪‌ .‬در ‌واقع ‌حذف ‌این ‌کلمات‪‌،‬‬ ‫دادههای ‌نویزدار ‌در ‌سیستم ‌م ‌‬‫باشند ‌و ‌بالث ‌تشکیل ‌ ‌‬
‫یشود‪‌.‬کلماتی‌که‌حذف‌می‌کنیم‌به‌«کلمات‌توقف‌( ‪stop‬‬ ‫بالث‌افزایش‌بهینگی‌و‌کارایی‌م ‌‬
‫آنها‌«لیست‌کلمات‌توقف‌‬ ‫نها‌داریم‪‌،‬که‌به‌ ‌‬ ‫یشوند‪‌.‬ما‌لیستی‌از‌ای ‌‬ ‫‪‌»)words‬نیز‌شناخته‌م ‌‬
‫شپردازش‌‬ ‫مرحلهی ‌پی ‌‬
‫‌‬ ‫یگوییم ‌و ‌این ‌کلمات ‌را ‌از ‌میان ‌متون ‌در ‌‬ ‫(‪‌ »)stop words list‬م ‌‬
‫نکار‌‬‫یکنیم‪‌.‬در ‌واقع ‌ما ‌این ‌کلمات ‌را ‌حذف ‌می‌کنیم ‌چون ‌اوالً ‌ای ‌‬ ‫(‪‌)preprocess‬حذف ‌م ‌‬
‫یشود ‌و ‌ثانیاً ‌این‌کار ‌تاثیر ‌بدی ‌بر ‌روی ‌کارایی ‌سیستم‌‬ ‫بالث ‌کاهش ‌مقدار ‌پردازش ‌ما ‌م ‌‬
‫یتواند‌بالث‌افزایش‌کارایی‌‬ ‫آنها‌حتی‌م ‌‬ ‫همانطور‌که‌در‌باال‌اشاره‌شد‪‌،‬حذف‌ ‌‬ ‫یگذارد‌–‌ ‌‬ ‫نم ‌‬
‫نیز‌شود‪.‬‬
‫‌‬
‫کلمات‌معمول‌(‪‌)Common Words‬در‌مقابل‌کلمات‌توقف‌(‪)Stop Words‬‬
‫یکنند‪‌،‬‬ ‫طبقهبندی ‌کمکی ‌نم ‌‬ ‫اگر ‌چه ‌این ‌جمله ‌که ‌کلماتی ‌مانند ‌‪‌ the‬یا ‌‪‌ a‬به ‌فرآیند ‌ ‌‬
‫کلمات‌دیگری‌مانند‌‪‌work‬یا‌‪‌write‬یا‌‪‌school‬ممکن‌است‌کمک‌کننده‌باشند‌که‌البته‌‬
‫طبقهبندی ‌دارد‪‌ .‬هنگامی ‌که ‌یک ‌مجموله ‌از ‌کلمات ‌توقف ‌( ‪stop‬‬ ‫بستگی ‌به ‌الگوریتم ‌ ‌‬
‫یسازیم‪‌ ،‬معموالً ‌کلمات ‌معمول ‌(‪‌)common words‬که ‌بتوانند ‌کمک ‌کننده‌‬ ‫‪‌)words‬م ‌‬
‫یتوانید ‌برای ‌درك‌‬ ‫یآوریم)‪‌ .‬م ‌‬ ‫یگیریم ‌(یعنی ‌در ‌لیست ‌کلمات ‌توقف ‌نم ‌‬ ‫باشند ‌را ‌نادیده ‌م ‌‬
‫مجمولهی ‌داده‪‌ ،‬در ‌اینترنت ‌جستجو ‌کنید ‌و ‌مجموله ‌کلمات‌‬ ‫‌‬ ‫کردن ‌تفاوت ‌بین ‌این ‌دو ‌‬
‫توقف‌را‌با‌کلمات‌پرتکرار‌و‌معمول‌مقایسه‌کنید‌(‪‌stop words list‬یا‌ ‪frequent word‬‬
‫‪)list‬‬
‫‌‬
‫خطرات‌حذف‌کلمات‌توقف‬
‫‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪337‬‬

‫‌‬
‫هِی‌تو‌جوانِ‌خام‪‌.‬نباید‌این‌کلمات‌معمول‌را‌دور‌بریزی! ‌‬

‫آنها ‌را‌‬
‫یتواند ‌کارا ‌باشد‪‌ ،‬بهتر ‌است ‌ ‌‬
‫در ‌حالی ‌که ‌حذف ‌کلمات ‌توقف‪‌ ،‬در ‌بعضی ‌از ‌موارد ‌م ‌‬
‫یرسد ‌که ‌فقط‌با ‌استفاده ‌از ‌کلماتِ ‌پرتکرار ‌(و‌‬‫بدون ‌فکر ‌حذف ‌نکنید‪‌.‬برای ‌مثال‪‌ ،‬به ‌نظر ‌م ‌‬
‫بدون ‌استفاده ‌از ‌بقی‌هی ‌کلمات)‌که ‌در ‌واقع ‌برلکسِ ‌کاری ‌است ‌که ‌در ‌باالتر ‌انجام ‌دادیم‪‌،‬‬
‫شدهاند‪‌،‬به‌‬
‫یتوانیم‌اطاللات‌کافی‌را‌برای‌به‌دست‌آوردنِ‌اسنادی ‌که ‌با‌زبان‌لربی‌نوشته‌ ‌‬ ‫م‌‬
‫مقالهای‌‬
‫مقالهی ‌زیر ‌را ‌جستجو ‌کنید ‌(این ‌ ‌‬ ‫دست ‌بیاوریم‪‌.‬اگر ‌به ‌این ‌موضوع ‌لالقه ‌دارید‪‌ ‌ ،‬‬
‫نوشتهام)‪:‬‬
‫‌‬ ‫یهایم‌در‌دانشگاه‌ایالتی‌نیومکزیو‌‬ ‫است‌که‌من‌با‌یکی‌از‌همکالس ‌‬
‫‪Linguistic Dumpster Diving: Geographical Classification of Arabic Text‬‬
‫همچنین‌این‌مقاله‌در‌سایت‌‪‌http://zacharski.org‬در‌دسترس‌است‪.‬‬
‫(یعنی‌کسانی‌که‌میخواهند‌مردم‌را‌‬
‫‌‬ ‫یهای‌جنسی‌‬ ‫چتهای‌آنالین‪‌،‬شکارچ ‌‬ ‫یا‌مثالً‌در‌مورد‌ ‌‬
‫فریب‌دهند)‌از‌کلماتی‌مانند ‌‪‌me‌ ،I‬و ‌‪‌you‬بسیار‌بیشتر‌از‌سایر‌افراد‌استفاده‌م ‌‬
‫یکنند‪‌.‬اگر‌‬
‫چتها ‌باشد‪‌ ،‬حذف ‌کلمات‌‬
‫هدف ‌ما ‌در ‌یک ‌پروژه‪‌ ،‬مشخص ‌کردنِ ‌شکارچیان ‌جنسی ‌در ‌ ‌‬
‫طبقهبندی‪‌،‬صدمه‌وارد‌کند‪.‬‬
‫یتواند‌به‌کاراییِ‌الگوریتم‌ ‌‬ ‫پرتکرار‌م ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌331‬‬
‫دادهکاوی‌برای‌ ‌‬

‫پس‪‌،‬کورکورانه‌کلمات‌توقف‌را‌حذف‌نکنید‪‌.‬ابتدا‌فکر‌کنید‪.‬‬

‫کد‌بزنید‌–‌استایل‌پایتونی‬
‫اجازه ‌بدهید ‌ابتدا ‌قسمت ‌آموزش ‌بیز ‌ساده ‌(‪‌)Naïve Bayes‬را ‌کد ‌بزنیم‪‌.‬یادتان ‌باشد ‌که‌‬
‫متنهای‌‪‌newsgroup‬به‌صورت‌زیر‌بود‪:‬‬ ‫دادههای‌آموزشی‌برای‌مجموله‌ی‌ ‌‬ ‫‌‬

‫پس ‌من ‌یک ‌دایرکتوری ‌یا‌همان‌فولدر‌دارم ‌(که ‌در ‌این ‌مثال ‌به ‌اسم ‌‪20news-bydate-‬‬
‫‪‌train‬است)‪‌.‬در‌این‌دایرکتوری‌یک‌سری‌زیردایرکتوری‌وجود‌دارد‌که‌ ‌‬
‫طبقههای‌مختلف‌را‌‬
‫یدهند ‌(برای ‌مثال ‌‪‌ alt.athesim‬یا ‌‪‌ comp.graphics‬و‪‌ .)...‬اسم ‌این ‌زیر‌‬
‫نمایش ‌م ‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪336‬‬

‫دادههای ‌آزمون ‌نیز‪‌ ،‬به ‌همین ‌شکل ‌سازماندهی‌‬ ‫یها ‌همان ‌اسم ‌طبقه‌ها ‌هستند‪‌ ‌.‬‬ ‫دایرکتور ‌‬
‫شدهاند‪‌.‬پس ‌برای ‌تطبیق ‌این ‌ساختار‪‌ ،‬کد ‌پایتون ‌نیاز ‌به ‌دانستنِ ‌دایرکتوریِ ‌آموزشی ‌دارد‌‬
‫‌‬
‫(برای ‌مثال‪‌.)/Users/raz/Downloads/20news-bydate/20news-bydate-train/‌ ،‬‬
‫توضیحِ‌کلیِ‌کد‪‌،‬برای‌قسمت‌آموزشی‌به‌صورت‌زیر‌است‪:‬‬
‫کالس‌‪BayesText‬‬
‫‪‌.2‬تابع‌‪:init‬‬
‫یخواند‬‫اول‪‌:‬کلمات‌را‌از‌مجموله‌کلمات‌توقف‌(‪‌)stop words‬م ‌‬
‫یخواند ‌(لالوه‌‬ ‫یها ‌م ‌‬
‫دوم‪‌:‬دایرکتوریِ ‌آموزشی ‌را ‌برای ‌به ‌دست ‌آوردن ‌نام ‌زیردایرکتور ‌‬
‫طبقهها‌نیز‌هستند)‬
‫گروهها‌یا‌همان‌ ‌‬ ‫یها‌هستند‪‌،‬نام‌ ‌‬ ‫نها‌نام‌زیردایرکتور ‌‬
‫نکه‌ای ‌‬‫بر‌ای ‌‬
‫طبقههای‌ما‌هستند‪‌،‬تابع‌‪‌train‬را‌‬ ‫یها‌که‌همان‌ ‌‬ ‫سوم‪‌:‬برای‌هر‌کدام‌از‌آن‌زیردایرکتور ‌‬
‫لهای ‌آن‌‬ ‫یزند‪‌ ،‬که ‌در ‌واقع ‌تعداد ‌تکرارِ ‌هر ‌کدام ‌از ‌کلمات ‌را ‌در ‌تمامی ‌فای ‌‬ ‫صدا ‌م ‌‬
‫زیردایرکتوری‌محاسبه‌می‌کند‬
‫چهارم‪‌:‬احتماالت‌را‌توسط‌فرمول‌زیر‌محاسبه‌می‌کند‪:‬‬
‫‌‬

‫‌‬

‫‪from __future__ import print_function‬‬


‫‪import os, codecs, math‬‬

‫‪class BayesText:‬‬

‫‪def __init__(self, trainingdir, stopwordlist):‬‬


‫‪"""This class implements a naive Bayes approach‬‬
‫‪to text‬‬
‫‪classification‬‬
‫‪trainingdir is the training data. Each subdirect‬‬
‫‪ory of‬‬
‫‪trainingdir is titled with the name of the class‬‬
‫‪ification‬‬
‫‪category -- those subdirectories in turn contain‬‬
‫‪the text‬‬
‫‪files for that category.‬‬
‫برنامهنویسان‬ ‌ ■‌341
‌ ‌‫دادهکاوی‌برای‬

The stopwordlist is a list of words (one per lin


e) will be
removed before any counting takes place.
"""
self.vocabulary = {}
self.prob = {}
self.totals = {}
self.stopwords = {}
f = open(stopwordlist)
for line in f:
self.stopwords[line.strip()] = 1
f.close()
categories = os.listdir(trainingdir)
#filter out files that are not directories
self.categories = [filename for filename in cate
gories
if os.path.isdir(trainingdir
+ filename)]
print("Counting ...")
for category in self.categories:
print(' ' + category)
(self.prob[category],
self.totals[category]) = self.train(trainin
gdir, category)
# I am going to eliminate any word in the vocabu
lary
# that doesn't occur at least 3 times
toDelete = []
for word in self.vocabulary:
if self.vocabulary[word] < 3:
# mark word for deletion
# can't delete now because you can't del
ete
# from a list you are currently iteratin
g over
toDelete.append(word)
# now delete
for word in toDelete:
del self.vocabulary[word]
# now compute probabilities
vocabLength = len(self.vocabulary)
print("Computing probabilities:")
for category in self.categories:
print(' ' + category)
denominator = self.totals[category] + vocabL
ength
342 ■‌‫‌پردازش‌متون‌بدون‌ساختار‬.7‌‫‌فصل‬

for word in self.vocabulary:


if word in self.prob[category]:
count = self.prob[category][word]
else:
count = 1
self.prob[category][word] = (float(count
+ 1)
/ denominat
or)
print ("DONE TRAINING\n\n")

def train(self, trainingdir, category):


"""counts word occurrences for a particular cate
gory"""
currentdir = trainingdir + category
files = os.listdir(currentdir)
counts = {}
total = 0
for file in files:
#print(currentdir + '/' + file)
f = codecs.open(currentdir + '/' + file, 'r'
, 'iso8859-1')
for line in f:
tokens = line.split()
for token in tokens:
# get rid of punctuation and lowerca
se token
token = token.strip('\'".,?:-')
token = token.lower()
if token != '' and not token in self
.stopwords:
self.vocabulary.setdefault(token
, 0)
self.vocabulary[token] += 1
counts.setdefault(token, 0)
counts[token] += 1
total += 1
f.close()
return(counts, total)

‌‫ ‌ذخیره‬prob‌ ‫)‌به ‌اسم‬hash table‌ -‌ ‫درهمساز‬


‌ ‌ ‫نتایج ‌فاز ‌آموزش ‌در ‌یک ‌دیکشنری ‌(جدول‬
‌،comp.graphics‌ ً‫یهاست ‌(مثال‬ ‌ ‫طبقهبند‬
‌ ‌ ‫ ‌کلیدها ‌برای ‌این ‌دیکشنری ‌انواع‬.‫یشود‬‌‫م‬
‫برنامهنویسان‬ ‫‪‌ ■‌341‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دیکشنریها ‌هستند‪‌.‬‬
‫‌‬ ‫‪‌ soc.religion.christian‌ ،rec.motocycles‬و‪‌ .)...‬مقادیر ‌هم ‌همان ‌‬
‫آنها‪‌ ،‬احتماالت ‌آن ‌کلمات ‌است ‌(در‌‬ ‫دیکشنریها ‌کلمات ‌بوده ‌و ‌مقادیرِ ‌ ‌‬
‫‌‬ ‫کلیدهای ‌این ‌زیر‬
‫واقع ‌به ‌صورت ‌کلید‪/‬مقدار ‌یا ‌همان ‌‪‌ key/value‬پی ‌‬
‫ادهسازی ‌شده ‌است)‪‌.‬در ‌زیر ‌یک ‌مثال ‌از‌‬
‫آوردهایم‪:‬‬
‫این‌مورد‌را‌ ‌‬
‫‌‬

‫کلمهی ‌‪(‌ god‬به ‌معنی ‌خدا) ‌در ‌گروه ‌‪‌rec.motorcycles‬‬


‫پس ‌برای ‌مثال‪‌ ،‬احتمال ‌وجود ‌ ‌‬
‫(که ‌مربوط ‌به ‌موتورسیکلت ‌است)‪‌ ،‬برابر ‌‪‌ 1.11123‬است‪(‌.‬یعنی ‌در‌این‌گروه‌تقریباً ‌در ‌هر‌‬
‫کلمهی ‌‪‌ god‬در ‌گروه‌‬ ‫کلمهی ‌‪‌ god‬داریم)‪‌ .‬ولی ‌احتمال ‌وجود ‌ ‌‬ ‫‪‌ 21111‬کلمه‪‌ ،‬یک ‌ ‌‬
‫‪(‌ soc.religion.christian‬که ‌مربوط ‌به ‌مذهب ‌مسحیت ‌است)‌برابر ‌‪‌ 1.11414‬است ‌(یعنی‌‬
‫کلمهی‌‪‌god‬داریم)‪.‬‬
‫در‌این‌گروه‌تقریباً‌در‌هر‌‪‌151‬کلمه‪‌،‬یک‌ ‌‬
‫یگرداند‪‌،‬که‌در‌آن‪‌،‬همان‌طیور‌‌کیه‌‌احتمیاالً‌‌حیدس‌‌‬
‫فاز‌آموزش‌همچنین‌طبقه‌ها‌را‌هم‌برم ‌‬
‫گروهها‌موجود‌است‪:‬‬
‫یزنید‪‌،‬لیستی‌از‌تمامی‌ ‌‬ ‫م‌‬
‫‌‬

‫‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪343‬‬

‫‌‬
‫طبقهبندی‌کنیم‬
‫این‌فاز‌آموزش‌بود‪‌.‬بیایید‌حاال‌یک‌سند‌را‌ ‌‬
‫‌‬
‫کد‌بزنید‬
‫پیشبینی‌‬
‫طبقهی ‌یک ‌سند ‌را ‌ ‌‬
‫گونهای ‌بنویسید ‌که ‌بتواند ‌ ‌‬
‫طبقهبند ‌را ‌به ‌ ‌‬
‫یتواند ‌تابع ‌ ‌‬
‫آی ا ‌ م ‌‬
‫کند؟‌برای‌مثال‪:‬‬
‫‌‬

‫‌‬
‫یگیرد‌و‌یی‌ک‌رشیته‌‌‬ ‫یبینید‪‌،‬تابع‌طبقه‌بند‌(‪‌)classify‬یک‌نام‌فایل‌را‌م ‌‬
‫همان‌طور‌که‌م ‌‬
‫طبقهی‌مربط‌به‌آن‌فایل‌(سند)‌است‪.‬‬ ‫یگرداند‌که‌این‌رشته‌همان‌ ‌‬ ‫برم ‌‬
‫یتوانید ‌به ‌صورت ‌قالب ‌از ‌آن ‌استفاده‌‬
‫وبسایت ‌موجود ‌است ‌که ‌م ‌‬
‫یک ‌فایل ‌پایتونی ‌در ‌ ‌‬
‫کنید‪‌.‬این‌فایل‌با‌نام‌‪‌bayesText-ClassifyTemplate.py‬در‌سایت‌ما‌موجود‌است‪.‬‬
‫‌‬
‫‌‬
‫برنامهنویسان‬ ‌ ‫‌■ د‬344
‌ ‌‫ادهکاوی‌برای‬



‫کد‌بزنید‌–‌راه‌حل‬

def classify(self, filename):
results = {}
for category in self.categories:
results[category] = 0
f = codecs.open(filename, 'r', 'iso8859-1')
for line in f:
tokens = line.split()
for token in tokens:
#print(token)
token = token.strip('\'".,?:-').lower(
)
if token in self.vocabulary:
for category in self.categories:
if self.prob[category][token]
== 0:
print("%s %s" % (category,
token))
results[category] += math.log(
self.prob[category][token]
)
f.close()
results = list(results.items())
results.sort(key=lambda tuple: tuple[1], rever
se = True)
# for debugging I can change this to give me t
he entire list
345 ■‌‫‌پردازش‌متون‌بدون‌ساختار‬.7‌‫‌فصل‬

return results[0][0]


‌‌‫‌هر‌کدام‌از‌اسناد‌را‌در‌دایرکتیور‌یِ‌آزمیون‬،‫‌بیایید‌کدی‌بزنیم‌که‌بتوانیم‌توسط‌آن‬،‫در‌آخر‬
.‫طبقهبندی‌کند‌و‌دقتِ‌این‌تابع‌را‌بر‌اساس‌درصد‌برگرداند‬
‌ ‌‫به‌گروهِ‌مربوط‌به‌خود‬

def testCategory(self, directory, category):
files = os.listdir(directory)
total = 0
correct = 0
for file in files:
total += 1
result = self.classify(directory + file)
if result == category:
correct += 1
return (correct, total)

def test(self, testdir):


"""Test all files in the test directory--that direct
ory is
organized into subdirectories--each subdir is a clas
sification
category"""
categories = os.listdir(testdir)
#filter out files that are not directories
categories = [filename for filename in categories if
os.path.isdir(testdir + filename)]
correct = 0
total = 0
for category in categories:
print(".", end="")
(catCorrect, catTotal) = self.testCategory(
testdir + category + '/', category)
correct += catCorrect
total += catTotal
print("\n\nAccuracy is %f%% (%i test instances)" %
((float(correct) / total) * 100, total))
‫برنامهنویسان‬ ‫‪‌ ■‌349‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یکنم‪‌،‬نتیجیه‌ی‌‬
‫هنگامی‌که‌این‌کد‌را‌همراه‌با‌فایل‌کلمات‌توقف‌(که‌خالی‌هستند)‌اجرا‌م ‌‬
‫یگیرم‪:‬‬
‫زیر‌را‌م ‌‬
‫‌‬

‫‌‬

‫‌‬
‫‌‬
‫کد‌بزنید‬
‫طبقهبند ‌را ‌برای‌چند ‌لیست ‌از ‌کلمات ‌توقف ‌اجرا ‌کنید؟ ‌آیا ‌کارایی‌‬
‫یتوانید ‌همین ‌ ‌‬ ‫آی ا ‌ م ‌‬
‫قتر ‌هستند؟ ‌(برای ‌پیدا ‌کردن ‌یک ‌یا ‌چند ‌لیست ‌از‌‬
‫یکند؟ ‌کدام ‌یک ‌دقی ‌‬
‫افزایش ‌پیدا ‌م ‌‬
‫یتوانید‌در‌اینترنت‌جستجو‌کنید)‌(مثال‌برای‌پیدا‌کردن‌کلمات‌توقف‌در‌‬ ‫کلمات‌توقف‪‌،‬م ‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪347‬‬

‫انگلیسی‌لبارت‌‪‌English stop words list‬را‌جستجو‌کنید‪‌،‬و‌برای‌فارسی‌هم‌‪perisan‬‬


‫‪‌ )stop words list‬‬
‫‌‬
‫مجمولهی‌کلمات‌توقف‌هستند‌و‌ستون‌‪‌،accuracy‬دقت‌را‌‬
‫‌‬ ‫ستون‌‪‌،stop list size‬سایز‌‬
‫نشان‌میدهد‪‌ :‬‬
‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬
‫کد‌بزنید‌–‌راه‌حل‬
‫کلمهی ‌توقف ‌انگلیسی ‌را ‌در ‌‪http://nlp.stanford.edu/IR-‬‬
‫من ‌یک ‌لیستی ‌از ‌‪‌ ‌ 15‬‬
‫‪‌ book/html/htmledition/dropping-common-terms-stop-words-1.html‬و‌‬
‫‌در‌‬ ‫‌را‬ ‫کلمهای‬
‫‌ ‌‬ ‫‌‪274‬‬ ‫‌لیستِ‬ ‫یک‬
‫‪‌http://www.ranks.nl/resources/stopwords.html‬پیدا‌ ‌‬
‫کردهام‪.‬‬
‫وبسایت‌خودمان‌هم‌برای‌دانلود‌موجود‌است‪.‬‬
‫البته‌در‌ ‌‬
‫آوردهام‪:‬‬
‫این‌نتایجی‌است‌که‌من‌به‌دست‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌341‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یرسد‌که‌لیستِ‌‪274‬تایی‪‌،‬کارایی‌را‌حدوداً‌‪‌1‬درصد‌نسبت‌به‌‬ ‫پس‌در‌این‌مورد‪‌،‬به‌نظر‌م ‌‬
‫یکردیم‪‌ ،‬بهبود ‌داده ‌است‪‌.‬آیا ‌با ‌نتایجی ‌که ‌شما ‌به‌‬
‫حالتی ‌که ‌از ‌کلمات ‌توقف ‌استفاده ‌نم ‌‬
‫دست‌آوردید‪‌،‬مطابقت‌داشت؟ ‌‬

‫بیز‌ساده‌(‪‌)Naïve Bayes‬و‌تحلیل‌احساسات‌(‪‌)Sentiment Analysis‬‬

‫هدف‌اصلی‌در‌تحلیل‌احساس‪‌،‬مشخص‌کردن‌گرایش‌نویسنده‌یا‌نظر‌او‌است‪.‬‬

‫شکلهای ‌رایج ‌در ‌تحلیل ‌احساسات‪‌ ،‬تعیین ‌قطبیت ‌(‪‌ )polarity‬برای ‌یک ‌نوشته‌‬ ‫یکی ‌از ‌ ‌‬
‫یتوانیم‌‬ ‫است‪‌،‬مثالً‌یک‌نظر ‌(مثبت‌یا‌منفی)‌یا‌چیزی‌شبیه‌به‌این‪‌.‬برای‌حل‌این‌مسئله‪‌،‬م ‌‬
‫یتوانیم ‌از‌‬ ‫طبقهبندی ‌بیزساده ‌(‪‌ )Naïve Bayes‬استفاده ‌کنیم‪‌ .‬برای ‌ای ‌‬
‫نکار ‌م ‌‬ ‫از ‌الگوریتمِ ‌ ‌‬
‫دادهی ‌قطبیت ‌نظرات ‌فیلم ‌که ‌ابتدا ‌در ‌سال ‌‪‌ 1114‬توسط ‌‪‌ Pang and Lee‬ارائه‌‬
‫مجمولهی ‌ ‌‬
‫‌‬
‫آنها‌در‌زیر‌آمده‌است‪:‬‬
‫مقالهی‌کامل‌ ‌‬
‫شد‪‌،‬استفاده‌کنیم‪‌ ‌.‬‬
‫‪Pang, Bo and Lillian Lee. 2004. A sentimental education: Sentiment analysis‬‬
‫‪using subjectivity summarization based on minimum cuts. Proceedings of‬‬
‫‪ACL.‬‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪346‬‬

‫آنها‌را‌‬
‫آنها‪‌،‬شامل‌‪‌2111‬نظر‌مثبت‌و‌‪‌2111‬نظر‌منفی‌بود‪‌.‬دو‌مورد‌از‌ ‌‬
‫مجمولهی‌داده‌ی‌ ‌‬
‫‌‬
‫در‌زیر‌مشاهده‌می‌کنید‪(‌:‬سمت‌چپ‌نظر‌منفی‌و‌سمت‌راست‌نظر‌مثبتی‌است)‬
‫‌‬

‫‌‬
‫‌‬
‫یتوانید ‌از ‌‪http://www.cs.cornell.edu/people/pabo/movie-‬‬ ‫مجمولهی ‌داده ‌را ‌م ‌‬
‫‌‬
‫دادهها ‌را ‌در ‌‪‌ 21‬قسمت ‌(‪‌)bucket‬یعنی ‌همان ‌‪‌ 21‬تکه‌‬
‫‪‌/review-data‬دانلود ‌کنید‪‌.‬من ‌ ‌‬
‫دهندهی‌‬
‫‌‬ ‫کردهام ‌(‪‌ ‌ neg‬‬
‫نشان‬ ‫جمعآوری ‌ ‌‬
‫یهای ‌مختلف ‌ ‌‬ ‫(‪‌ )fold‬به ‌صورت ‌زیر ‌در ‌دایرکتور ‌‬
‫نشاندهنده‌ی‌مثبت‌بودنِ‌نظرات‌موجود‌در‌آن‌دایرکتوری‌است)‪:‬‬ ‫منفی‌بودن‌و‌‪‌ ‌pos‬‬
‫‌‬

‫‌‬

‫وبسایت‌ما‌قابل‌دانلود‌است‌(‪‌guidetodatamining.com‬و‌‪)chistio.ir‬‬
‫این‌ساختار‌در‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌351‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫کد‌بزنید‬
‫یتوانید ‌روش ‌بیز ‌ساده ‌(‪‌ )naïve bayes‬را ‌طوری ‌تغییر ‌دهید ‌که ‌التبارسنجی‌‬ ‫آی ا ‌ م ‌‬
‫مجمولهی ‌داده ‌انجام‌‬
‫‌‬ ‫تکهای ‌(‪‌ )10-fold cross validation‬را ‌بر ‌روی ‌این ‌‬
‫متقابل ‌‪‌ -21‬‬
‫دهد؟‌مثالً‌خروجی‌چیزی‌شبیه‌به‌شکل‌زیر‌شود‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫همنچنین‌ضریب‌کاپا‌(‪‌)kappa coefficient‬را‌هم‌محاسبه‌کنید‪.‬‬
‫‌‬

‫رفع‌مسئولیت‌واضح‬
‫همانطور ‌که ‌خواندن‌‬‫دادهکاوِ ‌خبره ‌نخواهید ‌شد‪‌ ‌ ،‬‬
‫قطعاً ‌شما ‌فقط ‌با ‌خواندن ‌این ‌کتاب‪‌ ،‬یک ‌ ‌‬
‫حرفهای ‌نخواهد ‌کرد‪‌ .‬حتماً ‌و ‌لزوماً ‌نیاز ‌به ‌تمرین‌‬
‫یک ‌کتابِ ‌پیانو‪‌ ،‬شما ‌را ‌یک ‌پیانیستِ ‌ ‌‬
‫دارید!‬

‫در‌تصویر‌زیر‪‌،‬زنی‌در‌حال‌نواختن‌برام‌را‌مشاهده‌می‌کنید! ‌‬
‫‌فصل‌‪‌.7‬پردازش‌متون‌بدون‌ساختار‌■ ‪352‬‬

‫‌‬
‫تمرین‌میکند ‌‬
‫‌‬ ‫و‌متقابالً‌در‌تصویر‌زیر‪‌،‬زنی‌را‌مشاهده‌می‌کنید‌که‌دارد‌بیز‌ساده‌را‌‬
‫لالقهی‌بیشتری‌رشد‌کند) ‌‬ ‫(تمرین‌بالث‌میشود‌تا‌قلب‌با‌ ‌‬
‫‌‬

‫کد‌بزنید‌–‌راه‌حل‬
‫جهای‌که‌من‌گرفتم‌به‌این‌صورت‌بوده‌است‪:‬‬
‫نتی ‌‬
‫‌‬

‫‌‬
‫برنامهنویسان‬ ‌ ■‌351
‌ ‌‫دادهکاوی‌برای‬


‌ :‫کردهام‬
‌ ‌‫همچنین‌ضریب‌کاپا‌را‌هم‌حساب‬


‌ .‫گرفتهایم‬
‌ ‌‫دادهها‬
‌ ‌‫جهی‌خوبی‌برای‌این‌الگوریتم‌بر‌روی‌این‬
‌ ‫پس‌ما‌نتی‬


:‫کد‌نیز‌در‌ادامه‌آمده‌است‬
‫و‌باز‌هم‌یادآوری‌که‬
.‫‌دانلود‌کنید‬chistio.ir‌‫‌یا‬guidetodataminig.com‌‫یتوانید‌از‌سایت‬
‌ ‫کدها‌را‌م‬

from __future__ import print_function


import os, codecs, math

class BayesText:

def __init__(self, trainingdir, stopwordlist, ignore


Bucket):
"""This class implements a naive Bayes approach
to text
classification
trainingdir is the training data. Each subdirect
ory of
trainingdir is titled with the name of the class
ification
category -- those subdirectories in turn contain
the text
files for that category.
The stopwordlist is a list of words (one per lin
e) will be
removed before any counting takes place.
"""
self.vocabulary = {}
self.prob = {}
self.totals = {}
self.stopwords = {}
f = open(stopwordlist)
353 ■‌‫‌پردازش‌متون‌بدون‌ساختار‬.7‌‫‌فصل‬

for line in f:
self.stopwords[line.strip()] = 1
f.close()
categories = os.listdir(trainingdir)
#filter out files that are not directories
self.categories = [filename for filename in cate
gories
if os.path.isdir(trainingdir
+ filename)]
print("Counting ...")
for category in self.categories:
#print(' ' + category)
(self.prob[category],
self.totals[category]) = self.train(trainin
gdir, category,
ignoreB
ucket)
# I am going to eliminate any word in the vocabu
lary
# that doesn't occur at least 3 times
toDelete = []
for word in self.vocabulary:
if self.vocabulary[word] < 3:
# mark word for deletion
# can't delete now because you can't del
ete
# from a list you are currently iteratin
g over
toDelete.append(word)
# now delete
for word in toDelete:
del self.vocabulary[word]
# now compute probabilities
vocabLength = len(self.vocabulary)
#print("Computing probabilities:")
for category in self.categories:
#print(' ' + category)
denominator = self.totals[category] + vocabL
ength
for word in self.vocabulary:
if word in self.prob[category]:
count = self.prob[category][word]
else:
count = 1
self.prob[category][word] = (float(count
+ 1)
‫برنامهنویسان‬ ‌ ■‌354
‌ ‌‫دادهکاوی‌برای‬

/ denominat
or)
#print ("DONE TRAINING\n\n")

def train(self, trainingdir, category, bucketNumberT


oIgnore):
"""counts word occurrences for a particular cate
gory"""
ignore = "%i" % bucketNumberToIgnore
currentdir = trainingdir + category
directories = os.listdir(currentdir)
counts = {}
total = 0
for directory in directories:
if directory != ignore:
currentBucket = trainingdir + category +
"/" + directory
files = os.listdir(currentBucket)
#print(" " + currentBucket)
for file in files:
f = codecs.open(currentBucket + '/'
+ file, 'r', 'iso8859-1')
for line in f:
tokens = line.split()
for token in tokens:
# get rid of punctuation and
lowercase token
token = token.strip('\'".,?:
-')
token = token.lower()
if token != '' and not token
in self.stopwords:
self.vocabulary.setdefau
lt(token, 0)
self.vocabulary[token] +
= 1
counts.setdefault(token,
0)
counts[token] += 1
total += 1
f.close()
return(counts, total)

def classify(self, filename):


355 ■‌‫‌پردازش‌متون‌بدون‌ساختار‬.7‌‫‌فصل‬

results = {}
for category in self.categories:
results[category] = 0
f = codecs.open(filename, 'r', 'iso8859-1')
for line in f:
tokens = line.split()
for token in tokens:
#print(token)
token = token.strip('\'".,?:-').lower()
if token in self.vocabulary:
for category in self.categories:
if self.prob[category][token] ==
0:
print("%s %s" % (category, t
oken))
results[category] += math.log(
self.prob[category][token])
f.close()
results = list(results.items())
results.sort(key=lambda tuple: tuple[1], reverse
= True)
# for debugging I can change this to give me the
entire list
return results[0][0]

def testCategory(self, direc, category, bucketNumber


):
results = {}
directory = direc + ("%i/" % bucketNumber)
#print("Testing " + directory)
files = os.listdir(directory)
total = 0
correct = 0
for file in files:
total += 1
result = self.classify(directory + file)
results.setdefault(result, 0)
results[result] += 1
#if result == category:
# correct += 1
return results

def test(self, testdir, bucketNumber):


"""Test all files in the test directory--that di
rectory is
‫برنامهنویسان‬ ‌ ■‌359
‌ ‌‫دادهکاوی‌برای‬

organized into subdirectories--each subdir is a


classification
category"""
results = {}
categories = os.listdir(testdir)
#filter out files that are not directories
categories = [filename for filename in categorie
s if
os.path.isdir(testdir + filename)]
correct = 0
total = 0
for category in categories:
#print(".", end="")
results[category] = self.testCategory(
testdir + category + '/', category, buck
etNumber)
return results

def tenfold(dataPrefix, stoplist):


results = {}
for i in range(0,10):
bT = BayesText(dataPrefix, stoplist, i)
r = bT.test(theDir, i)
for (key, value) in r.items():
results.setdefault(key, {})
for (ckey, cvalue) in value.items():
results[key].setdefault(ckey, 0)
results[key][ckey] += cvalue
categories = list(results.keys())
categories.sort()
print( "\n Classified as: ")
header = " "
subheader = " +"
for category in categories:
header += "% 2s " % category
subheader += "-----+"
print (header)
print (subheader)
total = 0.0
correct = 0.0
for category in categories:
row = " %s |" % category
for c2 in categories:
if c2 in results[category]:
count = results[category][c2]
else:
357 ■‌‫‌پردازش‌متون‌بدون‌ساختار‬.7‌‫‌فصل‬

count = 0
row += " %3i |" % count
total += count
if c2 == category:
correct += count
print(row)
print(subheader)
print("\n%5.3f percent correct" %((correct * 100) /
total))
print("total of %i instances" % total)

# change these to match your directory structure


prefixPath = "/Users/raz/Dropbox/guide/data/review_polar
ity_buckets/"
theDir = prefixPath + "/txt_sentoken/"
stoplistfile = prefixPath + "stopwords25.txt"
tenfold(theDir, stoplistfile)


‫فصل ‪ .1‬خوشه بندي‬
‫كشف گروهها و خوشهها (‪)clusters‬‬
‫‌‬
‫‌‬
‫‌‬
‫طبقهبندی ‌(‪‌ )classification‬را ‌توسعه ‌دادیم‪‌ .‬در ‌این‌‬
‫در ‌فصول ‌گذشته‪‌ ،‬ما ‌سیستم‌های ‌ ‌‬
‫میدادیم‪.‬‬
‫طبقهبند‌را‌بر‌روی‌یک‌مجموله‌ی‌داده‌دارای‌برچسب‌آموزش‌ ‌‬‫ستمها‪‌،‬یک‌ ‌‬‫سی ‌‬
‫‌‬

‫‌‬

‫مثالهای‌جدید‌استفاده‌‬‫نمونهها‌و‌ ‌‬
‫برچسبزنیِ‌ ‌‬
‫‌‬ ‫یتوانیم‌از‌آن‌برای‌‬
‫طبقهبند‪‌،‬م ‌‬
‫بعد‌از‌آموزشِ‌ ‌‬
‫کنیم‪.‬‬
‫برای ‌مثال‪‌ ،‬این ‌شخص ‌یک ‌بازیکن ‌بسکتبال ‌است‪‌ .‬آن ‌یکی ‌ژیمیناستیک‌کار ‌است‪‌ .‬آن‌‬
‫نطور‌تا‌آخر‪‌.‬به‌بیانی ‌دیگر‪‌،‬‬
‫یگیرد‌و‌همی ‌‬
‫شخص‌با‌احتمال‌کمی ‌در‌‪‌3‬سال‌آینده‌دیابت‌م ‌‬

‫‪354‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌391‬‬
‫دادهکاوی‌برای‌ ‌‬

‫برچسبها ‌که ‌در ‌فاز ‌آموزش ‌دریافت‌‬


‫‌‬ ‫مجمولهای ‌از ‌‬
‫‌‬ ‫طبقهبندی‪‌ ،‬یک ‌برچسب ‌را ‌از ‌‬
‫الگوریتمِ ‌ ‌‬
‫برچسبهای‌ممکن‌را‌می‌داند‪.‬‬
‫‌‬ ‫یکند‌–‌در‌واقع‌این‌الگوریتم‪‌،‬‬ ‫کرده‌است‪‌،‬انتخاب‌م ‌‬
‫‌‬

‫‌‬

‫خوشهبندی ‌(‪‌ )clustering‬معروف ‌هستند‪‌.‬‬


‫‌‬ ‫دهی ‌الگوریتم‌هایی ‌است ‌که ‌به ‌‬
‫این ‌وظیفه ‌به ‌له ‌‬
‫یکند‌و‌این‌کار‌را‌بر‌اساس‌یک‌معیارِ‌‬
‫گروههایی‌تقسیم‌م ‌‬ ‫خوشهها‌یا‌ ‌‬
‫‌‬ ‫نمونهها‌را‌به‌‬
‫سیستم‪‌ ‌،‬‬
‫خوشهبندی‌وجود‌دارد‪.‬‬
‫‌‬ ‫شباهت‌انجام‌می‌دهد‪‌.‬دو‌نوع‌الگوریتم‌اصلیِ‌‬
‫‌‬

‫خوشهبندی‌‪k-means‬‬
‫‌‬
‫یخواهیم ‌به ‌دست‌‬ ‫خوشهبندی‪‌ ،‬ما ‌به ‌الگوریتم ‌می‌گوییم ‌که ‌چند ‌لدد ‌خوشه ‌م ‌‬ ‫‌‬ ‫در ‌این ‌نوع ‌‬
‫بیاوریم‪‌.‬برای ‌مثال‪‌ ،‬به‌الگوریتم‌می‌گوییم‪‌،‬لطفاً ‌این ‌‪‌ 2111‬نفر ‌را ‌به ‌‪‌ 5‬گروه ‌تقسیم ‌کن‪‌.‬یا‌‬
‫لهی ‌روشی‌‬‫بندیها‌به ‌وسی ‌‬
‫گروه ‌‬ ‫قسمتبندی ‌کن‪‌.‬این ‌ ‌‬ ‫‌‬ ‫لطفاً ‌این ‌صفحات ‌وب ‌را ‌به ‌‪‌ 25‬گروه ‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪392‬‬

‫نها‌‬
‫دربارهی ‌ای ‌‬ ‫خوشهبندی ‌‪‌ k-means‬انجام ‌م ‌‬
‫یشوند ‌و ‌کمی ‌جلوتر ‌در ‌همین ‌فصل ‌ ‌‬ ‫‌‬ ‫به ‌نام ‌‬
‫صحبت‌خواهیم‌کرد‪.‬‬
‫‌‬

‫سلسلهمراتبی‌(‪)Hierarchical‬‬
‫‌‬ ‫خوشهبندی‌‬
‫‌‬
‫یخواهیم ‌به ‌چه ‌تعداد ‌خوشه ‌یا ‌گروه ‌برسیم‪‌.‬به‌‬ ‫در‌این‌روش‪‌ ،‬ما ‌مشخص ‌نمی‌کنیم ‌که ‌م ‌‬
‫نمونهها‌را‌یک‌خوشه‌در‌نظر‌‬ ‫یکند‌که‌هر‌کدام‌از‌ ‌‬ ‫جای‌آن‪‌،‬الگوریتم‪‌،‬به‌این‌صورت‌شروع‌م ‌‬
‫خوشهای ‌را ‌که ‌بیشتر ‌از ‌همه ‌شبیه ‌به ‌هم ‌هستند‪‌،‬‬
‫‌‬ ‫یگیرد‪‌.‬در ‌هر ‌بار ‌تکرارِ ‌الگوریتم‪‌ ،‬دو ‌‬
‫م‌‬
‫یکند‪‌.‬این‌کار‌را‌تا‌موقعی‌تکرار‌می‌کند‌که‌فقط‌یک‌خوشه‌باقی‌بماند‪‌.‬به‌این‌روش‌‬ ‫یکی‌م ‌‬
‫یگویند ‌که ‌کامالً ‌اسم ‌بامسمایی ‌است‪‌.‬با ‌اجرای ‌این ‌الگوریتم‪‌،‬‬ ‫سلسلهمراتبی ‌م ‌‬
‫‌‬ ‫خوشهبندی ‌‬
‫‌‬
‫یرسیم‌که‌شامل‌دو‌زیر‌خوشه‌(‪‌)sub-cluster‬هست‪‌.‬هر‌کدام‌از‌‬ ‫در‌نهایت‌به‌یک‌خوشه‌م ‌‬
‫نطور‌تا‌آخر‪.‬‬‫یشود‌و‌همی ‌‬ ‫نوبهی‌خود‪‌،‬به‌‪‌1‬زیر‌زیر‌خوشه‌تقسیم‌م ‌‬ ‫این‌دو‌زیر‌خوشه‌به‌ ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌391‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫خوشهی ‌نزدیک ‌به ‌هم ‌را ‌یکی ‌می‌کنیم‪‌.‬برای‌‬
‫‌‬ ‫دوباره ‌با ‌هم ‌مرور ‌کنیم‪‌.‬در ‌هر ‌بار ‌تکرار‪‌ ،‬دو ‌‬
‫خوشهها»‪‌ ،‬بایستی ‌از ‌یک ‌فرمولِ ‌فاصله ‌استفاده ‌کنیم‪‌.‬ولی ‌ما‌‬
‫‌‬ ‫کترین ‌‬‫مشخص ‌کردنِ ‌«نزدی ‌‬
‫فاصلهی ‌بین ‌دو ‌خوشه ‌را ‌نسبت ‌به ‌هم ‌مقایسه‌‬
‫یتوانیم ‌ ‌‬ ‫روشهایی ‌داریم ‌که ‌توسط ‌آن ‌م ‌‬ ‫‌‬
‫یشود‪‌.‬سه‌‬ ‫خوشهبندیِ‌مختلف‌م ‌‬
‫‌‬ ‫روشهای‌‬
‫این‌روشهای‌مقایسه‪‌،‬منتج‌به‌ ‌‬ ‫‌‬ ‫کنیم‪‌.‬هر‌کدام‌از‌‬
‫خوشهی ‌‪‌ B‌ ،A‬و ‌‪‌ C‬را ‌فرض ‌کنید ‌که ‌هر ‌کدام ‌دو ‌لضو ‌(دو ‌نمونه)‌دارند‪‌ .‬کدام ‌دو ‌جفت‌‬ ‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪393‬‬

‫خوشهی ‌‪‌ A‬با ‌‪‌ ،B‬یا‌‬


‫‌‬ ‫مرحلهی ‌بعد ‌بایستی ‌با ‌یکدیگر ‌متصل ‌کرده ‌و ‌یکی ‌کنیم؟ ‌‬
‫‌‬ ‫خوشه ‌را ‌در ‌‬
‫خوشهی‌‪‌C‬با‌‌‪B‬؟‬‫‌‬
‫‌‬

‫خوشهبندی‌‪Single-linkage‬‬
‫‌‬
‫یکنیم‪:‬‬‫فاصلهی‌میان‌دو‌خوشه‌را‌به‌صورت‌زیر‌تفسیر‌م ‌‬ ‫در‌روش‌‪‌single-linkage‬ما‌ ‌‬
‫خوشهی‌دیگر‪.‬‬
‫‌‬ ‫خوشهها‌به‌هر‌لضو‌دیگری‌از‌‬
‫‌‬ ‫کترین‌فاصله‌بین‌هر‌لضوی‌از‌یکی‌از‌‬ ‫نزدی ‌‬
‫فاصلهی‌بین‌‪‌A1‬و‌‬
‫خوشهی‌‪(‌B‬در‌تصویر‌باال)‌برابر‌ ‌‬‫‌‬ ‫خوشهی‌‪‌A‬و‌‬
‫‌‬ ‫فاصلهی‌بین‌‬
‫با‌این‌تعریف‪‌ ‌،‬‬
‫فاصلهی ‌دیگر ‌بین ‌الضای ‌این ‌دو ‌خوشه‌‬
‫کتر ‌از ‌هر ‌جف ‌ ‌‬ ‫یشود‪‌ ،‬زیرا ‌این ‌فاصله ‌نزدی ‌‬‫‪‌ B1‬م ‌‬
‫فاصلهی ‌‪‌ A2‬و‌‬
‫فاصلههای ‌‪‌ A1‬و ‌‪‌ ،B2‬فاصله‌ی ‌‪‌ A2‬و ‌‪‌ B1‬و ‌ ‌‬
‫است‪‌.‬یعنی ‌این ‌فاصله ‌نسبت ‌به ‌ ‌‬
‫خوشهی ‌‪‌B‬‬
‫‌‬ ‫خوشهی ‌‪‌ A‬به ‌‬
‫‌‬ ‫خوشهبندی ‌‪‌ ،single-linkage‬‬‫‌‬ ‫‪‌ B2‬کمتر ‌است‪‌ .‬با ‌استفاده ‌از ‌‬
‫خوشههای‌‪‌A‬و‌‪‌B‬را‌با‌هم‌ترکیب‌کرده‌‬ ‫‌‬ ‫خوشهی‌‪‌.C‬پس‌در‌یک‌مرحله‪‌،‬ما‌‬ ‫‌‬ ‫کتر‌است‌تا‌‬‫نزدی ‌‬
‫و‌به‌یک‌خوشه‌تبدیل‌می‌کنیم‪.‬‬
‫‌‬

‫خوشهبندی‌‪Complete-linkage‬‬
‫‌‬

‫فاصلهی‌میان‌دو‌خوشه‌را‌به‌صورت‌زیر‌تفسیر‌می‌کنیم‪:‬‬ ‫در‌روش‌‪‌complete-linkage‬ما‌ ‌‬
‫خوشهی‌دیگر‪.‬‬
‫‌‬ ‫خوشهها‌به‌هر‌لضو‌دیگری‌از‌‬
‫‌‬ ‫دورترین‌فاصله‌بین‌هر‌لضوی‌از‌یکی‌از‌‬
‫فاصلهی ‌بین ‌‪‌ A2‬و ‌‪‌ B2‬است‪‌.‬در ‌واقع‌‬
‫خوشهی ‌‪‌ ‌ ،B‬‬
‫‌‬ ‫خوشهی ‌‪‌ A‬و ‌‬
‫‌‬ ‫فاصلهی ‌بین ‌‬
‫با ‌این ‌تعریف‪‌ ‌ ،‬‬
‫کتر‌است‌‬ ‫خوشهی‌‪‌B‬نزدی ‌‬
‫‌‬ ‫خوشهی‌‪‌C‬به‌‬
‫‌‬ ‫خوشهبندیِ‌‪‌،complete-linkage‬در‌شکل‌باال‪‌،‬‬ ‫‌‬ ‫در‌‬
‫خوشهی‌‪‌B‬و‌‪‌C‬را‌با‌هم‌ترکیب‌می‌کنیم‪.‬‬
‫‌‬ ‫خوشهی‌‪‌.B‬پس‌در‌یک‌مرحله‪‌،‬‬ ‫‌‬ ‫خوشهی‌‪‌A‬به‌‬
‫‌‬ ‫تا‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌394‬‬
‫دادهکاوی‌برای‌ ‌‬

‫خوشهبندی‌‪Average-linkage‬‬
‫‌‬
‫یکنیم‪:‬‬ ‫فاصلهی‌میان‌دو‌خوشه‌را‌به‌صورت‌زیر‌تفسیر‌م ‌‬ ‫در‌روش‌‪‌،average-linkage‬ما‌ ‌‬
‫خوشهی‌دیگر‪.‬‬
‫‌‬ ‫خوشهها‪‌،‬به‌هر‌لضو‌از‌‬
‫‌‬ ‫فاصلهی‌بین‌هر‌لضوی‌از‌یکی‌از‌‬
‫میانگین‌ ‌‬
‫خوشههای ‌‪‌ C‬و ‌‪‌ B‬کمتر ‌از ‌‪‌ A‬و ‌‪‌B‬‬
‫‌‬ ‫فاصلهی ‌‬
‫یرسد ‌به ‌صورت ‌میانگین‪‌ ‌ ،‬‬‫در ‌شکل ‌باال ‌به ‌نظر ‌م ‌‬
‫یکنیم‪.‬‬‫خوشههای‌‪‌C‬و‌‪‌B‬را‌با‌هم‌ترکیب‌م ‌‬
‫‌‬ ‫است‪‌.‬پس‌در‌یک‌مرحله‪‌،‬‬

‫خوشهبندی‌کنیم!‬
‫‌‬ ‫سگها‌را‌بر‌اساس‌قد‌و‌وزنشان‌‬
‫فکر‌خوبیه!‌بیایید‌نژاد‌ ‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪395‬‬

‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌399‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫کترند ‌با ‌رنگ ‌قرمز ‌مشخص‌‬‫فاصلههایی ‌که ‌به ‌هم ‌نزدی ‌‬
‫فاصلههای ‌اقلیدسی ‌(چند ‌لدد ‌از ‌ ‌‬
‫‌‬
‫ستونها‌به‌‬
‫ی‌نژادهای‌مختلف‌سگها‌هستند‌که‌ ‌‬
‫‌‬ ‫ها‌نشان ‌‬
‫دهده‬‫‌‬ ‫‌‬
‫ستون‬ ‫شدهاند) ‌– ‌سطرها‌و‌‬
‫‌‬
‫صورت‌مخفف‌نمایش‌داده‌شده‌اند‪‌،‬مثالً‌‪‌BT‬به‌معنای‌‪‌Boston Terrier‬است‪:‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪397‬‬

‫‌‬

‫‌‬
‫(در‌این‌شکل‪‌،‬هر‌کدام‌از‌نژاد‌سگها‌در‌دو‌بُعد‌با‌توجه‌به‌مقادیرِ‌نرمال‌شده‪‌،‬قرار‌‬
‫‌‬
‫گیرند‪‌.‬محور‌افقی‌نمایندهی‌«قد»‌و‌محور‌لمودی‌نماینده‌ی‌«وزن»‌است)‌ ‌‬
‫‌‬ ‫‌‬
‫می‬
‫‌‬
‫اگر ‌گفته ‌باشید ‌‪‌ Border Collie‬و ‌‪‌ Portuguese Water Dog‬به ‌هم ‌نزدیک‌تر ‌هستند‪‌،‬‬
‫گفتهاید!‬
‫درست‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌391‬‬
‫دادهکاوی‌برای‌ ‌‬

‫الگوریتم‬
‫مرحلهی‌‪.2‬‬
‫‌‬
‫کتر‌‬
‫خوشهی‌خودشان‌هستند‪‌.‬ما‌دو‌خوشه‌را‌که‌به‌هم‌نزدی ‌‬ ‫‌‬ ‫در‌ابتدا‪‌،‬هر‌کدام‌از‌نژادها‌در‌‬
‫صفحهی ‌قبل‪‌،‬‬
‫‌‬ ‫آنها ‌را ‌به ‌یک ‌خوشه ‌تبدیل ‌می‌کنیم‪‌ .‬در ‌جدولِ ‌‬
‫هستند‪‌ ،‬پیدا ‌کرده ‌و ‌ ‌‬
‫کترند ‌‪‌ Border Collie‬و ‌ ‪Portuguese‬‬ ‫خوشهای ‌که ‌به ‌هم ‌نزدی ‌‬
‫‌‬ ‫یکنیم ‌دو ‌‬‫مشاهده ‌م ‌‬
‫‪(‌Water Dog‬با‌فاصله‌ی‌‪‌)1.131‬هستند‪‌،‬پس‌ ‌‬
‫آنها‌را‌با‌هم‌ترکیب‌می‌کنیم‪.‬‬
‫‌‬

‫‌‬
‫مرحلهی‌‪.1‬‬
‫‌‬
‫کتر‌باشند‌را‌مشخص‌کرده‌و‌با‌هم‌ترکیب‌می‌کنیم‪‌.‬‬ ‫خوشهای ‌که‌به‌هم‌نزدی ‌‬
‫‌‬ ‫دو‌مرتبه‪‌ ،‬دو‌‬
‫یکنیم ‌که ‌این ‌دو ‌خوشه ‌‪‌ Chihuahua‬و ‌‪(‌ Yorkshire Terrier‬با‌‬
‫در ‌جدول ‌باال‪‌ ،‬مشاهده ‌م ‌‬
‫فاصله‌ی‌‪‌)1.391‬هستند‪‌.‬پس‌این‌دو‌را‌با‌هم‌ترکیب‌می‌کنیم‪.‬‬
‫‌‬

‫‌‬
‫مرحلهی‌‪.3‬‬
‫‌‬
‫فرآیند ‌را ‌دوباره ‌تکرار ‌می‌کنیم‪‌ .‬این ‌بار ‌نوبت ‌ترکیبِ ‌‪‌ German Shepherd‬و ‌ ‪Golden‬‬
‫‪‌Retriever‬است‪.‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪396‬‬

‫مرحلهی‌‪.4‬‬
‫‌‬
‫کترین ‌جفت ‌به‌‬ ‫یکنیم‪‌.‬از ‌جدول ‌مشاهده ‌می‌کنیم ‌که ‌نزدی ‌‬‫دوباره ‌همان ‌فرآیند ‌را ‌تکرار ‌م ‌‬
‫یکدیگر ‌‪‌ Border Collie‬و ‌‪‌ Brittany Spaniel‬هستند‪‌.‬ولی ‌‪‌ Border Collie‬در ‌حال ‌حاضر‌‬
‫مرحلهی ‌‪‌ 2‬آن ‌دو ‌را ‌در ‌یک‌‬
‫‌‬ ‫در ‌یک ‌خوشه ‌با ‌‪‌ Portuguese Water Dog‬قرار ‌دارد ‌(در ‌‬
‫خوشه‌قرار‌دادیم)‪‌.‬پس‌در‌این‌مرحله‌این‌خوشه‌را‌با‌‪‌Brittany Spaniel‬ترکیب‌می‌کنیم‪.‬‬
‫‌‬

‫‌‬
‫یدهیم‪:‬‬
‫و‌ادامه‌م ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌371‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫این ‌نوع ‌دیاگرام‌ها‪‌ ،‬به ‌دِندروگرام ‌(‪‌ )dendrogram‬معروف ‌هستند‪‌ .‬در ‌واقع ‌یک ‌دیاگرامِ‌‬
‫درختی‌است‌که‌خوشهها‌را‌نشان‌می‌دهد‪‌ .‬‬
‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‬
‫سگها‌به‌اتمام‌برسانید!‬
‫نژادهای‌ ‌‬
‫دادههای‌ ‌‬
‫خوشهبندی‌را‌برای‌ ‌‬
‫‌‬
‫سگها ‌در ‌لینک ‌زیر‌‬
‫شدهای ‌از ‌فاصله ‌بین ‌نژاد ‌ ‌‬
‫برای ‌حل ‌این ‌مسئله‪‌ ،‬یک ‌لیست ‌مرتب ‌ ‌‬
‫موجود‌است‪:‬‬
‫‪https://raw.githubusercontent.com/zacharski/pg2dm-‬‬
‫‪python/0684ec677a1a1baaecb47bc0f8f21ec121e83339/data/ch8/dogDi‬‬
‫‪stanceSorted.txt‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪372‬‬

‫‌‬

‫‌‬

‫‌‬
‫‌‬
‫مدادتان‌را‌تیز‌کنید‌–‌راه‌حل‬
‫برنامهنویسان‬ ‌ ■‌371
‌ ‌‫دادهکاوی‌برای‬

‌‫‌یک‌لیست‌مرتب‌شده‌ای‌از‌فاصله‌بین‌نژاد‌سگ‌ها‌در‌لینیک‌‌زیی‌ر‬،‫برای‌حل‌این‌مسئله‬
:‫موجود‌است‬
https://raw.githubusercontent.com/zacharski/pg2dm-
python/0684ec677a1a1baaecb47bc0f8f21ec121e83339/data/ch8/dogDi
stanceSorted.txt



‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪373‬‬

‫سلسلهمراتبی ‌‬
‫‌‬ ‫خوشهبندی‌‬
‫‌‬ ‫کُد‌پایتون‌برای‌یک‌الگوریتم‌‬

‫‌‬

‫‌‬
‫‪.‬‬
‫یشوند‪‌،‬یک ‌صفت‌به‌نام‌«اولویت»‌‬ ‫تمهایی‌که‌به‌صف‌وارد‌م ‌‬
‫در ‌صف‌اولویت‪‌،‬هر ‌کدام‌از‌آی ‌‬
‫یشوند‪‌.‬‬
‫یکند‪‌ ،‬از ‌صف ‌خوانده ‌م ‌‬
‫تمها ‌به ‌ترتیبی ‌که ‌ویژگیِ ‌اولویت ‌مشخص ‌م ‌‬
‫دارند ‌و ‌آی ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌374‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یشوند‪‌.‬در‌مثال‌ما‪‌،‬مثالً‌شخصی‌‬‫تمهایی ‌که‌اولویت‌بیشتری ‌داشته‌باشند‪‌،‬زودتر‌خارج‌م ‌‬


‫آی ‌‬
‫چون‌اولویت‌را‌سن‌افراد‌گذاشتهایم‪.‬‬
‫‌‬ ‫یشود‪‌.‬‬
‫جوانتر‌باشد‪‌،‬زودتر‌خارج‌م ‌‬
‫که‌ ‌‬
‫یکنیم!‬‫دادهها‌را‌به‌همان‌ترتیب‌قبل‌وارد‌صف‌م ‌‬
‫در‌شکل‌زیر‌ ‌‬
‫‌‬

‫‌‬
‫‌‬
‫یشود‪‌ Yui‌ ،‬خواهد ‌بود ‌به ‌خاطر ‌این‌که ‌او‌‬
‫نبار ‌اولین ‌آیتمی ‌که ‌از ‌صف ‌خارج ‌م ‌‬
‫ولی ‌ای ‌‬
‫جوانترین‌فرد‌است‪‌،‬پس‌اولویت‌بیشتری‌دارد‪.‬‬ ‫‌‬
‫‌‬

‫‌‬

‫یکند‪:‬‬
‫حاال‌ببینیم‌که‌این‌صف‌به‌چه‌صورتی‌در‌پایتون‌کار‌م ‌‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪375‬‬

‫خوشهها‌را‌در‌یک‌‬
‫‌‬ ‫خوشهبندی‌سلسله‌مراتبی‌را‌انجام ‌دهیم‪‌،‬‬‫‌‬ ‫یخواهیم ‌‬‫برای‌این‌مثال‌که‌م ‌‬
‫کترین‌همسایه‌از‌یک‌‬ ‫کوتاهترین‌فاصله‌به‌نزدی ‌‬
‫نجا‌اولویت‪‌ ‌،‬‬ ‫یدهیم‪‌.‬در‌ای ‌‬ ‫صف‌اولویت‌قرار‌م ‌‬
‫سگها‪‌ ،‬ما ‌نژاد ‌‪‌ Border Collie‬را ‌طوری‌‬
‫مسئلهی ‌نژادِ ‌ ‌‬
‫‌‬ ‫خوشه ‌خواهد ‌بود‪‌.‬برای ‌مثال‪‌ ،‬برای ‌‬
‫کترین ‌همسایه ‌به ‌آن ‌یعنی ‌‪‌ Portuguese Water Dog‬در‌‬ ‫یدهیم ‌که ‌نزدی ‌‬ ‫در ‌صف ‌قرار ‌م ‌‬
‫یهای ‌دیگرِ ‌مشابه ‌را ‌هم‪‌ ،‬به ‌همین ‌شکل‪‌ ،‬برای ‌بقی‌هی‌‬
‫فاصله‌ی ‌‪‌ 1.131‬قرار ‌بگیرد‪‌ .‬ورود ‌‬
‫نژادها‌در‌صف‌قرار‌می‌دهیم‪‌ :‬‬‫‌‬

‫صف‌اولویت‬
‫‪‌=‌cluster‬خوشه‬
‫‪‌=‌neighbor‬همسایه‬
‫‪‌=‌distance‬فاصله‬
‫‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌379‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫زوجهای‌‬
‫یکنیم‪‌ ،‬تا ‌مطمئن ‌شویم ‌که ‌ ‌‬ ‫کترین ‌فاصله ‌را ‌انتخاب ‌م ‌‬ ‫ما ‌دو ‌ورودی ‌با ‌نزدی ‌‬
‫کردهایم‪‌ .‬در ‌این ‌مثال‪‌ ،‬ما ‌دو ‌نژاد ‌‪‌ Border Collie‬و ‌ ‪Portuguese‬‬
‫متناسبی ‌را ‌انتخاب ‌ ‌‬
‫‪‌ Water Dog‬را ‌انتخاب ‌می‌کنیم ‌و ‌این ‌دو ‌خوشه ‌را ‌به ‌یک ‌خوشه ‌ترکیب ‌م ‌‬
‫یکنیم‪‌.‬در ‌این‌‬
‫مورد‪‌ ،‬یک ‌خوشه ‌با ‌نام ‌‪‌ Border Collie – Poruguese Water Dog‬خواهیم ‌ساخت ‌و ‌این‌‬
‫یدهیم‪:‬‬‫خوشه‌را‌در‌صف‌قرار‌م ‌‬
‫‌‬
‫صف‌اولویت‬
‫‪‌=‌cluster‬خوشه‬
‫‪‌=‌neighbor‬همسایه‬
‫‪‌=‌distance‬فاصله‬
‫‌‬

‫‌‬
‫‌‬
‫‌‬
‫یهایی ‌که ‌در ‌صف‌‬ ‫نکار ‌را ‌تا ‌وقتی ‌انجام ‌می‌دهیم ‌که ‌فقط ‌یک ‌خوشه ‌باقی ‌بماند‪‌.‬ورود ‌‬
‫و ‌ ای ‌‬
‫قتر ‌به ‌این ‌مثال‌‬
‫دهتر ‌از ‌این ‌باشند‪‌.‬پس ‌بیایید ‌کمی ‌دقی ‌‬
‫یدهیم‪‌ ،‬بایستی‌کمی ‌پیچی ‌‬ ‫قرار ‌م ‌‬
‫نگاه‌کنیم‪.‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪377‬‬

‫دادهها‌از‌فایل‬
‫خواندن‌ ‌‬
‫دادهها ‌در ‌فایل ‌‪(‌ CSV‬مقادیر ‌جداشده ‌شده ‌با ‌کاما)‌هستند ‌که ‌ستون ‌اول‪‌ ،‬نام ‌آن ‌ ‌‬
‫نمونهی‌‬ ‫‌‬
‫یهای ‌(‪‌)attributes‬دیگر ‌هستند‪‌.‬اولین ‌خط ‌از‌‬ ‫ستونها‪‌ ،‬ویژگ ‌‬
‫‌‬ ‫خاص ‌(نژاد ‌سگ)‌و ‌بقی‌هی ‌‬
‫یدهد‪:‬‬ ‫این‌فایل‌هم‪‌،‬سرآیند‌(‪‌)header‬است‌که‌ویژگ ‌‬
‫یها‌را‌توضیح‌م ‌‬
‫‌‬

‫‌‬

‫یشوند‪‌.‬این ‌متغیر ‌‪‌،data‬‬ ‫دادههای ‌این ‌فایل ‌در ‌لیستی ‌به ‌اسم ‌‪‌ ،data‬در ‌برنامه ‌ذخیره ‌م ‌‬‫‌‬
‫یکند‪‌.‬پس‪‌data[0]‌،‬لیستی‌است‌که‌نام‌نژادها‌را‌در‌‬ ‫اطاللات‌را‌به‌صورت‌ستونی‌ذخیره‌م ‌‬
‫رشتهی ‌«‪‌ »Border Collie‬است ‌و ‌یا ‌]‪‌data[0][1‬‬ ‫خود ‌دارد ‌(برای ‌مثال ‌]‪‌ ‌ data[0][0‬‬
‫رشتهی ‌«‪‌ »Boston Terrier‬هست)‪‌ .‬همچنین ‌]‪‌ data[1‬لیستی ‌است ‌که ‌شامل ‌قدها‌‬ ‫‌‬
‫آنهایی‌‬ ‫وزنهاست ‌(‪‌.)weights‬تمامیِ ‌ ‌‬
‫دادهها‪‌ ،‬به ‌جز ‌ ‌‬ ‫یشود ‌و ‌]‪‌ data[2‬برای ‌ ‌‬ ‫(‪‌)heights‬م ‌‬
‫یشوند‪‌ .‬برای ‌مثال‪‌ data[1][0]‌ ،‬یک‌‬ ‫که ‌در ‌ستون ‌اول ‌باشند‪‌ ،‬به ‌‪(‌ float‬الشار) ‌تبدیل ‌م ‌‬
‫مقدار ‌لددیِ ‌الشاری ‌برابر ‌‪‌ 11.1‬است ‌و ‌یا ‌]‪‌ data[2][0‬یک ‌مقدار ‌لددیِ ‌الشاری ‌برابر‌‬
‫دادهها ‌خوانده ‌شدند‪‌ ،‬نرمال‌سازی ‌انجام ‌می‌شود‪‌ .‬در ‌توضیح‌‬ ‫‪‌ 45.1‬است‪‌ .‬هنگامی ‌که ‌ ‌‬
‫شمارهی ‌سطر ‌برای ‌هر ‌کدام‌‬
‫‌‬ ‫الگوریتم‪‌ ،‬از ‌لبارت ‌‪(‌ index‬به ‌معنای ‌شاخص)‌جهتِ‌اشاره ‌به ‌‬
‫شمارهی‌‬
‫‌‬ ‫نمونهها ‌استفاده ‌خواهم ‌کرد‪‌.‬برای ‌مثال‪‌ Border Collie‌ ،‬در ‌شاخصِ ‌(‪‌)index‬‬ ‫از ‌ ‌‬
‫شمارهی ‌یک ‌و ‌یا ‌ ‪Yorkshine‬‬‫‌‬ ‫صفر ‌قرار ‌دارد ‌و ‌‪‌ Boston Terrier‬در ‌شاخص ‌(‪‌ )index‬‬
‫شمارهی‌‪.21‬‬
‫‌‬ ‫‪‌Terrier‬در‌شاخص‌(‪‌)index‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌371‬‬
‫دادهکاوی‌برای‌ ‌‬

‫ایجاد‌صف‌اولویت‌اولیه‬
‫یدهیم‪‌ .‬فرض ‌کنید ‌ورودیِ‌‬ ‫برای ‌شروع ‌الگوریتم‪‌ ،‬هر ‌کدام ‌از ‌نژادها ‌را ‌در ‌صف ‌قرار ‌م ‌‬
‫فاصلهی‌‪‌Border Collie‬را‌با‌تمامیِ‌‬
‫یخواهیم‌در‌صف‌قرار‌دهیم‪‌.‬ابتدا‪‌ ‌،‬‬ ‫‪‌Border Collie‬را‌م ‌‬
‫نژادهای‌دیگر‌به‌دست‌آورده‌و‌این‌اطاللات‌را‌در‌یک‌دیکشنریِ‌پایتونی‌ذخیره‌می‌کنیم‪.‬‬
‫‌‬

‫‌‬
‫کترین ‌همسای‌هی ‌‪‌ Border Bollie‬جمع ‌می‌کنیم ‌و ‌م ‌‬
‫یدانیم‌‬ ‫همچنین ‌حواسمان ‌را ‌به ‌نزدی ‌‬
‫به‌دست‌میآید‪:‬‬
‫‌‬ ‫کترین‌همسای‌هی‌آن‌به‌صورت‌زیر‌‬ ‫فاصلهی‌نزدی ‌‬
‫که‌ ‌‬
‫‌‬

‫‌‬
‫(نزدیک‌همسایه‌به‌‪‌Border Collie‬یعنی‌‪‌،index 0‬نژاد‌‪‌Portuguese Water Dog‬یعنی‌‬
‫‪‌index 8‬است‌و‌بالعکس) ‌‬
‫‌‬

‫دادهها‌چه‌کار‌کنیم؟‬
‫نکه‌با‌این‌ ‌‬
‫مسافتهای‌یکسان‌و‌ای ‌‬
‫‌‬ ‫مشکل‌‬

‫فاصلهی ‌بین ‌‪‌Portuguese Water Dog‬‬ ‫ممکن ‌است ‌متوجه ‌شده ‌باشید ‌که ‌در ‌جدولِ ‌باال‪‌ ‌ ،‬‬
‫و‌‪‌Standard Poodle‬و‌فاصله‌ی‌بین ‌‪‌Boston Terrier‬و‌‪‌Brittany Spaniel‬با‌هم‌مساوی‌‬
‫تمها‌را‌از‌صف‌اولویت‌بر‌اساس‌فاصله‌واکشی‌کنیم‪‌،‬احتمال‌‬ ‫و‌برابر‌‪‌1.599‬هستند‪‌.‬اگر‌ما‌آی ‌‬
‫دارد ‌‪‌ Standard Poodle‬و ‌‪‌ Boston Terrier‬را ‌انتخاب ‌کرده ‌و ‌ ‌‬
‫آنها ‌را ‌در ‌یک ‌خوشه ‌قرار‌‬
‫یشود‪‌ .‬برای ‌جلوگیری ‌از ‌این ‌خطا‪‌ ،‬ما ‌از ‌یک‌‬ ‫دهیم‪‌ ،‬که ‌در ‌واقع ‌به ‌یک ‌اشتباه ‌ختم ‌م ‌‬
‫دادههای‌مجموله)‌‬‫چندتایی‌(‪‌)tuple‬استفاده‌خواهیم‌کرد‌که‌شامل‌یک‌شاخص‌(بر‌اساس‌ ‌‬
‫ی‌بین‌آنها‌باشد‪‌.‬برای ‌مثال ‌ ‪Portuguese‬‬
‫‌‬ ‫از‌دو ‌نژاد ‌باشد ‌به ‌نحوی ‌که ‌نمایان‌گر ‌فاصل‌ه‬
‫شمارهی ‌‪‌ 1‬را ‌در ‌مجموله ‌دارد ‌(‪‌ )index 8‬و ‌‪‌Standard Poodle‬‬ ‫‌‬ ‫‪‌ Water Dog‬شاخصِ ‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪376‬‬

‫شمارهی ‌‪‌ 6‬را‪‌ ،‬پس ‌این ‌چند ‌تایی ‌به ‌صورت ‌)‪‌ (8, 9‬خواهد ‌شد ‌و ‌این ‌چندتایی ‌به‌‬
‫‌‬ ‫شاخصِ‌‬
‫کترین‌همسایه‌برای ‌‪‌Poodle‬به‌صورت‌‬ ‫میشود‪‌.‬پس‌نزدی ‌‬ ‫کترین‌همسایه‌داده‌ ‌‬ ‫لیستِ‌نزدی ‌‬
‫زیر‌خواهد‌شد‪:‬‬
‫‌‬

‫‌‬
‫کترین‌همسایه‌برای‌‪‌Portuguese Water Dog‬نیز‌به‌این‌صورت‌است‪:‬‬
‫و‌نزدی ‌‬
‫‌‬

‫‌‬
‫یکنیم‪‌،‬‬ ‫با ‌استفاده ‌از ‌این ‌چندتایی ‌(‪‌ ،)tuple‬هنگامی ‌که ‌ما ‌آی ‌‬
‫تمها ‌را ‌از ‌صف ‌واکشی ‌م ‌‬
‫زوجهای‌درستی‌هستند‌یا‌خیر‪‌.‬‬ ‫آنها‌ ‌‬
‫یتوانیم‌ببینم‌که‌آیا‌ ‌‬‫م‌‬
‫‌‬

‫فاصلههای‌یکسان‬
‫نکتهی‌دیگر‌در‌مورد‌ ‌‬
‫یک‌ ‌‬
‫ییهایی‌شامل‌سن‌‬ ‫هنگامی‌که‌صف‌اولویت‌را‌در‌پایتون‌معرفی‌کردم‌(کدهای‌باالتر)‪‌،‬چندتا ‌‬
‫یها‪‌ ،‬بر ‌اساس ‌ویژگیِ ‌سن ‌(‪‌)age‬از‌‬
‫و ‌نام ‌بازیگران ‌ژاپنی ‌را ‌هم‌واردِ ‌صف ‌کردم‪‌.‬این ‌ورود ‌‬
‫یبودند‪‌،‬آن‌وقت‌‬‫یشدند‪‌.‬حاال‌فرض‌کنید‌دو‌ورودی‪‌،‬دارای‌سن‌های‌یکسان‌م ‌‬ ‫صف‌واکشی‌م ‌‬
‫یافتاد؟‬‫چه‌اتفاقی‌م ‌‬
‫فرض‌کنید‪:‬‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌311‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫یبینید‪‌ ،‬اگر ‌اولین ‌آیتم ‌در ‌چندتاییِ ‌مورد ‌نظر ‌ما‪‌ ،‬مثل ‌هم ‌باشند‪‌ ،‬پایتون ‌به‌‬
‫همانطور ‌که ‌م ‌‬
‫‌‬
‫یها‌‬‫تمها ‌‪‌ 25‬سال ‌داشته ‌باشند‪‌ ،‬ورود ‌‬ ‫یرفت‪‌.‬مثالً ‌هنگامی ‌که ‌تمامی ‌آی ‌‬ ‫سراغ ‌آیتم ‌بعدی ‌م ‌‬
‫نامها ‌همگی ‌رشته‌‬ ‫یشوند‪‌.‬و ‌چون ‌این ‌ ‌‬ ‫بر ‌اساس ‌آیتم ‌بعدی‪‌ ،‬یعنی ‌«نام ‌شخص» ‌واکشی ‌م ‌‬
‫میشوند‪‌.‬پس ‌مثالً‪‌ ،‬نامِ ‌‪‌Avaka Sasaki‬‬ ‫هستند‪‌ ،‬به ‌ترتیبِ ‌حروف ‌الفبا ‌پشت ‌سر ‌هم ‌چیده ‌ ‌‬
‫یشد ‌و ‌نامِ ‌‪‌ Moa‬هم ‌طبیعتاً ‌زودتر ‌از ‌‪‌ Suzuka‬واکشی‌‬ ‫زودتر ‌از ‌‪‌ Moa Kikuchi‬واکشی ‌م ‌‬
‫یشود‪.‬‬‫م‌‬
‫سگها‪‌،‬برای‌تعیین‌‬ ‫سلسلهمراتبی‌بود‪‌،‬از‌فاصله‌ی‌بین‌نژاد‌ ‌‬ ‫‌‬ ‫خوشهبندیِ‌‬
‫‌‬ ‫در‌مثال‌ما‌که‌همان‌‬
‫اولویت‌استفاده ‌کردیم‌و‌برای ‌حل‌مشکل‪‌،‬از‌لدد‌شاخص‌(‪‌)index‬استفاده‌می‌کنیم‪‌.‬اولین‌‬
‫شمارهی ‌‪‌ 2‬و‌‬
‫‌‬ ‫شمارهی ‌صفر ‌دارد‪‌ ،‬آیتم ‌بعدی‪‌ ،‬شاخص ‌‬ ‫‌‬ ‫آیتمی ‌که ‌در ‌صف ‌قرار ‌می‌دهیم‪‌ ،‬‬
‫یکنیم‪‌،‬به‌شکل‌زیر‌هستند‪:‬‬ ‫یهایی‌که‌به‌صف‌اضافه‌م ‌‬ ‫نطور‌تا‌آخر‪‌.‬ورود ‌‬ ‫همی ‌‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪312‬‬

‫‌‬
‫‌‬
‫یکنیم‪.‬‬‫نژادها‪‌،‬صفِ‌اولویت‌را‌مقداردهی‌اولیه‌م ‌‬
‫برای‌هر‌کدام‌از‌این‌ ‌‬
‫‌‬
‫همهی‌‬
‫یدهیم‌تا‌هنگامی‌که‌فقط‌یک‌خوشه‌داشته‌باشیم‪‌.‬یعنی‌ ‌‬ ‫آنقدر‌این‌کارها‌را‌انجام‌م ‌‬
‫خوشهها‌تجمیع‌شوند‪:‬‬
‫‌‬
‫خوشهی ‌ترکیب‌‬
‫‌‬ ‫یکنیم ‌و ‌آن ‌‬‫آنها ‌را ‌به ‌یک ‌خوشه ‌تبدیل ‌م ‌‬
‫ما ‌دو ‌آیتم ‌از ‌صف ‌می‌گیریم‪‌ ‌ ،‬‬
‫شده ‌را ‌در ‌صف ‌درج ‌می‌کنیم‪‌ .‬در ‌مثالِ ‌نژادهای ‌سگ‪‌ ،‬برای ‌مثال‪‌ ،‬دو ‌ورودیِ ‌ ‪Border‬‬
‫‪‌Collie‬و‌‪‌Portuguese Water Dog‬را‌واکشی‌کرده‌و‌آیتم‌زیر‌را‌تولید‌می‌کنیم‪‌ :‬‬
‫‌‬

‫‌‬
‫سگهای ‌دیگر ‌(که ‌هر ‌کدام ‌یک‌‬ ‫خوشهی ‌جدید ‌را ‌با ‌تمام ‌نژادهای ‌ ‌‬
‫‌‬ ‫بعد ‌از ‌آن‪‌ ،‬فاصله‌ی ‌این ‌‬
‫یکنیم ‌(البته ‌به ‌جز ‌خودشان)‪‌.‬ما ‌این ‌کار ‌را ‌با ‌ادغام ‌دیکشنریِ‌‬ ‫خوشه ‌هستند)‌محاسبه ‌م ‌‬
‫فاصلهها ‌را ‌برای‌‬
‫یدهیم‪(‌ .‬دیکشنریِ ‌ ‌‬ ‫خوشهی ‌اولیه ‌به ‌صورت ‌زیر ‌انجام ‌م ‌‬
‫‌‬ ‫فاصلهها‪‌ ،‬از ‌دو ‌‬
‫‌‬
‫نامگذاری ‌کنیم ‌و ‌دومی ‌را‌‬‫اولین ‌آیتمی ‌که ‌از ‌صف ‌می‌گیریم‪‌ ،‬به ‌صورت ‌‪‌ ‌ distanceDict1‬‬
‫یای‌که‌جدید‌ایجاد‌شده‌را‌هم‌‪‌newDistanceDict‬م ‌‬
‫ینامیم)‬ ‫‪‌distanceDict2‬و‌دیکشنر ‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌311‬‬
‫دادهکاوی‌برای‌ ‌‬

‫(لطفاً‌از‌روی‌کد‌پرش‌نکنید‪‌،‬سعی‌کنید‌یک‌بار‌کد‌را‌بخوانید‌و‌درك‌کنید‪‌.‬الزم‌نیست‌‬
‫خیلی‌به‌خودتان‌فشار‌بیاورید‪‌.‬فقط‌سعی‌کنید‌این‌کار‌را‌انجام‌دهید) ‌‬
‫‌‬

‫‌‬
‫‌‬
‫ورودیِ ‌کاملی ‌که ‌قرار ‌است ‌در ‌صف ‌وارد ‌شود ‌به ‌صورت ‌زیر ‌خواهد ‌بود ‌(این ‌ورودی ‌از‌‬
‫ترکیب‌نژادِ‌‪‌Border Collie‬و‌‪‌Portuguese Water Dog‬ساخته‌شده‌است)‪:‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪313‬‬

‫کد‌بزنید‬
‫ادهسازی‌کنید؟‬
‫یتوانید‌در‌پایتون‌پی ‌‬
‫آیا‌الگوریتم‌باال‌را‌م ‌‬
‫وبسایت ‌به ‌اسم‌‬ ‫برای ‌کمک ‌به ‌شما ‌در ‌مورد ‌این ‌سوال‪‌ ،‬فایل ‌پایتونی ‌در ‌ ‌‬
‫‪‌ hierarchicalClustererTemplate.py‬موجود ‌است ‌که ‌ ‌‬
‫نقطهی ‌شروع ‌را ‌به ‌شما ‌نشان‌‬
‫یدهد‪‌.‬برای‌این‌کار‌بایستی‪‌ :‬‬ ‫م‌‬

‫‪‌.2‬تابع‌‪‌init‬را‌بنویسید‬
‫دادهها‪:‬‬
‫برای‌هر‌کدام‌از‌ورودی‌در‌ ‌‬
‫یهای ‌دیگر‌محاسبه‌کرده‌و‌‬
‫فاصلهی‌اقلیدسی‌را‌بین‌آن‌ورودی‌و‌تمامی‌ورود ‌‬‫‌‌‌‌‪‌ ‌.2‬‬
‫یک‌دیکشنریِ‌پایتونی‌مانند‌چیزی‌که‌در‌باال‌توضیح‌داده‌شد‪‌،‬ایجاد‌کنید‬
‫کترین‌همسایه‌را‌پیدا‌کنید‬ ‫‌‌‌‌‪‌.1‬نزدی ‌‬
‫‌‌‌‌‪‌.3‬اطاللات‌این‌ورودی‌را‌در‌صف‌وارد‌کنید‬
‫خوشهبندی‌را‌بنویسید‪‌.‬این‌تابع‌باید‌به‌صورت‌متناوب‪:‬‬
‫‌‬ ‫‪‌.1‬تابع‌‬
‫‌‌‌‌‪‌.2‬دو‌ورودیِ‌اول‌را‌از‌صف‌دریافت‌کند‬
‫و‌یک‌خوشهی‌جدید‌بسازد‬
‫‌‬ ‫آنها‌را‌با‌هم‌ترکیب‌کند‌‬
‫‌‌‌‌‪‌ ‌.1‬‬
‫خوشهی‌جدید‌را‌در‌صف‌قرار‌دهد‬‫‌‬ ‫‌‌‌‌‪‌.3‬‬
‫تا‌وقتی‌که‌فقط‌یک‌خوشه‌در‌صف‌باقی‌بماند ‌‬

‫‌‬
‫برنامهنویسان‬ ‌ ■‌314
‌ ‌‫دادهکاوی‌برای‬



‫کد‌بزنید‌–‌راه‌حل‬
:‫یادتان‌باشد‌که‬
‌‫‌شاید ‌شما ‌بتوانید ‌بهتر ‌از ‌آن ‌را‬.‫راهحل ‌نیست‬
‌ ‌ ‫راهحل ‌من ‌است ‌و ‌لزوماً ‌بهترین‬
‌ ‌ ،‫راهحل‬
‌ ‌ ‫ای ن‬
!‫بنویسید‬

from queue import PriorityQueue


import math

"""
Example code for hierarchical clustering
"""

def getMedian(alist):
"""get median value of list alist"""
tmp = list(alist)
tmp.sort()
alen = len(tmp)
if (alen % 2) == 1:
return tmp[alen // 2]
else:
return (tmp[alen // 2] + tmp[(alen // 2) - 1]) /
2
315 ■‌‫‌خوشه‌بندی‬.1‌‫‌فصل‬

def normalizeColumn(column):
"""Normalize column using Modified Standard Score"""
median = getMedian(column)
asd = sum([abs(x - median) for x in column]) / len(c
olumn)
result = [(x - median) / asd for x in column]
return result

class hClusterer:
""" this clusterer assumes that the first column of
the data is a label
not used in the clustering. The other columns contai
n numeric data"""

def __init__(self, filename):


file = open(filename)
self.data = {}
self.counter = 0
self.queue = PriorityQueue()
lines = file.readlines()
file.close()
header = lines[0].split(',')
self.cols = len(header)
self.data = [[] for i in range(len(header))]
for line in lines[1:]:
cells = line.split(',')
toggle = 0
for cell in range(self.cols):
if toggle == 0:
self.data[cell].append(cells[cell])
toggle = 1
else:
self.data[cell].append(float(cells[c
ell]))
# now normalize number columns (that is, skip th
e first column)
for i in range(1, self.cols):
self.data[i] = normalizeColumn(self.data
[i])

###
### I have read in the data and normalized the
### columns. Now for each element i in the data
, I am going to
‫برنامهنویسان‬ ‌ ■‌319
‌ ‌‫دادهکاوی‌برای‬

### 1. compute the Euclidean Distance from e


lement i to all the
### other elements. This data will be pl
aced in neighbors,
### which is a Python dictionary. Let's s
ay i = 1, and I am
### computing the distance to the neighbo
r j and let's say j
### is 2. The neighbors dictionary for i
will look like
### {2: ((1,2), 1.23), 3: ((1, 3), 2.3).
.. }
###
### 2. find the closest neighbor
###
### 3. place the element on a priority queue
, called simply queue,
### based on the distance to the nearest
neighbor (and a counter
### used to break ties.

# now push distances on queue


rows = len(self.data[0])

for i in range(rows):
minDistance = 99999
nearestNeighbor = 0
neighbors = {}
for j in range(rows):
if i != j:
dist = self.distance(i, j)
if i < j:
pair = (i,j)
else:
pair = (j,i)
neighbors[j] = (pair, dist)
if dist < minDistance:
minDistance = dist
nearestNeighbor = j
nearestNum = j
# create nearest Pair
if i < nearestNeighbor:
nearestPair = (i, nearestNeighbor)
else:
317 ■‌‫‌خوشه‌بندی‬.1‌‫‌فصل‬

nearestPair = (nearestNeighbor, i)

# put instance on priority queue


self.queue.put((minDistance, self.counter,
[[self.data[0][i]], nearestP
air, neighbors]))
self.counter += 1

def distance(self, i, j):


sumSquares = 0
for k in range(1, self.cols):
sumSquares += (self.data[k][i] - self.data[k
][j])**2
return math.sqrt(sumSquares)

def cluster(self):
done = False
while not done:
topOne = self.queue.get()
nearestPair = topOne[2][1]
if not self.queue.empty():
nextOne = self.queue.get()
nearPair = nextOne[2][1]
tmp = []
##
## I have just popped two elements off
the queue,
## topOne and nextOne. I need to check
whether nextOne
## is topOne's nearest neighbor and vi
ce versa.
## If not, I will pop another element
off the queue
## until I find topOne's nearest neigh
bor. That is what
## this while loop does.
##

while nearPair != nearestPair:


tmp.append((nextOne[0], self.counte
r, nextOne[2]))
self.counter += 1
nextOne = self.queue.get()
nearPair = nextOne[2][1]
‫برنامهنویسان‬ ‌ ■‌311
‌ ‌‫دادهکاوی‌برای‬

##
## this for loop pushes the elements I
popped off in the
## above while loop.
##
for item in tmp:
self.queue.put(item)

if len(topOne[2][0]) == 1:
item1 = topOne[2][0][0]
else:
item1 = topOne[2][0]
if len(nextOne[2][0]) == 1:
item2 = nextOne[2][0][0]
else:
item2 = nextOne[2][0]
## curCluster is, perhaps obviously, t
he new cluster
## which combines cluster item1 with c
luster item2.
curCluster = (item1, item2)

## Now I am doing two things. First, fi


nding the nearest
## neighbor to this new cluster. Second
, building a new
## neighbors list by merging the neighb
ors lists of item1
## and item2. If the distance between i
tem1 and element 23
## is 2 and the distance betweeen item2
and element 23 is 4
## the distance between element 23 and
the new cluster will
## be 2 (i.e., the shortest distance).
##

minDistance = 99999
nearestPair = ()
nearestNeighbor = ''
merged = {}
nNeighbors = nextOne[2][2]
for (key, value) in topOne[2][2].items(
):
if key in nNeighbors:
316 ■‌‫‌خوشه‌بندی‬.1‌‫‌فصل‬

if nNeighbors[key][1] < value[1]


:
dist = nNeighbors[key]
else:
dist = value
if dist[1] < minDistance:
minDistance = dist[1]
nearestPair = dist[0]
nearestNeighbor = key
merged[key] = dist

if merged == {}:
return curCluster
else:
self.queue.put( (minDistance, self.c
ounter,
[curCluster, neares
tPair, merged]))
self.counter += 1

def printDendrogram(T, sep=3):


"""Print dendrogram of a binary tree. Each tree nod
e is represented by a
length-2 tuple. printDendrogram is written and provi
ded by David Eppstein
2002. Accessed on 14 April 2014:
http://code.activestate.com/recipes/139422-dendrogra
m-drawing/ """

def isPair(T):
return type(T) == tuple and len(T) == 2

def maxHeight(T):
if isPair(T):
h = max(maxHeight(T[0]), maxHeight(T[1]))
else:
h = len(str(T))
return h + sep

activeLevels = {}

def traverse(T, h, isFirst):


‫برنامهنویسان‬ ‌ ■‌361
‌ ‌‫دادهکاوی‌برای‬

if isPair(T):
traverse(T[0], h-sep, 1)
s = [' ']*(h-sep)
s.append('|')
else:
s = list(str(T))
s.append(' ')

while len(s) < h:


s.append('-')

if (isFirst >= 0):


s.append('+')
if isFirst:
activeLevels[h] = 1
else:
del activeLevels[h]

A = list(activeLevels)
A.sort()
for L in A:
if len(s) < L:
while len(s) < L:
s.append(' ')
s.append('|')

print (''.join(s))

if isPair(T):
traverse(T[1], h-sep, 0)

traverse(T, maxHeight(T), -1)

filename = '//Users/raz/Dropbox/guide/data/dogs.csv'

hg = hClusterer(filename)
cluster = hg.cluster()
printDendrogram(cluster)

:‫جهی‌زیر‌را‌می‌گیرم‬
‌ ‫‌نتی‬،‫یکنم‬
‌ ‫هنگامی‌که‌این‌کد‌را‌اجرا‌م‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪362‬‬

‫که‌با‌چیزی‌که‌به‌صورت‌دستی‌محاسبه‌کردیم‌مطابقت‌دارد‪.‬‬

‫حاال‌شما‌امتحان‌کنید!‬
‫غالت‌صبحانه‬
‫وبسایتِ‌این‌کتاب‌(‪‌guidetodatamining.com‬و‌‪‌)chistio.ir‬فایلی‌وجود‌دارد‌که‌‬ ‫در‌ ‌‬
‫صبحانهی‌غالت‌شامل‪:‬‬
‫‌‬ ‫شامل‌اطاللات‌غذایی‌حدود‌‪‌77‬‬
‫اسم‌غله‬
‫کالری‌هر‌بار‌مصرف‬
‫پروتوئین‌(به‌گرم)‬
‫چربی‌(به‌گرم)‬
‫یگرم)‬ ‫نمک‌(به‌میل ‌‬
‫فیبر‌(به‌گرم)‬
‫کربوهیدرات‌(به‌گرم)‬
‫قند‌(به‌گرم)‬
‫برنامهنویسان‬ ‫‪‌ ■‌361‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یگرم)‬‫پتاسیم‌(به‌میل ‌‬
‫نها‌(درصد‌از‌‪)RDA‬‬ ‫ویتامی ‌‬
‫دادهها‌انجام‌دهید؟‬
‫سلسلهمراتبی‌را‌بر‌روی‌این‌ ‌‬
‫‌‬ ‫خوشهبندی‌‬
‫‌‬ ‫یتوانید‪‌،‬‬
‫است‪‌.‬آیا‌م ‌‬
‫کدام‌یک‌از‌غالت‌بیشترین‌شباهت‌را‌به‌‪‌Trix‬دارد؟‬
‫کدامیک‌بیشترین‌شباهت‌را‌به‌‪‌Muesili Raisins & Almonds‬دارند؟ ‌‬ ‫‌‬
‫‌‬

‫‌‬

‫مجمولهی‌داده‪‌،‬در‌اصل‌متعلق‌به‌دانشگاه‌کارنی‌ملون‌(‪‌)Carnegie Mellon‬است‪.‬‬
‫‌‬
‫‪http://lib.stat.cmu.edu/DASL/Datafiles/Cereals.html‬‬

‫شما‌امتحان‌کنید‌–‌راه‌حل‬
‫مجمولهی ‌داده‪‌ ،‬فقط ‌بایستی ‌که ‌نام ‌فایل ‌را ‌از‌‬
‫‌‬ ‫خوشهبندی ‌بر ‌روی ‌این ‌‬
‫‌‬ ‫برای ‌اجرای ‌‬
‫یبینید‪:‬‬‫خالصهای‌از‌نتیجه‌را‌م ‌‬
‫‌‬ ‫‪‌dogs.csv‬به‌‪‌cereal.csv‬تغییر‌دهیم‪‌.‬در‌زیر‌‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪363‬‬

‫‌‬
‫مشاهده ‌می‌کنید ‌که ‌‪‌ Trix‬بیشتر ‌به ‌‪‌ Fruity Pebbles‬شباهت ‌دارد‪‌ .‬همچنین ‌به ‌طور‌‬
‫واضحی‌‪‌Muesli Raisins & Almonds‬به‌‪‌Muesli Peaches & Pecans‬شباهت‌دارند‪‌ .‬‬

‫‌‬

‫‌‬
‫خوشهبندی‌سلسله‌مراتبی!‌(که‌به‌نظر‌ساده‌بود)‬
‫‌‬ ‫این‌هم‌از‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌364‬‬
‫دادهکاوی‌برای‌ ‌‬

‫خوشهبندی‌‪K-means‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪365‬‬

‫پس‌الگوریتم‌‪‌k-means‬به‌صورت‌زیر‌کار‌م ‌‬
‫یکند‪:‬‬
‫تهای‌(‪‌)centroids‬‬
‫یکنیم‌که‌به‌لنوان‌مرکزی ‌‬ ‫‪‌.2‬تعداد‌‪‌ ‌k‬‬
‫نمونهی‌تصادفی‌را‌انتخاب‌م ‌‬
‫اولیه‌باشند‬
‫برنامهنویسان‬ ‫‪‌ ■‌369‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‪‌.1‬موارد‌‪‌3‬و‌‪‌4‬را‌تکرار‌می‌کنیم‪:‬‬
‫کترین ‌مرکزیت‪‌ ،‬متصل ‌(همرنگ)‌می‌کنیم‪‌.‬این ‌کار‌‬ ‫نمونهها ‌را ‌به ‌نزدی ‌‬
‫‪‌.3‬هر ‌کدام ‌از ‌ ‌‬
‫یشود‬ ‫بالثِ‌ایجادِ‌‪‌k‬خوشه‌م ‌‬
‫یدهیم ‌که ‌میانگین ‌آن‌‬
‫آنها ‌را ‌به ‌جایی ‌انتقال ‌م ‌‬
‫بههنگام ‌می‌کنیم ‌و ‌ ‌‬‫تها ‌را ‌ ‌‬
‫‪‌.4‬مرکزی ‌‬
‫خوشه‌باشد‬
‫تها‌تغییر‌زیادی‌نکنند‬ ‫‪‌.5‬تا‌وقتی‌که‌مرکزی ‌‬
‫‌‬
‫اجازه ‌بدهید‪‌ ،‬این ‌کار ‌را ‌با ‌یک ‌مثال ‌انجام ‌دهیم‪‌.‬نقاط ‌زیر ‌را ‌در‌نظر‌بگیرید ‌(برای ‌مثال‌‬
‫فرض‌کنید‌اینها‌نقاط‌موجود‌در‌محورهای‌‪‌x‬و‌‪‌y‬در‌تصویر‌باال)‬‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫مبندی‌کنیم‬ ‫نمونهها‌را‌به‌دو‌خوشه‌(گروه)‌تقسی ‌‬
‫یخواهیم‌این‌ ‌‬ ‫م‌‬
‫تهای ‌اولیه ‌انتخاب‌‬ ‫مرحلهی ‌‪‌ 2‬از ‌الگوریتم ‌باال‪‌ :‬تعداد ‌‪‌ ‌ k‬‬
‫نمونهی ‌تصادفی ‌را ‌برای ‌مرکزی ‌‬ ‫‌‬
‫یکنیم‬‫م‌‬
‫نههای ‌(‪‌ )1, 4‬را‌به‌لنوان‌‪‌ centroid 1‬و ‌(‪‌ )4, 2‬را ‌به‌‬
‫فرض ‌کنید ‌ما ‌به ‌صورت ‌تصادفی‪‌ ،‬گزی ‌‬
‫لنوان‌‪‌centroid 2‬انتخاب‌کنیم‬
‫یکنیم‬ ‫کترین‌مرکزیت‌(‪‌)centroid‬متصل‌م ‌‬ ‫نمونهها‌را‌به‌نزدی ‌‬
‫مرحلهی‌‪‌:3‬هر‌کدام‌از‌ ‌‬
‫‌‬
‫یتوانیم ‌از ‌یک ‌معیارِ ‌فاصله ‌که‌‬
‫کترین ‌مرکزیت‪‌ ،‬م ‌‬ ‫نمونهها ‌به ‌نزدی ‌‬
‫برای ‌اتصالِ ‌هر ‌کدام ‌از ‌ ‌‬
‫فاصلهی ‌منهتن ‌استفاده‌‬ ‫سادهسازی‪‌ ،‬اجازه ‌دهید ‌از ‌ ‌‬
‫قبالً ‌یاد ‌گرفتیم ‌استفاده ‌کنیم‪‌ .‬برای ‌ ‌‬
‫کنیم‪.‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪367‬‬

‫‌‬
‫‌‬
‫یدهیم‪.‬‬
‫خوشههای‌زیر‌تخصیص‌م ‌‬
‫‌‬ ‫بر‌اساس‌این‌جدول‪‌،‬نقاطِ‌مختلف‌را‌به‌‬
‫‌‬

‫‌‬
‫‌‬
‫یکنیم‬ ‫تها‌(‪‌)centroids‬را‌ ‌‬
‫بههنگام‌م ‌‬ ‫مرحلهی‌‪‌:4‬مرکزی ‌‬
‫‌‬
‫تهای ‌جدید ‌را ‌با ‌توجه ‌به ‌میانگینِ ‌هر ‌خوشه ‌محاسبه ‌می‌کنیم‪‌ .‬میانگینِ ‌محور ‌‪‌x‬‬
‫مرکزی ‌‬
‫یشود‪:‬‬‫خوشهی‌‪‌2‬به‌صورت‌زیر‌محاسبه‌م ‌‬ ‫‌‬ ‫برای‌‬
‫‪(1 + 1 + 2) / 3 = 4/3 = 1.33‬‬
‫و‌برای‌‪‌،y‬میانگین‌به‌صورت‌زیر‌م ‌‬
‫یشود‪:‬‬
‫‪(2 + 4 + 3) / 3 = 9/3 = 3‬‬
‫خوشهی‌‪‌،2‬مرکزیت‌جدید‌برابر‌)‪‌(1.33, 3‬می‌شود‪.‬‬
‫‌‬ ‫پس‌برای‌‬
‫یشود‬
‫خوشهی‌‪‌1‬نیز‌برابر‌)‪‌(4, 2.4‬م ‌‬
‫‌‬ ‫نصورت‪‌،‬مرکزیت‌جدید‌برای‌‬
‫به‌همی ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌361‬‬
‫دادهکاوی‌برای‌ ‌‬

‫مرحلهی‌قبلی‌تغییر‌خاصی‌نکرده‌باشند‪‌ :‬‬‫‌‬ ‫تها‌نسبت‌به‌‬ ‫مرحلهی‌‪‌:5‬تا‌زمانی‌که‌مرکزی ‌‬


‫‌‬
‫تهای ‌قبلی‪‌ ،‬برابر ‌(‪‌)1, 4‬و ‌(‪‌)4, 2‬بودند ‌و ‌مرکزی ‌‬
‫تهای ‌جدید ‌)‪‌ ‌ (1.33, 3‬و ‌)‪‌.(4, 2.4‬‬ ‫مرکزی ‌‬
‫کردهاند‪‌،‬پس‌الگوریتم‌را‌ادامه‌می‌دهیم‪.‬‬
‫تها‌تغییر‌ ‌‬ ‫همانطور‌که‌مالحظه‌می‌کنید‪‌،‬مرکزی ‌‬ ‫‌‬
‫یکنیم‬ ‫کترین‌مرکزیت‌(‪‌)centroid‬متصل‌م ‌‬ ‫نمونهها‌را‌به‌نزدی ‌‬
‫مرحلهی‌‪‌:3‬هر‌کدام‌از‌ ‌‬ ‫‌‬
‫تهای‌جدید)‌محاسبه‌می‌کنیم‪:‬‬ ‫نبار‌برای‌مرکزی ‌‬‫فاصلهی‌منهتن‌را‌(ای ‌‬
‫دوباره‪‌ ‌،‬‬

‫یدهیم‪:‬‬
‫تهای‌جدید‪‌،‬تخصیص‌م ‌‬
‫و‌بر‌اساس‌این‌فاصله‪‌،‬هر‌کدام‌از‌نقاط‌را‌به‌مرکزی ‌‬

‫تها‬
‫هنگامسازی‌مرکزی ‌‬
‫‌‬ ‫مرحلهی‌‪‌ ‌:4‬‬
‫به‬ ‫‌‬
‫خوشهی‌‪(1.5, 2.75)‌:CLUSTER 1‌–‌2‬‬
‫‌‬ ‫مرکزیت‌جدید‌برای‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪366‬‬

‫خوشهی‌‪(4.5, 2.5)‌:CLUSTER 2‌–‌1‬‬


‫‌‬ ‫مرکزیت‌جدید‌برا‌‬
‫تها‌تغییری‌نکنند‬ ‫مرحلهی‌‪‌:5‬تا‌وقتی‌که‌مرکزی ‌‬
‫‌‬
‫تها‌تغییر‌کردند‪‌،‬پس‌تکرار‌را‌ادامه‌می‌دهیم‬‫مرکزی ‌‬
‫کترین‌مرکزیت‌(‪‌)centroid‬متصل‌م ‌‬
‫یکنیم‬ ‫نمونهها‌را‌به‌نزدی ‌‬
‫مرحلهی‌‪‌:3‬هر‌کدام‌از‌ ‌‬
‫‌‬
‫فاصلهی‌منهتن‪:‬‬
‫دوباره‪‌ ‌،‬‬
‫‌‬

‫‌‬
‫‌‬
‫تهای‌جدید‪:‬‬
‫تخصیص‌نقاط‌به‌مرکزی ‌‬
‫‌‬

‫‌‬
‫‌‬
‫تها‬
‫هنگامسازی‌مرکزی ‌‬
‫‌‬ ‫مرحلهی‌‪‌ ‌:4‬‬
‫به‬ ‫‌‬
‫یکنیم‪.‬‬
‫خوشهها‌را‌با‌به‌دست‌آوردن‌میانگین‌هر‌خوشه‌محاسبه‌م ‌‬
‫‌‬ ‫مرکزیتِ‌هر‌کدام‌از‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌411‬‬
‫دادهکاوی‌برای‌ ‌‬

‫خوشهی‌‪(1.5, 2.75)‌:CLUSTER 1‌–‌2‬‬


‫‌‬ ‫مرکزیت‌‬
‫خوشهی‌‪(4.5, 2.5)‌:CLUSTER 2‌–‌1‬‬
‫‌‬ ‫مرکزیت‌‬
‫تها‌تغییری‌نکرده‌باشند‬ ‫مرحلهی‌‪‌:5‬تا‌وقتی‌که‌مرکزی ‌‬
‫‌‬
‫مرحلهی ‌قبل ‌هستند‪‌ ،‬پس ‌الگوریتم‪‌ ،‬همگرا‌‬
‫‌‬ ‫بههنگام‌شده‪‌ ،‬همانند ‌‬
‫تهای ‌جدیدِ ‌ ‌‬‫مرکزی ‌‬
‫خوشههای‌نهایی‌به‌‬
‫‌‬ ‫نجا‌الگوریتم ‌را ‌متوقف‌کنیم‪‌.‬‬ ‫(‪‌)converge‬شده‌است‌و‌م ‌‬
‫یتوانیم‌همی ‌‬
‫صورت‌زیر‌هستند‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫تها ‌تغییری ‌نکنند‪‌ ،‬توقف ‌خواهیم ‌کرد‪‌.‬مانند ‌این ‌است ‌که ‌بگوییم‪‌ ،‬هیچ‌‬ ‫هنگامی ‌که ‌مرکزی ‌‬
‫خوشهی ‌دیگر ‌منتقل ‌نشده ‌است‪‌ .‬منظورمان ‌از ‌همگرا ‌شدن‌‬ ‫‌‬ ‫نقطهای ‌از ‌یک ‌خوشه‪‌ ،‬به ‌‬
‫‌‬
‫(‪‌)converge‬همین‌است‪.‬‬
‫تها ‌از ‌مکانِ ‌اولی‌هی ‌خود ‌به ‌سمت ‌یک ‌مکان ‌پایانی‌‬
‫در ‌هنگام ‌اجرای ‌این ‌الگوریتم‪‌ ،‬مرکزی ‌‬
‫تها ‌در‌‬
‫حرکت ‌می‌کنند‪‌ .‬اکثر ‌این ‌تغییر ‌در ‌چند ‌دور ‌اول ‌رخ ‌می‌دهد ‌و ‌معموالً ‌مرکزی ‌‬
‫دورهای‌آخر‪‌،‬تغییرات‌کمی‌دارند‪.‬‬
‫یسازد ‌و‌‬‫خوشههای ‌خوبی ‌را ‌در ‌ابتدا ‌م ‌‬
‫‌‬ ‫این ‌بدان ‌معنی ‌است ‌که ‌الگوریتم ‌‪‌ k-means‬‬
‫تکرارهای‌بعدی‪‌،‬فقط‌اصالحات‌جزئی‌هستند‪.‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪412‬‬

‫‌‬
‫‌‬
‫یتوانیم ‌تا ‌حد ‌زیادی ‌سرلت ‌اجرای ‌الگوریتم ‌را ‌با ‌ریلکس‌‬ ‫به ‌خاطر ‌این ‌رفتارِ ‌الگوریتم‪‌ ،‬م ‌‬
‫(‪‌)relax‬کردنِ ‌شرایطِ ‌خاتمه‪‌ ،‬کم ‌کنیم‪‌.‬یعنی ‌به ‌جای ‌این‌که ‌بگوییم ‌«هیچ ‌ ‌‬
‫نقطهای ‌از ‌یک‌‬
‫یتوانیم‌بگوییم‌«کمتر‌از‌‪‌2‬درصد‌از‌‬ ‫خوشهی‌دیگر‌در‌تکرار‌بعدی‌تغییر‌نکند»‪‌،‬م ‌‬ ‫‌‬ ‫خوشه‌به‌‬
‫خوشهی ‌دیگر ‌در ‌تکرار ‌بعدی ‌تغییر ‌کنند»‪‌ .‬و ‌البته ‌که ‌این ‌روشِ‌‬
‫‌‬ ‫نقاط ‌از ‌یک ‌خوشه ‌به ‌‬
‫مرسومی‌است!‬
‫‌‬

‫‌‬
‫‌‬
‫برای‌شما‌متخصصان‌للم‌کامپیوتر‬
‫نهسازی ‌انتظار ‌( ‪Expectation‬‬ ‫الگوریتم ‌‪‌ k-means‬یک ‌نمونه ‌از ‌روش ‌بیشی ‌‬
‫‪‌)Maximization‬یا ‌همان ‌‪‌ EM‬است‪‌.‬این ‌روش‪‌ ،‬یک ‌روش ‌تکراری ‌(‪‌)iterative‬است ‌که‌‬
‫یشود‪‌.‬ابتدا‌با‌یک‌تخمین‌اولیه‌برخی‌از‌پارامترها‌شروع‌می‌کنیم‪‌.‬در‌‬
‫جابهجا‌م ‌‬
‫بین‌دو‌فاز‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌411‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یشود‪‌.‬در ‌فاز ‌انتظار ‌(‪‌ ،)E‬ما ‌از ‌این‌‬


‫تها ‌شروع ‌م ‌‬ ‫نکار ‌با ‌تخمین ‌مرکزی ‌‬ ‫مورد ‌‪‌ ،k-means‬ای ‌‬
‫خوشههایی‌که‌انتظارشان‌را‌داریم‪‌،‬تخصیص‌دهیم‪‌.‬‬ ‫‌‬ ‫تخمین‌استفاده‌می‌کنیم‌تا‌نقاط‌را‌به‌‬
‫یکنیم ‌تا ‌بتوانیم ‌به‌‬‫نهسازی ‌(‪‌ ،)M‬ما ‌از ‌این ‌مقادیر ‌در ‌فاز ‌انتظار ‌استفاده ‌م ‌‬ ‫در ‌فاز ‌بیشی ‌‬
‫یخواهید ‌بیشتر ‌در ‌مورد ‌روش ‌‪‌EM‬‬ ‫تها ‌را ‌تخمین ‌بزنیم‪‌ .‬اگر ‌م ‌‬ ‫آنها ‌مرکزی ‌‬‫لهی ‌ ‌‬
‫وسی ‌‬
‫یپدیا‪‌،‬‬
‫‌ویک ‌‬ ‫بدانید‪،‬‬
‫‪https://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algo‬‬
‫‪‌rithm‬محل‌خوبی‌برای‌شروع‌است‪‌.‬‬
‫‌‬

‫‌‬
‫‌‬

‫تپهنوردی‌(‪‌ )Hill Climbing‬‬


‫‌‬
‫خوشهبندی ‌‪‌ k-means‬و ‌توضیحاتش ‌را‌‬‫‌‬ ‫یخواهم ‌به ‌صورت ‌خالصه‪‌ ،‬‬ ‫اگر ‌اجازه ‌دهید‪‌ ،‬م ‌‬
‫تپهنوردی‌بپردازم‪‌.‬فرض‌کنید‌هدفِ‌ما‌این‌باشد‌که‌بخواهیم‌‬ ‫تمهای‌ ‌‬‫متوقف‌کرده‌و‌به‌الگوری ‌‬
‫قلهی‌کوهی‌برسیم‪‌،‬و‌این‌کار‌را‌با‌استفاده‌از‌الگوریتم‌زیر‌انجام‌دهیم‪‌ :‬‬ ‫به‌ ‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪413‬‬

‫یکنیم‬ ‫نقطهی‌تصادفی‌در‌کوهستان‌شروع‌م ‌‬ ‫از‌یک‌ ‌‬


‫یکنیم‬
‫خط‌زیر‌را‌تکرار‌م ‌‬
‫یگذاریم‌که‌بالث‌بیشترین‌شدن‌ارتفاعِ‌ما‌از‌سطح‌زمین‌بشود‬ ‫‌به‌جهتی‌قدم‌م ‌‬
‫تا ‌هنگامی ‌که ‌هیچ ‌جهتی ‌موجود ‌نباشد ‌که ‌با ‌رفتن ‌به ‌آن ‌جهت‪‌ ،‬به ‌ارتفاع ‌بیشتری‌‬
‫برسیم‌(یعنی‌قله‌باشد) ‌‬

‫‌‬
‫‌‬
‫یرسد‪.‬‬‫که‌به‌نظر‌الگوریتمی‌منطقی‌م ‌‬
‫این‌الگوریتم‌را‌با‌توجه‌به‌شکلِ‌کوه‌مانند‌زیر‌در‌نظر‌بگیرید‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌414‬‬
‫دادهکاوی‌برای‌ ‌‬

‫همانطور‌که‌می‌بینید‪‌،‬مهم‌نیست‌که‌از‌کجا‌شروع‌کنیم‪‌ ،‬یعنی‌از‌هر‌جا‌که‌شروع‌کنیم‪‌،‬‬ ‫‌‬


‫یتوانیم‌به‌قله‌برسیم‪.‬‬ ‫با‌استفاده‌از‌الگوریتم‌باال‪‌،‬م ‌‬
‫نکه ‌از ‌کجای ‌گراف ‌شروع‌‬
‫و ‌اگر ‌به ‌صورت ‌گراف ‌به ‌این ‌قضیه ‌نگاه ‌کنیم‪‌ ،‬بدون ‌توجه ‌به ‌ای ‌‬
‫یرسیم‪.‬‬ ‫کنیم‪‌،‬به‌بیشترین‌مقدار‌(قله)‌م ‌‬
‫حاال‌فرض‌کنید‪‌،‬با‌همین‌الگوریتم‌بخواهیم‌گرافِ‌زیر‌را‌پیمایش‌کنیم‪:‬‬
‫‌‬

‫‌‬

‫نقطهی ‌بهینه‌‬
‫تپهنوردی‪‌ ،‬تضمین ‌نمی‌کند ‌که ‌ما ‌به ‌ ‌‬
‫نسخهی ‌ساده ‌از ‌الگوریتمِ ‌ ‌‬
‫پس ‌این ‌ ‌‬
‫برسیم‪‌.‬‬
‫خوشهبندیِ ‌‪‌k-means‬هم‌شبیه‌به‌همین‌است‪‌.‬تضمینی‌وجود‌ندارد‌که‌الگوریتم‌‬ ‫‌‬ ‫الگوریتم‌‬
‫خوشهها‌انجام‌دهد‪‌.‬ولی‌چرا؟‬
‫‌‬ ‫یهای‌بهینه‌را‌برای‌ساخت‌‬ ‫مبند ‌‬
‫بتواند‌تقسی ‌‬
‫نکه‌در‌شروعِ‌الگوریتم‪‌،‬ما‌نقاط‌شروع‌را‌به‌صورت‌تصادفی‌انتخاب‌کردیم‪‌،‬مانند‌‬ ‫به‌خاطر‌ای ‌‬
‫نقطهی‌شروع‌در‌نظر‌بگیریم‪‌.‬پس‪‌،‬بر‌اساس‌این‌‬‫نقطهی‌‪‌A‬را‌به‌لنوان‌ ‌‬ ‫نکه‌در‌شکلِ‌باال‪‌ ‌،‬‬ ‫ای ‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪415‬‬

‫نقطهی ‌‪‌B‬‬
‫خوشهها ‌را ‌به ‌صورت ‌محلی‪‌ ،‬بهینه ‌کنیم ‌(مانند ‌ ‌‬
‫‌‬ ‫یکنیم ‌‬
‫نقطهی ‌شروع‪‌ ،‬ما ‌سعی ‌م ‌‬
‫‌‬
‫در‌شکل‌باال)‪.‬‬
‫خوشههای ‌پایانی‪‌ ،‬بسیار ‌بستگی ‌به ‌نقاط ‌شروع ‌اولیه ‌دارند‪‌ .‬با ‌وجود ‌این‪‌ ،‬الگوریتم ‌‪k-‬‬
‫‌‬
‫خوشههای‌خوبی‌را‌تولید‌می‌کند‪‌ .‬‬
‫‌‬ ‫‪‌،means‬‬
‫‌‬

‫‌‬
‫‌‬

‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌419‬‬
‫دادهکاوی‌برای‌ ‌‬

‫معیار‌‪‌SSE‬و‌پراکندگی‬
‫یتوانیم ‌از ‌مجموع ‌مربعات‌‬‫خوشهها‪‌ ،‬م ‌‬
‫‌‬ ‫مجمولهای ‌از ‌‬
‫‌‬ ‫برای ‌بررسی ‌و ‌مشخص ‌کردنِ ‌کیفیتِ ‌‬
‫خطا ‌(‪‌)SSE‬استفاده ‌کنیم‪‌.‬به ‌این ‌خطا‪‌ ،‬پراکندگی ‌(‪‌)scatter‬هم ‌می‌گویند ‌و ‌به ‌این ‌صورت‌‬
‫فاصلهی ‌آن ‌نقطه ‌را ‌نسبت‌به‌‬
‫نمونهها)‌ما ‌ ‌‬
‫نقطهها ‌(یعنی ‌ ‌‬
‫یشود‪‌:‬برای ‌هر ‌کدام ‌از ‌ ‌‬‫محاسبه ‌م ‌‬
‫یکنیم)‪‌،‬و‌تمامی‌‬ ‫مرکزیتِ‌(‪‌)centroid‬خوشه‌محاسبه‌کرده‌و‌به‌توان‌‪‌1‬می‌رسانیم‌(مربع‌م ‌‬
‫فاصلهها ‌را‌(برای‌هر‌نقطه ‌یک ‌فاصله)‌که‌به‌توان‌‪‌1‬رسیده‌است‪‌،‬با‌هم‌جمع‌می‌کنیم‪‌.‬‬ ‫ای ن ‌ ‌‬
‫یتر‪:‬‬
‫به‌صورت‌رسم ‌‬
‫‌‬

‫∑∑‬

‫‌‬
‫خوشهها ‌تکرار ‌را‌‬
‫‌‬ ‫بیایید ‌این ‌فرمول ‌را ‌واکاوی ‌کنیم‪‌.‬در ‌اولین ‌لالمت ‌مجموع ‌(∑)‌بر ‌روی ‌‬
‫خوشهی‌‪‌2‬است‪‌،‬بعد‌از‌آن‌به‌‬ ‫‌‬ ‫انجام‌می‌دهیم‌(یعنی‌به‌ازای‌هر‌خوشه)‪‌.‬پس‌در‌ابتدا‌‪‌i‬برابر‌‬
‫خوشهی ‌‪‌.k‬لالمت ‌مجموع ‌(∑) ‌بعدی‪‌ ،‬تکرار ‌را ‌بر ‌روی‌‬ ‫‌‬ ‫نطور ‌تا ‌‬
‫یرسد ‌و ‌همی ‌‬‫خوشهی ‌‪‌ 1‬م ‌‬
‫‌‬
‫هر ‌کدام ‌از ‌نقاطِ ‌آن ‌خوشه ‌انجام ‌می‌دهد ‌– ‌مانند ‌این ‌است ‌که ‌بگوییم‪‌ ،‬برای ‌هر ‌ ‌‬
‫نقطهی ‌‪‌x‬‬
‫یتواند ‌هر ‌کدام ‌از ‌معیارهای ‌فاصله ‌باشد ‌(مثالً ‌منهتن ‌یا‌‬ ‫نجا ‌‪‌ ،dist‬م ‌‬
‫خوشهی ‌‪‌.i‬در ‌ای ‌‬
‫‌‬ ‫در ‌‬
‫خوشهی ‌‪(‌ i‬یعنی‌ ‌) ‌به‌‬‫‌‬ ‫نقطهی ‌‪‌ x‬را ‌نسبت ‌به ‌مرکزیت ‌‬
‫فاصلهی ‌هر ‌ ‌‬‫اقلیدسی)‪‌ .‬پس ‌ما ‌ ‌‬
‫یکنیم‪.‬‬ ‫نکار‌را‌با‌مجموعِ‌کل‪‌،‬جمع‌م ‌‬ ‫آنرا‌به‌توان‌‪‌1‬رسانده‌و‌حاصلِ‌ای ‌‬ ‫یآوریم‌و‌ ‌‬ ‫دست‌م ‌‬
‫مجمولهی ‌داده‪‌ ،‬اجرا ‌کنیم ‌و ‌برای‌‬
‫‌‬ ‫فرض ‌کنید ‌الگوریتم ‌‪‌ k-means‬را ‌دومرتبه ‌بر ‌روی ‌یک ‌‬
‫خوشههایی‌که‌در‌اجرای‌‬ ‫‌‬ ‫هر‌اجرا‪‌،‬یک‌سری‌نقاطِ‌اولیه‌ی‌متفاوت‌انتخاب‌کنیم‪‌.‬آیا‌مجموعِ‌‬
‫خوشههایی‌بود‌که‌در‌اجرای‌دوم‌ساخته‌شد؟‌برای‌پاسخ‌به‌‬ ‫‌‬ ‫اول‌ساخته‌شد‪‌،‬بهتر‌از‌مجموع‌‬
‫مجمولهای ‌که ‌کمترین‌‬
‫‌‬ ‫این ‌سوال‪‌ ،‬ما ‌مقدار ‌‪‌ SSE‬را ‌برای ‌هر ‌دو ‌اجرا ‌محاسبه ‌می‌کنیم‪‌ .‬‬
‫خوشهبندیِ‌بهتری‌ارائه‌کرده‌است‪.‬‬ ‫‌‬ ‫میزان‌‪‌SSE‬را‌داشته‌باشد‪‌،‬‬
‫‌‬

‫وقت‌کد‌زدنه!‬
‫در‌زیر‌کد‌‪‌k-means‬پایه‌رو‌مشاهده‌م ‌‬
‫یکنید‬
417 ■‌‫‌خوشه‌بندی‬.1‌‫‌فصل‬

import math
import random

"""
Implementation of the K-means algorithm
for the book A Programmer's Guide to Data Mining"
http://www.guidetodatamining.com

"""

def getMedian(alist):
"""get median of list"""
tmp = list(alist)
tmp.sort()
alen = len(tmp)
if (alen % 2) == 1:
return tmp[alen // 2]
else:
return (tmp[alen // 2] + tmp[(alen // 2) - 1]) /
2

def normalizeColumn(column):
"""normalize the values of a column using Modified S
tandard Score
that is (each value - median) / (absolute standard d
eviation)"""
median = getMedian(column)
asd = sum([abs(x - median) for x in column]) / len(c
olumn)
result = [(x - median) / asd for x in column]
return result

class kClusterer:
""" Implementation of kMeans Clustering
This clusterer assumes that the first column of the
data is a label
not used in the clustering. The other columns contai
n numeric data
"""

def __init__(self, filename, k):


""" k is the number of clusters to make
This init method:
‫برنامهنویسان‬ ‌ ■‌411
‌ ‌‫دادهکاوی‌برای‬

1. reads the data from the file named filenam


e
2. stores that data by column in self.data
3. normalizes the data using Modified Standar
d Score
4. randomly selects the initial centroids
5. assigns points to clusters associated with
those centroids
"""
file = open(filename)
self.data = {}
self.k = k
self.counter = 0
self.iterationNumber = 0
# used to keep track of % of points that change
cluster membership
# in an iteration
self.pointsChanged = 0
# Sum of Squared Error
self.sse = 0
#
# read data from file
#
lines = file.readlines()
file.close()
header = lines[0].split(',')
self.cols = len(header)
self.data = [[] for i in range(len(header))]
# we are storing the data by column.
# For example, self.data[0] is the data from col
umn 0.
# self.data[0][10] is the column 0 value of item
10.
for line in lines[1:]:
cells = line.split(',')
toggle = 0
for cell in range(self.cols):
if toggle == 0:
self.data[cell].append(cells[cell])
toggle = 1
else:
self.data[cell].append(float(cells[c
ell]))

self.datasize = len(self.data[1])
416 ■‌‫‌خوشه‌بندی‬.1‌‫‌فصل‬

self.memberOf = [-1 for x in range(len(self.data


[1]))]
#
# now normalize number columns
#
for i in range(1, self.cols):
self.data[i] = normalizeColumn(self.data
[i])

# select random centroids from existing points


random.seed()
self.centroids = [[self.data[i][r] for i in ran
ge(1, len(self.data))]
for r in random.sample(range(
len(self.data[0])),
self.k)
]
self.assignPointsToCluster()

def updateCentroids(self):
"""Using the points in the clusters, determine t
he centroid
(mean point) of each cluster"""
members = [self.memberOf.count(i) for i in range
(len(self.centroids))]
self.centroids = [[sum([self.data[k][i]
for i in range(len(self.
data[0]))
if self.memberOf[i] == c
entroid])/members[centroid]
for k in range(1, len(self.da
ta))]
for centroid in range(len(self
.centroids))]

def assignPointToCluster(self, i):


""" assign point to cluster based on distance fr
om centroids"""
min = 999999
clusterNum = -1
for centroid in range(self.k):
dist = self.euclideanDistance(i, centroid)
‫برنامهنویسان‬ ‌ ■‌421
‌ ‌‫دادهکاوی‌برای‬

if dist < min:


min = dist
clusterNum = centroid
# here is where I will keep track of changing po
ints
if clusterNum != self.memberOf[i]:
self.pointsChanged += 1
# add square of distance to running sum of squar
ed error
self.sse += min**2
return clusterNum

def assignPointsToCluster(self):
""" assign each data point to a cluster"""
self.pointsChanged = 0
self.sse = 0
self.memberOf = [self.assignPointToCluster(i)
for i in range(len(self.data[1]
))]

def euclideanDistance(self, i, j):


""" compute distance of point i from centroid j"
""
sumSquares = 0
for k in range(1, self.cols):
sumSquares += (self.data[k][i] - self.centro
ids[j][k-1])**2
return math.sqrt(sumSquares)

def kCluster(self):
"""the method that actually performs the cluster
ing
As you can see this method repeatedly
updates the centroids by computing the mean
point of each cluster
re-assign the points to clusters based on th
ese new centroids
until the number of points that change cluster m
embership is less than 1%.
"""
done = False

while not done:


self.iterationNumber += 1
422 ■‌‫‌خوشه‌بندی‬.1‌‫‌فصل‬

self.updateCentroids()
self.assignPointsToCluster()
#
# we are done if fewer than 1% of the points
change clusters
#
if float(self.pointsChanged) / len(self.memb
erOf) < 0.01:
done = True
print("Final SSE: %f" % self.sse)

def showMembers(self):
"""Display the results"""
for centroid in range(len(self.centroids)):
print ("\n\nClass %i\n========" % centroid)
for name in [self.data[0][i] for i in rang
e(len(self.data[0]))
if self.memberOf[i] == centroi
d]:
print (name)

##
## RUN THE K-MEANS CLUSTERER ON THE DOG DATA USING K = 3
###
# change the path in the following to match where dogs.c
sv is on your machine
km = kClusterer('../../data/dogs.csv', 3)
km.kCluster()
km.showMembers()
‫برنامهنویسان‬ ‫‪‌ ■‌421‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دادهها ‌را ‌به ‌صورت ‌ستونی ‌ذخیره ‌می‌کنیم‪‌.‬همان‌‬


‫سلسلهمراتبی‪‌ ،‬ما ‌ ‌‬
‫‌‬ ‫خوشهبندیِ ‌‬
‫‌‬ ‫مانند ‌کدِ ‌‬
‫صفحهی ‌گسترده ‌(مانند ‌اکسل)‌‬
‫‌‬ ‫دادهها ‌را ‌در ‌یک ‌‬
‫سگها ‌را ‌تصور ‌کنید‪‌.‬اگر ‌ما ‌ ‌‬
‫مثالِ ‌نژاد ‌ ‌‬
‫ستونهای ‌قد ‌(‪‌ )height‬و ‌وزن‌‬
‫‌‬ ‫نمایش ‌دهیم‪‌ ،‬چیزی ‌شبیه ‌به ‌شکل ‌زیر ‌خواهد ‌شد ‌(‬
‫ها‌را‌نشان‌میدهد)‪‌ :‬‬
‫‌‬ ‫‌‬
‫هم‌نژاد‌سگ‬ ‫نرمالشده‌هستند‪‌.‬ستون‌‪‌breed‬‬ ‫(‪‌ ‌)weight‬‬
‫‌‬

‫‌‬

‫یسازیم‪:‬‬
‫دادهها‌را‌به‌پایتون‌انتقال‌دهیم‪‌،‬احتماالً‌لیستی‌شبیه‌به‌لیست‌زیر‌م ‌‬
‫اگر‌بخواهیم‌ ‌‬
‫‌‬

‫‌‬
‫یکنیم‪:‬‬
‫دادهها‌به‌صورت‌کامل‪‌،‬مانند‌زیر‌لمل‌م ‌‬
‫و‌برای‌مشخص‌کردنِ‌فرمت‌ ‌‬
‫‌‬

‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪423‬‬

‫یتر ‌به‌‬
‫نحوهی ‌نمایش ‌شهود ‌‬
‫دادهها ‌را ‌به ‌صورت ‌سطری ‌ذخیره ‌کردیم‪‌.‬این ‌ ‌‬
‫نجا‪‌ ‌ ،‬‬
‫پس ‌در ‌ای ‌‬
‫کردهایم‪‌.‬البته‌که‌‬
‫نحوهی‌نمایش‌در‌سراسر‌این‌کتاب‌استفاده‌ ‌‬‫یرسد‪‌،‬ما‌هم‌از‌همین‌ ‌‬ ‫نظر‌م ‌‬
‫دادهها‌را‌به‌صورت‌اول‌ستون‌(‪‌)column first‬نیز‌ذخیره‌کنیم‪:‬‬
‫یتوانیم‌ ‌‬ ‫م‌‬
‫‌‬

‫‌‬
‫سگها‪:‬‬
‫پس‌برای‌مثال‌نژاد‌ ‌‬
‫‌‬

‫‌‬
‫نجا ‌برای ‌‪k-‬‬
‫سلسلهمراتبی ‌انجام ‌دادیم ‌و ‌ای ‌‬
‫‌‬ ‫خوشهبندیِ ‌‬
‫‌‬ ‫این ‌همان‌کاری ‌است ‌که ‌برای ‌‬
‫ادهسازیِ‌توابعِ‌ریاضی‌‬
‫ناست‌که‌پی ‌‬ ‫‪‌means‬هم‌همی ‌‬
‫نکار‌را‌تکرار‌کردیم‪‌.‬مزیت‌این‌روش‌ای ‌‬
‫یتوان‌در‌دو‌تابع‌اولِ‌در‌کدِ‌باال‌مشاهده‌کرد‌که‌دو‌تابع‌‬ ‫یکند‪‌.‬این‌سادگی‌را‌م ‌‬
‫سادهتر‌م ‌‬
‫را‌ ‌‬
‫‪‌ getMedian‬و ‌‪‌ normalizeColumn‬هستند‪‌ .‬چون ‌در ‌این ‌حالت‪‌ ‌ ،‬‬
‫دادهها ‌را ‌به ‌صورت‌‬
‫یکنند‪.‬‬‫ستونی‌ذخیره‌کردیم‪‌،‬این‌توابع‪‌،‬یک‌سری‌لیست‌ساده‌را‌به‌لنوان‌ورودی‌دریافت‌م ‌‬
‫‌‬

‫‌‬
‫تابعِ ‌‪(‌ constructor‬یعنی ‌همان ‌تابع ‌__‪‌ ،)__init‬نام ‌فایل ‌(‪‌ )filename‬و ‌مقدار ‌‪‌ k‬را ‌به‌‬
‫دادهها ‌را ‌به ‌صورت ‌ستونی ‌ذخیره‌‬
‫یخواند ‌و ‌این ‌ ‌‬ ‫دادهها ‌را ‌از ‌فایل ‌م ‌‬
‫لنوان ‌ورودی ‌گرفته‪‌ ‌ ،‬‬
‫نرمالسازی ‌می‌کند‪‌ .‬تابع‌‬ ‫دادهها ‌را ‌توسط ‌تابع ‌‪‌ ‌ normalizeColumn‬‬ ‫یکند‪‌ .‬این ‌تابع‪‌ ‌ ،‬‬ ‫م‌‬
‫اصالحشده ‌( ‪modified‬‬ ‫‌‬ ‫ادهسازی ‌امتیاز ‌استاندارد ‌‬ ‫‪‌ normalizeColumn‬در ‌واقع ‌پی ‌‬
‫‪‌ )standard score‬است‪‌ .‬در ‌آخر‪‌ k‌ ،‬آیتم ‌از ‌این ‌ ‌‬
‫دادهها ‌را ‌انتخاب ‌می‌کند‪‌ ،‬و ‌به ‌لنوان‌‬
‫فاصلهی ‌آن ‌نقطه ‌تا‌‬
‫خوشهی ‌مربوط‪‌ ،‬براساس ‌ ‌‬ ‫‌‬ ‫تهای ‌اولیه ‌قرار ‌داده ‌و ‌هر ‌نقطه ‌را ‌به ‌‬
‫مرکزی ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌424‬‬
‫دادهکاوی‌برای‌ ‌‬

‫مرکزیت‌اولیه‪‌،‬تخصیص‌می‌دهد‪‌.‬این‌تخصیص‌توسط‌تابع ‌‪‌assignPointsToCluster‬انجام‌‬
‫یشود‪.‬‬‫م‌‬
‫خوشهبندی ‌را ‌با‌‬
‫‌‬ ‫خوشهبندی ‌را ‌انجام ‌می‌دهد‪‌ .‬این ‌تابع‪‌ ،‬‬
‫‌‬ ‫تابعِ ‌‪‌ kCluster‬در ‌اصل ‌لملیات ‌‬
‫یدهد‪‌ .‬تابع ‌‪‌updateCentroids‬‬ ‫چندبارهی ‌تابع ‌‪‌ updateCentroids‬انجام ‌م ‌‬ ‫‌‬ ‫فراخوانیِ ‌‬
‫میانگینِ‌هر‌خوشه‌را‌محاسبه‌کرده‌و‌تابع‌‪‌assignPointsToCluster‬را‌تا‌زمانی‌که‌کمتر‌از‌‬
‫یکند‪‌ .‬تابع ‌‪‌ showMembers‬نتایج ‌را ‌نمایش‌‬ ‫دادهها ‌تغییر ‌کنند‪‌ ،‬فراخوانی ‌م ‌‬
‫یک ‌درصدِ ‌ ‌‬
‫یدهد‪.‬‬‫م‌‬
‫سگها‪‌،‬نتایج‌زیر‌حاصل‌می‌شود‪:‬‬ ‫دادههای‌نژاد‌ ‌‬
‫با‌اجرای‌کد‌بر‌روی‌ ‌‬
‫‌‬

‫‌‬
‫خوشهبندیِ‌ما‌خیلی‌خوب‌لمل‌کرد‪.‬‬
‫‌‬ ‫مجمولهی‌داده‌ی‌کوچک‪‌،‬الگوریتمِ‌‬
‫‌‬ ‫خب!‌برای‌این‌‬
‫شما‌امتحان‌کنید‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪425‬‬

‫دادههای ‌غالت ‌صبحانه ‌با ‌‪‌ k=4‬چگونه ‌لمل‌‬‫خوشهبندیِ ‌‪‌ k-means‬بر ‌روی ‌ ‌‬ ‫‌‬ ‫الگوریتم ‌‬
‫یکند؟‬‫م‌‬
‫یگیرند ‌( ‪Cap’n’Crunch, Cocoa‬‬ ‫آیا ‌‪sweet cereal‬ها ‌با ‌هم ‌به ‌یک ‌خوشه ‌تعلق ‌م ‌‬
‫‪)Puffs, Froot Loops, Lucky Charms‬؟‬
‫یگیرند ‌(‪100% Bran, All-Bran, All-‬‬ ‫آیا ‌‪bran cereal‬ها‪‌ ،‬با ‌هم ‌در ‌یک ‌خوشه ‌قرار ‌م ‌‬
‫‪)Bran with Extra Fiber, Bran Chex‬؟‬
‫یشود؟‬ ‫محصول‌‪‌Cheerios‬با‌چه‌چیزهایی‌هم‌خوشه‌م ‌‬
‫دادههای‌مصرفِ‌اتومبیل‌بر‌اساس ‌مایل‌( ‪auto‬‬ ‫خوشهبندی‌را‌بر‌روی‌ ‌‬
‫‌‬ ‫همچنین‌الگوریتم‌‬
‫‪‌)mpg‬با‌مقادیر‌مختلف‌برای‌‪‌k=8‬انجام‌دهید‪.‬‬
‫لها ‌برآورده‌‬
‫خوشهبندیِ ‌اتومبی ‌‬
‫‌‬ ‫خوشهبندی‪‌ ،‬انتظارات ‌شما ‌را ‌برای ‌‬
‫‌‬ ‫آیا ‌این ‌الگوریتمِ ‌‬
‫یکند؟‬‫م‌‬

‫شما‌امتحان‌کنید‌–‌راه‌حل‬
‫دادههای ‌غالت ‌صبحانه ‌با ‌‪‌ k=4‬چگونه ‌لمل‌‬ ‫خوشهبندیِ ‌‪‌ k-means‬بر ‌روی ‌ ‌‬
‫‌‬ ‫‌الگوریتم ‌‬
‫یکند؟‬
‫م‌‬
‫آوردهاید‪‌ ،‬ممکن ‌است ‌با ‌نتایج ‌من ‌فرق ‌کند‪‌ ،‬ولی ‌چیزی ‌که ‌من‌‬
‫نتایجی ‌که ‌شما ‌به ‌دست ‌ ‌‬
‫گرفتهام‌به‌صورت‌زیر‌است‪‌ .‬‬
‫نتیجه‌ ‌‬

‫یگیرند ‌( ‪Cap’n’Crunch, Cocoa‬‬


‫آیا ‌‪sweet cereal‬ها ‌با ‌هم ‌به ‌یک ‌خوشه ‌تعلق ‌م ‌‬
‫‪)Puffs, Froot Loops, Lucky Charms‬؟‌‬
‫نها ‌(به ‌همراه ‌‪‌ Fruity Pebbles‌ ،Count Chocula‬و ‌بقیه)‌در ‌یک ‌خوشه‌‬
‫بله‪‌ ،‬تمامی ‌ای ‌‬
‫گرفتهاند‪.‬‬
‫قرار‌ ‌‬

‫یگیرند ‌(‪100% Bran, All-Bran, All-‬‬


‫آیا ‌‪bran cereal‬ها‪‌ ،‬با ‌هم ‌در ‌یک ‌خوشه ‌قرار ‌م ‌‬
‫‪)Bran with Extra Fiber, Bran Chex‬؟‌‬
‫دوباره‪‌،‬بله!‌همچنین‌در‌این‌خوشه‌‪‌Raisin Bran‬و‌‪‌Fruitful Bran‬هم‌قرار‌داشتند‪.‬‬

‫یشود؟‌‬‫محصول‌‪‌Cheerios‬با‌چه‌چیزهایی‌هم‌خوشه‌م ‌‬
‫یشود‪.‬‬ ‫این‌محصول‌معموالً‌با‌‪‌ ‌Special K‬‬
‫همخوشه‌م ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌429‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دادههای‌مصرف‌اتومبیل‌بر‌اساس ‌مایل‌( ‪auto‬‬


‫خوشهبندی‌را‌بر‌روی‌ ‌‬
‫‌‬ ‫همچنین‌الگوریتم‌‬
‫‪‌)mpg‬با‌مقادیر‌مختلف‌برای‌‪‌k=8‬انجام‌دهید‪.‬‬
‫یکند؟‬‫لها‌برآورده‌م ‌‬
‫گروهبندی‌اتومبی ‌‬
‫خوشهبندی‪‌،‬انتظارات‌شما‌را‌برای‌ ‌‬
‫‌‬ ‫آیا‌این‌الگوریتمِ‌‬
‫خوشهبندی‪‌،‬به‌نظر‌منطقی‌و‌خوب‌آمد‌ولی‌در‌موارد‌نادری‌احتماالً‌یک‌یا‌چند‌‬
‫‌‬ ‫الگوریتمِ‌‬
‫خوشه‪‌،‬خالی‌هستند‪.‬‬
‫‌‬

‫‌‬
‫‌‬
427 ■‌‫‌خوشه‌بندی‬.1‌‫‌فصل‬

‌:‫‌را‌ببینید‬Tolga Can‌‫این‌مثال‌از‬
http://www.ceng.metu.edu.tr/~tcan/ceng465_f1314/Schedule/KMeansEm
pty.html


‫برنامهنویسان‬ ‫‪‌ ■‌421‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬
‫‌‬
‫در ‌مجموع‪‌ ،‬اگر ‌تعداد ‌‪‌ k‬را ‌برای ‌الگوریتمِ ‌‪‌ k-means‬برابر ‌لددی ‌خاص ‌قرار ‌دهیم‪‌ ،‬به ‌این‌‬
‫خوشهی ‌غیر ‌خالی ‌را‌‬
‫‌‬ ‫خوشهبندیِ ‌‪‌ ،k-mean‬دقیقاً ‌همین ‌تعداد ‌‬‫‌‬ ‫معنا ‌نیست ‌که ‌الگوریتم ‌‬
‫دادههای ‌باال ‌نگاه ‌کنید‪‌ ،‬به‌‬
‫یتواند ‌چیز ‌خوبی ‌باشد‪‌.‬به ‌ ‌‬ ‫یسازد‪‌.‬البته ‌این ‌قضیه ‌م ‌‬ ‫برای ‌ما ‌م ‌‬
‫آنها‪‌،‬‬
‫دادهها ‌در ‌دو ‌گروه ‌قرار ‌دارند ‌و ‌تالشِ ‌ما ‌برای ‌سه ‌گروه ‌کردن ‌ ‌‬ ‫یرسد ‌واقعاً ‌ ‌‬ ‫نظر ‌م ‌‬
‫یخواهیم ‌به ‌‪‌ 21‬گروه‌‬ ‫یثمر ‌بوده ‌است‪‌ .‬حاال ‌فرض ‌کنید ‌‪‌ 2111‬نمونه ‌داریم ‌که ‌م ‌‬ ‫ب‌‬
‫یکنیم‪‌،‬دو‌‬ ‫دادهها‌اجرا‌م ‌‬
‫خوشهبندی‌را‌بر‌روی‌این‌ ‌‬ ‫‌‬ ‫تقسیمشان‌کنیم‌و‌هنگامی‌که‌الگوریتمِ‌‬
‫خوشهها‪‌،‬شاید‌بتواند‌چیزی‌در‌مورد‌‬ ‫‌‬ ‫گروه‌از‌این ‌ده ‌گروه‪‌،‬خالی‌می‌مانند‪‌.‬این‌خالی‌ماندنِ‌‬
‫مبندی‌‬ ‫دادهها ‌به ‌صورت ‌ذاتی ‌به ‌‪‌ 21‬گروه ‌تقسی ‌‬ ‫دادهها ‌به ‌ما ‌بگوید‪‌ .‬شاید ‌ ‌‬
‫ساختار ‌اصلی ‌ ‌‬
‫یهای‌دیگری‌را ‌در‌نظر‌بگیریم ‌(مثالً‌تالش ‌کنیم ‌که‌‬ ‫گروهبند ‌‬
‫یبایستی‌که ‌ ‌‬ ‫یشوند‌و‌ما‌م ‌‬ ‫نم ‌‬
‫خوشهبندی‌کنیم)‪.‬‬‫‌‬ ‫دادهها‌را‌به‌جای‌‪‌21‬گروه‪‌،‬در‌‪‌1‬گروه‪‌،‬‬ ‫‌‬
‫یگیریم‪‌،‬‬ ‫به ‌بیانی ‌دیگر‪‌ ،‬برخی ‌اوقات ‌هنگامی ‌که ‌ما ‌‪‌ 21‬خوشه ‌را ‌برای ‌الگوریتم ‌در ‌نظر ‌م ‌‬
‫خوشهی ‌غیر ‌خالی ‌است‪‌ .‬اگر ‌واقعاً ‌به ‌دنبال ‌این ‌قضیه ‌هستیم‪‌ ،‬نیازداریم‌‬ ‫‌‬ ‫منظورمان ‌‪‌ 21‬‬
‫خوشهی‌‬
‫‌‬ ‫خوشههای ‌خالی ‌را ‌پیدا ‌کند‪‌ .‬هنگامی ‌که ‌یک ‌‬
‫‌‬ ‫الگوریتم ‌را ‌تغییر ‌دهیم ‌تا ‌بتواند ‌‬
‫یکند‪‌.‬یک‌حالت‌این‌‬ ‫خالی‌پیدا‌شد‪‌،‬الگوریتم‪‌،‬مرکزیتِ‌(‪‌)centroid‬این‌خوشه‌را‌ ‌‬
‫جابهجا‌م ‌‬
‫است ‌که ‌این ‌مرکزیت ‌را ‌به ‌دورترین ‌نمونه ‌نسبت ‌به ‌مرکزیتِ ‌متناظرِ ‌خودش ‌انتقال ‌دهد‪‌.‬‬
‫خوشهی‌صورتی‌را‌‬ ‫‌‬ ‫خوشهی‌صورتی‌را‌خالی‌میافتیم‪‌،‬مرکزیت‌‬ ‫‌‬ ‫(در‌مثال‌باال‪‌،‬هنگامی‌که‌ما‌‬
‫یبردیم‪‌ ،‬چون ‌‪‌ 2‬دورترین ‌نقطه ‌از ‌مرکزیت ‌متناظر ‌خودش ‌است)‪‌ .‬برای‌‬ ‫نقطهی ‌‪‌ 2‬م ‌‬
‫به ‌ ‌‬
‫کردهام‪:‬‬
‫حالتهای‌زیر‌محاسبه‌ ‌‬ ‫همین‪‌،‬من‌فاصله‌را‌نسبت‌به‌ ‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪426‬‬

‫خوشهی‌خودش‌‬‫‌‬ ‫نقطهی‌‪‌2‬به‌مرکزیت‌‬
‫‌‬
‫خوشهی‌خودش‬‫‌‬ ‫نقطهی‌‪‌1‬به‌مرکزیت‌‬
‫‌‬
‫خوشهی‌خودش‬‫‌‬ ‫نقطهی‌‪‌3‬به‌مرکزیت‌‬
‫‌‬
‫خوشهی‌خودش‬‫‌‬ ‫نقطهی‌‪‌4‬به‌مرکزیت‌‬
‫‌‬
‫خوشهی‌خودش‬‫‌‬ ‫نقطهی‌‪‌5‬به‌مرکزیت‌‬
‫‌‬
‫خوشهی‌خودش‬‫‌‬ ‫نقطهی‌‪‌‌9‬به‌مرکزیت‌‬
‫‌‬
‫خوشهی‌خودش‬‫‌‬ ‫نقطهی‌‪‌7‬به‌مرکزیت‌‬
‫‌‬
‫خوشهی‌خودش‬‫‌‬ ‫نقطهی‌‪‌1‬به‌مرکزیت‌‬
‫‌‬
‫خوشهی‌‪‌2‬‬
‫‌‬ ‫خوشهی‌خودش‌باشد‌(که‌‬
‫‌‬ ‫نقطهای‌را‌انتخاب‌کردم‌که‌دورترین‌نقطه‌به‌مرکز‌‬
‫و‌ ‌‬
‫خوشهی‌خالی‌(صورتی)‌را‌به‌آن‌نقطه‌انتقال‌دادم‪.‬‬
‫‌‬ ‫شد)‌و‌بعد‌‬

‫یشه‌اگه‌الگوریتم‌‪‌k-mean‬سری ‌‬
‫عتر‌و‌با‌دقتِ‌باالتری‌ارائه‌بشه؟‬ ‫به‌نظرتون‌بهتر‌نم ‌‬
‫با‌تغییری‌نسبت‌به‌الگوریتم‌‪‌k-mean‬به‌الگوریتم‌جدیدی‌به‌اسم‌‪‌k-mean++‬م ‌‬
‫یرسیم‪.‬‬
‫یرسه ‌–‌یک ‌‪‌k-mean‬‬ ‫عتر ‌و ‌با ‌دقت ‌بیشتری ‌به ‌نظر ‌م ‌‬
‫حتی ‌اسمش ‌هم ‌جدیدتر‪‌ ،‬بهتر‪‌ ،‬سری ‌‬
‫توربوشارژ‬

‫‪k-means++‬‬
‫در ‌قسمت‌قبلی‪‌،‬ما‌الگوریتم ‌‪‌k-mean‬را‌به‌صورت‌اصلی‌و‌بدون‌تغییر‪‌،‬یعنی‌همان‌چیزی‌‬
‫دادههای‌‬
‫ادهسازی‌کردیم‌و‌آن‌را‌بر‌روی‌مجموله‌ ‌‬ ‫که‌در‌چند‌دهه‌قبل‪‌،‬توسعه‌یافته‌بود‪‌،‬پی ‌‬
‫جهی ‌خوبی ‌هم‌‬ ‫ادهسازیِ ‌آن ‌ساده ‌بود ‌و ‌نتی ‌‬
‫همانطور ‌که ‌دیدیم‪‌ ،‬پی ‌‬
‫مختلف ‌آزمایش ‌کردیم‪‌ ‌.‬‬
‫خوشهبندی‌در‌جهان‌است‪‌.‬البته‌که‌‬ ‫‌‬ ‫پراستفادهترین‌الگوریتم‌‬
‫‌‬ ‫یداد‪‌.‬این‌الگوریتم‪‌،‬هنوز‌هم‌‬ ‫م‌‬
‫ضعفهای ‌اساسیِ ‌‪‌ k-means‬همان ‌اولین ‌قدمی ‌است ‌که ‌به‌‬ ‫یهایی ‌دارد‪‌ .‬یکی ‌از ‌ ‌‬ ‫کاست ‌‬
‫همانطور‌که‌از‌‬
‫دادهها‌انتخاب‌می‌کند‪‌ ‌.‬‬ ‫صورت‌«تصادفی»‌تعداد‌‪‌k‬داده‌را‌به‌لنوان‌مرکزیت‌ ‌‬
‫مشکلساز‌است‪‌.‬به‌‬
‫‌‬ ‫تاکیدم‌بر‌روی‌کلمه‌ی‌«تصادفی»‌متوجه‌شدید‪‌،‬قسمت‌تصادفیِ‌ماجرا‪‌،‬‬
‫تهای ‌اولیه ‌بسیار ‌لالی‌‬ ‫نکه ‌در ‌این ‌انتخاب ‌تصادفی ‌است‪‌ ،‬گاهی ‌اوقات ‌مرکزی ‌‬ ‫خاطر ‌ای ‌‬
‫یشوند‪‌.‬اما ‌برخی ‌اوقات‪‌ ،‬با ‌انتخابِ ‌تصادفی‪‌‌،‬‬ ‫نهای ‌ختم ‌م ‌‬
‫خوشههای ‌تقریباً ‌بهی ‌‬
‫‌‬ ‫هستند ‌و ‌به ‌‬
‫خوشههایی ‌با ‌کیفیتِ ‌پایین ‌و ‌غیر ‌بهینه‌‬
‫‌‬ ‫یشوند ‌و ‌‬‫تهای ‌اولیه ‌ضعیف ‌انتخاب ‌م ‌‬ ‫این ‌مرکزی ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌411‬‬
‫دادهکاوی‌برای‌ ‌‬

‫یسازند‪‌ .‬الگوریتم ‌‪‌ k-means++‬این ‌نقطه ‌ضعف ‌را ‌با ‌تغییر ‌روش‪‌ ،‬برای ‌انتخاب‌‬
‫م‌‬
‫تهای‌اولیه‌برطرف‌کرده‌است‪‌.‬بقی‌هی‌چیزها‌در‌مورد‌‪‌،k-means‬مانند‌قبل‌هستند‪.‬‬‫مرکزی ‌‬

‫تهای‌اولیه‬ ‫روش‌‪‌-‌k-means++‬انتخاب‌مرکزی ‌‬
‫مجمولهی‌مرکزیت‌های‌اولیه‌خالی‌است‬
‫‌‬ ‫‪‌.2‬در‌ابتدا‪‌‌،‬‬
‫دادهها‌انتخاب‌‬
‫‪‌.1‬یک‌نقطه‌را‌به ‌لنوان‌مرکزیت‪‌،‬به‌صورت‌تصادفی‌مانند‌قبل‌از‌میان‌ ‌‬
‫یکنیم‬
‫م‌‬
‫‪‌.3‬تا‌هنگامی‌که‌‪‌k‬مرکزیتِ‌اولیه‌داریم‬
‫فاصلهی ‌‪‌ D‬را ‌برای ‌هر ‌نقطه ‌(نمونه) ‌نسبت ‌به ‌نزدیک‌ترین ‌مرکزیت ‌پیدا‌‬
‫‌الف‪‌ ‌ .‬‬
‫یکنیم‬ ‫یکنیم‪‌.‬این‌فاصله‌را‌)‪‌D(dp‬برای‌هر‌نقطه‪‌ ‌،‬‬
‫نامگذاری‌م ‌‬ ‫م‌‬
‫‌با ‌یک ‌احتمال ‌متناسب ‌با‌مقدار ‌)‪‌ D(dp‬یک ‌ ‌‬
‫نقطهی ‌تصادفی ‌انتخاب ‌می‌کنیم ‌که‌‬
‫یکنیم‬ ‫تها‌اضافه‌م ‌‬
‫مجمولهی‌مرکزی ‌‬
‫‌‬ ‫مرکزیت‌جدید‌شود‌و‌این‌مرکزیت‌جدید‌را‌به‌‬
‫‌ج‪‌.‬این‌کار‌را‌تکرار‌می‌کنیم‬

‫حاال‌اجازه‌دهید‌لبارت‌«با‌یک‌احتمال‌متناسب‌با‌مقدار‌)‪‌D(dp‬یک‌نقطه‌تصادفی‌انتخاب‌‬
‫یکنیم‌که‌مرکزیت‌جدید‌شود»‌‌را‌واکاوی‌کنیم‌و‌ببینیم‌که‌منظورمان‌از‌این‌قسمت‌چه‌‬ ‫م‌‬
‫یآورم‪‌.‬فرض ‌کنید ‌ما ‌وسط ‌این ‌فرآیند ‌باشیم‪‌.‬‬ ‫نکار‪‌ ،‬یک ‌مثال ‌ساده ‌م ‌‬ ‫بوده ‌است‪‌.‬برای ‌ای ‌‬
‫یخواهیم‌‬ ‫مثالً ‌ما ‌تا ‌االن ‌در ‌الگوریتم ‌دو ‌مرکزیت ‌(‪‌)centroid‬اولیه ‌را ‌انتخاب ‌ ‌‬
‫کردهایم ‌و ‌م ‌‬
‫مرحلهی ‌‪‌–‌ 3‬الف ‌از ‌الگوریتم ‌باال ‌هستیم‪‌.‬فرض ‌کنید‌‬
‫‌‬ ‫بعدی ‌را ‌انتخاب ‌کنیم‪‌.‬پس ‌ما ‌در ‌در ‌‬
‫فاصلههای‌نقاط‌‬
‫آنها ‌را‌انتخاب ‌کنیم‌در‌حالی‌که‌ ‌‬ ‫یخواهیم‌ ‌‬ ‫ما‌‪‌5‬مرکزیت ‌دیگر‌داریم ‌که‌م ‌‬
‫نسبت‌به‌دو‌مرکزیتِ‌انتخاب‌شده‌به‌صورت‌زیر‌است‪:‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪412‬‬

‫‌‬
‫‌‬
‫منظور‌از‌‪‌،Dc1‬فاصله‌تا‌مرکزیت‌‪‌2‬و‌منظور‌از‌‪‌،Dc2‬فاصله‌تا‌مرکزیت‌‪‌1‬است‪‌.‬لبارت‌‪‌dp1‬‬
‫نقطهی‌‪‌2‬است‪.‬‬‫به‌معنای‌ ‌‬
‫مرحلهی ‌‪‌ –‌ 3‬الف ‌گفته ‌شده ‌که ‌بایستی ‌نزدی ‌‬
‫کترین ‌فاصله ‌را ‌انتخاب ‌کنیم‪‌ .‬پس ‌به‌‬ ‫‌‬ ‫در ‌‬
‫صورت‌زیر‌لمل‌می‌کنیم‪:‬‬
‫‌‬

‫‌‬
‫‌‬
‫یخواهیم ‌الداد ‌را ‌طوری ‌تغییر ‌دهیم ‌که ‌جمع ‌آن‌ها ‌‪‌ 2‬شود ‌(من ‌این ‌را ‌وزن‌‬ ‫حاال ‌م ‌‬
‫یکنیم‪‌.‬در‌این‌مورد‪‌،‬جمع‌‬ ‫ینامم)‪‌.‬برای‌این ‌کار‌ما‌الدادِ‌اولیه ‌را‌با‌هم‌جمع ‌م ‌‬ ‫(‪‌)weight‬م ‌‬
‫یکنیم‪‌.‬نتیجه ‌به ‌صورت ‌زیر‌‬
‫یشود‪‌ ،‬و ‌حاال ‌هر ‌کدام ‌از ‌الداد ‌را ‌بر ‌‪‌ 11‬تقسیم ‌م ‌‬‫برابر ‌‪‌ 11‬م ‌‬
‫است‪‌ :‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌411‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬

‫‌‬

‫نداده‌ها‌مثل‌یک‌چرخ‪‌،‬مانند‌شکل‌زیر‌هستند‪‌ :‬‬
‫این‌طور‌تصور‌کنید‌که‌ای ‌‬
‫‌‬

‫‌‬
‫‌‬
‫همانجا ‌را ‌به ‌لنوان ‌مرکزیت‌‬
‫یایستد ‌و ‌ ‌‬ ‫یبینیم ‌که ‌کجا ‌م ‌‬
‫یچرخانیم‪‌ ،‬م ‌‬
‫ما ‌این ‌چرخ ‌را ‌م ‌‬
‫جدید ‌انتخاب ‌می‌کنیم‪‌.‬پس‌متوجه‌شدید‌که‌هر ‌چه ‌قدر ‌لددِ ‌نوشته ‌شده ‌برای ‌آن ‌نقطه‪‌،‬‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪413‬‬

‫بزرگتر ‌باشد‪‌ ،‬احتمال ‌انتخاب ‌آن ‌هم ‌بیشتر ‌است‪‌.‬منظور ‌ما ‌هم ‌از ‌«با ‌یک ‌احتمال ‌متناسب‌‬
‫با‌مقدار‌)‪‌D(dp‬یک‌نقطه‌تصادفی‌انتخاب‌می‌کنیم‌که‌مرکزیت‌جدید‌شود»‌‌همین‌بود‪.‬‬
‫مجمولهای ‌از‌‬
‫‌‬ ‫ادهسازی ‌کنیم‪‌ .‬فرض ‌کنید ‌‬ ‫حاال ‌اجازه ‌دهید ‌همین ‌ایده ‌را ‌در ‌پایتون ‌پی ‌‬
‫ییها‌(‪‌)tuples‬همراه‌با‌وزنشان‌داریم‪:‬‬‫چندتا ‌‬
‫‌‬
‫])‪data = [("dp1", 0.25), ("dp2", 0.4), ("dp3", 0.1), ("dp4", 0.15), ("dp5", 0.1‬‬

‫تابع‌‪‌roulette‬در‌زیر‪‌،‬یک‌نقطه‌را‌با‌توجه‌به‌احتمالِ‌متناسب‌با‌وزنِ‌آن‪‌،‬انتخاب‌می‌کند‪‌ :‬‬

‫‪import random‬‬
‫)(‪random.seed‬‬
‫‪def roulette(datalist):‬‬
‫‪i = 0‬‬
‫]‪soFar = datalist[0][1‬‬
‫)(‪ball = random.random‬‬
‫‪while soFar < ball:‬‬
‫‪i += 1‬‬
‫]‪soFar += datalist[i][1‬‬
‫]‪return datalist[i][0‬‬
‫‌‬
‫نسبتهایی ‌که ‌داریم ‌انتخاب ‌را ‌انجام ‌دهد‪‌ ،‬به ‌این ‌معنی ‌است ‌که ‌مثالً ‌اگر‌‬
‫‌‬ ‫اگر ‌این ‌تابع‪‌ ،‬با ‌‬
‫نقطهی ‌‪‌10‌ ،dp2‬‬ ‫نقطهی ‌‪‌ 40‌ ،dp1‬مرتبه ‌ ‌‬‫‪‌ 211‬مرتبه ‌انتخاب ‌را ‌انجام ‌دهیم‪‌ 15‌ ،‬مرتبه ‌ ‌‬
‫یشود‪‌.‬بیایید‌‬ ‫نقطهی‌‪‌dp4‬و‌‪‌21‬مرتبه‌نقطه‌ی‌‪‌dp5‬انتخاب‌م ‌‬ ‫نقطهی‌‪‌15‌،dp3‬مرتبه‌ ‌‬ ‫مرتبه‌ ‌‬
‫ببینیم‌آیا‌این‌فرضیه‌درست‌است‌یا‌خیر؟‬
‫‌‬
‫‪import collections‬‬
‫)‪results = collections.defaultdict(int‬‬
‫‪for i in range(100):‬‬
‫‪results[roulette(data)] += 1‬‬
‫‪print results‬‬
‫‌‬
‫}‪{'dp5': 11, 'dp4': 15, 'dp3': 10, 'dp2': 38, 'dp1': 26‬‬
‫‌‬
‫خب!‌تابع‌ما‪‌،‬نقاط‌را‌به‌صورت‌تقریبی‌با‌نسبتِ‌درستی‌انتخاب‌کرد‪.‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌414‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دهی ‌اصلی ‌در ‌‪‌ k-means++‬به ‌این ‌صورت ‌است ‌که‪‌ ،‬با ‌این‌که ‌نقاطِ‌‬
‫پس ‌به ‌طور ‌خالصه ‌ای ‌‬
‫تها‌از‌هم‌فاصله‌داشته‌‬ ‫یکنیم‪‌،‬ترجیح‌می‌دهیم‌مرکزی ‌‬‫اولیه‌را‌به‌صورتِ‌تصادفی‌انتخاب‌م ‌‬
‫باشند‪.‬‬
‫‌‬

‫‌‬
‫‌‬
‫کد‌بزنید‬
‫یتوانید‌الگوریتم‌‪‌k-means++‬را‌در‌پایتون‌پی ‌‬
‫ادهسازی‌کنید؟‬ ‫آیا‌م ‌‬
‫ادهسازی‌قبلی‌ما‌در‌روش‌‪‌k-means‬و‌این‌روش‌(‪‌)k-means++‬در‌‬ ‫دوباره‪‌،‬تنها‌تفاوت‌پی ‌‬
‫تهای ‌اولیه ‌است‪‌.‬یک ‌کپی ‌از ‌کد ‌اصلی ‌‪‌ k-means‬بگیرید ‌و ‌آن ‌را ‌تغییر‌‬
‫انتخاب ‌مرکزی ‌‬
‫یساخت‌در‌خط‌زیر‌بود‪:‬‬ ‫تهای‌اولیه‌را‌م ‌‬
‫دهید‪‌.‬کد‌اصلیِ‌ما‌که‌مرکزی ‌‬
‫‌‬
‫]))‪self.centroids = [[self.data[i][r] for i in range(1, len(self.data‬‬
‫‪for r in random.sample(range(len(self.data[0])),‬‬
‫])‪self.k‬‬

‫اجازه‌دهید‌این‌قسمت‌را‌به‌صورت‌زیر‌تغییر‌دهیم‪:‬‬

‫)(‪self.selectInitialCentroids‬‬

‫فهی‌شما‌این‌است‌که‌این‌تابع‌را‌بنویسید!‬‫وظی ‌‬
‫خوش‌بگذره!‬
‫‌‬
415 ■‌‫‌خوشه‌بندی‬.1‌‫‌فصل‬



‫کد‌بزنید‌–‌راه حل‬
:‫کردهام‬ ‌ ‫‌پی‬selectInialCentroids‌‫نسخهای‌است‌که‌من‌برای‌تابع‬
‌ ‌‫ادهسازی‬ ‌ ‌‫این‬

def distanceToClosestCentroid(self, point, centroidLis


t):
result = self.eDistance(point, centroidList[0])
for centroid in centroidList[1:]:
distance = self.eDistance(point, centroid)
if distance < result:
result = distance
return result

def selectInitialCentroids(self):
"""implement the k-means++ method of selecting
the set of initial centroids"""
centroids = []
total = 0
# first step is to select a random first centroid
current = random.choice(range(len(self.data[0])))
centroids.append(current)
# loop to select the rest of the centroids, one at
a time
for i in range(0, self.k - 1):
‫برنامهنویسان‬ ‫‪‌ ■‌419‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‪# for every point in the data find its distanc‬‬


‫‪e to‬‬
‫‪# the closest centroid‬‬
‫‪weights = [self.distanceToClosestCentroid(x, c‬‬
‫)‪entroids‬‬
‫]))]‪for x in range(len(self.data[0‬‬
‫)‪total = sum(weights‬‬
‫‪# instead of raw distances, convert so sum of‬‬
‫‪weight = 1‬‬
‫]‪weights = [x / total for x in weights‬‬
‫‪#‬‬
‫‪# now roll virtual die‬‬
‫)(‪num = random.random‬‬
‫‪total = 0‬‬
‫‪x = -1‬‬
‫‪# the roulette wheel simulation‬‬
‫‪while total < num:‬‬
‫‪x += 1‬‬
‫]‪total += weights[x‬‬
‫)‪centroids.append(x‬‬
‫‪self.centroids = [[self.data[i][r] for i in range‬‬
‫]))‪(1, len(self.data‬‬
‫]‪for r in centroids‬‬

‫خالصه‬
‫سادهای ‌که ‌در ‌این‌‬
‫مثالهای ‌ ‌‬‫خوشهبندی ‌تماماً ‌در ‌مورد ‌کشف ‌کردن ‌است‪‌.‬با ‌این ‌وجود‪‌ ‌ ،‬‬
‫‌‬
‫دهی‌اصلی‌یعنی‌همان‌«کشف‌کردن»‌را‌پنهان‌کرده‌باشد‪‌.‬با‌‬ ‫فصل‌زدیم‪‌،‬ممکن‌است‌این‌ای ‌‬
‫یدانیم ‌که ‌چگونه ‌محصوالتِ ‌غالتِ ‌صبحانه ‌را‌‬ ‫این ‌همه‪‌ ،‬ما ‌بدون ‌کمکِ ‌کامپیوتر ‌هم ‌م ‌‬
‫خوشهبندی ‌کنیم ‌– ‌مثالً ‌طبیعتاً ‌محصوالتِ ‌‪‌ sugary cereals‬و‌‪‌ healthy cereals‬با ‌هم‌‬‫‌‬
‫خوشهبندی‌کنیم‌‬
‫‌‬ ‫مدلهای‌مختلفِ‌اتومبیل‌را‌‬
‫یدانیم‌که‌چگونه‌بایستی‌ ‌‬ ‫هستند‪‌.‬همچنین‌م ‌‬
‫ونها ‌(‪‌ )truck‬تعلق ‌می‌گیرد ‌و ‌ ‪Mazda‬‬ ‫– ‌مثالً ‌اتومبیل ‌‪‌ Ford F150‬به ‌ ‌‬
‫دستهبندیِ ‌کامی ‌‬
‫لهای ‌ورزشی ‌(‪‌ ،)sports‬و ‌اتومبیل ‌‪‌ Honda Civic‬در ‌دسته‌ی‌‬ ‫‪‌ Miata‬در ‌دسته‌ی ‌اتومبی ‌‬
‫مصرف ‌سوختِ ‌بهینه ‌(‪‌ )fuel efficient‬قرار ‌می‌گیرد‪‌ .‬ولی ‌حاال ‌فرض ‌کنید ‌بخواهیم‌‬
‫مهم‌و‌اولویتدار‌باشد‪‌ .‬‬
‫‌‬ ‫مسئلهای‌را‌حل‌کنیم‌که‌در‌آن‌«کشف‌کردن»‌‬ ‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪417‬‬

‫هنگامی‌که‌یک‌سرچ‌در‌اینترنت‌انجام‌می‌دهیم‌در‌واقع‌با‌یک‌لیست‌بسیار‌بلندی‌از‌نتایج‌‬
‫کلمهی ‌« ‪carbon‬‬‫یشویم‪‌.‬برای ‌مثال‪‌ ،‬هنگامی ‌که ‌سرچی ‌در ‌سایتِ ‌گوگل ‌بر ‌روی ‌ ‌‬ ‫روبرو ‌م ‌‬
‫‪‌»sequestration‬انجام‌دادم‪‌،‬بیش‌از‌‪‌1.1‬میلیون‌نتیجه‌به‌دست‌آوردم‪‌.‬برخی‌از‌محققین‌‬
‫کردهاند‪‌.‬به ‌جای ‌این ‌لیست ‌بسیار ‌بلند ‌که ‌در ‌مورد‌‬
‫خوشهبندیِ ‌این ‌نتایج ‌را ‌بررسی ‌ ‌‬
‫‌‬ ‫مزیت ‌‬
‫مجمولههایی‌مانند‌« ‪carbon sequestration in‬‬ ‫‌‬ ‫کلمهی ‌‪‌carbon sequestration‬باشد‪‌،‬‬ ‫‌‬
‫‪‌ »freshwater wetlands‬و ‌«‪‌ »carbon sequestration in forests‬را ‌نیز ‌مشاهده‌‬
‫یکنید‪.‬‬ ‫م‌‬
‫آنها ‌در ‌مورد‌‬
‫مصاحبهی ‌گسترده ‌با ‌‪‌ 3111‬نفر ‌انجام ‌داد ‌که ‌از ‌ ‌‬
‫‌‬ ‫تیم ‌‪‌ Josh Gotbaum‬یک ‌‬
‫خوشهها ‌را ‌بررسی ‌کرد‪‌ ،‬به ‌پنج ‌گروه‌‬
‫‌‬ ‫ارزشهایشان ‌سواالتی ‌پرسید‪‌.‬هنگامی ‌که ‌این ‌تیم‪‌ ،‬‬
‫‌‬
‫آنها‌یک‌نام‌و‌توضیح‌اختصاص‌داد‪:‬‬ ‫رسید‌و‌به‌هر‌کدام‌از‌ ‌‬
‫‪‌.2‬بازکننده‌فرصت‌برای‌دیگران‬
‫تعاملکننده‌با‌اجتماع‬
‫‪‌ ‌.1‬‬
‫‪‌.3‬مستقل‬
‫‪‌.4‬متوجه‌فامیل‬
‫‪‌.5‬مدافع‌لدالت‬
‫راهاندازی‌کردند‪.‬‬‫نهای‌تبلیغاتی‌ ‌‬ ‫گروهها‪‌،‬کمپی ‌‬
‫بعد‌از‌آن‪‌،‬این‌تیم‌برای‌هر‌کدام‌از‌این‌ ‌‬
‫از‌کتاب‌‪‌The Numerati‬از‌‪Stephen Baker‬‬

‫سلسلهمراتبی ‌و‌‬
‫‌‬ ‫خوشهبندی ‌‬
‫‌‬ ‫خوشهبندی ‌را ‌یاد ‌گرفتیم‪‌ :‬‬
‫‌‬ ‫ما ‌تا ‌به ‌حال‪‌ ،‬فقط ‌دو ‌الگوریتم ‌‬
‫سلسلهمراتبی ‌و ‌در ‌چه ‌شرایطی‌‬
‫‌‬ ‫خوشهبندی ‌‪‌ .k-means‬در ‌چه ‌شرایطی ‌باید ‌از ‌روش ‌‬ ‫‌‬
‫بایستی‌از‌روش‌‪‌k-mean‬استفاده‌کنیم؟ ‌‬
‫سوال‌خوبی‌بود!‌‬
‫مزیت ‌روش ‌‪‌ k-means‬این‌است‌که‌این‌روش‌ ‌‬
‫سادهتر ‌است ‌و ‌سرلت ‌اجرای ‌باالتری ‌دارد‪‌.‬‬
‫این‌روش‪‌،‬یک ‌راه‌حل‌لالی‌برای‌کارهای‌لمومی‌است‪‌.‬همچنین‌این‌روش‪‌،‬راه‌حلی‌خوب‌‬
‫دادهها ‌را ‌به ‌صورت ‌اکتشافی ‌بررسی‌‬
‫برای ‌این ‌است ‌که ‌توسط ‌آن ‌بتوانید ‌در ‌مراحل ‌اولیه‪‌ ‌ ،‬‬
‫نحال‪‌ ‌،k-means‌،‬‬
‫دادههای‌‬ ‫کنید‌حتی‌اگر‌در‌نهایت‌به‌الگوریتمی‌دیگر‌مهاجرت‌کنید‪‌.‬با‌ای ‌‬
‫پرت ‌(‪‌ )outlier‬را ‌به ‌خوبی ‌شناسایی ‌نمی‌کند‪‌ .‬البته ‌که ‌می‌توانیم ‌این ‌نقطه ‌ضعف ‌را ‌با‌‬
‫دادههای‌پرت‪‌،‬رفع‌کنیم‪.‬‬
‫شناسایی‌و‌حذف‌ ‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌411‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫سلسلهمراتبی‌چه؟ ‌‬
‫‌‬ ‫خوشهبندی‌‬
‫‌‬ ‫اوکی!‌گرفتم‪‌.‬در‌مورد‌‬
‫سلسلهمراتبی‌‪‌ ،‬هنگامی‌است ‌که ‌بخواهیم ‌یک‌‬
‫‌‬ ‫خوشهبندی ‌‬
‫‌‬ ‫استفادهی ‌الگوریتم ‌‬
‫‌‬ ‫یکی ‌از ‌موارد ‌‬
‫سلسلهمراتب ‌(‪‌)hierarchy‬از ‌ ‌‬
‫دادهها ‌بسازیم‪‌.‬این ‌سلسله ‌مراتبِ‌‬ ‫‌‬ ‫ردهبندی ‌(‪‌)taxonomy‬یا ‌‬ ‫‌‬
‫خوشهبندی ‌تخت ‌(‪‌)flat‬باشد‪‌.‬‬
‫‌‬ ‫ساخته ‌شده‪‌ ،‬ممکن ‌است ‌حاوی ‌اطاللاتِ ‌بیشتری ‌نسبت ‌به ‌‬
‫اشغالشده)‌نیست‪.‬‬
‫‌‬ ‫حافظهی‌‬
‫‌‬ ‫البته‌که‌این‌روش‪‌،‬خیلی‌هم‌بهینه‌(باتوجه‌به‌سرلت‌اجرا‌و‌‬
‫لالیه!‬
‫دادهی‌جدید‪‌،‬آزمایش‌کنم‪.‬‬ ‫آنها‌را‌بر‌روی‌یک‌مجموله‌ ‌‬ ‫شاید‌بهتر‌باشه‌که‌ ‌‬
‫‌‬

‫‌‬
‫‌‬

‫انرون‌(‪)Enron‬‬
‫ممکن ‌است ‌‪‌ Enron‬و ‌‪‌ Enron Scandal‬را ‌به ‌خاطر ‌بیاورید‪‌ .‬در‌‬
‫خودش‪‌ Enron‌ ،‬یک ‌شرکت ‌انرژیِ ‌بسیار ‌بزرگ ‌با ‌درآمد‌‌‬
‫‌‬ ‫زمان ‌اوج ‌‬
‫شاز ‌‪‌ 211‬میلیارد ‌دالر ‌بود‪‌ .‬این ‌شرکت ‌در ‌آن ‌زمان‪‌11111‌ ،‬‬ ‫بی ‌‬
‫کارمند ‌داشت ‌(درآمد ‌ماکروسافت ‌بعد ‌از ‌آن ‌فقط ‌‪‌ 11‬میلیارد ‌دالر‌‬
‫یها ‌که ‌شامل ‌ایجادِ ‌کمبودِ ‌مصنولیِ‌‬ ‫بود)‪‌ Enron‌ .‬به ‌دلیل ‌سستیِ ‌سیستماتیک ‌و ‌قطع ‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪416‬‬

‫لدهای ‌راهی ‌زندان ‌شدند‪‌.‬‬


‫انرژی ‌و ‌در ‌نتیجه ‌خاموشی ‌برق ‌کالیفرنیا ‌شد‪‌ ،‬ورشکسته ‌شد ‌و ‌ ‌‬
‫مشاهدهی ‌مستندی ‌در ‌مورد ‌‪‌ Enron‬م ‌‬
‫یتوانید ‌فیلم ‌زیر ‌را ‌در ‌نتفیلیکس ‌و ‌آمازون‌‬ ‫‌‬ ‫برای ‌‬
‫پرایم‌جستجو‌کنید‪:‬‬
‫‪Enron: The Smartest Guys in the Room‬‬
‫ممکن ‌است ‌فکر ‌کنید ‌که ‌«خب‪‌ ،‬این ‌ماجراهای ‌شرکت ‌‪‌ Enron‬جالبه‪‌ ،‬ولی ‌چه ‌ربطی ‌به‌‬
‫دادهکاوی‌داره؟»‬
‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌431‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬
‫یپدیا‌را‌نگاه‌کنید‪:‬‬ ‫دادهی‌‪‌ ‌،Enron‬‬
‫وبسایت‌ویک ‌‬ ‫گاه ‌‬
‫برای‌اطاللات‌بیشتر‌در‌مورد‌پای ‌‬
‫‪https://en.wikipedia.org/wiki/Enron_Corpus‬‬
‫صفحهی‌زیر‌بیندازید‪:‬‬
‫‌‬ ‫همچنین‌نگاهی‌به‌‬
‫‪/https://www.cs.cmu.edu/~./enron‬‬
‫حوزههای‌مختلف‌است‪‌ .‬‬
‫مجمولهی‌داده‪‌،‬منبع‌بزرگی‌برای‌محققان‌در‌ ‌‬
‫‌‬ ‫این‌‬

‫خوشهبندی ‌کنیم‪‌.‬‬
‫‌‬ ‫دادهی ‌‪‌ Enron‬را ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫یخواهیم ‌یک ‌قسمت ‌کوچک ‌از ‌‬ ‫حاال ‌ما ‌م ‌‬
‫مجمولهی ‌آزمایشیِ ‌کوچکمان‪‌ ،‬من ‌این ‌اطاللات ‌که ‌«چه ‌کسی ‌به ‌چه ‌کسی ‌ایمیل‌‬
‫‌‬ ‫برای ‌‬
‫زده‌است»‌را‌واکشی‌کردم‌و‌در‌جدولی‌مانند‌جدول‌زیر‌برای‌نمایش‌قرار‌دادم‌(هر‌کدام‌از‌‬
‫سطرها‌یا‌ستونها‌اسم‌افراد‌هستند)‪:‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪432‬‬

‫‌‬

‫‌‬
‫‌‬
‫وبسایتمان ‌قرار ‌دادیم‪‌ ،‬من ‌این ‌اطاللات ‌را ‌برای ‌‪‌ 61‬نفر‪‌،‬‬
‫دادهای ‌که ‌در ‌ ‌‬
‫در ‌مجموله‌ی ‌ ‌‬
‫خوشهبندی‌کنیم‌که‌بتوانیم‌ارتباطات‌‬‫‌‬ ‫استخراج‌کردم‪‌.‬فرض‌کنید‌می‌خواهیم‌افراد‌را‌طوری‌‬
‫میان‌این‌افراد‌را‌کشف‌کنم‪.‬‬
‫‌‬

‫تحلیل‌لینک‌(‪)Link Analysis‬‬
‫یک ‌زیرحوزه ‌در ‌داده‌کاوی ‌به ‌اسم ‌تحلیل ‌لینک ‌(‪‌ )link analysis‬وجود ‌دارد ‌که ‌کامالً‌‬
‫مسئلهای ‌که ‌در ‌آن ‌بخواهیم ‌ارتباطات ‌بین‌‬
‫‌‬ ‫مناسبِ ‌این ‌دست ‌از ‌مسئل ‌است ‌(یعنی ‌‬
‫تمهای‌مخصوصی‌برای‌مسائل‌نیز‌به‌وجود‌آمده‌است‪.‬‬ ‫یها‌را‌ارزیابی‌کنیم)‌و‌الگوری ‌‬‫ورود ‌‬
‫‌‬
‫شما‌امتحان‌کنید‬
‫لهای ‌‪‌ Enrol‬انجام‌‬ ‫مجمولهی ‌ایمی ‌‬
‫‌‬ ‫سلسلهمراتبی ‌را ‌بر ‌روی ‌‬
‫‌‬ ‫خوشهبندیِ ‌‬
‫‌‬ ‫یتوانید ‌‬
‫آیا ‌م ‌‬
‫دهید؟‬
‫وبسایت ‌ما ‌(‪‌ guidetodatamining.com‬و ‌‪‌ )chistio.ir‬دانلود‌‬ ‫دادهها ‌را ‌از ‌ ‌‬
‫یتوانید ‌ ‌‬ ‫م‌‬
‫نمایید‪‌.‬البته‌احتماالً‌بایستی‌برای‌تطبیق‌با‌این‌مسئله‌کدتان‌را‌کمی‌تغییر‌دهید‪.‬‬
‫خوش‌بگذره!‬
‫‌‬
‫شما‌امتحان‌کنید‌–‌راه‌حل‬
‫برنامهنویسان‬ ‫‪‌ ■‌431‬‬
‫دادهکاوی‌برای‌ ‌‬

‫دادهها ‌را ‌برای ‌‪‌ 61‬نفر‌‬


‫وبسایت ‌ما ‌فراهم ‌شده ‌است‪‌ ،‬من ‌این ‌ ‌‬
‫دادهای ‌که ‌در ‌ ‌‬
‫مجمولهی ‌ ‌‬
‫‌‬ ‫در ‌‬
‫کردهام‪.‬‬
‫استخراج‌ ‌‬
‫خوشهبندی ‌می‌کنیم‪‌.‬مثالً ‌اگر ‌مکاتبات ‌ایمیلیِ‌‬
‫‌‬ ‫ما ‌افراد ‌را ‌بر ‌اساس ‌شباهتِ ‌مکاتباتِ ‌ایمیل ‌‬
‫من‪‌،‬با ‌‪‌Ben‌ ،Ann‬و ‌‪‌Clara‬باشد‪‌،‬و‌اکثر‌مکاتبات‌شما‌هم‌با‌همین‌افراد ‌رخ‌دهد‪‌،‬این‌خود‌‬
‫دهی‌کلی‌چیزی‌شبیه‌به‌زیر‌است‪:‬‬ ‫نشانهای‌باشد‌که‌ما‌در‌گروه‌یکسانی‌هستیم‪‌.‬ای ‌‬
‫یتواند‌ ‌‬ ‫م‌‬
‫‌‬

‫‌‬
‫‌‬
‫یگیریم‪‌.‬البته‌‬
‫نکه ‌سطرهای ‌ما ‌شبیه ‌به ‌هم ‌هستند‪‌ ،‬با ‌هم ‌در ‌یک ‌خوشه ‌قرار ‌م ‌‬
‫به ‌دلیل ‌ای ‌‬
‫ستونهایمان‌را‌به‌این‌صورت‌اضافه‌می‌کنیم‪:‬‬ ‫‌‬ ‫یآید‌که‌ما‌‬‫مشکل‌هنگامی‌به‌وجود‌م ‌‬
‫‌‬

‫‌‬

‫داشتهاید ‌ولی ‌من ‌فقط ‌‪‌1‬‬


‫‌‬ ‫با ‌نگاه ‌به ‌به ‌ستونِ ‌«من ‌(‪‌ ،»)me‬شما ‌با ‌من ‌‪‌ 261‬مرتبه ‌مکاتبه ‌‬
‫نطور ‌است‪‌ .‬حاال ‌اگر‌‬ ‫فرستادهام‪‌ .‬ستونِ ‌«شما ‌(‪‌ »)you‬هم ‌همی ‌‬
‫‌‬ ‫مرتبه ‌برای ‌خودم ‌ایمیل ‌‬
‫نکه‌‬ ‫یشود‪‌ .‬قبل ‌از ‌ای ‌‬‫سطرهای ‌خودمان ‌را ‌با ‌هم ‌مقایسه ‌کنیم‪‌ ،‬خیلی ‌به ‌هم ‌شبیه ‌نم ‌‬
‫ستونهای ‌«‪‌»me‬و ‌«‪‌»you‬را ‌به ‌جدول ‌باال ‌اضافه ‌کنم‪‌ ‌ ،‬‬
‫فاصلهی ‌اقلیدسی ‌برابر ‌‪‌ 49‬بود ‌و‌‬ ‫‌‬
‫فاصلهی‌‬
‫نکه ‌این ‌مشکل ‌رفع ‌شود‪‌ ،‬هنگامی ‌که ‌ ‌‬ ‫آنها‪‌ 196‌ ،‬شد!‌برای ‌ای ‌‬
‫بعد ‌از ‌اضافه ‌کردنِ ‌ ‌‬
‫ستونها ‌را ‌برای ‌آن ‌دو ‌نفر ‌حذف ‌می‌کنم‪‌.‬این‌‬‫‌‬ ‫اقلیدسی ‌را ‌برای ‌دو ‌نفر ‌محاسبه ‌می‌کنم‪‌ ،‬‬
‫نیازمند‌تغییر‌کمی‌در‌فرمول‌است‪:‬‬
‫‌‬
‫‪def distance(self, i, j):‬‬
‫‪#enron specific distance formula‬‬
‫‪sumSquares = 0‬‬
‫‪for k in range(1, self.cols):‬‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪433‬‬

‫‪if (k != i) and (k != j) :‬‬


‫‪sumSquares += (self.data[k][i] - self.data[k‬‬
‫‪][j])**2‬‬
‫)‪return math.sqrt(sumSquares‬‬
‫‌‬
‫یکنید‪:‬‬
‫در‌تصویر‌پایین‪‌،‬یک‌زیردرخت‌از‌نتایج‌را‌مشاهده‌م ‌‬
‫‌‬

‫‌‬
‫‌‬
‫مجمولهی ‌داده ‌با ‌‪‌ k=8‬انجام ‌دادم‪‌.‬در ‌زیر‌‬
‫‌‬ ‫همچنین ‌الگوریتم ‌‪‌ k-means++‬را ‌بر ‌روی ‌این ‌‬
‫چند‌گروهی‌که‌‪‌k-mean++‬توانسته‌کشف‌کند‌را‌مشاهده‌می‌کنید‪:‬‬
‫برنامهنویسان‬ ‫‪‌ ■‌434‬‬
‫دادهکاوی‌برای‌ ‌‬

‫شگفتانگیز ‌است‪‌.‬مثالً‌گروهِ‌‪‌)Class 5(‌ ‌ 5‬شامل ‌چند ‌نفر ‌از ‌تجار ‌است‪Chris ‌.‬‬
‫‌‬ ‫این ‌نتایج ‌‬
‫قائممقام ‌تجارت ‌است‪Marie ‌.‬‬
‫‪‌ Germany‬و ‌‪‌ Leslie Hansen‬تاجر ‌هستند‪‌ ‌ Scott Neal‌.‬‬
‫‪‌ Heard‬یک ‌قاضی ‌است‪‌ Mike Carson‌ .‬یکی ‌از ‌مدیران ‌تجارت ‌در ‌شمال ‌شرقی ‌است‪‌.‬‬
‫همچنین ‌الضای ‌گروه ‌‪‌ 7‬نیز ‌جالب ‌توجه ‌است‪‌ .‬تمام ‌چیزی ‌که ‌در ‌مورد ‌‪‌Tana Jones‬‬
‫یدانم‌این‌است‌که‌یک‌مدیر‌و‌‪‌Louise Kitchen‬مدیر‌تجارت‌آنالین‌بود‪‌Mike Grigsby‌.‬‬ ‫م‌‬
‫حوزهی ‌تجارت ‌بود‪Kevin ‌.‬‬ ‫قائممقام ‌گاز ‌طبیعی ‌بود‪‌ David Forster‌.‬هم ‌یک ‌ ‌‬
‫قائممقام ‌در ‌ ‌‬ ‫‌‬
‫‪‌)m.presto(‌Presto‬نیز‌یک‌ ‌‬
‫قائممقام‌و‌یک‌تاجرِ‌ارشد‌بود‪.‬‬
‫‌‬
‫‌فصل‌‪‌.1‬خوشه‌بندی‌■ ‪435‬‬

‫‌‬
‫‌‬

‫‌‬
‫‌‬
‫برنامهنویسان‬ ‫‪‌ ■‌439‬‬
‫دادهکاوی‌برای‌ ‌‬

‫‌‬
‫‌‬

237

You might also like