پیشنهاد دادن آنچه مخاطب از آن استقبال خواهد کرد، برعهده سامانه‌های توصیه‌گر است. این سامانه‌ها که امروز ما کاربر بسیاری از آنها هستیم، سعی می‌کنند از روی علاقه‌مندی‌های ما و دیگران، مثلا اینکه ما چه کتاب‌هایی را خوانده‌ایم و دیگران که علایقی مشابه ما داشته‌اند، مثلا چه کتاب‌هایی را خوانده‌اند، پیشنهاد مناسبی به ما بدهند.

Git Hub

۱. مقدمه

Recommender System

سامانه توصیه‌گر (به انگلیسی: Recommender System) یا سامانه پیشنهادگر، با تحلیل رفتار کاربر خود، اقدام به پیشنهاد مناسب‌ترین اقلام
(داده، اطلاعات، کالا و...)می‌نماید.
این سیستم رویکردی است که برای مواجهه با مشکلات ناشی از حجم فراوان و رو به رشد اطلاعات ارائه شده‌است و به کاربر خود کمک می‌کند تا در میان حجم عظیم اطلاعات سریع‌تر به هدف خود نزدیک شوند. برخی سامانه پیشنهادگر را معادل پالایش گروهی (به انگلیسی: Collaborative filtering) می‌دانند.
پیش بینی می‌شد که تا اوایل سال ۲۰۰۷ میلادی در سایت دانشنامه اینترنتی ویکی‌پدیا چیزی حدود ۵٫۱ میلیون مقاله به ثبت رسیده باشد و یا سایت مدیریت و به اشتراک‌گذاری تصاویر فلیکر بالغ بر ۲۵۰ میلیون تصویر را در خود جای دهد.
از این رو، می‌توان گفت که ما در میان حجم عظیمی از داده و اطلاعات قرار گرفته‌ایم که بدون راهنمایی و ناوبری درست ممکن است انتخاب‌هایی غلط و یا غیر بهینه از میان آن‌ها داشته باشیم.
سیستم‌های توصیه‌گر سیستم‌های تأثیرگذار در راهنمایی و هدایت کاربر، در میان حجم عظیمی از انتخاب‌های ممکن، برای رسیدن به گزینه مفید و مورد علاقه وی هستند به گونه‌ای که این فرایند، برای نفس همان کاربر، شخصی‌سازی شده باشد.
تعاریف متفاوتی برای سیستم‌های توصیه‌گر ارائه شده‌است. از آن جمله، تعریف کلی‌نگر و خلاصه آقای Ting-peng liang در سال ۲۰۰۷ است که RS را زیرمجموعه‌ای از DSSها می‌داند و آن‌ها را سیستم‌های اطلاعاتی تعریف می‌کند که، توانایی تحلیل رفتارهای گذشته و ارائه توصیه‌هایی برای مسائل جاری را دارا هستند. به زبان ساده‌تر در سیستم‌های توصیه‌گر تلاش بر این است تا با حدس زدن شیوه تفکر کاربر (به کمک اطلاعاتی که از نحوه رفتار وی یا کاربران مشابه وی و نظرات آن‌ها داریم) به وی مناسب‌ترین و نزدیک‌ترین کالا به سلیقه او را شناسایی و پیشنهاد کنیم.
این سیستم‌ها در حقیقت همان فرایندی که ما در زندگی روزمره خود به کار می‌بریم و طی آن تلاش می‌کنیم تا افرادی با سلایق نزدیک به خود را پیدا کرده و از آنها در مورد انتخاب‌هایمان نظر بخواهیم. توصیه‌هایی که از سوی سیستم‌های توصیه‌گر ارائه می‌شوند به طور کلی می‌توانند دو نتیجه در برداشته باشند :

  • کاربر را در اخذ تصمیمی یاری می‌کنند (که مثلاً از میان چندین گزینه پیش رو کدام بهتر است و آن را انتخاب کند و ... ).
  • موجب افزایش آگاهی کاربر، در زمینه مورد علاقه وی می‌شود (مثلاً در حین ارائه توصیه به کاربر موجب می‌شود تا وی با اقلام و اشیاء جدیدی را قبلاً آنها را نمی‌شناخته، آشنا شود).
سیستم‌های توصیه‌گر برای هر دو طرف یک تعامل (تجاری یا غیرتجاری)، مفید هستند و مزایایی را فراهم می‌آورد. برای نمونه در یک تعامل تجاری، مشتری‌ها از این جهت که عمل جستجو در میان حجم زیاد اطلاعات برای آن‌ها تسهیل و تسریع می‌شود، استفاده از سیستم‌های توصیه‌گر را مفید می‌دانند؛ فروشندگان به کمک این سیستم‌ها می‌توانند رضایت مشتریان را بالا برده و نیز فروش خود را افزایش دهد.

کارهای مرتبط

سیستم‌های توصیه‌گر کاربردهای فراوانی دارند که برخی از زمینه‌های کاربردی آن به شرح زیر است:

  • تجارت الکترونیک : برای توصیه محصولات و خدمات مختلف.
  • اینترانت‌های بنگاهی : برای پیدا کردن افراد خبره در یک زمینه خاص و یا افرادی که در رویارویی با شرایط مشابه، تجاربی کسب کرده و راه حل‌هایی یافته‌اند(بیشتر داخل یک سازمان کاربرد دارد).
  • کتابخانه دیجیتال: پیدا کردن کتاب، مقاله و ...
  • کاربردهای پزشکی: انتخاب پزشک متناسب با شرایط (مکان، نوع بیماری، زمان و ...) بیمار، انتخاب دارو و ...
  • مدیریت ارتباط با مشتری CRM : برای ارائه راهکارهایی برای حل مشکلات تولیدکننده و مصرف‌کننده در زنجیره تأمین.

