الگوریتم کی-نزدیک‌ترین همسایه

در بازشناخت الگو کی-نزدیکترین همسایه (انگلیسی: k-nearest neighbors algorithm) یک متد آمار ناپارامتری است که برای طبقه‌بندی آماری و رگرسیون استفاده می‌شود. در هر دو حالت کی شامل نزدیک‌ترین مثال آموزشی در فضای داده‌ای می‌باشد و خروجی آن بسته به نوع مورد استفاده در طبقه‌بندی و رگرسیون متغیر است. در حالت طبقه‌بندی با توجه به مقدار مشخص شده برای کی، به محاسبه فاصله نقطه ای که می‌خواهیم برچسب آن را مشخص کنیم با نزدیک‌ترین نقاط می‌پردازد و با توجه به تعداد رای حداکثری این نقاط همسایه، در رابطه با برچسب نقطه مورد نظر تصمیم‌گیری می‌کنیم. برای محاسبه این فاصله می‌توان از روش‌های مختلفی استفاده کرد که یکی از مطرح‌ترین این روش‌ها، فاصله اقلیدسی است. در حالت رگرسیون نیز میانگین مقادیر به‌دست آمده از کی خروجی آن می‌باشد. از آنجا که محاسبات این الگوریتم بر اساس فاصله است نرمال‌سازی داده‌ها می‌تواند به بهبود عملکرد آن کمک کند.[۱][۲]

تنظیمات آماری ویرایش

فرض کنید زوج مرتب‌های (Xn,Yn),... ,(X2,Y2),(X1,Y1) از {۱٬۲} × Rd مقدار می‌گیرد. (Y نشان دهنده کلاس X است). در نتیجه خواهیم داشت: X|Y = r ~ Pr برای r = ۱٬۲ که Pr توزیع احتمال است.

با داشتن تعدادی اندازه (norm) ‖. ‖ در Rd و نقطه x، زوج مرتب‌های (X(n),Y(n)) ,... , (X(2),Y(2)),(X(1),Y(1) را که ترتیب دیگری از داده‌های اولیه هستند با شرط ǁX(n) ≤ xǁ ,... , ǁX(1) ≤ xǁ تعریف می‌کنیم.

الگوریتم ویرایش

 
مثال طبقه‌بندی: NN-  نمونه آزمایش (نقطه سبز) باید به دسته اول) کره آبی) یا دسته دوم (کره قرمز) طبقه‌بندی شود. اگر   = ۳ (دایره سیاه)، نمونه به دسته دوم اختصاص دارد؛ زیرا درون دایره سیاه درونی، ۲ کره قرمز و ۱ کره آبی وجود دارد. هم چنین اگر   = ۵ (دایره نارنجی) به دسته اول اختصاص داده می‌شود؛ زیرا در حلقه بیرونی ۳ کره آبی و ۲ کره قرمز است.

داده‌های اولیه، بردارهایی در یک فضای چند بعدی هستند که هر کدام شامل برچسبی به نام دسته می‌باشند.

فاز یادگیری (training phase) الگوریتم، شامل ذخیره‌سازی بردارهای ویژگی و برچسب دسته نمونه‌های اولیه است.

در فاز طبقه‌بندی، k یک ثابت توسط کاربر تعریف می‌شود و بردار بدون برچسب (نقطه تست) از دسته ای است که بیشترین تعداد را در k نزدیک‌ترین همسایه آن نقطه داشته باشد. به این ترتیب برچسب نقطه تست نیز مشخص می‌شود.

معیار فاصله برای متغیرهای پیوسته معمولاً فاصله اقلیدسی است.

برای متغیرهای گسسته، مانند دسته‌بندی متون، می‌توان از یک معیار دیگر مانند فاصله همینگ استفاده کرد.

اگر NN-  را با استفاده از الگوریتم‌های تخصصی مانند تجزیه و تحلیل اجزای همسایه (Neighbourhood components analysis) یا حاشیه بزرگ نزدیک‌ترین همسایه (Large Margin Nearest Neighbor) پیاده‌سازی کرد، می‌توان دقت اندازه‌گیری را به شدت بهبود داد.

