مسئولیت واحد(Single Responsibility) در مهندسی نرم افزار و برنامه نویسی

حتما میدانید که در برنامه نویسی شی گرا در یک پروژه نرم افزاری، کلاس ها(Class) و توابع(Function) مختلف حضور دارند. این کلاس ها در فایل های مختلف قرار میگیرند و هر کدام کاربردهای خاص خود را دارند. مانند افراد مختلف در یک سازمان که هر کدام مسئولیت های مشخصی بر عهده داند.

ادامه خواندن “مسئولیت واحد(Single Responsibility) در مهندسی نرم افزار و برنامه نویسی”

طبقه بندی و پیش بینی تصاویر دست نوشته با پایتون و الگوریتم RNN

حال اجازه بدهید با استفاده از طبقه بند Radius Neighbors دسته نوشته های درس قبل را یاد بگیریم.  محتویات این فایل به شکل زیر است(دانلود فایل iris_radius_nn_handwriting_classification.py):

from sklearn.neighbors import RadiusNeighborsClassifier  
from sklearn import datasets, metrics  
  
digits = datasets.load_digits()  
images_and_labels = list(zip(digits.images, digits.target))  
  
n_samples = len(digits.images)  
data = digits.images.reshape((n_samples, -1))  
rnn = RadiusNeighborsClassifier(30, outlier_label=-1)  
  