می‏توان گفت که پیدایش اصطلاح "سیستم‏های توصیه ‏گر" تقریبا به اواسط دهه 1990 برمی گردد. در آن زمان، محققان بر روی ساختار‏های نرخ‏گذاری، متمرکز شده بودند. از اواسط دهه 90 تا کنون تعداد زیادی سیستم توصیه‏ گر برای کمک به کاربران در رسیدن به اطلاعات مورد علاقه شان پیاده سازی شده اند. سیستم GCBR و سیستم GroupLens، توصیه‏ گر مقالات و اخبار یوزنت وBellcore Video Recommender سیستم پیشنهاد فیلم نیز در ادامه طراحی و پیاده سازی شدند.
سیستم پیشنهاد آهنگ که با استفاده از تعاملات کاربر درون شبکه‏های اجتماعی و دیگر داده ‏های انتشار یافته درون حوزه داده‏های پیوندی باز، همچنین با بهره گیری از تکنولوژی وب معنایی، استخراج سه‏تایی‏های RDF از وب سایت‏های آهنگ و پرس‏وجوی معنایی روی آنها، پیشنهادات خود را ارائه می‏دهد، نیز یکی از این سیستم‏ها می‏باشد.
شیوه پیشنهاد دهی جدید گفته شده در ترجیحات دیگر کاربران در سیستم اشتراکی چندرسانه‏ای را بر اساس دانش کشف شده در شبکه اجتماعی چند بعدی(MSN)، فراهم می‏کند. این سیستم، فعالیت‏های کاربران را در لایه های جداگانه‏ی MSN در نظر می‏گیرد. این روند و وزن-دهی شخصی‏ به هر لایه، توصیه‏ها را شخصی می‏کند. علاوه بر این سیستم‏های عملیاتی، تحقیقاتی نیز در زمینه ی ترکیب سیستم‏های توصیه‏گر و ساخت کاراترین سیستم ممکن توسط
Bruke[1][2] ,Balabanovi [3] , Nquyen[4] انجام شده است.
برخی کارها به دسته ‏بندی برچسب‏ های کاربران در شبکه‏های اجتماعی پرداخته‏اند. سیستم توصیه‏گر اجتماعی معرفی شده در به تقسیم برچسب‏ها به چهار دسته می‏پردازد. این سیستم ابتدا فرض می‏کند که مفهوم برچسب، در پایگاه‏های دانشی مثل Yago موجود است و سپس آن را به معنی مرتبط نگاشت می‏کند.
اگر مفهوم برچسب در هیچ پایگاهی موجود نبود، با استفاده از تکنیک‏های پردازش زبان، جداکردن برچسب‏ها و سپس تشخیص نقش برچسب مانند اسم و فعل و غیره، آن را به یک واحد معنایی‏‏ موجود در پایگاه دانش نگاشت و سپس دسته ی معادل آن واحد را بدست می‏آورد.
سیستم های توصیه گر به عنوان نمونه ای از سیستم های پشتیبانی تصمیم یا تصمیم یار شناخته می شوند که در دهه ی 90 میلادی به عنوان یک شاخه ی مستقل پا به عرصه ی تحقیق و پژوهش گشودند. از این سیستم ها به عنوان یکی از راه حل های رویارویی با مساله ی سربار اطلاعات در وب یاد می شود. اگر چه دامنه ی کاربرد استفاده از سیستم های توصیه گر بسیار گسترده می باشد ولی کاربرد آن در زمینه تجارت الکترونیک بیشتر به چشم می آید.
از یک سو کسب و کارهای فعال در زمینه ی تجارت الکترونیک برای جذب مشتری بیشتر در بازار پر رقابت مذکور نیازمند این سیستم ها هستند و از سوی دیگر مشتری نیازمند یاری رسانی در خیل عظیم و رو به رشد کالا و به همان نسبت اطلاعات مربوط به آنها است تا بتواند از میان تعداد گزینه های پیش رو مناسب ترین آنها را برگزیند. [5]
سیستم های توصیه گر عمده ترین فناوری بازیابی شخصی سازی شده ی اطلاعات هستند که غالبا به دو شکل عمل می کنند [6]:
(1) پیش بینی اینکه آیا یک کالای خاص مورد علاقه یک کاربر (مشتری) خاص هست یا خیر؟
(2) پیش بینی دسته ای کالا که احتمالا مورد پسند یک کابر قرار خواهد گرفت. به این ترتیب سیستم های توصیه گر از یک سو موجب جلب رضایت مشتری و از سوی دیگر افزایش فروش خواهند شد. [7]

تکنیک‏های بکار رفته از پردازش زبان طبیعی


برای بهبود معیار بازیابی (Recall) و درستی (Precision) سیستم، باید کلمات کلیدی متعلق به یک ریشه ی زبانی تشخیص داده شوند و یا به عبارت دیگر، ریشه‏ یابی یا ریخت‏شناسی شوند.
ریخت‏شناسی بخشی از علم پردازش زبان طبیعی است که به بررسی ساختار کلمات و ریشه‏یابی واژگان می‏پردازد. به عمل بیرون آوردن ریشه اصلی یک واژه، ریشه ‏یابی (stemming) گویند.
ریشه ‏یابی باعث بهبود چشمگیر پیشنهادات سیستم می‏شود. برای مثال، "نتایج" و "نتیجه ‏ها" یک معنی دارند؛ اما با مقایسه مستقیم توسط ماشین، دو کلمه متفاوت تشخیص داده می‏شوند. با ریشه‏یابی، هر دو به کلمه ی یکسان "نتیجه" تبدیل خواهند شد و میزان شباهت اسناد دربرگیرنده خود به یکدیگر را بالا خواهند برد. پس بهتر است با تبدیل هر دو کلمه به ریشه‏شان، آنها را دو کلمه یکسان در نظر گرفت.
در ریشه یابی کلمات کلیدی، از یک ریشه یاب معنایی بهره گرفته شده است. بدین صورت که فرهنگ لغتی شامل تمامی لغات فارسی تهیه گردیده و در ریشه یابی لغات، حذف پسوندها به ترتیبی خاص صورت پذیرفته و صحت نتیجه ی جاری از طریق معنادار بودن کلمه و وجود آن در فرهنگ لغت، مورد بررسی قرار می گیرد. لغاتی مانند جمع های مکسر جزو استثنائات محسوب می گردند؛ بنابراین فرهنگ لغتی نیز حاوی جمع های مکسر تهیه شده و ریشه ی این لغات مستقیماً بیان می گردد.
پس از مرحله ی یافتن ریشه ی هر لغت، مرحله ی نگاشت کلمه کلیدی به یک واحد معنایی در شبکه ی واژگان فارس‏نت می‏باشد. نحوه‏ی کار به این صورت است که شبکه واژگان، لغات را در گروه‏های هم ‏خانواده قرار می‏دهد.
هر کدام از این گروه‏ها شامل لغاتی است که در یک متن می‏توانند به جای یکدیگر استفاده شوند و بیانگر یک مفهوم خاص هستند که به وسیله مفاهیم معنایی و روابط لغوی به یکدیگر مرتبط می‏شوند که نتیجه این کار شبکه‏ای است متشکل از لغات و مفاهیم که از نظر معنایی با یکدیگر ارتباط دارند. بنابراین می‏توان به جستجو در بین لغات یک شبکه واژگان، هم از نظر املایی و هم از نظر معنایی پرداخت.