یک اشکال طبقه‌بندی پایه «رای اکثریت» (majority voting) زمانی اتفاق می‌افتد که توزیع دسته درهم شکسته شود. به این معنی که تعداد زیادی از نمونه‌های یک دسته در میان نزدیک‌ترین همسایه عضو جدید بوده‌است.[۳] یکی از راه‌های غلبه بر این مشکل، وزن دادن به طبقه‌بندی بر مبنای فاصله هر یک از نمونه‌های اولیه، از عضو جدید است. دسته (یا مقدار در مسائل رگرسیون) هرکدام از k نزدیک‌ترین نقاط در وزن خود که متناسب با معکوس فاصله آن‌ها از نقطه تست است، ضرب می‌شود.

یکی دیگر از راه‌های غلبه بر این مشکل، انتزاع در نمایش داده‌ها است. برای مثال، در یک نقشه‌های خودسازمان‌دهنده (SOM)، هر گره، صرف نظر از تراکم آن‌ها در داده‌های اولیه اصلی، یک نماینده (مرکز) از نقاط مشابه است. سپس NN-  به SOM اعمال می‌شود.

مراحل الگوریتم knn شامل موارد زیر خواهد بود:[۴]

  1. داده‌های را بارگیری کنید.
  2. K به عنوان تعداد نزدیک‌ترین همسایگان انتخاب کنید.
  3. برای هر یک از داده‌های اولیه:
    1. فاصله بین داده مورد سؤال و هر یک داده‌های اولیه را محاسبه کنید.
    2. فاصله و اندیس نمونه را به یک مجموعه اضافه کنید.
    3. مجموعه را بر اساس فاصله از کوچک به بزرگ مرتب کنید.
    4. نقاط K عضو اول مجموعه مرتب شده را انتخاب کنید.
    5. بسته به حالت یا حالت طبقه‌بندی، خروجی را اعلام کنید.

به این ترتیب، کد پایتون محاسبه فاصله اقلیدسی و NN-  را در ادامه می‌بینید:

 def EuclideanDistance(x1, x2, length):
    distance = 0
    for x in range(length):
        distance += np.square(x1[x] - x2[x])
    return np.sqrt(distance)

کد زیر مربوط به الگوریتم knn گفته شده در حالت دسته‌بندی است. داده‌های اولیه، trainingSet و داده مورد سؤال testInstance نامیده شده‌است.

 def knn(trainingSet, testInstance, k):
    distances = {}
    sort = {}

    length = testInstance.shape[1]

    for x in range(len(trainingSet)):
        dist = EuclideanDistance(testInstance, trainingSet.iloc[x], length)
        distances[x] = dist[0]
    sortdist = sorted(distances.items(), key=operator.itemgetter(1))
    neighbors = []
    for x in range(k):
        neighbors.append(sortdist[x][0])
    Votes = {} #to get most frequent class of rows
    for x in range(len(neighbors)):
        response = trainingSet.iloc[neighbors[x]][-1]
        if response in Votes:
            Votes[response] += 1
        else:
            Votes[response] = 1
    sortvotes = sorted(Votes.items(), key=operator.itemgetter(1), reverse=True)
    return(sortvotes[0][0], neighbors)

انتخاب پارامتر ویرایش

بهترین انتخاب   بستگی به داده‌ها دارد؛ به‌طور کلی، مقادیر بزرگ   باعث کاهش خطا در طبقه‌بندی می‌شود، اما وضوح مرز بین کلاس‌ها را کمتر می‌کند.[۵]   مناسب را می‌توان با استفاده از تکنیک‌های مختلف انتخاب کرد. مورد خاص زمانی است که دسته پیش‌بینی شده برای عضو جدید، همان دسته نزدیکترین نمونه باشد. (به ازای k = ۱). در این صورت، الگوریتم نزدیکترین همسایه نامیده می‌شود.

دقت الگوریتم NN-  می‌تواند در نتیجه وجود خطا، یا ویژگی‌های غیر مرتبط یا اگر مقیاس داده‌ها با اهمیت آن‌ها تطابق نداشته باشد، به شدت تضعیف می‌شود. برای بهبود طبقه‌بندی، تلاش‌های زیادی در زمینه انتخاب یا مقیاس بندی داده‌ها شده‌است. یک رویکرد بسیار مشهور، استفاده از الگوریتم‌های تکاملی برای بهینه‌سازی مقیاس بندی داده‌ها است.