X_train = data[:n_samples // 2]  
y_train = digits.target[:n_samples // 2]  
X_test = data[n_samples // 2:]  
y_test = digits.target[n_samples // 2:]  
  
rnn.fit(X_train, y_train)  
  
predicted = rnn.predict(X_test)  
report = metrics.classification_report(y_test, predicted)  
print(report)
دسترسی کامل به این دوره مخصوص « کاربر ویژه(ماهیانه ۶هزار تومان جهت دسترسی به کلیه دوره های ویژه) » می باشد
ورود ثبت نام

تجزیه و تحلیل تصاویر دست نوشته با پایتون و Matplotlib

 اجازه بدهید به سراغ کد برویم و مطابق روال گذشته، کد را خط به خط مرور کنیم. میخواهیم توسط کد پایتون چند عکس را به نمایش در بیاوریم(در این قسمت فعلا عملیات طبقه بندی را انجام نمیدهیم و فقط به نمایش داده های تصویری میپردازیم). ساختار فایل به صورت زیر است (دانلود فایل radius_nn_handwriting.py):

from sklearn import datasets  
import matplotlib.pyplot as plt  
  
digits = datasets.load_digits()  
images_and_labels = list(zip(digits.images, digits.target))  
for index, (image, label) in enumerate(images_and_labels[:4]):  
    plt.subplot(2, 4, index + 1)  
    plt.axis('off')  
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')  
    plt.title('Training: %i' % label)
دسترسی کامل به این دوره مخصوص « کاربر ویژه(ماهیانه ۶هزار تومان جهت دسترسی به کلیه دوره های ویژه) » می باشد
ورود ثبت نام

تبدیل مسئله تشخیص دست نوشته(handwriting) به ماتریس آموزشی داده کاوی

اجازه دهید این مثال آخر را کمی پیشرفته تر و کاربردی تر اجرا کنیم. فرض کنید شما دست نوشته ای دارید و میخواهید از این دسته نوشته که به صورت عکس است، اعداد آن را تشخیص دهید. البته در اینجا مسئله را ساده در نظر میگیریم و از هر کاراکتر دست نوشته(که عددی بین ۰ تا ۹ است) یک عکس کوچک تهیه می کنیم. مثلا اگر کسی عدد ۰را به صورت دست نوشت بر روی کاغذ نوشت(و یک عکس از این کاغذ گرفته شد)، کامپیوتر بتواند با استفاده از تصویر این عکس، عدد را تشخیص دهد. در علم داده کاوی این مسئله نیز یک مسئله طبقه بندی است. ویژگی ها یا ابعاد این مسئله، پیکسل های عکس هستند، در حالی که برچسب ها(کلاس ها)، همان اعداد هستند. در این جا ۱۰ برچسب(از ۰ تا ۹) داریم که هر کدام یک کلاس یا یک طبقه را نمایش می دهند. برای تبدیل تصاویر به ماتریس، به مهندسی ویژگی(Feature Engineering) نیاز است. شکل زیر را در نظر بگیرید(برای مثال ساده، عکس کاملا سیاه و سفید در نظر گرفته می شود):

دسترسی کامل به این دوره مخصوص « کاربر ویژه(ماهیانه ۶هزار تومان جهت دسترسی به کلیه دوره های ویژه) » می باشد
ورود ثبت نام

طبقه بند Radius Neighbor Classifier(نزدیک ترین همسایه بر مبنای شعاع)

اجازه بدهید به یک طبقه بند دیگر که مبتنی بر همسایه است بپردازیم. این طبقه بند، مانند KNN عمل میکند، با این تفاوت که برای هر نمونه جدید، به جای پیدا کردن Kهمسایه نزدیک، در یک شعاع خاص به دنبال همسایه میگردد و نوع اکثریت همسایه ها، طبقه یا همان کلاس نهایی را مشخص می کند. تصویر زیر را نگاه کنید:

فرض کنید! دایره بنفش، یک دایره مثلا به شعاع ۲ است. الگوریتم Radius Neighbor Classifier در این شعاع به دنبال نمونه ها(گل های زنبق) میگردد و همسایه ها را جهت انتخاب پیدا میکند. نوع اکثریت، طبقه یا کلاس نهایی می شود. در بالا، چون Versicolor(نقاط قرمز رنگ) ۳بار و Setosa(نقاط سیاه رنگ) ۲بار در دایره به شعاع مشخص پیدا شد، نوع این گل Versicolor طبقه بندی می شود. از این طبقه بند، حتی میتوان در تشخیص outlier(داده پرت) هم استفاده کرد. به این صورت که اگر در شعاع مشخص، هیچ همسایه ای پیدا نشد، احتمالا این نمونه یک نمونه پرت است که به هیچ طبقه ای تعلق ندارد.

ضد الگو تجزیه تابعی(Functional Decomposition)

شاید اسم سختی داشته باشد، ولی کلمه تجزیه تابعی معنای ساده ای دارد. فرض کنید یک تکه کد دارید که میخواد یک شخص را در سیستم عضو کند. به این ترتیب که نام کاربری و ایمیل را از کاربر میگیرد، سپس یک کلمه عبور برای این کاربر ایجاد میکند و این کلمه عبور را برای کاربر مربوط ایمیل میکند. اگر این فرآیند را به قسمت های مختلفی تقسیم کنیم و هر کدام را برای مثال در یک تابع بنویسیم، تجزینه تابعی یا همان Functional Decomposition رخ داده است که کار خوبی هم هست.

ادامه خواندن “ضد الگو تجزیه تابعی(Functional Decomposition)”

بررسی توابع مختلف و کاربرد آن ها در الگوریتم KNN در Scikit Learn

مدل KNN در Scikit Learn که در درس های قبلی در مورد آن بحث میکردیم توابع(functions) مختلفی دارد که در فایل iris_knn_functions.py میتوانید آن را مشاهده کنید. ساختار کد به صورت زیر است:iris_knn_functions.py

import numpy as np  
import pandas as pd  
from sklearn.neighbors import KNeighborsClassifier  
  
dataset = pd.read_csv('iris.csv')  
np.random.seed(0)  
  
iris_X = np.asmatrix(dataset[['sepal.width', 'sepal.length', 'petal.width', 'petal.length']], dtype=np.float64)  
iris_y = np.asarray(dataset['variety'])  
indices = np.random.permutation(len(iris_X))  
iris_X_train = iris_X[indices[:-10]]  
iris_y_train = iris_y[indices[:-10]]  
iris_X_test = iris_X[indices[-1:]]  
iris_y_test = iris_y[indices[-1:]]  
  
knn = KNeighborsClassifier(n_neighbors=8, weights='distance', algorithm='ball_tree', leaf_size=50, p=2, metric='minkowski', n_jobs=-1)  
knn.fit(iris_X_train, iris_y_train)  
  
distances, samples = knn.kneighbors(iris_X_test, 5)  
print(distances)  
print(samples)  
for sample in samples[0]:  
    print(iris_y_train[sample])  
  
print('*******')  
  
predicted_proba = knn.predict_proba(iris_X_test)  
print(predicted_proba)  
  
print('********')  
  
iris_X_test = iris_X[indices[-9:-8]]  
iris_y_test = iris_y[indices[-9:-8]]  
predicted_proba = knn.predict_proba(iris_X_test)  
print(predicted_proba)  
  
print('*******')  
  
iris_X_test = iris_X[indices[-10:]]  
iris_y_test = iris_y[indices[-10:]]  
score = knn.score(iris_X_test, iris_y_test)  
print(score)
دسترسی کامل به این دوره مخصوص « کاربر ویژه(ماهیانه ۶هزار تومان جهت دسترسی به کلیه دوره های ویژه) » می باشد
ورود ثبت نام

نحوه کار کرد الگوریتم K نزدیک ترین همسایه(KNN)، بهینه سازی و پارامترها

حال که با توجه به دروس قبلی این مجموعه درس به صورت کاربردی توانستیم با الگوریتم KNN یک طبقه بند ساده بسازیم، بهتر است به صورت عمیق تر به این الگوریتم بپردازیم. الگوریتم Kنزدیک ترین همسایه یا K Nearest Neighbor یکی از الگوریتم های پرکاربرد حوزه داده کاوی و طبقه بندی است. برای توضیح نحوه کار این الگوریتم شکل زیر را در نظر بگیرید:

دسترسی کامل به این دوره مخصوص « کاربر ویژه(ماهیانه ۶هزار تومان جهت دسترسی به کلیه دوره های ویژه) » می باشد
ورود ثبت نام

ذخیره/بازیابی و استفاده مجدد از الگوریتم یادگرفته شده در داده کاوی

در مثال قبلی، در هر بار اجرا، بایستی طبقه بند KNN را به اصلاح Train کنیم. این کار را با تابع fit() انجام میدادیم. ولی در دنیای واقعی این کار معقول به نظر نمیرسد. یعنی هر بار که بخواهیم یک نوع دسته گل زنبق جدید را طبقه بندی کنیم، نیاز نیست که الگوریتم KNN را از نو آموزش بدهیم. برای حل این مشکل بهتر است یک بار الگوریتم را آموزش داده(Trainکرده) و مدل آموزش دیده شده را به بر روی حافظه جانبی(Hard Disk) ذخیره کنیم و هر بار جهت طبقه بندی داده های جدید از این مدل استفاده کنیم. این کار با استفاده از ماژول Pickle در پایتون قابل انجام است. فایل iris_pickle_train.py که محتوای آن مانند زیر است را نگاهی بیندازید:

import numpy as np  
import pandas as pd  
from sklearn.neighbors import KNeighborsClassifier  
import pickle  
  
dataset = pd.read_csv('iris.csv')  
np.random.seed(0)  
  
iris_X = np.asmatrix(dataset[['sepal.width', 'sepal.length', 'petal.width', 'petal.length']], dtype=np.float64)  
iris_y = np.asarray(dataset['variety'])  
indices = np.random.permutation(len(iris_X))  
iris_X_train = iris_X[indices[:-10]]  
iris_y_train = iris_y[indices[:-10]]  
  
knn = KNeighborsClassifier()  
knn.fit(iris_X_train, iris_y_train)  
  
knn_train_file = open('knn_train.pkl', 'wb')  
pickle.dump(knn, knn_train_file)  
knn_train_file.close()
دسترسی کامل به این دوره مخصوص « کاربر ویژه(ماهیانه ۶هزار تومان جهت دسترسی به کلیه دوره های ویژه) » می باشد
ورود ثبت نام

اولین مثال با Python, Numpy, Scikit Learn و Pandas

مثال طبقه بندی گل های زنبق را که یادتان هست. میخواهیم یک مدل(Model) بسازیم و با استفاده از الگوریتم طبقه بندی(Classifier) نزدیک ترین همسایه، انواع مختلف گل های زنبق(Setosa, Verginica وVersicolor) را از روی ویژگی های آن ها(طول و عرض کاسبرگ و گلبرگ) یاد بگیریم. فرض این است پایتون و کتابخانه های مختلف آن را با Anaconda یا هر روش دیگری بر روی سیستم خود نصب کرده اید. پس ابتدا یک فایل به اسم iris_1.py ایجاد میکنیم. محتوای فایل به صورت زیر است(دانلود فایل iris_1.py):

import numpy as np  
import pandas as pd  
from sklearn.neighbors import KNeighborsClassifier  
  
dataset = pd.read_csv('iris.csv')  
np.random.seed(0)  
  
iris_X = np.asmatrix(dataset[['sepal.width', 'sepal.length', 'petal.width', 'petal.length']], dtype=np.float64)  
iris_y = np.asarray(dataset['variety'])  
indices = np.random.permutation(len(iris_X))  
iris_X_train = iris_X[indices[:-10]]  
iris_y_train = iris_y[indices[:-10]]  
iris_X_test = iris_X[indices[-10:]]  
iris_y_test = iris_y[indices[-10:]]  
  
knn = KNeighborsClassifier()  
knn.fit(iris_X_train, iris_y_train)  
  
predicted = knn.predict(iris_X_test)  
print(predicted)  
print(iris_y_test)

اجازه دهید فایل بالا را خط به خط مرور کنیم.

دسترسی کامل به این دوره مخصوص « کاربر ویژه(ماهیانه ۶هزار تومان جهت دسترسی به کلیه دوره های ویژه) » می باشد
ورود ثبت نام