سیستم توصیه‏ گر پیشنهادی

در هر سیستم توصیه ‏گری هدف نهایی، تصمیم به توصیه یا عدم توصیه یک آیتم به یک کاربر می‏باشد. سیستم توصیه‏گر پیشنهادی با بررسی تعدادی مقاله ی جدید ورودی، توصیه یا عدم توصیه آنها به کاربر جاری را تصمیم‏گیری می‏کند. به بیان دقیق‏تر این سیستم با بررسی مقالات خوانده شده توسط کاربر و تشخیص دسته ی آنها که مشخص کننده دسته ‏های مورد علاقه کاربر می‏باشد؛ پس از تشخیص دسته ی یک مقاله ی جدید، در مورد پیشنهاد به خواندن این مقاله به کاربر تصمیم می‏گیرد. یکی از ویژگی‏های اصلی هر مقاله، کلمات کلیدی هستند؛ زیرا آنها موضوع اصلی مقاله را بیان می‏کنند. بنابراین با تشکیل برداری از کلمات کلیدی مقالات و مقایسه ی بردار دو مقاله، می‏توان شباهت موضوعی مقالات را تشخیص داد. برای رسیدن به دقت بالاتر بایستی حوزه معنایی کلمات کلیدی مقاله مشخص شوند. بدون این کار دو کلمه کلیدی هم‏خانواده ظاهراً متفاوت، مانند "سیستم پیشنهادکننده" و "سیستم توصیه ‏گر"، غیرمتشابه می‏باشند. برای تشخیص حوزه معنایی یک کلمه باید آن را به واحد معنایی مربوطه‏اش نگاشت داد. برای تحقق این امر، استفاده از ریشه کلمه به جای خود آن، نتایج بسیار مناسب‏تری را به ‏همراه خواهد داشت. در سیستم توصیه‏گر پیشنهادی با گرفتن کلمات کلیدی هر مقاله و ریشه‏یابی آنها و سپس نگاشت به واحد معنایی موجود در شبکه واژگان فردوس‏نت، در واقع دسته یک مقاله به طور معنایی مشخص می‏شود. با انجام عملیات گفته شده در فوق، مثلاً دو مقاله "سطوح دسترسی در شبکه‏های Ad-Hoc" و "امنیت در شبکه‏های بی‏سیم" (به ‏درستی) در یک دسته قرار خواهند گرفت. اما با بررسی صرفاً خود کلمات کلیدی بصورت خام، تشابه بسیار کمتری برای آنها درنظر گرفته خواهد شد که در نتیجه ی آن، به کاربری که یکی را خوانده، دومی از طرف سیستم (به غلط) توصیه نخواهد شد. عملکرد سیستم توصیه‏گر پیشنهادی متشکل از دو قسمت است: یادگیری و تست. در بخش یادگیری، تعدادی مقاله به عنوان ورودی به سیستم داده شده و حوزه معنایی و تمام کلمات هم‏خانواده کلمات کلیدی آنها، با ثبت دسته‏ی مقاله، درون پایگاه داده ذخیره می‏شوند. در بخش تست نیز ورودی، مقاله ی جدیدی است که سیستم می‏خواهد روی توصیه‏کردن یا نکردن آن به کاربر، تصمیم بگیرد. در این بخش، کلمات کلیدی مقاله ی جاری پس از طی مراحل پردازش زبانی و معنایی گفته شده در بخش یادگیری، با کلمات و عبارات هر دسته که در پایگاه داده ذخیره شده‏اند، مقایسه می‏شوند. در این مقایسه، زاویه بین برداری از کلمات کلیدی مقاله جدید با بردار کلمات کلیدی دسته ی موجود در پایگاه داده، با استفاده از شباهت کسینوسی محاسبه می‏شود. با توجه به این نوع شباهت معنایی، هر چه کسینوس زاویه ی بین دو بردار کمتر باشد، آن دو بردار تطابق بیشتری داشته و در نتیجه شباهت بیشتری دارند. پس از مقایسه فوق به ازای هر دسته، دسته ی با بیشترین مقدار شباهت به مقاله ی جدید، به عنوان حوزه ی موضوعی آن، تشخیص داده می‏شود. پس اگر دسته ی تشخیص داده شده، جزو دسته‏های مورد علاقه کاربر بود (یعنی دسته‏ هایی که کاربر سابقه خواندن چندین مقاله ی آنها را دارد)، این مقاله به او برای خواندن پیشنهاد می‏شود.

ارزیابی سیستم

در سیستم پیشنهادی، تکنولوژی‏های وب معنایی، مانند داده‏های پیوندی، برای حل مشکل "شروع آهسته" و یا به‏طورکلی "پراکندگی داده" به ‏کار می‏روند. بنابراین مجموعه داده‏ای که پراکندگی بسیاری را در ماتریس نرخ‏گذاری کاربر-آیتم خود داشته باشد، محک خوبی برای ارزیابی این نوع سیستم خواهد بود. از طرف دیگر به دلیل موجود نبودن مجموعه داده‏ای مناسب به زبان فارسی، جهت ارزیابی سیستم‏های توصیه‏گر همراه با داده‏ها و ارتباطات بین کاربری در شبکه‏ای اجتماعی، تصمیم به مونتاژ کردن سیستم پیشنهادی به زبان انگلیسی و ارزیابی آن در بستری به این زبان گرفته شد. به همین دلیل، مجموعه داده Epinions انتخاب شده است. این مجموعه توسط Paolo Massa در یک خزش تولید شده است و شامل حدود 132هزار کاربر با تعداد 13,668,319 نرخ روی حدود 1,560,144 مقاله/کتاب می‏باشد. بنابراین پراکندگی داده در جدول نرخ‏های کاربر-آیتم طبق فرمول (2) حدود 0.99993 می‏باشد و چون این عدد نزدیک به یک است، پراکندگی این مجموعه داده، بسیار زیاد می‏باشد. در فرمول فوق نماد R بیانگر مجموعه نرخ‏ها، I مجموعه آیتم‏ها و U مجموعه کاربران می‏باشد. نماد || نیز اندازه مجموعه را بیان می‏کند. به‏عنوان نمونه |R| یعنی تعداد نرخ‏ها. علاوه بر پراکندگی بسیار داده در این مجموعه، دلیل دیگر انتخاب آن برای ارزیابی، موجود بودن ارتباط بین کاربران می‏باشد. همان‏طور که قبلا نیز توضیح داده شد، در سیستم پیشنهادی از روی روابط بین کاربران و شباهت سلایق آنها به یکدیگر، اقدام به تکمیل پروفایل‏ها می‏شود که با این‏کار حوزه‏های بیشتر مورد علاقه کاربران تشخیص داده می‏شوند. این روابط بین کاربری در یک شبکه اجتماعی و توسط خود کاربران ایجاد شده است. به دلیل موجود بودن ارتباطات بین کاربران، مجموعه Epinions یک شبکه اجتماعی نیز می‏باشد و با استفاده از آن می‏توان تاثیر تکمیل پروفایل کاربران را از روی کاربران مشابه مرتبط با آنها در افزایش صحت پیشنهادات سیستم مشاهده کرد. کاربران در این شبکه اجتماعی با بازدید نرخ‏ها و توضیحات دیگر کاربران روی آیتم‏هایی که خودشان قبلاً بازبینی کرده‏اند، اقدام به برقراری ارتباط اعتماد از خود به کاربران مشابه خود می‏کنند. به عنوان نمونه فرض کنید که کاربر A پس از خواندن کتابی به آن نرخ 5 (بالاترین میزان علاقه) را می‏دهد. این کاربر وقتی با مشاهده نظرات و نرخ کاربر B متوجه می‏شود که او نیز به همان کتاب یا چندین کتاب مشابه دیگر ابراز علاقه بالا کرده‏ است، به آن کاربر اعتماد کرده و سعی می‏کند سایر کتبی که کاربر B به آنها علاقه دارد را نیز بخواند. در واقع کاربر A کاربر B را در نظرات و علاقه‏ها و روحیات شبیه خودش تشخیص می‏دهد. بنابراین از اعتماد کاربر A به کاربر B می‏توان در جهت تکمیل پروفایل A و تشخیص بیشتر علاقه‏های وی استفاده کرد. در این مجموعه، 841,372 ارتباط بین کاربری (717,667 اعتماد و 123,705 عدم اعتماد) وجود دارد که حدود 85 هزار کاربر این اعتماد/عدم ‏اعتماد را دریافت کرده‏اند؛ که به ازای هر یک می‏توان به تکمیل خودکار پروفایل وی از روی علاقه‏های کاربران مورد اعتماد او اقدام کرد و در نتیجه، کتابهایی را (بدرستی) به وی توصیه کرد که مشابه کتب خوانده شده او نباشند اما مورد علاقه ی کاربران مورد اعتماد وی باشند. پس می‏توان گفت که با استفاده از تکنولوژی شبکه‏های اجتماعی و ارتباط بین کاربران، میزان معیار Recall بالاتر خواهد رفت و سیستم توصیه‏گر دقیق‏تری را خواهیم داشت. در زیر معیارهایی برای ارزیابی "صحت پیش‏بینی‏ها"ی سیستم در مورد آیتم‏های مورد علاقه کاربران و "صحت دسته‏بندی" آیتم‏ها (به دو دسته آیتم‏های مورد توصیه و عدم توصیه به کاربر) توسط سیستم، بیان خواهند شد.

انواع سامانه‌های توصیه‌گر

سامانه‌های توصیه‌گر به طور کلی به سه دسته تقسیم می‌شوند؛ در رایج‌ترین تقسیم‌بندی، آنها را به سه گروه ۱.محتوا محور ۲.دانش محور و ۳.صافی سازی تجمعی، تقسیم می‌کنند، که البته گونه چهارمی تحت عنوان Hybrid RS هم برای آنها قائل می‌شوند.

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

در روش محتوا محور، اقلام پیشنهادی، به این دلیل که با اقلامی که کاربر فعال (کاربری که قرار است به او توصیه کنیم) نسبت به آنها ابراز علاقه کرده‌است شباهت‌هایی دارند، به کاربر توصیه می‌شوند ولی در CF، لیست اقلام پیشنهادی، بر اساس این اصل که، کاربرانی، مشابه کاربر فعال، از آنها رضایت داشته‌اند تهیه می‌شود. از این رو واضح است که در روش محتوامحور، تمرکز بر روی یافتن شباهت بین اقلام بوده، در حالی که در CF، تمرکز روی یافتن شباهت بین کاربران است؛ بدین ترتیب که پیشنهادات در CF، بر اساس تشابه رفتاری کاربرفعال با کاربران دیگر صورت می‌گیرد و نه بر اساس تشابه ویژگی کالاهای پیشنهادی با ویژگی‌های کالاهای مورد علاقه وی (کاربر فعال).

اما گونه سوم این سیستم‌ها را با نام سیستم‌های دانش محور می‌شناسند.این سیستم‌ها براساس ادراکی که از نیازهای مشتری و ویژگی‌های کالاها پیدا کرده‌اند، توصیه‌هایی را ارائه می‌دهند. به عبارتی در این گونه از سیستم‌های توصیه‌گر مواد اولیه مورد استفاده برای تولید لیستی از پیشنهادها، دانش سیستم در مورد مشتری و کالا است. سیستم‌های دانش محور از متدهای مختلفی که برای تحلیل دانش، قابل استفاده هستند بهره می‌برند که متدهای رایج در الگوریتم‌های ژنتیک، فازی، شبکه‌های عصبی و ... از جمله آنهاست. همچنین، در این گونه سیستم‌ها از درخت‌های تصمیم، استدلال نمونه‌محور و ... نیز می‌توان استفاده کرد. یکی از رایج‌ترین متدهای تحلیل دانش درسیستم‌های توصیه‌گر دانش محور ،CBR یا روش استدلال نمونه‌محور است.

گونه چهارم سیستم‌های ترکیبی هستند. طراحان این نوع سیستم‌ها دو یا چند گونه از انواع سه‌گانه مذکور را غالباً به دو منظور با هم ترکیب می‌کنند؛ ۱- افزایش عملکرد سیستم ۲- کاهش اثر نقاط ضعفی که آن سیستم‌ها وقتی به تنهایی به کار گرفته شوند، دارند. از میان سه روش موجود (CF و CB و KB)، غالباً روش CF یک پای ثابت این ترکیبات است.

آزمایش‌ها