در دسته‌بندی‌های دو کلاس، بهتر است که k یک عدد فرد انتخاب شود؛ زیرا این امر از گره خوردن آرا جلوگیری می‌کند.

نزدیکترین همسایه ویرایش

شهودی‌ترین نوع نزدیکترین همسایه در حالت طبقه‌بندی، تنها نزدیکترین همسایه است که یک نقطه را به کلاس نزدیکترین همسایه خود اختصاص می‌دهد؛ به این معنی که (1)Clnnn(x) = Y.

هر چه تعداد داده‌های اولیه به بی‌نهایت نزدیک می‌شود، نزدیکترین همسایه در حالت طبقه‌بندی تضمین می‌کند که میزان خطا بیشتر از دو برابر خطای بایاس (حداقل خطا قابل دستیابی با توجه به توزیع داده‌ها) نخواهد بود.

خصوصیات ویرایش

kNN یک مورد خاص از پهنای باند متغیر است.[۶][۷]

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

NN-  نتایجی با سازگاری(consistency) قوی دارد. هر چه تعدا داده‌ها به بی‌نهایت نزدیک می‌شود، الگوریتم NN-  با دو دسته، تضمین می‌کند که نرخ خطا بیشتر از دو برابر نرخ خطای Bayes(حداقل خطا قابل دستیابی با توجه به توزیع داده‌ها) نباشد.[۸] هم چنین می‌توان با استفاده از گرافهای مجاورت، سرعت kNN را بهبود بخشید.[۹]

برای طبقه‌بندی NN-  چند کلاس، کاور و هارت (۱۹۶۷) ثابت می‌کنند که حد بالای نرخ خطا برابر است با:

R* ≤ RkNN ≤ R* (2 - MR* M-1 )

*R نرخ خطای Bayes (حداقل نرخ خطا ممکن)، RkNN نرخ خطای NN-  و M تعداد دسته‌ها در مسئله است. برای M = ۲ خطای بیزین *R به صفر میل می‌کند؛ این حد، حداکثر به میزان دو برابر خطای بیزین کاهش می‌یابد.

یادگیری متریک ویرایش

عملکرد   نزدیکترین همسایه، اغلب می‌تواند به‌طور قابل توجهی، از طریق یادگیری متریک بهبود یابد. الگوریتم‌های مشهور، تجزیه و تحلیل اجزای همسایه (Neighbourhood components analysis) یا حاشیه بزرگ نزدیک‌ترین همسایه (Large Margin Nearest Neighbor) هستند. الگوریتم‌های یادگیری متریک، از اطلاعات نمونه، برای یادگیری متریک جدید یا شبه متریک استفاده می‌کنند.

استخراج ویژگی ویرایش

هنگامی که داده‌های ورودی یک الگوریتم برای پردازش بیش از حد بزرگ باشد و داده‌ها مشکوک به بی‌استفاده یا تکراری بودن باشند (به عنوان مثال اندازه‌گیری یکسان یک ویژگی با دو واحد متفاوت) آنگاه داده‌های ورودی به یک مجموعه با ابعاد کاهش یافته از ویژگی‌ها تبدیل می‌شوند (همچنین بردار ویژگی‌ها نامیده می‌شود). تبدیل داده‌های ورودی به مجموعه ویژگی‌ها را استخراج ویژگی می‌گویند. اگر ویژگی‌های استخراج‌شده با دقت انتخاب شوند، انتظار می‌رود که مجموعه ویژگی‌ها اطلاعات مربوط را از داده‌های ورودی استخراج کند تا با استفاده از این نمایش کاهش‌یافته به جای ورودی با اندازه بزرگ الگوریتم را اجرا کرد و به نتیجه رسید. استخراج ویژگی بر روی داده‌های خام قبل از اعمال الگوریتم k-NN انجام می‌شود تا الگوریتم بر روی داده‌های تبدیل شده در فضای ویژگی جدید اجرا شود.

مرز تصمیم‌گیری ویرایش

قواعد مربوط به نزدیکترین همسایه در عمل به‌طور ضمنی مرز تصمیم را محاسبه می‌کنند. همچنین می‌توان مرز تصمیم را به‌طور صریح محاسبه کرد و این کار را به‌طور کارآمد انجام داد، به طوری که پیچیدگی محاسباتی در مجموع تابعی از پیچیدگی مرزی خواهد بود.[۱۰]

کاهش ابعاد ویرایش

برای داده‌های با ابعاد بالا (به عنوان مثال، با تعداد ابعاد بیش از ۱۰)، کاهش ابعاد معمولاً قبل از اعمال الگوریتم k-NN انجام می‌شود تا از اثرات مشقت بعدچندی جلوگیری شود.[۱۱]

مشقت بعدچندی در زمینه k-NN اساساً به این معنی است که فاصله اقلیدسی در ابعاد بالا مفید نیست، زیرا همه بردارها تقریباً با بردار پرس‌وجو(query) فاصله دارند (تصور کنید چندین نقطه تقریباً بر روی یک دایره به مرکز نقطه پرس‌وجو قرار دارند. فاصله نقطه پرس‌وجو تا تمام نقاط داده در فضای جستجو تقریباً یکسان است).

استخراج ویژگی و کاهش ابعاد را می‌توان در یک مرحله با استفاده از تحلیل مؤلفه اصلی (PCA)، تجزیه و تحلیل متمایز خطی (LDA)، یا تجزیه و تحلیل همبستگی متعارف (CCA) به عنوان یک مرحله پیش پردازش، و پس از خوشه بندی توسط k-NN بر روی بردارهای ویژگی‌ها در فضا با بعد کاهش یافته انجام داد. به این فرایند تعبیه با ابعاد کم نیز می‌گویند.[۱۲]

برای مجموعه داده‌های با ابعاد بسیار بالا (به عنوان مثال هنگام انجام جستجوی تشابه در جریان‌های ویدیویی زنده، داده‌های DNA یا سری‌های زمانی با ابعاد بالا) یک جستجوی سریع و تقریبی k-NN با استفاده از درهم‌سازی حساس محلی(LSH)، «پیش‌بینی‌های تصادفی»،[۱۳] «طرح‌ها»[۱۴] یا سایر تکنیک‌های جستجوی شباهت با ابعاد بالا از جعبه ابزار VLDB ممکن است تنها گزینه ممکن باشد.

کاهش داده‌ها ویرایش

کاهش داده‌ها یکی از مهم‌ترین مسائل در کار با مجموعه داده‌های عظیم است. معمولاً فقط برخی از نقاط داده برای طبقه‌بندی دقیق مورد نیاز است. این داده‌ها نمونه‌های اولیه نامیده می‌شوند و می‌توان آنها را با استفاده از سه مرحله زیر یافت:

  1. پیدا کردن داده‌های پرت: پیدا کردن داده‌هایی که در زمان آموزش به اشتباه توسط k-NN طبقه‌بندی شده‌اند.
  2. تقسیم بقیه داده‌ها به دو دسته: بقیه داده‌ها را دودسته تقسیم می‌کنیم. یک دسته نمونه‌های اولیه که برای تصمیم‌گیری‌های طبقه‌بندی استفاده می‌شوند و دسته دیگر نقاط جذب (نقاطی که می‌توانند به درستی توسط k-NN با استفاده از نمونه‌های اولیه طبقه‌بندی شوند)
  3. در انتها نقاط جذب شده را می‌توان از مجموعه داده‌های آموزش حذف کرد.

نزدیکترین همسایه در حالت رگرسیون ویرایش

در رگرسیون، الگوریتم NN-  برای تخمین زدن متغیرهای پیوسته استفاده می‌شود. یکی از این الگوریتم‌ها از میانگین وزنی k نزدیکترین همسایه به‌دست می‌آید (میانگین وزنی از معکوس فاصله آنها محاسبه می‌شود). این الگوریتم به شرح زیر عمل می‌کند:

  1. محاسبه فاصله اقلیدسی یا فاصله Mahalanobis از نمونه مسئله داده شده به نمونه‌های علامت زده شده.
  2. مرتب‌سازی مثال‌های علامت زده شده با افزایش فاصله.
  3. بر اساس RMSD بهینه‌ترین   در   نزدیک‌ترین همسایه را پیدا کنید. این کار با استفاده از اعتبارسنجی متقابل انجام می‌شود.
  4. محاسبه میانگین معکوس فاصله   نزدیکترین همسایه.

