یادگیری ماشین در OpenCV : جلسه سوم

الگوریتم K نزدیک ترین همسایه در OpenCV :

در این جلسه از یادگیری ماشین به بررسی الگوریتم K نزدیک ترین همسایه در OpenCV می پردازیم. مثال را با دو خانواده ( کلاس ) پیش می بریم :

در این مثال خانواده ( کلاس ) قرمز را با نام کلاس-۰ و خانواده ( کلاس ) آبی رنگ را با نام کلاس-۱ برچسب گذاری می کنیم. در این مثال ما ۲۵ همسایه یا ۲۵ داده آموزشی را ایجاد کرده ایم. هرکدام از این همسایه ها یا داده های آموزشی به عنوان بخشی از کلاس-۰ یا کلاس-۱ برچسب خورده اند. این برچسب خوردن را می توانیم با استفاده از numpy انجام دهیم. استفاده از این کد دستوری در OpenCV باعث ایجاد عدد های تصادفی می شود.

سپس، می توانیم از کد دستوری import matplotlib.pyplot برای ترسیم شکل ها استفاده کنیم. همسایه های قرمز رنگ با مثلث های قرمز رنگ و همسایه های آبی رنگ با مربع های آبی رنگ نمایش داده شده اند.

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# مجموعه ویژگی ها شامل ۲۵ مقدار شناخته شده از داده های آموزشی برای (x,y) 
trainData = np.random.randint(0,100,(25,2)).astype(np.float32)
# هر کدام از مقادیر قرمز یا آبی را با ۰ و ۱ برچسب می زنیم 
responses = np.random.randint(0,2,(25,1)).astype(np.float32)
# همسایه های دسته قرمز را می گیریم و آن ها را روی نمودار رسم می کنیم
red = trainData[responses.ravel()==0]
plt.scatter(red[:,0],red[:,1],80,'r','^')
# همسایه های دسته آبی را می گیریم و آن ها را روی نمودار رسم می کنیم
blue = trainData[responses.ravel()==1]
plt.scatter(blue[:,0],blue[:,1],80,'b','s')
plt.show()

بعد از اجرای این کد های OpenCV شما می توانید شکلی مشابه شکل زیر را مشاهده کنید. البته به یاد داشته باشید که در زمان اجرای این کد، چون از متغیر ایجاد کننده عدد تصادفی استفاده کرده ایم، هر زمان داده های متفاوتی را به دست می آوریم.

تئوری Knn

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

سپس، نمونه جدید ما ایجاد می شود و در این مرحله با کمک الگوریتم K نزدیک ترین همسایه در OpenCV آن را طبقه بندی کرده و در کلاس مرتبط دسته بندی می شود. اما به یاد داشته باشید که قبل از اجرای الگوریتم K نزدیک ترین همسایه لازم است تا در مورد داده های تست مورد استفاده (داده های عضو جدید) اطلاعاتی را داشته باشیم.

داده های ما باید مقادیر آرایه شناور باشند که سایز آن ها از ضرب داده های تستی در تعداد ویژگی ها به دست می آید.  سپس، نزدیکترین همسایه ها به این داده را پیدا می کنیم. در این مرحله می توانیم به K هر مقداری که می خواهیم را اختصاص دهیم (در اینجا ما عدد ۳ را برای K در نظر گرفته ایم). این کد مقادیر زیر را برمی گرداند:

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

بنابراین، اجازه دهید که نحوه عمل کردن الگوریتم K نزدیک ترین همسایه در OpenCV را ببینیم. عضو یا نمونه جدید در این کد OpenCV با رنگ سبز نمایش داده شده است:

newcomer = np.random.randint(0,100,(1,2)).astype(np.float32)
plt.scatter(newcomer[:,0],newcomer[:,1],80,'g','o')
knn = cv.ml.KNearest_create()
knn.train(trainData, cv.ml.ROW_SAMPLE, responses)
ret, results, neighbours ,dist = knn.findNearest(newcomer, 3)
print( "result: {}\n".format(results) )
print( "neighbours: {}\n".format(neighbours) )
print( "distance: {}\n".format(dist) )
plt.show()