برای به دست آوردن یک سیستم توصیه گر راه های مختلفی وجود دارد که یکی از این روشها استفاده از روش Clustering است. به این صورت که تمام instance های موجود در دیتا ست دسته بندی میشوند و در صورت ایجاد شدن Instance جدید با ارائه دسته ای که آن Instance در آن جای میگیرد به مخاطب یک سری موارد جدید نشان داده ایم که تا حد زیادی به درخواست او نزدیک است. ساده ترین راه یادگیری Plain Memorization یا حفظ کردن ساده میباشد. به این صورت که فقط تمام Instance ها را ذخیره میکنیم و Instance های جدید را با مقایسه کردن با موارد موجود کلاس بندی میکنیم. البته در واقع تمام روش های Learning هم به همین صورت عمل میکنند. و اما روش انتخابی ما استفاده از روش Instance Based Learning است . در این روش هر Instance جدید با Instance های موجود با استفاده از یک تابع فاصله مقایسه شده و از نزدیک ترین Instance موجود برای اضافه کردن به کلاس مورد نظر استفاده میشود. در این روش مثال های یادگیری به صورت کاملا دقیق و یکسان در دیتابیس ذخیره شده و تابع فاصله مشخص میکند که کدام Instance به کدام کلاس تعلق دارد. تنها مشکلی که باقی میماند مشخص کردن یک تابع فاصله است. اگرچه امکانات دیگری هم وجود دارد اما بیشتر Instance Based Learners ها از تابع فاصله ی اقلیدسی استفاده میکنند. $${\sqrt{(a1.1-a1.2)^2+(a2.1-a2.2)^2+...+(ak.1-ak.2)^2}}$$ به صورت که k در اینجا تعداد Attribute ها و a مقدار Attribute در هر Distance میباشد. هر چه قدر مقدار توان را از 2 افزایش دهیم میزان تاثیر اختلاف زیاد بین Instance ها را افزایش داده ایم. ![A kD-Tree](http://publications.csail.mit.edu/abstracts/abstracts07/hon/Example1.jpg) در آزمایش انجام شده در این پروژه ( کد برنامه در لینک گیت هاب بالای صفحه وجود دارد) یک دیتاست از رتبه ی 5 سایت ارزیابی فیلم به 13000 مثال train شده است. [10] که رتبه ی 3 سایت از 5 سایت از 100 بوده و امتیاز یک سایت از 5 و سایت دیگر از 10 میباشد. به اینصورت که کاربر نظر خود را بین اعداد 0 تا 100 بیان میکند و سیستم سعی میکند نزدیک ترین فیلم به نظر کاربر را در میان دیتاست به او معرفی کند. بعد از انجام چندین آزمایش توسط زبان پایتون میانگین زمان طول کشیده برای بدست آوردن جواب بهینه 13.76 ثانیه میباشد. اگر چه Instance Based Learning ساده و موثر است اما مقایسه کردن هر Instance با Instance های موجود کاری بسیار سخت و کند است. و مرتبه ی زمانی آن از مرتبه ی تعداد Instance های Dataset است. به همین منظور ما از روش بهینه تر Kd-Tree که روش بهینه تر برای instance based learning است استفاده خواهیم کرد. که یک درخت باینری است که فضای ورودی را تقسیم میکند و این کار را تا جایی که هر Instance در یک بخش قرار گیرد , به صورت بازگشتی ادامه میدهد. همه ی برش ها به صورت موازی با محورهای نمودار K-Dimensional است که در اینجا k نشان دهنده ی تعداد Attribute های ما میباشد. به طور مثال در تصویر زیر نقاط (7,4) , (2,2) , (6,7) , (3,8) در یک فضای حالت 2 بعدی ( 2 اتریبیوت ) ترسیم شده اند. ![A kD-Tree](http://oi62.tinypic.com/in4fio.jpg) بعد از تقسیم کردن فضای حالت درخت تصمیم ما به صورت شکل زیر تولید میشود. ![A kD-Tree](http://oi58.tinypic.com/11sdt9k.jpg) یک روش مناسب برای اتخاب یک محور برای برش محاسبه ی واریانس نقاط دیتا در طول هر محور میباشد. و یک روش خوب برای پیدا کردن نقطه ی برش پیدا کردن میانه نقاط روی آن محور است. برای جلو گیری از ایجاد اشکال لاغر و دراز بهترین راه این است که تقسیم ها در محورهای مختلف انجام گیرد. بعد از انجام تقسیم بندی هر ناحیه فقط شامل یک نقطه میشود به این صورت که هر نقطه از Training Set مطابق با شکل زیر به یک نود از درخت مرتبط میشود. ![A kD-Tree](http://oi60.tinypic.com/dpidzm.jpg)
  • نقطه ی هدف در این شکل به صورت ستاره نمایش داده شده است.
  • برگی از درخت که شامل نود تارگت است به صورت سیاه نمایش داده شده است که البته به صورت لزوم نزدیک ترین نقطه به نقطه ی هدف نیست ولی به هر حال یک تقریب بسیار خوب است.
  • در هر صورت اگر قرار باشد نقطه ای نزدیک تر به هدف وجود داشته باشد باید در داخل دایره ی نقطه چین قرار داشته باشد.
برای اینکه متوجه شد که آیا نقطه ی بهتری وجود دارد یا نه باید نود Sibling یا همسایه نود هدف هم بررسی شود. نود سیبلینگ نود سیاه به صورت سایه دار نمایش داده شده است که چون دایره تماسی با آن ندارد شامل نقطه ی نزدیک تر نمیباشد , پس دوباره به نود پدر مراجعه میشود و سیبلینگ این نود هم مقایسه میشود.

امتیازات

این الگوریتم به مراتب سریع تر از الگوریتم Nearest Neighbour مطرح شده است. با توجه به عمق درخت این الگورتم در اوردر لوگاریتم از تعداد Train ها جواب بهینه را به ما میدهد. مزیت دیگر این الگوریتم این است که Example های جدید به راحتی و در هر زمانی میتوانند به درخت حالت اضافه شوند. نتیجه ی زمانی به دست آمده از این الگوریتم روی همان دیتاست مطرح شده در بالا به میزان متوسط 9.03 ثانیه کاهش پیدا کرد. برای این الگوریتم هم بازهم روش های بهینه سازی زیادی وجود دارد که در قسمت بهینه سازی به آن اشاره خواهد شد.

بهینه سازی

همانطور که مشاهده کردیم , درخت های Kd ساختمان های داده های بسیار خوبی برای پیدا کردن نزدیک ترین همسایه به صورت بهینه هستند. اما این الگوریتم مطلق کامل نیست . دیتا ست های ناموزون (skewed datasets) یک تناقض کامل را بین تمایل به بالانس بودن درخت و ایجاد شدن ناحیه های مربعی ایجاد میکنند . در واقع ما همیشه به دنبال این هستیم که ناحیه تقسیم بندی شده ی دیتاست کاملا موزون بوده و اشکال به مربع نزدیکتر باشند در این صورت است که میتوان گفت Instance ها به صورت همگن پخش شده اند. مهم تر از آن مستطیل ها - حتی مربع ها - به خاطر گوشه هایشان بهترین اشکالی نیستند که میتوان استفاده کرد . اگر دایره ی هاشور زده شده در شکل بالا کمی بزرگتر بود ممکن بود با گوشه ی راست و پایین مستطیل واقع در قسمت چپ و بالای شکل تداخل داشته باشد , که البته این امکان وجود داشت اگر Instance سیاه کمی از نقطه ی هدف دورتر بود , در این صورت باید آن مستطیل هم برای امکان وجود داشتن نزدیکترین همسایه مورد جستجو قرار میگرفت . راه حل این است که به جای استفاده از Hyperrectangle ( ابر مکعب مستطیل ) از Hyperspheres ( ابر کره ) استفاده شود. کره های همسایه ممکن است با هم اشتراک داشته باشند , ولی این مساله مشکلی به وجود نمی آورد به این دلیل که الگوریتم Nearest Neighbor برای درخت های kD-Trees به منطقه های گسسته وابسته نیستند . یک Data Structure به نام ball tree کره ( ball ) های k بعدی را تعریف میکند که دیتا های Train شده را پوشش میدهند و در نهایت آنها را در درخت مورد نظر قرار میدهد. تصویر زیر نشان دهنده ی 16 Training Instance در یک فضای دو بعدی است که به وسیله ی یک Pattern از دایره های دارای اشتراک پوشش داده شده . ![A ball-Tree](http://oi57.tinypic.com/2yxp36t.jpg) و تصویر زیر نشان دهنده ی درخت تولید شده توسط این دایره ها است . ![A ball-Tree](http://oi57.tinypic.com/2yvp7gg.jpg)
  • دایره ها در لایه های مختلف از درخت توسط اشکال مختلف هاشور مشخص شده اند .
  • دایره های کوچکتر توسط سایه ی خاکستری نمایان شده اند .
  • هر نودی از درخت نمایانگر یک ball (دایره) است .
  • نود ها به صورت انجمنی رنگ زده شده اند تا کار تشخیص لایه نود ها آسان شود
برای اینکه امر فهمیدن درخت برای شما آسان تر شود اعدادی در نود ها قرار داده شده اند که نشان دهنده ی تعداد Instance هایی است که فرض شده در داخل دایره قرار دارد . اما دقت داشته باشید که این عدد لزوما نشان دهنده ی نقاطی که ball پوشش میدهد نیست زیرا بعضی اوقات نواحی در لایه های مختلف با هم تداخل دارند ولی نقاطی که در نواحی مشترک قرار دارند فقط به یکی از نود ها assign میشوند . در نظام عمل به جای تعداد Instance های شامل شده در شکل بالا نود های یک ball tree واقعی مرکز و شعاع دوایر مربوط به خود را نگه میدارند و برگ های درخت علاوه بر این اطلاعات لیستی از point های شامل شونده را هم نگه میدارند . برای استفاده از یک ball tree برای پیدا کردن نزدیک ترین همسایه به یک نود هدف (target) درخت را به روش top-down برای پیدا کردن نود برگی که Instance هدف را شامل میشود جستجو میکنیم . سپس نزدیک نقطه به هدف در آن دایره را درنظر میگیریم . این نقطه یک حد بیشینه ( upper bound ) از فاصله ی نود تارگت تا نزدیک ترین همسایه ی واقعی نقطه را به ما میدهد. که البته خود نتیجه هم به مقدار بالایی قابل اتکا است . بعد دقیقا مانند kD-tree نود برادر (sibling) وارسی میشود , اگر فاصله تا مرکز نود برادر بیشتر از شعاعش به اضافه حد بیشینه ی فعلی شد , این نود ممکن نیست نقطه ای نزدیک تر را شامل شود , در غیر اینصورت نود برادر برای یافتن نقطه ی نزدیکتر در نود های پایین تر باید جستجو شود. به طور مثال در تصویر زیر نقطه ی هدف توسط یک ستاره مشخص شده است و نقطه ی سیاه نشان دهنده ی نزدیکترین نقطه ی یافت شده تا نقطه ی هدف تا کنون است . ![A ball-Tree](http://oi60.tinypic.com/mcq654.jpg) تمام فضای دایره ی خاکستری میتواند نادیده گرفته شود . این ناحیه نمیتواند دارای نقطه ی نزدیک تر باشد به این دلیل که مرکز این دایره بسیار دور است . به همین روش و به صورت recursive درخت را تا رسیدن به root جستجو میکنیم تا دایره ای را که امکان داشتن نقطه ی نزدیکتر و دارای فاصله ی کمتر از upper bound را پیدا کنیم . درختهای کره ای (ball tree) با استفاده از روش top-down ساخته میشوند و مهمترین مساله پیدا کردن یک روش مناسب برای تقسیم کردن یک ball شامل چند data point به دو ball کوچکتر است . در عمل شما لازم نیست تا جایی که ball های برگ دارای فقط دو نقطه باشند پیش بروید , بلکه میتوانید خیلی قبل تر یعنی جایی که یک تعداد از قبل معین شده از نقاط برقرار شد این کار را متوقف کنید - این اتفاق برای kD-tree هم میافتد . در اینجا به توضیح یک روش تقسیم فضا که در پیاده سازی هم از آن کمک گرفته شده میپردازیم : نقطه ای از دایره که در دورترین فاصله از مرکز قرار دارد را در نظر میگیریم , سپس دومین نقطه را به صورتی که در دورترین فاصله از نقطه ی اول باشد را در نظر میگیریم . در نهایت تمام نقاط درون دایره را به نزدیکترین نقطه از بین این دو نقطه ی ذکر شده نسبت میدهیم . سپس برای محاصبه ی شعاع این cluster ها کمترین شعاعی از نقاط که میتواند تمام نقاط assign شده را دربرگیرد نمایان گر شعاع این cluster ها است. این روش این مزیت را دارد که هزینه ی تقسیم کردن یک دایره در ضریب پیچیدگی از اوردر خطی از تعداد نقاط داخل همان دایره است . روش های دارای جزییات بیشتر و الگوریتم های دیگری هم برای تقسیم کردن یک ball وجود دارد که دایره های دقیق تری تولید میکنند که در قسمت کارهای آینده به آنها اشاره خواهد شد .

نتایج

همانطور که پیش تر گفته شد هر دو الگوریتم kNN , kD-Tree الگوریتم های کامل هستند و همواره بهترین نتیجه را به ما برمیگردانند. در نتیجه نمیتوان میزان دقت این الگوریتم های مطرح شده را سنجید زیرا هر دو در حالت بهینه شده یک جواب را به ما میدهند. در تنها حالت موجود میتوان میزان رضایت مخاطب را در نظر گرفت در حالی که این کار نیز در مجال پروژه ما نیست زیرا به طور مثال برای دیتا ست بررسی شده در بالا محاسبه کردن میزان رضایت مخاطب نیاز مند یک پایگاه داده بسیار بزرگ از فیلم ها و یک سایت ارزیابی فیلم است که تعداد بالایی از کاربرها بتوانند در آن سایت ثبت نام کرده و بعد از وارد کردن نظر خود درخواست مشاهده Recommendation کنند و بعد نظر خود را در مورد موارد پیشنهاد شده داده تا بتوان دقت الگوریتم ها را سنجید . به هر حال ما در این قسمت میزان زمان اجرا و جواب نهایی و فاصله ی این جواب تا Instance ورودی را در الگوریتم های بررسی و پیاده سازی شده در نظر میگیریم. 3 الگوریتم بررسی شده عبارتند از :
  • k-nearest neighbor
  • kD-tree اولیه
  • kD-tree بهینه شده
نتیجه آزمایش های انجام شده بر طبق جدول زیر میباشد :

نتایج الگوریتم k-nearest neighbor

Instance ورودی خروجی جواب بهینه فاصله تا جواب بهینه زمان الگوریتم درصد خطا
[45,45,45,45,45] [46, 47, 40, 46, 40] [46, 47, 40, 46, 40] 0 ثانیه 1.22 0%
[72,72,72,72,72] [68, 72, 80, 75, 70] [68, 72, 80, 75, 70] 0 ثانیه 1.22 0%
[67,67,67,67,67] [67, 71, 60, 71, 70] [67, 71, 60, 71, 70] 0 ثانیه 1.18 0%
[13,13,13,13,13] [10, 13, 20, 13, 10] [10, 13, 20, 13, 10] 0 ثانیه 1.23 0%
[23,23,23,23,23] [28, 23, 20, 23, 20] [28, 23, 20, 23, 20] 0 ثانیه 1.17 0%
  • توجه شود که الگوریتم فقط از کاربر درخواست یک عدد میکند که نشان دهنده ی نظر کاربر به فیلم مورد نظر از 1 تا 100 است و خود الگوریتم Instance نمونه را به صورت لیست 5 تایی از عدد وارد شده میسازد.

نتایج الگوریتم kD-tree اولیه

Instance ورودی خروجی جواب بهینه فاصله تا جواب بهینه زمان الگوریتم درصد خطا
[45,45,45,45,45] [44, 35, 60, 35, 50] [46, 47, 40, 46, 40] 27.730 ثانیه 0.98 0.011%
[72,72,72,72,72] [72, 82, 40, 62, 80] [68, 72, 80, 75, 70] 44.553 ثانیه 1.03 0.039%
[67,67,67,67,67] [67, 74, 80, 64, 70] [67, 71, 60, 71, 70] 21.400 ثانیه 0.95 0.023%
[13,13,13,13,13] [14, 21, 0, 7, 20] [10, 13, 20, 13, 10] 24.819 ثانیه 0.83 0.013%
[23,23,23,23,23] [24, 29, 40, 18, 30] [28, 23, 20, 23, 20] 24.020 ثانیه 0.74 0.105%

نتایج الگوریتم kD-tree بهینه شده

Instance ورودی خروجی جواب بهینه فاصله تا جواب بهینه زمان الگوریتم درصد خطا
[45,45,45,45,45] [46, 47, 40, 46, 40] [46, 47, 40, 46, 40] 0 ثانیه 1.01 0%
[72,72,72,72,72] [68, 72, 80, 75, 70] [68, 72, 80, 75, 70] 0 ثانیه 1.07 0%
[67,67,67,67,67] [67, 71, 60, 71, 70] [67, 71, 60, 71, 70] 0 ثانیه 1 0%
[13,13,13,13,13] [10, 13, 20, 13, 10] [10, 13, 20, 13, 10] 0 ثانیه 0.92 0%
[23,23,23,23,23] [28, 23, 20, 23, 20] [28, 23, 20, 23, 20] 0 ثانیه 0.87 0%

۲. کارهای آینده

روش های دارای جزییات بیشتر و الگوریتم های دیگری هم برای تقسیم کردن یک ball وجود دارد که دایره های تنگ تر (tighter) را تولید میکنند و در نتیجه دقت الگوریتم را افزایش میدهند ولی این الگوریتم ها نیاز مند محاسبات بیشتر هستند .
که در اینجا مجال صحبت کردن در مورد االگوریتم های پیچیده برای ساختن ball tree ها یا update کردن آنها در حین ورود Instance جدید , نیست .
یکی دیگر از کارهایی که میشود در این مورد انجام داد این است که به جای ذخیره کردن تمام Training Instance ها میتوان آنها را به منطقه هایی فشرده کرد.
و کار ما فقط ذخیره کردن range ای از مقادیر است که برای هر attribute دیده شده اند .
یک روش دیگر ساختن interval (فاصله) برای هر attribute است تا از training set استفاده شود تا تعدادی که هر کلاس برای هر interval در هر attribute اتفاق می افتد را بشمارد . این روش به نام voting feature intervals معروف است.

۳. مراجع

[1]Burke, R. The Wasabi Personal Shopper: A Case-Based Recommender System. In Proceedings of the 11th National Conference on Innovative Applications of Artificial Intelligence, pages 844-849. AAAI, 1999.

[2] Burke, R. Knowledge-based Recommender Systems. To appear in the Encyclopedia of Library and Information Science.
[3] Marko Balabanovic , Yoav Shoham .Content-based, collaborative recommendation (1997)
[4]Olga Averjanova, Francesco Ricci, Quang Nhat Nguyen , The Second International Conference on Mobile Ubiquitous Computing, Systems, Services and Technologies Map-based Interaction with a Conversational Mobile Recommender System , Discovery Science, 2007.
[5] Felfering A., Friedrich G., and Schmidt-Thieme L., "Recommender systems," IEEE Intelligent systems, vol. 22, pp. 18-21, 2007.
[6] Cornelis C., Lu J., Guo X., and Zhang G., "One-and-only item recommendation with fuzzy logic techniques," Information sciences, vol. doi:10.1016/j.ins.2007.07.001, 2007.
[7] Li Y., Lu L., and Xuefeng L., "A hybrid collaborative filtering method for multiple-interests and multiplecontent recommendation in E-Commerce," Expert systems with applications, vol. 28, pp. 67-77, 2005.
[8] B. Mobasher, H. Dai, T. Luo, M. Nakagawa, "Effective personalization based on association rule discovery from web usage data", Proceedings of the 3rd ACM Workshop on Web Information and Data Management, 2001 .
[9] B. Mobasher, R. Cooley, J. Srivastava, "Automatic Personalization Based on Web Usage Mining", Communications of the ACM, Vol. 43, No. 8, 2000 .
[10] دیتا ست بررسی شده
Machine Learning Course - Recommender Systems
Data Mining: Practical Machine Learning Tools and Techniques داده های ارزیابی نمونه

تایید شده

قسمت بهینه سازی خوب توضیح داده شده بود و تصاویر کاملا گویای مطلب بود
اگر تصاویر شماره داشتند و در متن به شماره ی عکس اشاره میشد بهتر بود.
قسمت نتایج هم به خوبی با جداول مشخص مشخص شده بود
قسمت کارهای آینده کم توضیح داده شده بود در حالی که کارهای خیلی زیادی میشود در این حیطه انجام داد
و من مطمين هستم خیلی از این فیلدها قابل ذکر کردن بودند.
در مورد پیاده سازی باید بگم خوب انجام شده بود
فقط فاصله ی بین جواب های خروجی برنامه و جواب بهینه مشخص نبود که البته چیز زیاد مهمی نیست
همچنین با بررسی فایل متوجه شدم که زمان اجرا بالا رفته بود زیرا در انتهای برنامه برای نشان دادن لیست نودها دوباره for روی instance ها زده شده بود ولی میشد با یکبار استفاده از dictionary زمان را کاهش داد
در مجموع نتایج و بهینه سازی و پیاده سازی همگی به نحو مناسبی توضیح داده شده بود
نمره ی مناسب 4.5 بود ولی با ارفاق 5 دادم

رد شده
تایید شده

با سلام
موضوع پروژه بسیار جالب است.

*‌ در مقدمه به خوبی و دقیق، مشکل حجم زیاد داده‌ها و چالش پروژه توضیح داده شده است. کاش کاربردهای سیستم‌های توصیه‌گر را هم، به جای کارهای مرتبط، در مقدمه توضیح می‌دادید.

  • بهینه‌سازی، بسیار خوب انجام شده بود و نتایج در حد قابل قبولی بهبود داشتند.

  • فکر می کنم recall , Precisionُ، دقت و فراخوانی ترجمه می‌شوند.

  • با توجه به تعداد زیاد تصاویر، بهتر بود برای عکس‌ها شماره تصویر می‌گذاشتید و در متن به آن ارجاع می‌دادید.

  • ارزیابی‌هایی که در بخش ارزیابی ها توضیح داده شده است، بسیار عجیب و جالب بود!

  • نتایج بسیار خوب است. فقط تعداد نمونه های دیتاست شما کم بود و زمان توصیه برای این حجم از داده زیاد به نظر می‌رسد ولی نتایج دقیق گزارش شده بود.

  • """ برای استفاده از یک ball tree برای پیدا کردن نزدیک ترین همسایه به یک نود هدف (target) درخت را به روش top-down برای پیدا کردن نود برگی که Instance هدف را شامل میشود جستجو میکنیم .""" روش را بیشتر توضیح بدهید.

*‌ با توجه به جدید بودن موضوع، کاش از مقالات جدید تری به عنوان مراجع استفاده می‌کردید

رد شده

بسم الله

سلام و خسته نباشید

توضیحات کامل بود .
به نظر می رسد نحوه عملکرد الگوریتم های مطرح شده خوب است.
توضیحات مطرح شده در قسمت ارتقای نتایج جالب بود.
اینکه به طور واضح بهبود نتایج به نمایش گذاشته شده ، بسیار خوب است.
مشخص نمودن اینکه هر مطلب را از کدام مرجع براداشته اید ، از نقاط قوت پروژه شماست

رد شده

با سلام.در بخش کارهای مرتبط بهتر بود تکنیک های استفاده شده مانند خوشه بندی یا حفظ کردن ساده را که در بخش آزمایش ها نام بردید بیشتر توضیح می دادید.
همچنین نگارش کلمات می توانست دقیق تر باشد.نتایج الگوریتم های اولیه و بهینه شده به خوبی بیان شده اند.

رد شده

به نام خدا
با سلام
این پروژه به نظر بنده در تمام جنبه ها کامل و جامع کار کرده و در هیچ یک از بخش ها کمبودی به نظر بنده نرسید
با آرزوی موفقیت

تایید شده

باسلام و خسته نباشید
توضیحات جامع و مفید بوده و در عین کامل بودن قابل فهم می باشد
مراحل انجام کار کاملا دقیق بررسی شده و نتایج هر قسمت به خوبی توصیف و تحلیل شده است
ارائه ی نتایج آزمایش در هر مرحله کاملا به جا و مناسب بود
استفاده از جدول گزارش تست ها خیلی خوب بود
بهتر بود توضیحاتی در رابطه با پیاده سازی و کدتون رو هم به گزارش اضافه میکردید
موفق باشید

تایید شده

در مورد پروژه شما نکات زیر به ذهنم میرسه :

  1. طرح ها بسیار مفهومی و زیبا و کاملا مرتبط با سطح پیاده سازی بودن.

  2. روش پیدا کردن target node خوب توضیح داده نشده بود و من زیاد نفهمیدم .

  3. قسمت نتایج هم کاملا کارا و مفید بود و نتیجه ی پروژه رو به خوبی نشون میداد، فقط اگر instance های ورودی رو میشد به جای 5 تا عدد تکراری 5 عدد متفاوت داد نتایج واقعی تر میشد.

  4. به قسمت کارهای آینده خیلی کم پرداخته شده بود در حالی که احتمالا میشد منابع زیادی رو برای بیشتر کار کردن در این مورد پیدا کرد.

  5. در مورد پیاده سازی باید بگم که متاسفانه دیتاست استفاده شده استاندارد نبود به همین دلیل تعداد instanceهای دیتا ست کم بود و چون استاندارد نیست تغییر دادن دیتاست کار سختیه، البته لزومی به استفاده از موارد قبلا مطرح شده نیست و این صرفا یک پیشنهاد میباشد.

  6. یه سوالم داشتم روش انتخابی شما برای تقسیم کردن دایره ها به نظر میاد فقط برای حالت دو بعدی صادقه و من متوجه نشدم که در حالت های چند بعدی ( چند اتریبیوتی) چه جوری میشه فضای حالت رو تقسیم کرد؟

در کل پروژه بسیار مرتب، کامل و جامع است و ایرادات گفته شده کوچک و جزیی هستند. به همین دلیل نمره 5 رو به شما دادم.
ممنون، خسته نباشید