اعتبارسنجی نتایج ویرایش

یک ماتریس درهم‌ریختگی یا «ماتریس تطبیق» اغلب به عنوان ابزاری برای تأیید صحت طبقه‌بندی k-NN استفاده می‌شود. روش‌های آماری قوی‌تری مانند آزمون نسبت درست‌نمایی نیز می‌تواند استفاده شود.

مزایا و معایب ویرایش

[۱۵] مزایا:

  • هیچ پیش فرضی در مورد داده‌ها وجود ندارد - مثال برای داده‌های غیر خطی
  • الگوریتم ساده
  • دقت نسبتاً بالا
  • مقایسه مدل‌های یادگیری تحت نظارت بهتر
  • چند منظوره - برای طبقه‌بندی و رگرسیون

مضرات:

  • محاسبه گران
  • نیاز به حافظه بالا - چرا که الگوریتم، تمام داده‌های قبلی را ذخیره می‌کند.
  • ذخیره تقریباً یا همه داده‌های اولیه
  • مرحله پیش‌بینی ممکن است کند باشد (با N بزرگ)
  • حساس به ویژگی‌های نامناسب و مقیاس داده

منابع ویرایش

  1. Piryonesi, S. Madeh; El-Diraby, Tamer E. (2020-06). "Role of Data Analytics in Infrastructure Asset Management: Overcoming Data Size and Quality Problems". Journal of Transportation Engineering, Part B: Pavements. 146 (2): 04020022. doi:10.1061/jpeodx.0000175. ISSN 2573-5438. {{cite journal}}: Check date values in: |date= (help)
  2. Hastie, Trevor. (2001). The elements of statistical learning: data mining, inference, and prediction: with 200 full-color illustrations. Tibshirani, Robert. , Friedman, J. H. (Jerome H.). New York: Springer. ISBN 0-387-95284-5. OCLC 46809224.
  3. D. Coomans; D.L. Massart: نزدیکترین همسایه با استفاده از قوانین رای‌گیری جایگزین
  4. The KNN Algorithm
  5. Everitt, B. S. , Landau, S. , Leese, M. and Stahl, D
  6. D. G. Terrell; D. W. Scott (1992). "Variable kernel density estimation"
  7. Mills, Peter. "Efficient statistical classification of satellite measurements"
  8. Cover TM .Hart PE , Nearest neighbor pattern classification بایگانی‌شده در ۲۳ دسامبر ۲۰۱۸ توسط Wayback Machine
  9. "Toussaint GT (April 2005). "Geometric proximity graphs for improving nearest neighbor methods in instance-based learning and data mining
  10. Bremner, David; Demaine, Erik; Erickson, Jeff; Iacono, John; Langerman, Stefan; Morin, Pat; Toussaint, Godfried T. (2005). "Output-sensitive algorithms for computing nearest-neighbor decision boundaries". Discrete and Computational Geometry. 33 (4): 593–604. doi:10.1007/s00454-004-1152-0.
  11. Beyer, Kevin; et al. "When is "nearest neighbor" meaningful?" (PDF). Database Theory—ICDT'99. 1999: 217–235.
  12. Shaw, Blake; Jebara, Tony (2009), "Structure preserving embedding" (PDF), Proceedings of the 26th Annual International Conference on Machine Learning (published June 2009), pp. 1–8, doi:10.1145/1553374.1553494, ISBN 978-1-60558-516-1, S2CID 8522279
  13. Bingham, Ella; Mannila, Heikki (2001). "Random projection in dimensionality reduction". Proceedings of the seventh ACM SIGKDD international conference on Knowledge discovery and data mining - KDD '01. pp. 245–250. doi:10.1145/502512.502546. ISBN 1-58113-391-X. S2CID 1854295.
  14. Ryan, Donna (editor); High Performance Discovery in Time Series, Berlin: Springer, 2004, شابک ‎۰−۳۸۷−۰۰۸۵۷−۸
  15. : A Quick Introduction to K-Nearest Neighbors Algorithm

مشارکت‌کنندگان ویکی‌پدیا. «K-nearest_neighbors_algorithm». در دانشنامهٔ ویکی‌پدیای انگلیسی، بازبینی‌شده در ۱۵ آوریل ۲۰۱۹.