از کد انجام شده نتیجه های زیر به دست می آید:

result: [[ 1.]]
neighbours: [[ 1. 1. 1.]]
distance: [[ 53. 58. 61.]]

این نتیجه به دست آمده نشان می دهد که عضو جدید ایجاد شده دارای ۳ همسایه نزدیک است که همگی از خانواده آبی رنگ ها هستند. بنابراین عضو جدید برچسب کلاس (خانواده) آبی رنگ را به خود اختصاص می دهد. این موضوع از شکل زیر کاملا مشخص است:

مثال الگوریتم KNN

در این الگوریتم و کدهای OpenCV مربوطه اگر چندین نمونه یا عضو جدید موجود بود، می توانید همگی این نمونه های جدید را از طریق آرایه ای مورد بررسی قرار دهید. در این حالت نتیجه به دست آمده نیز به صورت آرایه حاصل می شود.

# ۱۰ عضو جدید
newcomers = np.random.randint(0,100,(10,2)).astype(np.float32)
ret, results,neighbours,dist = knn.findNearest(newcomer, 3)
# نتیجه نیز شامل ۱۰ برچسب خواهد بود

حالا فرض می کنیم داده های ما ناشناخته بوده و طبقه بندی الگوریتم K نزدیک ترین همسایه در OpenCV برچسب داده ای با مقادیر ۰ و ۱ داشته باشند. این مقدار داده ای به ویژگی عدد به دست آمده مربوط است و توسط ما تعریف می شود. در این حالت کد ایجاد شده الگوریتم K نزدیک ترین همسایه در OpenCV به صورت زیر پیاده سازی می شود:

  • داده های تصادفی می سازیم
  • unkown یک نقطه داده است که روی آن پیشبینی را انجام می دهیم
unknown = np.random.randint(0, 50, (1, 2)).astype(np.float32)
  • کلاسه بند KNN را می  سازیم
knn = cv.ml.KNearest_create()
  • از تابع cv.ml.ROW_SAMPLE برای اشغال یک سطر از نمونه ها در مجموعه ی نمونه ها استفاده می کنیم
knn.train(Data_points, cv.ml.ROW_SAMPLE, labels)
  • برچسب، شماره و فاصله ی هر نقطه داده را می گیریم
  • تابع find nearest تعداد مشخصی از همسایه ها را می یابد و نتیجه را پیشبینی می کند
ret, res, neighbours, distance = knn.findNearest(unknown, 5)
  • برای هر سطر از نمونه ها، این روش k تا از نزدیک ترین همسایه ها را پیدا می کند
  • برای مسائل رگرسیون، نتیجه پیشبینی شده میانگین تمام همسایه ها می باشد
  • برای کلاسه بندی، کلاس تشخیص داده شده بر اساس اکثریت تعیین می شود
  • نقطه داده برا در کنار بقیه نقطه داده ها رسم می کنیم
plt.scatter(unknown[:, 0], unknown[:, 1], 80, 'g', '^')
  • نتایج را رسم می کنیم
plt.show()
  • نتایج به دست آمده را نمایش می دهیم
print( "Label of the unknown data - ", res ) 
print( "Nearest neighbors -  ", neighbours ) 
print( "Distance of each neighbor - ", distance ) 

که خروجی کد زیر به صورت زیر خواهد بود:

Label of the unknown data -  [[1.]]
Nearest neighbors -   [[1. 1. 0. 1. 1.]]
Distance of each neighbor -  [[  1.  65. 130. 173. 245.]]
مثال پیاده سازی KNN در OpenCV

بیشتر بخوانید :

0/5 (0 نظر)

درباره‌ی احمدرضا جعفری

همچنین ببینید

لیست ابزار های هوش مصنوعی استفاده شخصی

لیستی از ابزارهای هوش مصنوعی که می توانید از آن ها استفاده کنید – قسمت اول : استفاده شخصی

هوش مصنوعی و چهارمین انقلاب صنعتی، پیشرفت های قابل ملاحضه و چشم گیری را طی …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *