<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های AliFallahi</title>
        <link>https://virgool.io/feed/@alifallahi</link>
        <description>آنچنان رفتم كه خود می خواستم</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:07:49</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/7985/avatar/Ff1Z4W.jpeg?height=120&amp;width=120</url>
            <title>AliFallahi</title>
            <link>https://virgool.io/@alifallahi</link>
        </image>

                    <item>
                <title>آموزش بیش برازش (Overfitting) و کم برازش (Underfitting) در ماشین لرنینگ با مثال درخت تصمیم</title>
                <link>https://virgool.io/@alifallahi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%DB%8C%D8%B4-%D8%A8%D8%B1%D8%A7%D8%B2%D8%B4-overfitting-%D9%88-%DA%A9%D9%85-%D8%A8%D8%B1%D8%A7%D8%B2%D8%B4-underfitting-%D8%AF%D8%B1-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%84%D8%B1%D9%86%DB%8C%D9%86%DA%AF-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-ucxrrnw8anyv</link>
                <description>در این مطلب می خواهیم در مورد مفاهیم بیش برازش (Overfitting)، کم برازش (Underfitting) صحبت کنیم.دانش آموزی را در نظر بگیرید، که زبان انگلیسی بلد نیست اما تمام نمونه سوال های امتحان آیلتس را حفظ کرده است. در واقع اگر از نمونه سوال ها، امتحانی گرفته شود، این دانش آموزش عملکرد بسیار عالی خواهد داشت. چرا که او بدون داشتن دانش موردنیاز برای پاسخ به سوالات، در اثر تکرار، تنها شکل ظاهری سوال ها و پاسخ هایشان را به صورت چیدمانی از حروف و کلمات حفظ کرده است. در این وضعیت اصطلاحا Overfitting اتفاق افتاده است. یعنی فرد دانش واقعی درباره آن موضوع ندارد اما عملکردش بسیار قابل قبول است.واضح است که اگر سوال های جدیدی به این فرد داده شود، عملکرد قبلی را نخواهد داشت.در مورد Underfitting نیز فردی را تجسم کنید که حتی در هنگام مطالعه جزوه و نمونه سوال ها نیز نوانسته به نمره قابل قبولی برسد. چه برسد به امتحان اصلی :)( به نظرم در فایل ویدیویی مثال رو بهتر توضیح دادم :) )در این مثال ها، منظور از جزوه و نمونه سوال ها عملکرد مدل در داده های Training و منظور از امتحان اصلی داده های Validation است.Underfitting و Overfitting چیست؟This is a phenomenon called overfitting, where a model matches the training data almost perfectly, but does poorly in validation and other new data.When a model fails to capture important distinctions and patterns in the data, so it performs poorly even in training data, that is called underfitting.حالا چگونه باید متوجه Overfitting و Underfitting بشویم و از آن جلوگیری کنیم؟در مورد الگوریتم درخت تصمیم، عمق درخت از جمله مواردی است که در بیش برازش (Overfitting)، کم برازش (Underfitting) تاثیرگذار است. https://www.aparat.com/v/NC7zv محور افقی نمودار زیر نشان دهنده عمق درخت تصمیم است. محور عمودی نیز مقدار خطای میانگین مطلق یا MAE را نشان می دهد. بدیهی است که هرچه مقدار MAE کمتر باشد، مدل عملکرد بهتری دارد.همانطور که مشاهده می کنید، در مورد خط آبی که مربوط به داده های یادگیری و آموزش است، با افزایش عمق درخت، پس از محل مشخص شده، مقدار خطا دیگر تغییر چندانی نمی کند و مدل به سمت Overfit شدن پیش می رود.در مورد منحنی قرمز رنگ که مربوط به داده های ارزیابی است، اگر محل مشخص شده را مدنظر قرار دهید مشاهده می کنید که تا قبل از علامت زرد رنگ، مقدار خطا روندی کاهشی داشته است اما پس از علامت زردرنگ مجدد خطا افزایش یافت است.علامت زرد رنگ و خط عمودی رسم شده تقریبا در وسط نمودار، عمق مناسب درخت در این مثال است.به طورخلاصه، افزایش عمق درخت تصمیم، خطر بیش برازش (Overfitting) را نیز افزایش می دهد.آموزش بیش برازش (Overfitting) و کم برازش (Underfitting) در ماشین لرنینگ  (شکل از سایت Kaggle)آشنایی با مفهوم بیش برازش (Overfitting)، کم برازش (Underfitting) و برازش مناسبدر ادامه می خواهیم عمق مناسب را برای مثال مربوط به پیش بینی قیمت خانه که در قسمت های پیش نیز روی آن کار کرده ایم، اجرا کنیم.قطعه کد شامل خواندن فایل دیتاست و ساخت مجموعه های Training و Validation است.بررسی دو مفهوم under-fitting و over-fitting در یادگیری ماشین خطای MAE و درخست تصمیم را از sklearn فراخوانی می کنیم.آشنایی با مفهوم Overfitting و Underfitting برای اینکه بتوانیم میزان خطای MAE برای عمق های مختلف درخت تصمیم را با هم مقایسه کنیم، یک تایع تعریف کرده ایم به اسم get_mae که به عنوان ورودی عمق درخت (max_leaf_nodes) و مجموعه های Train و Validation را دریافت کرده و خطای MAE را محاسبه می کنید.در بخش پایین نیز یک حلقه for ایجاد شده است که چهار مقدار 5, 50, 500, 5000 را به عنوان عمق درخت به تابع get_mae ارسال می کند.در خط آخر نیز مقدار عمق و MAE محاسبه شده براساس آن را پرینت می کنیم.تفاوت overfitting و underfittingهمانطور که از نتایج مشخص است، از عمق 5 به 50، مقدار خطا کم شده است، اما وقتی عمق از 50 بیشتر می شود خطا نیز بیشتر می شود.به بیان دیگر، تا پیش از 50 کم برازش (Underfitting) و پس از 50 بیش برازش (Overfitting) داریم.برای اینکه بتوان تفسیر بهتری از نتایج داشته باشیم، با استفاده از کد زیر نمودار مربوط به این داده ها را رسم می کنیم. محور افقی نشان دهنده عمق درخت و محور عمودی نیز شامل مقادیر خطای MAE است.under-fitting-و over-fitting در یادگیری ماشین فایل های مرتبط:تمام کدهای مربوط به این قسمت از لینک زیر قابل دسترس هستند:https://github.com/alifallahi/MachineLearning_Warmup/tree/master/Session5-overfitting-and-underfitting-in-machine-learningدانلود فایل دیتاست train.csv از Kagglehttps://www.kaggle.com/c/home-data-for-ml-course/data?select=train.csvتوضیحات تکمیلی مرتبط با این مطلب</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Fri, 11 Mar 2022 10:13:24 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش تقسیم داده در یادگیری ماشین به داده های training و validation</title>
                <link>https://virgool.io/@alifallahi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AA%D9%82%D8%B3%DB%8C%D9%85-%D8%AF%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D8%A8%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-training-%D9%88-validation-pagawspfdmi2</link>
                <description>تقسیم بندی داده ها به دو گروه مجموعه های یادگیری و آموزش (Train set) و ارزیابی (Validation set) یکی از مراحل بسیار مهم در ساخت مدل های ماشین لرنینگ است. در این مطلب ساخت مجموعه های training و validation با استفاده از sklearn را بررسی می کنیم.در این ساختار، داده ها به گونه ای تقسیم بندی می شوند که یک گروه برای یادگیری و ساخت مدل است که با نام Training data شناخته می شود و یک گروه دیگر به نام  Validation data  برای ارزیابی عملکرد مدل مورد  استفاده قرار می گیرد.نسبت مجموعه داده فاز آموزش و یادگیری (Training) به مجموعه داده فاز  ارزیابی (Validation) اغلب 80 به 20 است. برای مثال اگر اطلاعات 1.000.000 خانه را در اختیار داشته باشیم، 800.000 را برای ساخت و آموزش مدل استفاده می کنیم و سپس ارزیابی را بر روی 200.000 خانه ای انجام می دهیم که مدل قبلا آن ها را مشاهده نکرده است.اگرچه جداسازی داده ها و ایجاد مجموعه های Train set و Validation set به صورت دستی نیز امکان پذیر است، اما با استفاده از sklearn می توان به راحتی این کار را به صورت داینامیک انجام داد. https://www.aparat.com/v/LnzpE کد پایتون برای تقسیم بندی داده ها به مجموعه های یادگیری و ارزیابیقطعه کد زیر، کدهای کلی است که با استفاده از sklearn تقسیم بندی داده ها انجام می شود.همانطور که در خط سوم مشاهده می کنید، ما داده ها را به 4 گروه تقسیم می  کنیم. فرض کنید تعداد 100 اطلاعات 100 خانه شامل متراژ، تعداد اتاق خواب و  قیمت را داریم. هدف نیز محاصبه قیمت است. داده ها با نسبت 80 به 20 تقسیم  کرده ایم، در این صورت:train_X شامل متراژ و تعداد اتاق خواب 80 خانه استtrain_y شامل قیمت های آن 80 خانه استval_X شامل متراژ و تعداد اتاق خواب 20 خانه دیگر استval_y شامل قیمت های آن 20 خانه استfrom sklearn.model_selection import train_test_split 

train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)

splitted_model = DecisionTreeRegressor(random_state=1)
splitted_model.fit(train_X, train_y)

val_predictions = splitted_model.predict(val_X)در خط پنجم، مشخص می کنیم که می خواهیم از DecisionTreeRegressor استفاده کنیم. در خط ششم، این مدل را بر روی داده های train_X و train_y یعنی فقط همان 80 خانه اجرا می کنیم. دقت کنید که تا اینجا مدل ساخته شده، هیچ دسترسی به اطلاعات آن 20 خانه ندارد. در خط هشتم، برای اینکه بتوانیم عملکرد مدل را برای داده هایی به غیر از  آنچه با آن ها آموزش دیده است، ارزیابی کنیم، آن را بر روی اطلاعات 20 خانه  اجرا می کنیم تا ببینیم چه قیمت هایی را برای آن ها پیش بینی می کند. در پایان می توانیم برای مشخص کردن چگونگی عملکرد مدل، قیمت های پیش بینی  شده برای آن 20 خانه را با قیمت های اصلی همان 20 خانه مقایسه کنیم.برای ارزیابی مدل از معیار MAE استفاده می کنیم. فرمول خطای میانگین مطلق یا MAE نیز به صورت زیر است.میانگین خطای مطلق(Mean Absolute Error)from sklearn.metrics import mean_absolute_error

splitted_MAE = mean_absolute_error(val_predictions, val_y)

print(&amp;quot\n MAE =&amp;quot, splitted_MAE)در خط اول چهارم، خطای MAE بر اساس val_y یعنی قیمت های اصلی آن 20  خانه، و val_predictions یعنی قیمت های پیش بینی شده برای آن 20 خانه است.فایل های مرتبط:تمام کدهای مربوط به این قسمت که در فایل ویدیویی استفاده شده از لینک زیر قابل دسترس هستند:https://github.com/alifallahi/MachineLearning_Warmup/tree/master/Session4-model-validation-train-test-split</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Tue, 08 Mar 2022 21:51:36 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش محاسبه قیمت خانه با استفاده از ماشین لرنینگ و  استفاده از درخت تصمیم</title>
                <link>https://virgool.io/@alifallahi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D9%87-%D9%82%DB%8C%D9%85%D8%AA-%D8%AE%D8%A7%D9%86%D9%87-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%84%D8%B1%D9%86%DB%8C%D9%86%DA%AF-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AF%D8%B1%D8%AE%D8%AA-%D8%AA%D8%B5%D9%85%DB%8C%D9%85-lroaxuykjy7y</link>
                <description> محاسبه قیمت خانه در املاک با استفاده از ماشین لرنینگ و درخت تصمیمدرخت تصمیمیکی از روش های بسیار کاربردی در داده کاوی درخت تصمیم یا به اختصار (DTs) است. اساس کار درخت تصمیم به این صورت است که در مرحله یک پرسش مطرح می شود و متناسب با جواب، مرحله بعدی اجرا می شود.مثال برای درخت تصمیم گیریامروز هوا ابری است؟اگر جواب بله بود، پس چتر برمی دارم.اگر جواب خیر بود، پس عینک آفتابی برمی دارم.عمق این درخت می تواند بر اساس بله و خیرها ادامه پیدا کند.مثال برای درخت تصمیم گیریمثال محاسبه قیمت خانه در املاک با استفاده از ماشین لرنینگ و درخت تصمیمبه نظر شما یک متخصص ملک، چگونه قیمت خانه را برآورد می کند؟ اگر مفهوم درخت تصمیم را در نظر بگیرید، اغلب متخصصین املاک نیز هنگام برآورد قیمت، در ذهن خود یک درخت تصمیم را برای خانه مورد نظر ایجاد می کنند و در پایان قیمت متناسب با آن خانه را پیشنهاد می دهند. برای مثال در سطح اول این سوال مطرح می شود آیا خانه نوساز است؟ و در سطوح بعدی تعداد اتاق خواب، داشتن آسانسور و… . در شکل زیر نمونه ای از این مثال را مشاهده می کنید.مثال محاسبه قیمت خانه در املاک با استفاده از ماشین لرنینگ و درخت تصمیمنمونه کد درخت تصمیم در یادگیری ماشینimport pandas as pd
from sklearn.tree import DecisionTreeRegressor

file_path = &#039;train.csv&#039;

home_data = pd.read_csv(file_path)
home_data.head()

y = home_data.SalePrice
feature_columns = [&#039;LotArea&#039;, &#039;YearBuilt&#039;, &#039;1stFlrSF&#039;, &#039;2ndFlrSF&#039;, &#039;FullBath&#039;, &#039;BedroomAbvGr&#039;, &#039;TotRmsAbvGrd&#039;]
X = home_data[feature_columns]

mytest_model = DecisionTreeRegressor()
mytest_model.fit(X, y)

print(&amp;quotFirst in-sample predictions:&amp;quot, mytest_model.predict(X.head()))
print(&amp;quotActual target values for those homes:&amp;quot, y.head().tolist())محاسبه قیمت خانه در املاک با استفاده از ماشین لرنینگ و درخت تصمیم https://www.aparat.com/v/sGbDc لینک های مرتبط:دانلود کدها و فایل train.csv از Githubدانلود فایل train.csv از Kaggleدوره آموزش ماشین لرنینگ – قسمت دوم (نسخه تکمیلی این مطلب) </description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Sat, 05 Mar 2022 01:06:51 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای استفاده رایگان از Cloudflare به صورت مرحله به مرحله</title>
                <link>https://virgool.io/@alifallahi/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86-%D8%A7%D8%B2-cloudflare-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D9%85%D8%B1%D8%AD%D9%84%D9%87-%D8%A8%D9%87-%D9%85%D8%B1%D8%AD%D9%84%D9%87-vv8tmmmzetl1</link>
                <description>آموزش استفاده از کلودفلر اینکه چرا استفاده از کلودفلر مفید هست به صورت خلاصه می تونه دوتا دلیل مهم داشته باشه افزایش امنیت سایترایگان بودندر واقع با استفاده از کلودفلر شما به صورت رایگانجلوی حملات سایبری به خصوص حملات مقدماتی رو  تا حد زیادی می گیرید و همچنین می تونید از مزایای HTTPS استفاده کنید.در ادامه مرحله به مرحله این کا رو با هم انجام می دیم. به سایت کلودفلر به آدرس https://www.cloudflare.com می ریم.آموزش استفاده از CloudFlare2. بر روی گرزینه &quot;Sign Up&quot; در قسمت بالا و سمت راست صفحه کلیک می کنیم.راهنمای استفاده از کلودفلر3. ایمیل و رمز عبوی دلخواه خودمون رو برای ثبت نام وارد می کنیم.انتخاب پسورد در کلودفلر4. دقت کنید که رمزعبور انتخاب شده باید چند شرط زیر را داشته باشد.حداقل 8 کاراکتر باشد، شامل عدد هم باشد و از علامت هایی مثل # ، @، $ و... در هم آن استفاده شود.5. در مرحله بعدی از ستون سمت چپ، روی گزینه &quot;Websites&quot; کلیک می کنیم.راهنمای مرحله به مرحله تنظیمات کلودفلر6. در صفحه بعدی، بر روی گزینه &quot;َAdd Site&quot; را کلیک می کنیم.اضافه کردن سایت به صورت رایگان در Cloudflare7. در قسمت &quot;Enter your site&quot; نشانی سایت را بدون http و www می نویسم.مثل virgool.ioچگونه از کلودفلر استفاده کنیم؟8. در صفحه بعدی، مقدار به سمت پایین صفحه اسکرول می کنیم و در فصای خالی مشخص شده یک بار کلیک چپ می کنیم تا پلن &quot;Free&quot; انتخاب شده و گزینه &quot;Continue&quot; فعال شود.ثبت رایگان سایت در کلودفلر9. در صفحه بعد، چند ثانیه صبر می کنیم تا آنالیز سایت انجام شود.اضافه کردن سایت در پنل کلودفلر10. پس از اتمام آنالیز، بر روی  گزینه &quot;Continue&quot; کلیک می کنیم.کلودفلر چیست؟11. در این مرحله، دو NameServer به ما داده می شود که باید در پنل مدیریت دامنه آن ها را قرار دهیم.تنظیمات ClouFlare12. این مرحله خارج از کلودفلر انجام شده و برای انجام آن باید به پنل مدیریت دامنه مراجعه کنید. این پنل از شرکتی که دامنه سایت را خریداری کرده اید در اختیار شما قرار می گیرد. تصویر زیر مربوط به پنل مدیریت دامنه در یکی از شرکت های فروش دامنه در ایران است.تنظیم نیم سرور در کلاودفلیردو Nameserver که در مرحله 11 ایجاد شده اند را در قسمت ها مربوطه وارد می کنیم.تغییر DNS برای کلاودفلردقت کنید که اگرچه اعمال این تغییرات ممکن است تا چند ساعت هم طول بکشد، اما شما می توانید مراحل بعدی در کلودفلر را ادامه دهید.13. در صفحه بعدی بر روی گزینه &quot;Done, check nameservers&quot; کلیک می کنیم.آموزش درج سایت در کلودفلر14. تا اینجا تقریبا کار اصلی انجام شده است، اما می توانید مواردی پیشنهادی را نیز انجام دهید. بر روی گزینه &quot;Configuration recommendations&quot; کلیک می کنیم.افزایش امنیت سایت با کلودفلر15. در صفحه بعدی، بر روی گزینه های &quot;Apply recommendation&quot; کلیک می کنیم.ارتقاء امنیت سایت با CloudFlare16. پس از انجام این مرحله، دو عبارت &quot;Applied&quot; نمایش داده می شود.آموزش گام به گام کلودفلر17. کار تموم شده.اگر به صفحه اصلی پنل مدیریت در cloudflare برگردید (می تونید روی لوگو نارنجی رنگ بالای صفحه، سمت چپ کلیک کنید) و در ادامه از ستون سمت چپ، گزینه &quot;Websites&quot; رو انتخاب کنید، اسم سایتی که تنظیمات رو براش انجام دادید، نشان داده می شود.کلمه &quot;Active&quot; و تیک سبز کنارش هم یعنی تنظیمات کلودفلر برای این سایت فعال است.تایید ایمیل در کلودفلر18. یک مرحله دیگه هم مونده و اون تایید آدرس ایمیلی هست که در زمان ثبت نام (مرحله 3) معرفی کردید.در قسمت inbox، باید ایمیلی مشابه با ایمیل زیر را دریافت کرده باشید.فعال سازی پروفایل در CloudFlareیک قسمت چندخطی شامل حروف و اعداد در وسط صفحه به صورت لینک هست. روی اون کلیک می کنیم تا به صورت اتوماتیک به سایت cloudflare منتقل بشیم. اگر هنوز لاگین باشید، به صورت خودکار پیام زیر نشان داده می شود. اگر هم که خارج شده باشید، باید ایمیل و رمز عبورتون رو قسمت مربوطه وارد کنید. تنظیمات Cloudflare تبریک می گم :)شما تنظیمات Cloudflare را برای سایت خود فعال کردید و امنیت اون را تا حد قابل قبولی ارتقاء دادید.</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Wed, 02 Feb 2022 19:00:38 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش مرحله به مرحله و با مثال ساخت ماتریس درهم ریختگی (Confusion Matrix) در مسایل طبقه بندی چند کلاسه</title>
                <link>https://virgool.io/@alifallahi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D8%B1%D8%AD%D9%84%D9%87-%D8%A8%D9%87-%D9%85%D8%B1%D8%AD%D9%84%D9%87-%D9%88-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%85%D8%A7%D8%AA%D8%B1%DB%8C%D8%B3-%D8%AF%D8%B1%D9%87%D9%85-%D8%B1%DB%8C%D8%AE%D8%AA%DA%AF%DB%8C-confusion-matrix-%D8%AF%D8%B1-%D9%85%D8%B3%D8%A7%DB%8C%D9%84-%D8%B7%D8%A8%D9%82%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%DA%86%D9%86%D8%AF-%DA%A9%D9%84%D8%A7%D8%B3%D9%87-amiayditxicl</link>
                <description>پیشتر در مطلبی با عنوان &quot;آموزش مرحله به مرحله و با مثال معیارهای ارزیابی مدل های طبقه بندی و ماتریس درهم ریختگی (Confusion Matrix)&quot; چگونگی ساخت «ماتریس درهم ریختگی (Confusion Matrix)» را با مثال و مرحله به مرحله برای یک مسئله طبقه بندی ساده و اصطلاحا single class بررسی کردیم.Confusion matrix چیستاما بدیهی است که مسایل کلسیفیکیشن، تنها محدود به دو کلاس داده ای نمی شوند و ما نیاز داریم تا بتوانیم کانفیوژن ماتریس را برای طبقه بندی چند کلاسه (Multi-Class Classification) نیز پیاده سازی کنیم.برای مثال در نظر بگیرید که یک جعبه شامل 18 عدد سیب و متشکل از 6 عدد سیب زرد، 6 عدد سیب قرمز و 6 عدد سیب سبز را به صورت درهم به مدل یادگیری ماشین می دهیم تا سیب ها را بر اساس رنگ از هم جدا کند.معیارهای ارزیابی طبقه بندی عملکرد دستگاه در شکل بالا نشان داده شده است. برای ساخت Confusion Matrix، ابتدا داده های خروجی دستگاه را به صورت زیر در یک جدول وارد می کنیم.Confusion matrix در داده کاوی قطر اصلی این جدول، که با رنگ سبز مشخص شده است شامل نتیجه عملکرد صحیح مدل برای هر گروه از سیب ها است.نکته تکمیلی: جمع هر یک از ردیف ها برابر با 6 است و جمع کل خانه های جدول نیز 18 است.نحوه تکمیل کردن یک ردیف از جدول، به عنوان نمونه در شکل زیر نشان داده شده است.Confusion matrix اموزشساخت ماتریس درهم ریختگی (Confusion Matrix) در مسایل طبقه بندی چند کلاسهدر ادامه، Confusion Matrix را برای این مسئله پیاده سازی می کنیم. در هر مرحله، رنگ مورد نظر را به عنوان کلاس +، و سایر رنگ ها را به عنوان کلاس های منفی در نظر می گیریم.در شکل های زیر چگونگی محاسبه هر عدد، از دو طریق استفاده از داده های خروجی مدل و همچنین شمارش از روی شکل نشان داده شده است. لازم به ذکر است که روش شمارش از روی شکل، تنها با هدف افزایش کیفیت مطلب آموزشی انجام شده است.با سیب های سبز شروع می کنیم.بخش True Positiveدارای مقدار عددی &quot;4&quot; که نشان دهنده مجموع تعداد سیب های سبزی است که به درستی سبز، در نظر گرفته شده اند.ماشین لرنینگبخش False Positiveدارای مقدار عددی &quot;2&quot; که نشان دهنده مجموع تعداد سیب های غیر سبزی که به اشتباه سبز، در نظر گرفته شده اند.2 = 1 + 1یادگیری ماشینیبخش False Negativeدارای مقدار عددی &quot;4&quot; که نشان دهنده مجموع تعداد سیب های سبزی است که به اشتباه در گروه های رنگی دیگر قرار داده شده اند.4 = 2 + 2داده کاویبخش True Negativeدارای مقدار عددی &quot;8&quot; که نشان دهنده مجموع تعداد سیب های غیر سبزی که به درستی غیر سبز، در نظر گرفته شده اند.8 = 2 + 1 + 2 + 3دیتا ماینینگبه همین ترتیب برای ساخت ماتریس درهم ریختگی برای یک مسئله کلاس بندی چند کلاسه مراحل را ادامه می دهیم.تکمیل داده های مربوط به سیب های قرمزبخش True Positiveدارای مقدار عددی &quot;3&quot; که نشان دهنده مجموع تعداد سیب های قرمزی است که به درستی قرمز، در نظر گرفته شده اند.آموزش ماشین لرنینگبخش False Positiveدارای مقدار عددی &quot;3&quot; که نشان دهنده مجموع تعداد سیب های غیر قرمزی که به اشتباه قرمز، در نظر گرفته شده اند.3 = 1 + 2آموزش یادگیری ماشینیبخش False Negativeدارای مقدار عددی &quot;3&quot; که نشان دهنده مجموع تعداد سیب های قرمزی است که به اشتباه در گروه های رنگی دیگر قرار داده شده اند.3 = 2 + 1آموزش داده کاویبخش True Negativeدارای مقدار عددی &quot;9&quot; که نشان دهنده مجموع تعداد سیب های غیر قرمزی که به درستی غیر قرمز، در نظر گرفته شده اند.9 = 2 + 2 + 1 + 4آموزش دیتا ماینینتکمیل داده های مربوط به سیب های زردبخش True Positiveدارای مقدار عددی &quot;2&quot; که نشان دهنده مجموع تعداد سیب های زردی است که به درستی زرد، در نظر گرفته شده اند.True Positive ماتریس در هم ریختگی بخش False Positiveدارای مقدار عددی &quot;4&quot; که نشان دهنده مجموع تعداد سیب های غیر زردی که به اشتباه زرد، در نظر گرفته شده اند.4 = 2 + 2False Positive ماتریس در هم ریختگیبخش False Negativeدارای مقدار عددی &quot;2&quot; که نشان دهنده مجموع تعداد سیب های زردی است که به اشتباه در گروه های رنگی دیگر قرار داده شده اند.2 = 1 + 1False Negative ماتریس در هم ریختگیبخش True Negativeدارای مقدار عددی &quot;10&quot; که نشان دهنده مجموع تعداد سیب های غیر زردی که به درستی غیر زرد، در نظر گرفته شده اند.10 = 3 + 1 + 2 + 4True Negative ماتریس در هم ریختگیدر نهایت، پس از محاسبه تمامی خانه ها، کانفیوژن ماتریس به صورت زیر تکمیل می شود.کانفیوژن ماتریسبرای محاسبه معیارهای ارزیابی نیز می توانیم معیار موردنظر را برای هر سه کلاس محاسبه کنیم و سپس مقدار میانگین آن ها را به عنوان نتیجه کلی آن معیار اعلام کنیم. برای مثال، صحت (Precision) در این مسئله، به صورت زیر محاسبه می شود.فرمول محاسبه دقت و صحت در داده کاوینکته تکمیلی:به طور معول سطرهای کانفیوژن ماتریس حاوی مقادیر پیش بینی شده و ستون ها حاوی مقادیر اصلی هستند، اما در برخی منابع این چیدمان برعکس است. مهم، مقادیر داخل خانه های ماتریس هستند که باید از لحاظ معنایی در محل درستی قرار گرفته باشند. در ادامه، تصویر اول، دارای چینش رایج و تصویر دوم به صورتی است که ستون ها دارای مقادیر پیش بینی شده و ردیف ها مقادیر اصلی هستند.کانفیوژن ماتریسماتریس درهم ریختگی در یادگیری ماشینی</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Thu, 19 Aug 2021 15:16:44 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش مرحله به مرحله و با مثال معیارهای ارزیابی مدل های طبقه بندی و ماتریس درهم ریختگی (Confusion Matrix)</title>
                <link>https://virgool.io/@alifallahi/%D9%85%D8%B9%DB%8C%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D8%A7%D8%B1%D8%B2%DB%8C%D8%A7%D8%A8%DB%8C-%D9%85%D8%AF%D9%84-%D9%87%D8%A7%DB%8C-%D8%B7%D8%A8%D9%82%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-%D9%88-%D9%85%D8%A7%D8%AA%D8%B1%DB%8C%D8%B3-%D8%AF%D8%B1%D9%87%D9%85-%D8%B1%DB%8C%D8%AE%D8%AA%DA%AF%DB%8C-confusion-matrix-buh4cjladtu2</link>
                <description>یکی از رایج ترین مسایل در مدل های یادگیری با ناظر (Supervised Learning) طبقه بندی داده ها (Classification) است. بدیهی است که اینگونه از مدل ها نیز نیاز به معیارهایی برای ارزیابی دارند. در این مطلب به بررسی ماتریس درهم ریختگی (Confusion Matrix) و معیارهایی که برپایه این ماتریس برای ارزیابی یک مدل طبقه بندی از آن ها استفاده می شود، می پردازیم.معیارهای ارزیابی در کلسیفیکیشندر نظر بگیرید مدلی را پیاده سازی کرده ایم که هدف آن پیدا کردن سیب زمینی است در بین داده های ورودی است.  یک مجموعه 10 عددی شامل 4 سیب زمینی و 6 پیاز را به مدل داده ایم.معیارهای ارزیابی مدل های طبقه بندیهمانطور که مشخص است عملکرد این مدل در تشخیص سیب زمینی ها دارای خطا بوده است، اما مقدار این خطا چقدر است؟ماتریس درهم ریختگی (Confusion Matrix)برای اندازه گیری خطا و یا به بیان دیگر، ارزیابی یک مدل طبقه بندی داده های خروجی را در کانفیوژن ماتریس  (Confusion Matrix) وارد می کنیم. با توجه به اینکه مسئله ما فقط دارای یک حالت است (اینکه ورودی سیب زمینی است یا خیر) ماتریس درهم ریختگی از نظر تعداد سطر و ستون، به صورت زیر خواهد بود.ماتریس درهم ریختگی (Confusion Matrix)دقت شود که داده های ما دارای برچسب هستند، به این معنی که ما از قبل می دانیم کدام ورودی سیب زمینی است و کدام سیب زمینی نیست.بخش True Positiveمحتوای این بخش شامل تعداد گزینه های مثبتی است که مدل توانسته آن ها را پیدا کند.بخش False Positiveمحتوای این بخش شامل تعداد گزینه های اشتباه (منفی) است که مدل به اشتباه آن ها را مثبت تشخیص داده است.بخش False Negativeمحتوای این بخش شامل تعداد گزینه های درست (مثبتی) است که مدل به اشتباه آن ها را منفی تشخیص داده است.بخش True Negativeمحتوای این بخش شامل تعداد گزینه های اشتباه (منفی) است که مدل به درستی آن ها را منفی تشخیص داده است.معیارهای ارزیابی در یادگیری ماشینپس با توجه به نتایج بالا، ماتریس درهم ریختگی (Confusion Matrix) در این مثال دارای مقادیر زیر است.حالا که توانستیم نتایج به دست آمده توسط مدل را به صورت عددی و تفکیک شده داشته باشیم، می توانیم معیارهای ارزیابی را برای این مسئله کلسیفیکیشن اجرا کنیم.معیارهای رایج در این مسایل عبارت هستند از:Precision, Recall, Accuracy, Specificity, F1نتایج این فرمول ها اغلب در 100 ضرب می شود و به صورت «درصد» بیان می شوند.صحت (Precision)معیار پرسیژن، نشان می دهد که چقدر از نتایجی که توسط مدل مثبت اعلام شده اند، واقعا مثبت هستند. (چندتا از مواردی که اعلام شده سیب زمینی هستند، واقعا سیب زمینی هستند.)فرمول محاسبه دقت و صحت در داده کاویپوشش (Recall)Recall و precision چیستمعیار ریکال، نشان می دهد که چقدر از موارد مثبت داده شده به مدل، پیدا شده و به عنوان نمونه مثبت اعلام شده اند. ( از کل سیب زمینی ها چندتاشون توسط مدل به عنوان سیب زمینی شناسایی شدن.)دقت (Accuracy)Confusion matrix اموزشمعیار اکیوریسی، با محاصبه نسبت تشخیص های درست به کل داده ها، دقت مدل را محاسبه می کند. نکته بسیار مهم و قابل توجه در مورد Accuracy این است که اگر جامعه آماری داده های ورودی دارای توزیع نرمال نباشند، این معیار نتیجه قابل اعتمادی نخواهد داشت. مثلا مدلی ارایه شده است تا در یک لیست 20 نفری که به صورت تصادفی انتخاب شده اند افراد «راست دست» را از «چپ دست» ها تشخیص دهد. ما می دانیم که در حالت عادی تعداد افراد چپ دست، کمتر از راست دست ها است. پس اینکه مدل ارایه شده خطای کمی در تفکیک این دو گروه داشته باشد، نمی تواند نشان دهنده عملکرد دقیق آن باشد. زمانی می توان از معیار Accuracy  استفاده نمود که داده های ورودی دارای تقسیم بندی یکسان باشد. مثلا لیست ورودی شامل 20 نفر و متشکل از 10 نفر راست دست و 10 نفر چپ دست باشد.تشخیص پذیری (Specificity)آموزش ماتریس مجاورتامتیاز اف یک (F1)تحلیل ماتریس درهم ریختگینکته: معیار F1 Score از دو طریق قابل محاسبه است که در فرمول مشخص شده است.مطلب تکمیلیآموزش مرحله به مرحله و با مثال ساخت ماتریس درهم ریختگی (Confusion Matrix) در مسایل طبقه بندی چند کلاسهنکات تکمیلی:اگر دوست داشتید، معیارهای معرفی شده را برای مسئله تشخیص سیب زمینی محاسبه کنید و در کامنت بنویسید.سعی می کنم این مطلب رو با کدهای مربوطه هم به زودی تکمیل تر کنم :)</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Wed, 18 Aug 2021 14:01:11 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش روش کدبندی وان هات (One Hot Encoding) — به زبان ساده</title>
                <link>https://virgool.io/@alifallahi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B1%D9%88%D8%B4-%DA%A9%D8%AF%D8%A8%D9%86%D8%AF%DB%8C-%D9%88%D8%A7%D9%86-%D9%87%D8%A7%D8%AA-one-hot-encoding-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-n3hnx37sj93q</link>
                <description>آموزش روش کدبندی وان هات (One Hot Encoding) — به زبان سادهیکی از مهمترین اقداماتی که پیش از اجرای مدل ماشین لرنینگ باید انجام شود، پیش پردازش (Pre-Processing) داده ها است. مراحل کلی در پیاده سازی و اجرای یک مدل یادگیری ماشیندر این مرحله داده ها مورد بررسی قرار گرفته و ممکن است با هدف تطابق با مدل مورد نظر، تغییراتی بر روی آن ها انجام شود. از جمله این تغییرات می توان به موارد زیر اشاره نمود:تغییر بازه عددیحذف داده های ناموجودتبدیل متغیرهای غیرعددی به متغیرهای عددیفعالیت های رایج در پیش پردازش داده هاتبدیل متغیرهای غیرعددی به متغیرهای عددیدر این مطلب به تبدیل متغیرهای غیرعددی (Categorical) به متغیرهای عددی (Numerical) می پردازیم.متغیرهای Categoricalساده و خلاصه، بر خلاف داده های عددی (Numerical)، برخی دادi ها به صورت رشته ای(string) هستند که به آن ها Categorical می گوییم. برای اینکه بتوانیم از این مقادیر نیز به عنوان ویژگی های ورودی مدل استفاده کنیم، دو روش کلی وجود دارد:جایگزین کردن (replace) داده ها با استفاده از مقادیر دلخواهروش کدبندی وان هات (One Hot Encoding)برای مثال جدول زیر را در نظر بگیرید.آموزش روش کدبندی وان هات این اطلاعات مربوط به تعدادی آگهی فروش خودروی پژو 207 صفرکیلومتر در اواخر مرداد 1400 است. می خواهیم یک مدل ماشین لرنینگ بسازیم که بر پایه این اطلاعات بتواند قیمت مناسب برای یک خودرو پژو 207 صفرکیلومتر را پیش بینی کند.اما همانطور که مشخص است، به غیر از ستون های مربوط به سال (year)، رنگ (color)، جعبه دنده (gearbox) و امکانات جانبی (option) این خودرو ها تفاوت دیگری با هم ندارند. به بیان دیگر، داده های موجود در این ستون ها به صورت غیرعددی و Categorical هستند.آموزش وان هات انکودینگهمانطور که گفته شد دو روش کلی برای قابل استفاده کردن این داده ها وجود دارد:جایگزین کردن (replace) داده ها با استفاده از مقادیر دلخواهروش کدبندی وان هات (One Hot Encoding)در روش replace کردن همانطور که از نام این روش مشخص است هر عبارت رشته ای را با یک مقدار عددی دلخواه جایگزین می کنیم. مثلا به جای Grey عدد 1، به جای White عدد 2 و...اما روش اصولی تر استفاده از One Hot Encoding  و ساخت Dummy variables است. برای این کار ستونی که حاوی این مقادیر هست را به تعداد تنوع داده های به ستون های حاوی صفر و یک تبدیل می کنیم.مثلا با توجه به تنوع داده های ستون color که حاوی انواع Grey, White, Black, Silver، 4 ستون خواهیم داشت.  به زبان ساده One Hot Encoding همچنین برای ستون gearbox دو ستون Manual و Automatic و برای option نیز دو ستون Typical و Panoramic ساخته می شود.آموزش One Hot Encoding به زبان سادهآموزش روش کدبندی وان هات به زبان سادهبا انجام این کار می توانیم در ادامه از این مقادیر نیز به عنوان ویژگی های ورودی مدل استفاده کنیم.آموزش روش  وان هات در ماشین لرنینگآموزش  پیاده سازی روش کدبندی وان هات (One Hot Encoding) با استفاده از زبان پایتون و کتابخانه Pandasابتدا کتابخانه پانداز را فراخوانی می کنیمimport pandas as pdسپس با استفاده از امکانات پانداز، فایل CSV مربوط به اطلاعات خودروها را می خوانیم.cars_data = pd.read_csv(&amp;quotPeugeot207.csv&amp;quot)با استفاده از ()unique. می توانیم انواع داده های موجود در یک ستون را مشاهده کنیم. برای مثال انواع داده های موجود در ستون color در نتیجه اجرای کد زیر نشان داده خواهند شد.cars_data[&amp;quotcolor&amp;quot].unique()در ادامه قصد داریم بر روی ستون color و مقادیر آن One Hot Encoding را اجرا کنیم.colors = pd.get_dummies(cars_data[&amp;quotcolor&amp;quot])
colorsخط اول One Hot Encoding را بر روی ستون color اجرا می کنیم و نتیجه آن را داخل متغیر colors می ریزیم.نتیجه اجرای خط دوم، نمایش داده های موجود در colors است. متغیرهای Categoricalدر ادامه با استفاده از کد زیر، colors را به جدول اصلی اضافه می کنیم.cars_data = pd.concat([cars_data,colors],axis=1)نتیجه این بخش با استفاده از کد زیر نشان داده می شود.cars_dataآموزش پیاده‌سازی کدبندی One-Hot در پایتونهمانطور که مشخص است که بر اساس تعداد و اسامی رنگ های موجود در ستون color، ستون هایی به جدول انتهای جدول اضافه شده اند. مقادیر این ستون ها صفر یا یک است. «صفر» به معنی اینکه آن ردیف از جدول دارای آن مقدار نیست و «یک» به معنی اینکه آن مقدار را دارد.برای  مثال در ردیف اول به دلیل آن رنگ خودروی موردنظر،  Grey است، در 4 ستون آخر نیز تنها مقدار ستون Grey یک است و سایر ستون ها صفر هستند.به همین ترتیب برای ستون های gearbox و option نیز، کدبندی وان هات به صورت زیر انجام می شود.gearbox_types = pd.get_dummies(cars_data[&amp;quotgearbox&amp;quot])
cars_data = pd.concat([cars_data,gearbox_types],axis=1)
cars_data«یادگیری ماشین» (Machine Learning) کدبندی One-Hot  options = pd.get_dummies(cars_data[&amp;quotoption&amp;quot])
cars_data = pd.concat([cars_data,options],axis=1)
cars_dataکدبندی One-Hotدر پایان و در نتیجه اجرای تمامی کدهای بالا، جدول به صورت زیر خواهد بود. پیاده‌سازی کدبندی One-Hot در پایتونلینک دانلود دیتاست:https://www.kaggle.com/alifallahi1/simple-peugeot207-pricelistلینک دانلود کد:https://www.kaggle.com/alifallahi1/peugeot207-notebook&amp;lt;br/&amp;gt;</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Fri, 13 Aug 2021 12:46:00 +0430</pubDate>
            </item>
                    <item>
                <title>کتاب اثر مرکب، تجربه شخصی</title>
                <link>https://virgool.io/@alifallahi/%DA%A9%D8%AA%D8%A7%D8%A8-%D8%A7%D8%AB%D8%B1-%D9%85%D8%B1%DA%A9%D8%A8-%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D8%B4%D8%AE%D8%B5%DB%8C-jb8qjusjl2ic</link>
                <description>کتاب اثر مرکب The Compound Effectتا قبل از اینکه این کتاب رو بخونم، هر وقت اسمش رو می شنیدم تصویر زیر تو ذهنم به وجود می اومد.اثر مرکبدر واقع فکر می کردم کلمه «مرکب» در اسم این کتاب، هم معنی با جوهر هست. اما خب، پس از شروع مطالعه و در همون صفحات اول متوجه شدم که «مرکب» ترجمه شده لغت انگلیسی &quot;Compound&quot; به معنی «ترکیب شده» هست نه &quot;ink&quot; و جوهر. و خب «اثر مرکب» ترجمه لغوی &quot;The Compound Effect&quot; هست.کتاب توسط آقای دارن هاردی (Darren Hardy) نوشته شده. ایشون از نویسندگان و سخنرانان شناخته شده در زمینه موفقیت هستند.دارن هاردیبه نظر من کتاب در گروه کتاب های توسعه فردی و موفقیت قرار می گیره. متاسفانه این گروه از کتاب ها، امروزه سرشار از اراجیف و اباطیل شده و من به همین دلیل، خیلی رغبت زیادی به خرید این کتاب نداشتم. اما شنیدن اسم کتاب از آدم هایی که حرف های درست زیادی می زنن باعث شد تا بالاخره کتاب رو تهیه کنم.اگر کتاب رو نخوندید پیشنهاد می کنم دو پادکست کوتاه زیر از آقای مجتبی شکوری رو گوش بدید. اگر هم که کتاب رو خوندید، توصیف کتاب اثر مرکب، از زبان ایشان خالی از لطف نیست.https://www.aparat.com/v/kFgKf?playlist=315257https://www.aparat.com/v/aR1K3?playlist=315257تو همین دو پادکست کوتاه که در مجموع حدود 15 دقیقه هستند، خیلی خلاصه و مفید و زیبا حرف اصلی کتاب اثر مرکب نوشته آقای دارن هاردی گفته می شه.کتابی که من خریدم از انتشارات نسل نو اندیش هست. چاپ هفتاد و هشتم و ترجمه شده توسط آقایان اکبر عباسی و شاهین بیات. به نظرم ترجمه خیلی خوب و روان و کاملا قبول قبولی هست.کتاب اثر مرکب - انتشارات نسل نو اندیشکتاب در مجموع 245 هست و شش فصل دارد. البته از صفحه 1 تا 39 شامل تحسین  کتاب از نویسندگان اغلب شناخته شده دیگر، پیام ویژه از آنتونی رابینز و مقدمه هست. از صفحه 211 تا پایان هم پرسش نامه ها و به نوعی تمرین هایی هستن که با توجه به مطالب کتاب می تونید اون ها رو برای خودتون تکمیل کنید و به نتایجی در مورد خودشناسی و اهدافتون و ... برسید.خلاصه کتاب به نظرم این هست که نتیجه در اثر استمرار به دست میاد. حالا این استمرار اگر در جهت مثبت باشه دستاوردهای مثبت به همراه خواهد داشت و اگر در جهت منفی هم باشه به پایانی ناخوشایند می رسه. یعنی خیلی از کارها در کوتاه مدت هیچ نشانه ای از به نتیجه رسیدن ندارند و تنها بعد از استمرار و گذشت زمان کافی هست که دستاوردها پدیدار می شن.یک مثال مرتبط با این موضوع «مساله دانه گندم و صفحه شطرنج» هست. یکی از ورژن های این داستان به این صورت هست که:پادشاه به فرد دانایی گفت برای تشکر از او که یک خواسته او را برآورده می کند. آن فرد هم درخواست کرد تا یک صفحه شطرنج بیاورند و گفت به ازای خانه اول ۱ گندم، به ازای خانه دوم ۲ گندم، به ازای خانه سوم ۴ گندم و بدین ترتیب به ازای هر خانه دو برابر قبلی گندم به او پاداش داده شود. با توجه به تعداد خانه های شطرنج، اگر این حرکت ادامه پیدا می کرد، احتمالا در پایان داستان، گندم کم می اوند :)خلاصه (نظر شخصی):به نظرم کتاب خوبی هست و خواندنش خالی از لطف نیست اما اگر این اولین کتابی نیست که در زمینه موفقیت و توسعه فردی مطالعه می کنید، خیلی از مطالب در نظرتون تکراری به حساب میان.حرف اصلی کتاب، خیلی خلاصه تر از 245 صفحه است.اسم کامل کتاب هم به صورت زیر هست:The Compound Effect: Multiply Your Success One Simple Step at a Timeلینک های مرتبط با کتاب اثر مرکب نوشته دارن هاردی:صفحه معرفی نویسنده کتاب در ویکی پدیا فارسیhttps://fa.wikipedia.org/wiki/دارن_هاردیصفحه معرفی نویسنده کتاب در ویکی پدیا انگلیسیhttps://en.wikipedia.org/wiki/Darren_Hardyلینک کتاب در آمازونhttps://www.amazon.com/Compound-Effect-Darren-Hardy/dp/159315724X</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Thu, 20 May 2021 00:22:45 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش الگوریتم گرادیان کاهشی در شبکه های عصبی عمیق Gradient descent</title>
                <link>https://virgool.io/@alifallahi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%DA%AF%D8%B1%D8%A7%D8%AF%DB%8C%D8%A7%D9%86-%DA%A9%D8%A7%D9%87%D8%B4%DB%8C-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%B9%D9%85%DB%8C%D9%82-gradient-descent-qkiwqo2owpig</link>
                <description>اگر با مفاهیم گراف محاسباتی (کامپیوتیشنال گراف | Computational Graph) و کاربرد آن در عملیات انتشار رو به جلو (فُروارد پروپگیشن | Forward Propagation) و همچنین روش پس انتشار یا انتشار رو به عقب (بک وارد پروپگیشن | Backward Propagation) آشنایی ندارید، پیشنهاد می کنم ابتدا مطلب زیر مطالعه نمایید.گراف محاسباتی (Computational Graph) و محاسبه مشتق ضمنی در شبکه های عصبی عمیقآموزش الگوریتم گرادیان کاهشی در شبکه های عصبی عمیق Gradient descentشکل زیر گراف محاسباتی برای رگرسیون لجستیک (لجستیک رگرشن | Logistic Regression) را نشان می دهد.گراف محاسباتی رگرسیون لجستیکدر این شکل پارامترهای w و b به همراه ورودی x به سیستم وارد می شوند. سپس مطابق فرمول داده شده، z محاسبه می شود. در ادامه z به عنوان ورودی به تابع سیگمویید داده می شود. خروجی تابع سیگومئید در متغیر a ریخته می شود. این مقدار می تواند بین صفر تا یک باشد و به معنی احتمال وجود گربه در ورودی داده شده است. مثلا 0.75 یعنی از نظر ماشین، تصویر داده شده، 75% تصویر یک گربه است. در پایان تابع هزینه L با توجه به دو مقدار a و مقدار y میزان خطای شبکه را محاسبه می کند.این شبکه از نوع یادگیری با ناظر (Supervised Learning) است. در این شکل، y برچسب اصلی ورودی x است. توضیح بیشتر جمله بالا:در شبکه های Supervised، داده های ورودی ما برچسب دارند. مثلا ما تعدادی تصویر به شبکه می دهیم و می خواهیم که تصاویری که گربه در آن ها وجود دارد را پیدا کند. نکته مهم این است که خود ما می دانیم کدام تصاویر از گربه ها هستند. y  برچسب این تصاویر است و می تواند دارای مقدار 1 به معنی اینکه تصویر گربه است و 0 به این معنی که در آن تصویر گربه وجود ندارد. مثلا در مجموعه داده ای زیر، تنها تصاویر شماره 1 و 3 تصاویر گربه هستند.نمونه جدول ورودی یک Image Classifierدر مورد اینکه چرا خروجی تابع سیگومید حتما مقداری بین صفر تا یک است می توانید مطلب زیر را مطالعه نمایید.تابع سیگمویئد (Sigmoid function) چیستگراف محساباتی در شبکه های عصبیپس در  مرحله آخر گراف ارایه شده، تابع هزینه برای ما اخلاف بین a که مقدار پیش بینی شده برای ورودی x است را با برچسب اصلی آن یعنی y محاسبه می کند.توضیحات مربوط به تابع هزینه در مطلب مستقل ارایه می شود.الگوریتم گرادیان کاهشی چیست؟در مطلب &quot;گراف محاسباتی (Computational Graph) و محاسبه مشتق ضمنی در شبکه های عصبی عمیق&quot; توضیح دادیم که در شبکه های عصبی عمیق، روال کلی انجام کار به این صورت است که ما داده های ورودی را به سیستم می دهیم. با مقادیر اولیه که به صورت تصادفی انتخاب شده اند، پارامترها را مقدار دهی می کنیم و سپس شبکه عملیات فروارد پروپگیشن را انجام می دهد. جواب نهایی مورد ارزیابی قرار می گیرد و میزان خطای شبکه محاسبه می شود، سپس برخلاف Forward Propagation، اینبار رو به عقب حرکت می کنیم (Backward Propagation) و پارامترها را اصلاح می کنیم. با پارامترهای آپدیت شده مجدد، مدل اجرا می شود (Forward Propagation) و به جواب پایانی می رسیم. جواب را مورد ارزیابی قرار داده و میزان خطای شبکه را محاسبه می کنیم. Backward Propagation و اصلاح پارامترها را انجام داده و مجدد شبکه را اجرا می کنیم. این مراحل، تا زمانی که قانع شویم مدل دارای دقت کافی در انجام وظیفه تعیین شده است می شود.واضح است که ما برای بهبود عملکرد شبکه نمی توانیم ورودی x را تغییر دهیم و تنها پارامترهای w و b هستد که می توان آن ها را بهینه نمود. در واقع ما به دنبال بهینه کردن J(w,b) هستیم.در این قسمت تابع هزینه را به جای L با J نشان می دهیم. Loss function و Cost function هر دو به تابع هزینه ترجمه می شوند. اما loss function میزان خطا را برای یک ورودی اندازه گیری می کند در حالی که cost function میانگین تمام loss function های محاسبه شده برای همه داده های موجود در دیتاست آموزش شبکه است.The loss function computes the error for a single training example; the cost function is the average of the loss functions of the entire training set.در این مثال نیز چون ما تنها یک داده ورودی داریم پس از J به معنی تابع هزینه کلی، استفاده می کنیم.خروجی کانوکس از تابع هزینهدر این شکل محورهای افقی نشان دهنده مقادیر w و b و محور عمودی نشان دهنده مقدار J است. و هدف  ما این است که w و b را به گونه ای انتخاب کنیم که J کمترین مقدار ممکن را داشته باشد (در نقطه ای که J کمترین مقدار ممکن را دارد ببنیم چه w و b چه اعدادی هستند.).شکل بالا مشابه یک کاسه است (Bow shape) و طبیعتا کمترین مقدار J در عمیق ترین جای این کاسه قرار دارد که با فلش قرمز مشخص شده است. به شکل بالا convex (کان وِکس) گفته می شود.این شکل دارای یک مینیم سراسری و کلی است.روال کلی کار یک شبکه عصبی را با هم مرور می کنیم.1. داده های ورودی را به سیستم می دهیم. 2. پارامترهای w  و b را با مقادیر اولیه تصادفی، مقدار دهی می کنیم و سپس شبکه، عملیات فروارد پروپگیشن را انجام می دهد. شکل زیر نشان می دهد که ما در نتیجه انتخاب w و b به صورت تصادفی به خروجی J رسیده ایم، اما این نتیجه مطلوب ما نیست.شروع گرادیان کاهشی از یک نقطه رندوم3. جواب نهایی مورد ارزیابی قرار می گیرد و میزان خطای شبکه محاسبه می شود4.  سپس برخلاف Forward Propagation، اینبار رو به عقب حرکت می کنیم (Backward Propagation) و پارامترها را اصلاح می کنیم. 5. با پارامترهای آپدیت شده مجدد، مدل اجرا می شود (Forward Propagation).مراحل 3 تا 5 به اندازه ای تکرار می شوند که دقت شبکه به میزان مورد تایید ما برسد.الگوریتم گرادیان کاهشی بر روی کانوکسجمع بندیهدف الگوریتم گرادیان کاهشی پیدا کردن کمینه محلی (local minimum) در توابع مختلف است، مثل تابع J در این مطلب که شکلی کانوکس داشت.ایده اصلی در الگوریتم گرادیان کاهشی، تکرار گام برداشتن در جهت شیب رو به سمت پایین است.در این الگوریتم کار با یک نقطه تصادفی روی تابع آغاز می‌شود و روی جهت منفی از گرادیان تابع حرکت می‌کند تا به کمینه محلی/سراسری برسد.دقت کنید که خروجی تابعی که قصد داریم گرادیان کاهشی را بر روی آن اجرا کنیم می تواند شکل ها بسیار متنوعی داشته باشد.آموزش الگوریتم گرادیان کاهشی</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Sat, 01 May 2021 18:16:57 +0430</pubDate>
            </item>
                    <item>
                <title>گراف محاسباتی (Computational Graph) و محاسبه مشتق ضمنی در شبکه های عصبی عمیق</title>
                <link>https://virgool.io/@alifallahi/%DA%AF%D8%B1%D8%A7%D9%81-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D8%A7%D8%AA%DB%8C-computational-graph-%D9%88-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D9%87-%D9%85%D8%B4%D8%AA%D9%82-%D8%B6%D9%85%D9%86%DB%8C-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%B9%D9%85%DB%8C%D9%82-wdaknptuy0rl</link>
                <description>در این مطلب به بررسی گراف محاسباتی (کامپیوتیشنال گراف | Computational Graph) و کاربرد آن در عملیات انتشار رو به جلو (فُروارد پروپگیشن | Forward Propagation) و همچنین روش پس انتشار یا انتشار رو به عقب (بک وارد پروپگیشن | Backward Propagation) می پردازیم. همچنین برای محاسبه مشتق از قانون زنجیر در دیفرانسیل، نیز استفاده می کنیم.آموزش قانون زنجیر دیفرانسیل در گراف محاسباتی (Computational Graph) در شبکه های عصبی عمیق
انتشار رو به جلو (Forward Propagation)گراف محاسباتی (Computational Graph) در شبکه های عصبی عمیقدر این شکل، اگر از سمت چپ به راست، معادلات را انجام دهیم خواهیم داشت:u = b * c  u = 6 * 3   u = 18v = a + u  v = 4 + 18  v = 22j = 2v    j = 2 * 22  j = 44اگر بخواهیم برای کل این گراف، یک معادله ارایه کنیم خواهیم داشت:گراف محاسباتی در دیپ لرنینگ تا اینجا ما عملیات Forward Propagation را انجام دادیم، یعنی با توجه به داده های ورودی (a=4, b=6, c=3) محسابات را انجام دادیم و به جواب پایانی J رسیدیم.انتشار رو به عقب (Backward Propagation)در شبکه های عصبی عمیق، روال کلی انجام کار به این صورت است که ما داده های ورودی را به سیستم می دهیم، با مقادیر اولیه که به صورت تصادفی انتخاب شده اند، پارامترها را مقدار دهی می کنیم و سپس شبکه عملیات فروارد پروپگیشن را انجام می دهد. جواب نهایی مورد ارزیابی قرار می گیرد و میزان خطای شبکه محاسبه می شود، سپس برخلاف Forward Propagation، اینبار رو به عقب حرکت می کنیم (Backward Propagation) و پارامترها را اصلاح می کنیم. با پارامترهای آپدیت شده مجدد، مدل اجرا می شود (Forward Propagation) و به جواب پایانی می رسیم. جواب را مورد ارزیابی قرار داده و میزان خطای شبکه را محاسبه می کنیم. Backward Propagation و اصلاح پارامترها را انجام داده و مجدد شبکه را اجرا می کنیم. این مراحل، تا زمانی که قانع شویم مدل دارای دقت کافی در انجام وظیفه تعیین شده است می شود.به تابعی که با استفاده از آن میزان خطای شبکه را محاسبه می کنیم، تابع هزینه (لاس فانکشن | Loss Function) گفته می شود. برای به روزرسانی پارامترها متناسب با خروجی تابع هزینه نیز از الگوریتم گرادیان کاهشی (گردین دیسنت | Gradient descent) استفاده می کنیم.توضیحات مربوط به عملکرد شبکه عصبی، تابع هزینه و الگوریتم گرادیان کاهشی در مطلب مستقل ارایه می شوند.اما برای انجام Backward Propagation ما نیاز داریم تا ارتباط بین نتیجه نهایی شبکه (گراف محاسباتی) و ورودی ها و نتایج میانی شبکه را به دست بیاوریم. منظور از این ارتباط، مشتق ضمنی تابع J نسبت به پارامتر موردنظر است (یا به بیان ساده تر شیب خط J در نقطه مورد نظر).به مشتق در زبان انگلیسی، Derivative (دِری وِتیو) یا شیب خط Slop (اِسلُپ) گفته می شود.گراف ارایه شده را در نظر بگیرید.Backward Propagationمحاسبه مشتق ضمنی در اگر بخواهیم خط  j=2v را رسم کنیم  می توانیم نقاط زیر را خط را پیدا کرده و خط را رسم کنیم.اگر v = 0 باشد، خروجی 0 می شود. اگر v = 1 باشد، خروجی 2 می شود.اگر v = 2 باشد، خروجی 4 می شود.آموزش شبکه عصبیآموزش گراف محساباتی در شبکه های عصبیو اگر مطابق داده های مسئله، v = 22 باشد،  j = 2 * 22 خواهد بود و در نتیجه  j = 44 می شود. در شکل زیر مقیاس رعایت نشده است. آموزش گراف محساباتی در شبکه های عصبی عمیق گفته شد که j = 2v و اگر v = 20 باشد  j = 2 * 20 = 40 می شود. حالا اگر به v مقدار بسیار کمی اضافه کنیم j چه تغییری می کند؟ برای مثالj = 2 * vv = 20                 j = 2 * 20 = 40 v= 20.001         j = 2 * 20.001 = 40.002v = 20.002         j = 2 * 20.002 = 40.004آموزش محاسبه مشتق ضمنیبا توجه به محاسبات بالا می توان نتیجه گرفت که اگر v به هر مقداری تغییر کند، j به اندازه 2 برابر آن تغییر می کند. یا به زبان ریاضی مشتق j نسبت به v برابر به 2 است.Derivative of j with respect to v is equal to 2این رابطه بر روی نمودار به صورت زیر محاسبه می شود. (بر روی قسمت موردنظر از شکل قبل زوم شده است.)Derivative وزش مشتق شیب خط در نقظه مورد نظر (مشتق خط) که با رنگ سبز نشان داده شده است برابر است با تقسیم ارتفاع مثلث ساخته شده (خط آبی) بر قاعده یا عرض مثلث ساخته شده (خط قرمز).این مفهوم را به صورت کسر زیر نشان می دهیم.مجدد گراف را به خاطر بیاورید.فروارد پروپگیشن در شبکه های عصبی قانون زنجیر در دیفرانسیلاگر بخواهیم مشتق j را نسبت به a محاسبه کنیم چطور؟به a مقداری کوچک اضافه می کنیم تا ببینیم j چه تغییری می کند.                               v = a + u                                             j = 2 * v           a = 4, u = 18          v = 4 + 18 = 22                                 j = 2 * 22 = 44a= 4.0001              v = 4.0001 + 18 = 22.0001         j = 2 * 22.0001 = 44.0002a= 4.0002              v = 4.0001 + 18 = 22.0002         j = 2 * 22.0002 = 44.0004با توجه به محاسبات بالا می توان نتیجه گرفت که اگر a به هر مقداری تغییر کند، j به اندازه 2 برابر آن تغییر می کند. پس مشتق j نسبت به a برابر است با 2همانطور که مشاهده کردید برای محاسبه مشتق j نسبت به a ما نیاز داشتیم که مشتق j نسبت به v را نیز محاسبه کنیم.a --&gt; v --&gt; j به این رابطه در دیفرانسیل (Calculus)، قانون زنجیر (Chain rule) گفته می شود.در فرمول بالا مشتق v به a به صورت زیر محاسبه شده است.                               v = a + u                                 a = 4, u = 18          v = 4 + 18 = 22                               a= 4.0001              v = 4.0001 + 18 = 22.0001        a= 4.0002              v = 4.0001 + 18 = 22.0002      هر اندازه که a تغییر کند v نیز به همان اندازه تغییر می کند، پس مشتق v نسبت به a برابر 1 است.استفاده قانون زنجیر در دیفرانسیلحالا که چگونگی محاسبه مشتق ضمنی نسبت به متغییرهای مختلف و قانون زنجیر را یادگرفتیم می توانیم مشتق j نسبت به هر یک از موارد موجود در گراف محاسباتی را به دست بیاوریم.بکوارد پروپگیشن در شبکه های عصبی مشتق j نسب به uمشتق j نسبت به bمقدار b را به اندازه ای کوچک افزایش می دهیم و تغییرات را بررسی می کنیم.                             u=b*c            v=a+u              j=2*v           b=6, c=3, a=4     u=6*3 =18     v=4+18=22     j=2*22=44b=6.0001, c=3, a=4     u=6.0001*3 =18.0003     v=4+18.0003=22.0003     j=2*22.0003=44.0006b=6.0002, c=3, a=4     u=6.0002*3 =18.0006     v=4+18.0006=22.0006     j=2*22.0006=44.0012هر اندازه که b تغییر کند j به اندازه 6 برابر آن تغییر می کند.مشتق j نسبت به cمشابه به مشتق j نسبت به b برای محاسبه مشتق j نسبت به c خواهیم داشت:راهنمای تعریف متغیر در کدنویسی محاسبه مشتقدر مبحث مطرح شده، j خروجی نهایی شبکه است که به آن Final output می گوییم. پس در هریک از کسرهای dj بر روی هر یک از متغیرهای غیرپایانی گراف مثل dv، du، da، db، dc منظور ما کسر زیر است.که به صورت خلاصه نوشته می شودبه دلیل اینکه تعریف کامل کسر در نام متغیر دشوار است، در کدنویسی مشتق های ضمنی بالا را به صورت dv، du، da، db، dc نشان می دهیم. در واقع تنها به ذکر کسر مربوطه اکتفا می کنیم. هریک از متغیرهای ذکر شده، دارای مفهوم زیر هستند</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Fri, 30 Apr 2021 21:15:15 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش طبقه بندی (Classification) با استفاده از رگرسیون لجستیک | مرحله به مرحله و با مثال</title>
                <link>https://virgool.io/@alifallahi/%D8%B7%D8%A8%D9%82%D9%87-%D8%A8%D9%86%D8%AF%DB%8C-classification-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%B1%DA%AF%D8%B1%D8%B3%DB%8C%D9%88%D9%86-%D9%84%D8%AC%D8%B3%D8%AA%DB%8C%DA%A9-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-l9detz2tcwjx</link>
                <description>بعد از یادگیری رگرسیون خطی نوبت به Classification می رسد.برای اینکه بیشتر با این موضوع آشنا شوید، مثال های زیر را در نظر بگیرید:سیستم تشخیص اسپم بودن یا نبودن یک ایمیلخوشخیم یا بدخیم بودن یک توموردر تمام این مثال ها ساختار و خروجی سیستم به گونه ای است که یک جواب صفر یا یک دارد. y∈{0,1}که به طور معمول، 0 به معنی جواب منفی و 1 به معنی جواب مثبت است. برای مثال در مورد موضوع تشخیص تومور، جواب تست می تواند به صورت زیر در نظر گرفته شود:0: &quot;Negative Class&quot; 1: &quot;Positive Class&quot;در این مثال ها ما طبقه بندی را با دو متغیر انجام می دهیم که به آن binary classification problem نیز گفته می شود.مشابه با رگرسیون خطی ساده و چندمتغیره، در مبحث طبقه بندی (Classification) نیز اگر مجموعه جواب مسئله دارای عضوهای بیشتر از 0 و 1 باشد به آن multiclass classification problem گفته می شود.مثال 1:مجموعه داده ای داریم که شامل مشخصات تعدادی تومور نمونه برداری شده است. این دیتاست دارای دو ویژگی اندازه تومور و بدخیم بودن یا نبودن آن است.با توجه به شکل بالا می توان نتیجه گرفت که بین اندازه یک تومور و بدخیم بودن یا نبودن آن یک رابطه احتمالا خطی ؟؟ وجود دارد. به این معنی که هرچه اندازه تومور بزرگتر باشد احتمال بدخیم بودن آن نیز بیشتر می شود. به این ترتیب آیا ما می توانیم از رگرسیون خطی مثل پیشبینی قیمت خانه، برای پیش بینی بدخیم بودن یا نبودن یک تومور هم استفاده کنیم؟یعنی یک خط رگرسیون رسم کنیم و نتیجه بگیریم که اگر تومور از یک اندازه مشخصی بزرگتر باشد بدخیم است و اگر کوچکتر باشد، بدخیم نیست. این ایده در شکل زیر نشان داده شده است.به صورت دقیق تر، تمام آیتم هایی که بیشتر از 0.5 هستند را به عنوان جواب مثبت و یک در نظر بگیریم و به همین ترتیب جواب های کمتر از 0.5 را به عنوان جواب های منفی لحاظ کنیم.یادآوری: فرضیه (hypothesis) ما در رگرسیون خطی به صورت زیر است.خب، تا اینجا که ظاهرا همه چیز به خوبی پیش می رود. مقادیر سمت راست حد آستانه (threshold) به عنوان تومورهای بدخیم و آیتم های کمتر از حدآستانه، به عنوان تومورهای غیربدخیم به خوبی از هم تفکیک شده اند.حالا اگر مقادیر دیتاست به صورت زیر تغییر کند، چه می شود؟؟؟مثلا تومورهای نمونه برداری شده از نظر اندازه با هم تفاوت زیادی داشته باشند.مثال 2:بر اساس روش مطرح شده باز هم خط رگرسیون را رسم می کنیم.واضح است که اینبار حد آستانه درنظر گرفته شده برای اندازه تومورها به خوبی عمل نمی کنه و مدل اجرا شده خطای زیادی دارد.پس استفاده از رگرسیون خطی برای مسایل مربوط به طبقه بندی داده ها (Classification) راهکار مناسبی نیست. (اگرچه ممکن است در برخی موارد با توجه به مقادیر دیتاست، مشابه آنچه در مثال اول اتفاق افتاد، رگرسیون خطی نتیجه مناسبی در طبقه بندی داده ها ارایه دهد.)نکته دیگر این است که در مسایل طبقه بندی جواب های ما همواره بین صفر یا یک است. ولی هیچ تضمینی وجود ندارد که جواب های رگرسیون خطی در این بازه محدود شوند.راه حل، استفاه از رگرسیون لجستیک (Logistic regression) است.رگرسیون لجستیک یک راهکار مناسب برای مسایل طبقه بندی (Classification) است. مقادیر این مساله به صورت گسسته هستند (discrete values) و نکته مهم اینکه خروجی لجستیک رگرشن محدود به 0 و 1 است.تابع فرضیه ما در رگرسیون لجستیک دارای شکل کلی زیر است، که به آن تابع سیگومید (sigmoid function) یا تابع لجستیک (logistic function) می گوییم.فرمول رگرسیون لجستیک رگرسیون لجستیک دارای فرمول کلی زیر است.در این فرمول e نماد عدداویلر و دارای مقدار ثابت 2.718281828459 است.حرف z نیز به معنی همان تابع رگرسیون خطی است. در واقع خواهیم داشت:و همانطور که گفته شد خروجی این تابع در بازه صفر تا یک است.به معنی اگر در سیستم بررسی بدخیم بودن تومور که در آن عدد 1 به معنی بدخیم بودن و 0 به معنی بدخیمنبودن است، اگر خروجی تابع در نتیجه بررسی یک تومور 0.7 بود، یعنی به احتمال 70% تومور موردنظر یک تومور بدخیم است.این تعریف را در زبان ریاضی به صورت زیر نشان می دهیم:عبارت بالا را اینگونه می خوانیم:احتمال اینکه y به ازای x های داده شده و بر حسب پارامتر تتا، برابر با 1 باشد. و براساس مثال بدخیم بودن یا نبودن تومور:This is the probability that y is equal to one. Given x, given that my patient has features x, so given my patient has a particular tumor size represented by my features x. And this probability is parameterized by theta.واضح است که اگر احتمال بدخیم بودن تومور موردنظر 0.7 باشد P (y = 1∣ x ; θ ) =0.7احتمال بدخیم نبودن این تومور 0.3 است. P (y = 0∣ x ; θ ) =0.3در واقع می توان گفت که مجموع احتمال بدخیم بودن و نبودن یک تومور باید 1 باشد. 0.7 + 0.3 = 1چرا که مقدار y برای رگرسیون لجستیک همواره بین صفر و 1 است.آپدیت: 26 اسفند 1400اضافه کردن کدهای پیاده سازی رگرسیون لجستیک با استفاده از sklearn بر روی دیتاست iris ###I --- پیاده سازی رگرسیون لجستیک بر روی دیتاست iris  --- start
### --- Running logistic regression on the iris dataset --- start

import pandas as pd
iris = pd.read_csv(&#039;iris.csv&#039;)

iris.head()

from sklearn.model_selection import train_test_spli
from sklearn.linear_model import LogisticRegression

y = iris.variety
features = [&#039;sepal.length&#039;,&#039;sepal.width&#039;,&#039;petal.length&#039;,&#039;petal.width&#039;]
X = iris[features]

train_X, val_X, train_y, val_y = train_test_split(X, y, test_size=0.4, random_state=1)

###I --- رگرسیون لجستیک | Logistic regression
dt_model = LogisticRegression()
dt_model.fit(train_X, train_y)

val_predictions = dt_model.predict(val_X)

from sklearn import metrics
print(metrics.accuracy_score(val_y, val_predictions))

### --- Running logistic regression on the iris dataset --- end
###I --- پیاده سازی رگرسیون لجستیک بر روی دیتاست iris  --- end</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Fri, 25 Dec 2020 10:49:11 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش رگرسیون خطی چندگانه، مرحله به مرحله و با مثال</title>
                <link>https://virgool.io/@alifallahi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B1%DA%AF%D8%B1%D8%B3%DB%8C%D9%88%D9%86-%D8%AE%D8%B7%DB%8C-%DA%86%D9%86%D8%AF%DA%AF%D8%A7%D9%86%D9%87-%D9%85%D8%B1%D8%AD%D9%84%D9%87-%D8%A8%D9%87-%D9%85%D8%B1%D8%AD%D9%84%D9%87-%D9%88-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-thtmb28lyndm</link>
                <description>آموزش رگرسیون خطی چندگانه، مرحله به مرحله و با مثالهمانطور که در مطلب مربوط به رگرسیون خطی ساده (Simple linear regression) گفته شد، چنانچه بین متغیرهای مستقل (dependent variable) و متغیرهای وابسته (independent variable) در یک مسئله، رابطه خطی وجود داشته باشد، می‌توان از رگرسیون خطی استفاده کرد تا برای متغیرهای مستقل جدید، متغیرهای وابسته متناسب با آن‌ها را پیش‌بینی کرد.به عنوان مثال:جدول زیر نشان‌دهنده مساحت چند خانه و قیمت آن‌ها است.در این جدول مقادیر متراژ خانه‌ها به عنوان متغیرهای مستقل (X) درنظر گرفته می‌شوند. در مقابل قیمت هرخانه نیز به عنوان یک متغیر وابسته (Y) شناخته می‌شود.اگر داده‌های جدول بالا را در قالب یک نمودار نشان دهیم، به تصویر زیر می رسیم.رابطه خطی بین متغیرهامشخص است که یک رابطه خطی بین متراژ خانه و قیمت آن وجود دارد، به این معنی که با افزایش متراژ خانه، قیمت آن نیز افزایش می‌یابد.پس اگر ما بتوانیم معادله این رابطه خطی را پیدا کنیم، می‌توانیم قیمت خانه را برای متراژهای دیگر نیز محاسبه کنیم. مثلا می‌خواهیم پیش‌بینی کنیم قیمت یک خانه 40 متری چقدر است.معادله خط را به خاطر دارید؟حالت کلی معادله یک خط به صورت زیر است:y = ax+bدر این معادله به a شیب خط (slop) و به b عرض از مبدا (intercept) می‌گویند.شیب خط مقدار زاویه خط با محور افقی و عرض از مبدا، فاصله نقطه شروع خط از محور y را مشخص می‌کند.مثلا :y = 2x + 1برای رسم این خط کافی است برای مقادیر مختلف x مقدار y را محاسبه کنیم و سپس نقاط را به هم وصل کنیم.Y = (2 * -2) + 1= -3Y = (2 * -1) + 1= -1Y = (2 * 0) + 1= 1Y = (2 * 1) + 1= 3Y = (2 * 2) + 1= 5Y = (2 * 3) + 1= 7نمایش داده های بالا بر روی محورهای مختصات به صورت زیر است:مثال مربوط به قیمت خانه‌ها را که فراموش نکرده‌اید!همانطور که پیشتر گفتیم، که اگر داده‌های جدول بالا را به صورت مختصات xو y در نظر بگیریم، شکل زیر به دست می‌آید.import matplotlib.pyplot as plt
from numpy.polynomial.polynomial import polyfit

Area = [10,15,20,25,30]
Price = [500,750,1000,1250,1500]

plt.scatter(Area, Price, color=&#039;blue&#039;)
plt.xlabel(&#039;Area&#039;)
plt.ylabel(&#039;Price&#039;)

input_size = len(Area)
x = Area
y = Priceآیا می‌توانید معادله این خط را به دست آورید و خطی را رسم کنید که با تمامی نقاط کمترین فاصله را داشته باشد؟ با توجه به داده‌های مسئله، حتی به صورت چشمی نیز می‌توان خط صافی را رسم که دقیقا از روی تمامی نقاط عبور می‌کند.(این حالت که خط رسم شده کمترین فاصله را از نقاط داشته باشد، بهترین حالت خط رگرسیون است، بعدا در مبحث ارزیابی خطای مدل، به این موضوع بیشتر می‌پردازیم.)معادله این خط نیز حالتی از y = ax+b است اما چگونه a و b را پیدا کنیم که بتوانیم برای xهای جدید نیز y را محاسبه کنیم؟مثلا y را برای x=40 محاسبه کنیم که با توجه به مثال مورد بحث، می‌شود قیمت خانه‌ای با متراژ40 متر مربع.برای حل این مثل از رگرسیون خطی ساده (Simple linear regression) استفاده می‌کنیم.این که چرا از پسوند &quot;ساده&quot; در این عبارت استفاده کرده‌ایم؟به طور کلی اگر در محاسبه رگرسیون خطی، برای متغیر وابسته (y)، بیشتر از یک متغیر مستقل (x) را در نظر بگیریم، رگرسیون خطی ما از نوع چندگانه (Multiple Linear Regression) است.در ادامه مطلب با این تعریف بیشتر آشنا می شوید.فرمول کلی رگرسیون خطی ساده همان  y = ax+b است که به طور معمول به جای a و b از θ0 (تتا صفر) و θ1 (تتا یک)استفاده می‌کنیم.y = θ0 + θ1 xبرای محاسبه θ0 و θ1 نیز به صورت زیر عمل می‌کنیم:یکبار دیگه داده‌ها رو ببینیم و محاسبات رو شروع کنیم.هدفمون که یادتون نرفته، به دنبال پیدا کردن معادله خط موردنظر برای داده‌ها هستیم.اولین قدم محاسبه میانگین هر یک از متغیرهاست:avg_x = (10 + 15 + 20 + 25 + 30)/5 = 20avg_y = (500 + 750 + 1000 + 1250 + 1500)/5 = 1000Area = [10,15,20,25,30]
Price = [1,3,3,2,5]
input_size = len(Area)
x = Area
y = Price

def avg(avg_input):
      my_temp = 0
      for i in range (0, input_size):
            my_temp = my_temp + avg_input[i]
      return(my_temp/input_size)

avg_x = avg(x)
avg_y = avg(y)

print(&amp;quotAverage of x: &amp;quot, avg_x)
print(&amp;quotAverage of y: &amp;quot, avg_y)پس با توجه به مقادیر بالا، معادله خط مورد نظر به صورت زیر به دست می‌آید:y = θ0 + θ1 xy = 0 + 50 xیعنی تابع yما در این مثال هر x ورودی را در 50 ضرب می‌کند و به خروجی می‌دهد.import matplotlib.pyplot as plt
from numpy.polynomial.polynomial import polyfit

Area = [10,15,20,25,30]
Price = [500,750,1000,1250,1500]

plt.scatter(Area, Price, color=&#039;blue&#039;)
plt.xlabel(&#039;Area&#039;)
plt.ylabel(&#039;Price&#039;)

input_size = len(Area)
x = Area
y = Price

def avg(avg_input):
     my_temp = 0
     for i in range (0, input_size):
          my_temp = my_temp + avg_input[i]
     return(my_temp/input_size)

avg_x = avg(x)
avg_y = avg(y)
print(&amp;quotAverage of x: &amp;quot, avg_x)
print(&amp;quotAverage of y: &amp;quot, avg_y)

def beta1():
     beta1_numerator = 0
     beta1_denumerator = 0
     for i in range (0, input_size):
          beta1_numerator = beta1_numerator + ((x[i] - avg_x)*(y[i] - avg_y))
          beta1_denumerator = beta1_denumerator + ((x[i] - avg_x)**2)
     return(beta1_numerator/beta1_denumerator)

print(&amp;quotBeta1 = &amp;quot, beta1())

beta0 = avg_y - (beta1() * avg_x)
print(&amp;quotBeta0 = &amp;quot, avg_y , &amp;quot-&amp;quot , &amp;quot(&amp;quot , beta1() , &amp;quot*&amp;quot , avg_x , &amp;quot) =&amp;quot , beta0)حالا می‌توانیم به راحتی قیمت یک خانه 40 متری نیز محاسبه کنیم.X = 40y = 0 + 50 xy = 0 + (50* 40) = 2000import matplotlib.pyplot as plt
from numpy.polynomial.polynomial import polyfit

Area = [10,15,20,25,30]
Price = [500,750,1000,1250,1500]

plt.scatter(Area, Price, color=&#039;blue&#039;)
plt.xlabel(&#039;Area&#039;)
plt.ylabel(&#039;Price&#039;)

input_size = len(Area)
x = Area
y = Price

def avg(avg_input):
     my_temp = 0
     for i in range (0, input_size):
          my_temp = my_temp + avg_input[i]
     return(my_temp/input_size)

avg_x = avg(x)
avg_y = avg(y)

print(&amp;quotAverage of x: &amp;quot, avg_x)
print(&amp;quotAverage of y: &amp;quot, avg_y)

def beta1():
     beta1_numerator = 0
     beta1_denumerator = 0
     for i in range (0, input_size):
          beta1_numerator = beta1_numerator + ((x[i] - avg_x)*(y[i] - avg_y))
          beta1_denumerator = beta1_denumerator + ((x[i] - avg_x)**2)
     return(beta1_numerator/beta1_denumerator)

print(&amp;quotBeta1 = &amp;quot, beta1())
beta0 = avg_y - (beta1() * avg_x)
print(&amp;quotBeta0 = &amp;quot, avg_y , &amp;quot-&amp;quot , &amp;quot(&amp;quot , beta1() , &amp;quot*&amp;quot , avg_x , &amp;quot) =&amp;quot , beta0)

def capital_y(user_input):
     return(beta0 + (beta1() * user_input))

user_input = 40
print(&amp;quotPredicted value is: &amp;quot, capital_y(user_input))قیمت پیش‌بینی شده برای x=40، کاملا روی خط رگرسیونی است که آن را محاسبه کرده‌ایم.خب، در مثالی که مطرح شد نقاط کاملا روی یک خط مستقیم قرار می‌گیرند، اما آیا همیشه چیدمان نقاط به همین شکل است؟جواب: خیییییییر :)به مثال زیر دقت کنید:در این جدول نیز مثل قبل، مقادیر متراژ خانه‌ها به عنوان متغیرهای مستقل (X) و قیمت هرخانه نیز به عنوان یک متغیر وابسته (Y) شناخته می‌شود. اگر داده‌های جدول بالا را در قالب یک نمودار نشان دهیم:مشخص است که اینبار نیز یک رابطه خطی بین متراژ خانه و قیمت آن وجود دارد، یعنی به طور متوسط و در نگاه کلی با افزایش متراژ خانه، قیمت آن نیز افزایش می‌یابد. اما دیگر نمی‌توان به سادگی یک خط صاف و مستقیم را به گونه‌ای رسم کرد که از تمامی نقاط موجود در صفحه کمترین فاصله ممکن را داشته باشد.در ادامه چند خط رگرسیون فرضی را رسم می‌کنیم. آیا می‌توانید با اطمینان 100% بگویید که یکی از این خط ها بهترین خط ممکن است؟راه حل سادست، همون مقادیر θ0 و θ1 را محاسبه کنید تا به جواب‌های ممکن برسید.تا اینجا مرور مباحث گذشته بود، اما برسیم به مبحث اصلی این مطلب یعنی:آموزش رگرسیون خطی چندگانه(Multiple Linear Regression)، مرحله به مرحله و با مثالمثال متراژ و قیمت‌ خانه‌ها رو که فراموش نکردید. حالا اگر به جای یک متغیر مستقل X بیشتر از یک متغیر مستقل داشته باشیم، چه می‌شود؟ مثلا قیمت خانه‌ها برگرفته از متراژ و سال ساخت باشد. یا مثلا قیمت یک اتومبیل بر اساس قدرت آن و کیلومتر طی شده محاسبه شود.به طور کلی اگر در محاسبه رگرسیون خطی، برای متغیر وابسته (y)، بیشتر از یک متغیر مستقل (x) را در نظر بگیریم، رگرسیون خطی ما از نوع چندگانه (Multiple Linear Regression) است.متوجه تفاوت رگرسیون خطی ساده (Simple Linear Regression) و رگرسیون خطی چندگانه (Multiple Linear Regression) شدید؟خب، بریم سراغ یک مثال از رگرسیون خطی چندگانه و حل این مثال به صورت مرحله به مرحله.در این مثال مقادیر X1، تنها برای سادگی به صورت 1 و 2 و 3 و 4 در نظر گرفته شده‌اند.دقت کنید که در برخی از منابع آموزشی، ممکن است اعدادی به صورت کوچک، بالا و سمت راست X‌ها نوشته شوند، این اعداد توان X‌ها نیستند، بلکه ایندکس آن متغیر مستقل هستند.همچنین اعداد کوچکی نیز پایین سمت راست‌ Xها نوشته می‌شوند که به معنی ایندکس ردیف مورد نظر از جدول کلی اطلاعات هستند، مثلا با توجه به اطلاعات مثال ارایه شده:البته در این مطلب آموزشی ما ایندکس متغیر مستقل (اینکه متغیر چندم ما است) را پایین سمت راست می‌نویسم، و اعداد در جایگاه توان به معنی توان هستند.معادله کلی خط در حالت رگرسیون خطی چندگانه با توجه به اینکه تعداد Xها بیشتر از یک است، به صورت زیر محاسبه می‌شود:در صورتی که از معادله بالا مشتق جزئی نسبت به متغیرها بگیریم، به معادلات زیر می‌رسیم:برای حل این معادلات به غیر از مقادیر تتا ها:می‌توانیم سایر مقادیر را با توجه به داده‌های ارایه شده در صورت مسئله محاسبه کنیم.منظور از m نیز، تعداد ردیف‌های جدول اطلاعات است؛ در این مثل m=4x1 = [1,2,3,4]
x2 = [10,1,2,3]
y = [12,18,24,30]

input_size = len(x1)

def paramcalc(x1,x2,y):
     x1y = []
     x2y = []
     x1x2 = []
     x1power2 = []
     x2power2 = []

     sum_x1 = 0
     sum_x2 = 0
     sum_y = 0
     sum_x1y = 0
     sum_x2y = 0
     sum_x1x2 = 0
     sum_x1power2 = 0
     sum_x2power2 = 0
     
     for i in range(0, input_size):
          x1y.append(x1[i]*y[i])
          x2y.append(x2[i]*y[i])
          x1x2.append(x1[i]*x2[i])
          x1power2.append(x1[i]**2)
          x2power2.append(x2[i]**2)

     for i in range(0, input_size):
          sum_x1 = sum_x1 + x1[i]
          sum_x2 = sum_x2 + x2[i]
          sum_y =  sum_y + y[i]
          sum_x1y = sum_x1y + x1y[i]
          sum_x2y = sum_x2y + x2y[i]
          sum_x1x2 = sum_x1x2 + x1x2[i]
          sum_x1power2 = sum_x1power2 + x1power2[i]
          sum_x2power2 = sum_x2power2 + x2power2[i]

     print(&amp;quotx1y = &amp;quot,x1y , &amp;quotsum_x1y = &amp;quot,sum_x1y)
     print(&amp;quotx2y = &amp;quot,x2y , &amp;quotsum_x2y = &amp;quot,sum_x2y)
     print(&amp;quotx1x2 = &amp;quot,x1x2 ,&amp;quotsum_x1x2 = &amp;quot,sum_x1x2)
     print(&amp;quotx1power2 = &amp;quot,x1power2 , &amp;quotsum_x1power2 = &amp;quot,sum_x1power2)
     print(&amp;quotx2power2 = &amp;quot,x2power2 , &amp;quotsum_x2power2 = &amp;quot,sum_x2power2)

     print(&amp;quotsum_x1 = &amp;quot, sum_x1)
     print(&amp;quotsum_x2 = &amp;quot, sum_x2)
     print(&amp;quotsum_y = &amp;quot, sum_y)

paramcalc(x1,x2,y)مقادیر به دست آمده را در فرمول‌ها جایگزین می‌کنیم:مرتب‌تر که بنویسمشوناینجا ما سه معادله داریم و سه مجهول، برای حل کردن این مسئله می‌توانیم از روش حذف متغیر استفاده کنیم یا از روش کرامر (Cramer rule)، که به نظر من پیاده‌سازی روش کرامر، در یک برنامه کامپیوتری، راحت‌تر و قابل‌فهم‌تر هست (البته به نظر من).طبق روش کرامر، ما می‌توانیم سه متغیر مورد نظرمان را به صورت زیر محاسبه کنیم:صورت و مخرج کسرها در تصویر بالا به معنی دترمینان آن ماتریس هستند.برای مثالی که مشغول حل کردن آن هستیم، مقادیر به صورت زیر جایگذاری می‌شوند:یادآوری دترمینان (Determinant):برای محاسبه دترمینان یک ماتریس 3*3 به صورت زیر عمل می‌کنیم:در محاسبات زیر، با هدف ساده کردن درک بخش‌های تفکیک شده، شروع و پایان هر پرانتز با رنگی متفاوت مشخص شده است.y = 6 + 6x1+ 0x2که می‌شودy = 6 + 6x1def paramcalc(x1,x2,y,input_x1,input_x2):
     x1y = []
     x2y = []
     x1x2 = []
     x1power2 = []
     x2power2 = []

     sum_x1 = 0 
     sum_x2 = 0
     sum_y = 0
     sum_x1y = 0
     sum_x2y = 0
     sum_x1x2 = 0
     sum_x1power2 = 0
     sum_x2power2 = 0

     for i in range(0, input_size):
          x1y.append(x1[i]*y[i])
          x2y.append(x2[i]*y[i])
          x1x2.append(x1[i]*x2[i])
          x1power2.append(x1[i]**2)
          x2power2.append(x2[i]**2)

     for i in range(0, input_size):
          sum_x1 = sum_x1 + x1[i]
          sum_x2 = sum_x2 + x2[i]
          sum_y =  sum_y + y[i]
          sum_x1y = sum_x1y + x1y[i]
          sum_x2y = sum_x2y + x2y[i]
          sum_x1x2 = sum_x1x2 + x1x2[i]
          sum_x1power2 = sum_x1power2 + x1power2[i]
          sum_x2power2 = sum_x2power2 + x2power2[i]

     print(&amp;quotx1y = &amp;quot,x1y , &amp;quotsum_x1y = &amp;quot,sum_x1y)
     print(&amp;quotx2y = &amp;quot,x2y , &amp;quotsum_x2y = &amp;quot,sum_x2y)
     print(&amp;quotx1x2 = &amp;quot,x1x2 ,&amp;quotsum_x1x2 = &amp;quot,sum_x1x2)
     print(&amp;quotx1power2 = &amp;quot,x1power2 , &amp;quotsum_x1power2 = &amp;quot,sum_x1power2)
     print(&amp;quotx2power2 = &amp;quot,x2power2 , &amp;quotsum_x2power2 = &amp;quot,sum_x2power2)

     print(&amp;quotsum_x1&amp;quot, sum_x1)
     print(&amp;quotsum_x2&amp;quot, sum_x2)
     print(&amp;quotsum_y&amp;quot, sum_y)

     orginal_m = [[input_size,sum_x1,sum_x2],
                          [sum_x1,sum_x1power2,sum_x1x2],
                          [sum_x2,sum_x1x2,sum_x2power2]
                         ]
     teta0_numerator = [[sum_y,sum_x1,sum_x2],
                                     [sum_x1y,sum_x1power2,sum_x1x2],
                                     [sum_x2y,sum_x1x2,sum_x2power2]
                                    ]
     teta1_numerator = [[input_size,sum_y,sum_x2],
                                     [sum_x1,sum_x1y,sum_x1x2],
                                     [sum_x2,sum_x2y,sum_x2power2]
                                    ]
     teta2_numerator = [[input_size,sum_x1,sum_y],
                                     [sum_x1,sum_x1power2,sum_x1y],
                                     [sum_x2,sum_x1x2,sum_x2y]
                                    ]

     teta0 = det(teta0_numerator)/det(orginal_m)
     teta1 = det(teta1_numerator)/det(orginal_m)
     teta2 = det(teta2_numerator)/det(orginal_m)

     print(&amp;quotteta0 = &amp;quot , teta0)
     print(&amp;quotteta1 = &amp;quot , teta1)
     print(&amp;quotteta2 = &amp;quot , teta2)

     predicted_value = teta0 + (teta1 * input_x1) +  (teta2 * input_x2) 
     print(&amp;quotpredicted value = &amp;quot, predicted_value)


def det(m):
     det_result = (m[0][0] * ((m[1][1] * m[2][2]) - (m[1][2] * m[2][1]))) -(m[0][1] * ((m[1][0] * m[2][2]) - (m[1][2] * m[2][0]))) +(m[0][2] * ((m[1][0] * m[2][1]) - (m[1][1] * m[2][0])))
     return (det_result)


x1 = [1,2,3,4]
x2 = [10,1,2,3]
y = [12,18,24,30]
input_size = len(x1)
input_x1 = 0
input_x2 = 0

paramcalc(x1,x2,y,input_x1,input_x2)</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Wed, 30 Sep 2020 19:08:18 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از فرمول پیرسون برای ساخت ریکامندرسیستم فیلم مبتنی بر پالایش مشارکتی</title>
                <link>https://virgool.io/@alifallahi/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%D8%B1%D9%85%D9%88%D9%84-%D9%BE%DB%8C%D8%B1%D8%B3%D9%88%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%B1%DB%8C%DA%A9%D8%A7%D9%85%D9%86%D8%AF%D8%B1%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%81%DB%8C%D9%84%D9%85-%D9%85%D8%A8%D8%AA%D9%86%DB%8C-%D8%A8%D8%B1-%D9%BE%D8%A7%D9%84%D8%A7%DB%8C%D8%B4-%D9%85%D8%B4%D8%A7%D8%B1%DA%A9%D8%AA%DB%8C-hxfip1gtd8cx</link>
                <description>ساخت سیستم توصیه گر فیلم مبتنی بر روش پالایش مشارکتی معیار شباهت پیرسون (Pearson correlation coefficient) یکی از پرکاربردترین معیارهای محاسبه شباهت در سیستم های مبتنی بر رویکرد پالایش مشارکتی (Collaborative Filtering) است.در این مطلب با استفاده از معیار شباهت Pearson correlation و رویکرد پالایش مشارکتی Collaborative Filtering یک سیستم توصیه گر فیلم Movie Recommender System می سازیم. فرمول پیرسون https://www.aparat.com/v/aPzXQ کد پایتون برای حل کردن مثال مطرح شده در فایل ویدویی نیز از لینک زیر در دسترس است.https://github.com/alifallahi/RecommenderSystem/blob/master/PearsonCorrelationCoefficient.py</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Fri, 04 Sep 2020 20:59:40 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش رگرسیون خطی ساده، مرحله به مرحله و با مثال</title>
                <link>https://virgool.io/@alifallahi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B1%DA%AF%D8%B1%D8%B3%DB%8C%D9%88%D9%86-%D8%AE%D8%B7%DB%8C-%D8%B3%D8%A7%D8%AF%D9%87-%D9%85%D8%B1%D8%AD%D9%84%D9%87-%D8%A8%D9%87-%D9%85%D8%B1%D8%AD%D9%84%D9%87-%D9%88-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-yjpynnaygnad</link>
                <description>آموزش رگرسیون خطی ساده به همراه مثالدر این مطلب ما از روش &quot;Ordinary Least Squares (OLS)&quot; یا «کمترین مربعات معمولی» استفاده می کنیم.فرض می کنیم که جدول زیر نشان دهنده متراژ و قیمت چند خانه است.مثال از رگرسیون خطی سادهستون Area در این جدول نشان دهنده متراژ و ستون Price نشان دهنده قیمت آن خانه است. برای مثال قیمت خانه 1 متری 1 تومان، خانه 2 متری 3 تومان است.اگر مقادیر جدول بالا را بر روی نمودار رسم کنیم، متوجه وجود یک رابطه خطی بین متراژ و قیمت می شویم، به طوری که در نتیجه افزایش متراژ، قیمت نیز افزایش می یابد. https://www.aparat.com/v/Cmohf داده های مثال رگرسیون خطی بر روی نموداربرای رسم این نمودار از کد زیر استفاده شده است:import matplotlib.pyplot as plt
Area = [1,2,4,3,5]
Price = [1,3,3,2,5]
plt.scatter(Area, Price, color=&#039;blue&#039;)
plt.xlabel(&#039;Area&#039;)
plt.ylabel(&#039;Price&#039;)در چنین مواردی که یک رابطه خطی بین متغیرها وجود دارد، می توانیم برای پیش بینی مقادیر جدید، از رگرسیون خطی استفاده کنیم.در رگرسیون خطی (Linear Regression)، به طور کلی دو نوع متغیر وجود دارد:متغیرهای مستقل، که اغلب با x نشان داده می شوند. در این مثال «متراژ»، یک متغیر مستقل است.متغیرهای وابسته، که در نتیجه متغیرهای مستقل محاسبه می شوند و به طور معمول با y نشان داده می شوند. در این مثال، «قیمت خانه» یک متغیر وابسته به متراژ است.اگر یک نوع متغیر مستقل داشته باشیم، رگرسیون خطی از نوع ساده (Simple Linear Regression) و در صورتی که چند نوع متغیر مستقل داشته باشیم، رگرسیون خطی چندگانه (Multiple Linear Regression) است. برای مثال قیمت نهایی خانه برگرفته از عواملی نظیر: متراژ، عمر بنا و محله باشد.فرمول کلی رگرسیون خطی سادهفرمول کلی محاسبه رگرسیون خطی سادهبا استفاده از این فرمول ما می توانیم به ازای هر ورودی x، خروجی y را محاسبه کنیم. با در نظر گرفتن مثال بالا، می خواهیم پیش بینی کنیم قیمت یک خانه 6 متری چقدر است.بدین ترتیب، در فرمول معرفی شده، مقدار  x، 6 خواهد بود و با محاسبه B1 و B0 می توانیم Y که همان قیمت این خانه است را پیش بینی کنیم.فرمول محاسبه بتا صفر در رگرسیون خطی سادهفرمول محاسبه بتا یک در رگرسیون خطی سادهمشخص است که ابتدا باید B1  را حساب کنیم و سپس B0 را به دست بیاوریم.برای محاسبه صورت کسر فرمول B1، برای هر ردیف، مقدار ستون x را از میانگین x ها کم می کنیم، مقدار ستون y را از میانگین y ها کم می کنیم، حاصل را در هم ضرب می کنیم. برای تمامی ردیف ها این فرآیند را انجام می دهیم و در پایان تمامی این مقادیر را با هم جمع می کنیم.محاسبه میانگین مقادیر در رگرسیون خطی سادهمثال مرحله به مرحله رگرسیون خطی سادهمحاسبه بتا یک در رگرسیون خطی سادهکد زیر، مربوط محاسبه B1 است.Area = [1,2,4,3,5]
Price = [1,3,3,2,5]

input_size = len(Area)
x = Area
y = Price

def avg(avg_input):
     my_temp = 0
     for i in range (0, input_size):
          my_temp = my_temp + avg_input[i]
     return(my_temp/input_size)

avg_x = avg(x)
avg_y = avg(y)
print(&amp;quotAverage of x: &amp;quot, avg_x)
print(&amp;quotAverage of y: &amp;quot, avg_y)

def beta1():
     beta1_numerator = 0
     beta1_denumerator = 0
     for i in range (0, input_size):
          beta1_numerator = beta1_numerator + ((x[i] - avg_x)*(y[i] - avg_y))
          beta1_denumerator = beta1_denumerator + ((x[i] - avg_x)**2)
     return(beta1_numerator/beta1_denumerator)

print(&amp;quotBeta1 = &amp;quot, beta1())در نتیجه اجرای این کد مقادیر زیر به دست می آیند:Average of x:  3.0Average of y:  2.8Beta1 =  0.8در مرحله بعد، Beta0 را محاسبه می کنیم.فرمول بتا صفر در رگرسیون خطی سادهمحاسبه بتا صفر در مثال رگرسیون ساده خطیbeta0 = avg_y - (beta1() * avg_x)
print(&amp;quotBeta0 = &amp;quot, avg_y , &amp;quot-&amp;quot , &amp;quot(&amp;quot , beta1() , &amp;quot*&amp;quot , avg_x , &amp;quot) =&amp;quot , beta0)در نتیجه اجرای این کد مقدار Beta0  به صورت زیر محاسبه می شود:Beta0 =  2.8 - ( 0.8 * 3.0 ) = 0.39999999999999947پس از محاسبه Beta1  و Beta0  می توانیم معادله خط رگرسیون را به دست بیاوریم:Y = Beta0  + Beta0 xBeta1 =  0.8Beta0 = 0.399Y = 0.8 + ( 0.399 * x)در این معادله x، مقدار ورودی کاربر (با توجه به مثال، متراژ خانه) و Y نیز پاسخ نهایی یا همان قیمت خانه مورد نظر است.def capital_y(user_input):
     return(beta0 + (beta1() * user_input))ارزیابی مدل رگرسیون خطی سادهپس از به دست آوردن معادله خط رگرسیون، نوبت به ارزیابی آن می رسد. برای این کار متراژ خانه ها را به تابع  ساخته شده می دهیم و قیمت های محاسبه شده را با قیمت های اصلی مقایسه می کنیم.ارزیابی مدل رگرسیون خطی سادهستون Predicted price در جدول قیمت های محاسبه شده را نشان می دهد. همانطور که مشخص است، مدل ساخته شده دارای خطا است. برای محسابه این بخش از کد زیر استفاده می شود:user_input = [1,2,4,3,5]
predicted_y = []
for i in range(0, len(user_input)):
      predicted_y.append(capital_y(user_input[i]))
print(&amp;quotPredicted values are: &amp;quot, predicted_y)حاصل اجرای کد بالا نیز به صورت زیر است:Predicted values are:  [1.1999999999999995, 1.9999999999999996, 3.5999999999999996, 2.8, 4.3999999999999995]که همان مقادیر ستون Predicted price هستند.در نمودار زیر نقاط آبی رنگ، قیمت های اصلی و نقاط قرمز رنگ قیمت های پیش بینی شده هستند.مقایسه مقادیر پیش بینی شده توسط مدل رگرسیون خطی ساده با مقادیر اصلیفاصله هر نقطه آبی تا نقطه نارنجی در همان عرض، نشان دهنده میزان خطای مدل در پیش بینی قیمت ها است.نمودار بالا با استفاده از کد زیر رسم شده است:plt.scatter(Area, Price, color=&#039;blue&#039;)
plt.scatter(Area, predicted_y, color=&#039;red&#039;)
plt.xlabel(&#039;Area&#039;)
plt.ylabel(&#039;Price&#039;)
plt.plot(Area, predicted_y, color=&#039;orange&#039;)محاسبه میزان خطای جذر میانگین مربعات (RMSE)همانطور که گفته شده مشخص است مدل ساخته شده دارای خطا است، اما میزان خطای این مدل چقدر است؟یکی از رایج ترین معیارهای سنجش خطا در مدل های رگرسیون و به طور کلی در مباحث ماشین لرنینگ، خطای Root Mean Squared Error است که به صورت زیر محاسبه می شود.فرمول خطای جذر میانگین مربعاتمحاسبه فرمول خطای جذر میانگین مربعاتمثال خطای جذر میانگین مربعاتdef my_RMSE(y,predicted_y):
     my_temp = 0
     for i in range(0, input_size):
          my_temp = my_temp + ((y[i] - predicted_y[i])**2)
          my_temp = my_temp /  input_size
          my_temp = my_temp **(1/2)
      return(my_temp)

print(&amp;quotRMSE = &amp;quot, my_RMSE(y,predicted_y))قطعه کد بالا، RMSE را برای مقادیر مثال مطرح شده محاسبه می کند.RMSE =  0.692820323027551تمامی کدهای نوشته شده در این مطلب، به صورت یکجا از لینک زیر قابل دریافت هستند:https://github.com/alifallahi/Regression/blob/master/Simple_Linear_Regression.pyهمانطور که گفته شد ما در این مطلب از روش کمترین مربعات معمولی (به انگلیسی: Ordinary Least Squares) (به اختصار OLS) استفاده کردیم. این روش برای مسایلی که تعداد متغیرهای وابسته و مستقل کم است و به طور کلی مسئله ساختار ساده ای دارد می تواند استفاده شود، اما در مسایل پیچیده تر که حجم داده ها و تعداد متعیرها بیشتر می شود نیاز است تا از روش هایی مثل «گرادیان کاهشی» استفاده کنیم که به صورت تکرار شونده و در چند مرحله بهترین مقدار را برای Beta1  و Beta0 به دست بیاورم تا در نهایت خط رگرسیون  در مطلوبترین حالت رسم شود.لینک های تکمیلی:https://fa.wikipedia.org/wiki/خطای_جذر_میانگین_مربعاتhttps://fa.wikipedia.org/wiki/رگرسیون_خطیhttps://fa.wikipedia.org/wiki/کمترین_مربعات_معمولی</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Fri, 14 Aug 2020 14:10:54 +0430</pubDate>
            </item>
                    <item>
                <title>نرمال سازی داده‌های ترتیبی (Ordinal) با استفاده از روش Min-Max</title>
                <link>https://virgool.io/@alifallahi/%D9%86%D8%B1%D9%85%D8%A7%D9%84-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87%D9%87%D8%A7%DB%8C-%D8%AA%D8%B1%D8%AA%DB%8C%D8%A8%DB%8C-ordinal-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%B1%D9%88%D8%B4-min-max-l0uommra7coo</link>
                <description>Min-Max Scaling image via Chris Albon نرمال سازی به روش مین مکس که به نام Rescaling (min-max normalization) نیز شناخته می شود، ساده ترین روش برای تغییر بازه عددی مقادیر یک مجموعه به [1, 0] یا [1, 1-] است. فرمول کلی نرمال سازی min-max normalization به صورت زیر است:مثال: فرض کنید نتایج نظرسنجی درباره یک فیلم به صورت زیر است:}excellent, fair, good, excellent{با توجه به اینکه کاربران برای نشان دادن نظر خود از سه عبارت استفاده کرده‌اند، برای هر عبارت، یک مقدار عددی به صورت زیر در نظر می‌گیریم:در نتیجه جدول بالا، نتایج نظرسنجی را به صورت عددی بازنویسی می‌کنیم:}3,1,2,3{در ادامه برای نرمال سازیMinMax  داده‌ها به صورت زیر عمل می‌کنیم:1. بزرگترین عدد را در مجموعه پیدا می‌کنیم: max = 32. کوچکترین عدد را در مجموعه پیدا می‌کنیم: min = 13. برای نرمال سازی، هر عدد از مجموعه را از min کم می‌کنیم، و تقسیم بر (max - min) می‌کنیم:Normal(x) = (x - min) / (max – min)Normal(3) = (3 - 1) / (3 – 1) = 2/2 = 1Normal(1) = (1 - 1) / (3 – 1) = 0/2 = 0Normal(2) = (2 - 1) / (3 – 1) = 1/2 = 0.5Normal(3) = (3 - 1) / (3 – 1) = 2/2 = 1با توجه به مقادیر به دست آمده، می‌توان نتیجه گرفت که پس از نرمال‌سازی، maximum مجموعه همیشه 1 و minimum مجموعه نیز همیشه 0 می‌شود.در این قسمت کد مربوط به این مطلب به زبان پایتون نوشته شده است:test = [3,1,2,3]
normalized = []
for i in range(len(test)):
    normalized.append((test[i] - min(test)) / (max(test) - min(test)))
print(normalized)لینک مطلب مربوط به min-max normalization، در ویکی پدیا:https://en.wikipedia.org/wiki/Feature_scaling</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Sun, 09 Aug 2020 07:56:25 +0430</pubDate>
            </item>
                    <item>
                <title>عدم شباهت در داده‌های عددی: معیار فاصله مینکوفسکی</title>
                <link>https://virgool.io/@alifallahi/%D8%B9%D8%AF%D9%85-%D8%B4%D8%A8%D8%A7%D9%87%D8%AA-%D8%AF%D8%B1-%D8%AF%D8%A7%D8%AF%D9%87%D9%87%D8%A7%DB%8C-%D8%B9%D8%AF%D8%AF%DB%8C-%D9%85%D8%B9%DB%8C%D8%A7%D8%B1-%D9%81%D8%A7%D8%B5%D9%84%D9%87-%D9%85%DB%8C%D9%86%DA%A9%D9%88%D9%81%D8%B3%DA%A9%DB%8C-w0mtjkeimrta</link>
                <description>عدم شباهت در داده‌های عددی: معیار فاصله مینکوفسکی Dissimilarity of Numeric Data: Minkowski Distanceدر این مطلب قصد داریم تا  به معرفی معیارهای سنجش فاصله زیر، به عنوان رایج‌ترین معیارهای بررسی عدم شباهت در داده‌های عددی بپردازیم.فاصله اقلیدسی (Euclidean distance)فاصله منهتن (Manhattan distance)فاصله مینکوفسکی (Minkowski distance)پیش از معرفی عناوین بالا، بهتر است یادآور شویم که به طور معمول قبل از محاسبه عدم شباهت، مرحله نرمال‌سازی داده‌ها (Data Normalization) انجام می‌شود. منظور از نرمال‌سازی، تغییر بازه عددی داده‌های موجود، به بازه‌ای کوچک‌تر و محدودتر مثل [1, 1- ] و یا [1.0, 0.0 ] است. به عنوان مثال داده‌های مربوط به ارتفاع چند ساختمان که می‌تواند به در قالب متر و یا اینچ بیان شود و یا معدل‌های کیفی چند دانش‌آموز که به صورت مجموعه‌ای از اعداد نرمال‌شده در لیست نمایش داده می‌شود.چرا از نرمال‌سازی استفاده می‌کنیم؟به طور کلی برای بیان کردن داده‌ها با مقادیر کوچک نیاز به بازه‌های بزرگتری داریم و علاوه بر آن، در مرحله تخصیص وزن و به مقادیر مورد نظر و انجام محاسبات نیز با چالش‌های بیشتری مواجه خواهیم بود. هدف اصلی از نرمال‌سازی، یکسان‌سازی وزن داده‌های موجود است که البته ممکن است در همه موارد، کارآمد نباشد.فاصله اقلیدسی (Euclidean distance)رایج‌ترین معیارهای محاسبه فاصله، فاصله اقلیدسی (Euclidean distance) و یا مسیر مستقیمی است که یک کلاغ بین مبدا و مقصد پرواز می‌کند (as the crow flies).فاصله اقلیدسی بین دو نقطه p و q به صورت زیر محاسبه می‌شود:فرمول محاسبه فاصله اقلیدسیدر واقع برای محاسبه فاصله اقلیدسی، ما طبق قضیه فیثاغورت، وتر مثلث قائم الزاویه به وجود آمده را محاسبه می کنیم.Euclidean distance in R2 مثالی از فاصله اقلیدسی در فضای دو بعدی    https://en.wikipedia.org/wiki/Euclidean_distanceفاصله مهنتن (Manhattan distance)یکی دیگر از رایج‌ترین معیارهای محاسبه فاصله، فاصله مهنتن (Manhattan distance) است. این فاصله برگرفته از فاصله بین بلوک‌های ساختمانی در شهرها است (City block distance).فاصله مهتن بین دو نقطه p و q به صورت زیر محاسبه می‌شود:فرمول محاسبه فاصله منهتن Manhattan distanceمثالی از معیار فاصله منهتنفاصله منهتن، به عنوان فاصله راننده تاکسی (taxi driver) نیز شناخته می شود. براساس مثال بالا، یک راننده تاکسی برای حرکت از نقطه بنفش (مبدا) به نقطه صورتی (مقصد) 4 بلوک به سمت چپ و سپس 3 بلوک به سمت بالا حرکت می کند.ویژگی‌های مهم فاصله اقلیدسی و منهتنهر دو معیار سنجش عدم شباهت، فاصله اقلیدسی و فاصله منهتن دارای ویژگی‌های ریاضیاتی زیر هستند:همیشه مثبت بودن (Non-negativity): مقدار فاصله بین دو نقطه p و q همیشه مقداری مثبت، و بزرگ‌تر و مساوی صفر است. d(i,j) &gt;= 0اصل این‌همانی تمیزناپذیرها (Identity of indiscernibles): فاصله هر شیء از خودش صفر است. d(i,i) = 0تقارن (Symmetry): معیار فاصله، دارای مقداری متقارن است.d(i,j) = d(j,i)اصل نابرابری مثلث (Triangle inequality): مطابق قضیه نابرابری مثلثی، در ریاضیات، در هر مثلث اندازه هر ضلع از مجموع اندازه دو ضلع دیگر کوچکتر است.d(i,j) &lt;= d(i,k) + d(k,j)در مورد محاسبه میزان عدم شباهت، طبق قضیه نابرابری مثلثی، میزان فاصله مستقیم از شی i به شی j، نمی‌تواند بزرگتر از زمانی باشد که در حرکت از i به سمت j یک مسیر انحرافی به k نیز طی شده است.مطابق این قضیه، همچنین اندازه هر ضلع از تفاضل اندازه دوضلع دیگر بزرگتر است.معیاز اندازه‌گیری که هرتمامی موارد گفته شده بالا را پوشش دهد، به عنوان متریک (metric) شناخته می‌شود. لازم به ذکر است که ویژگی همیشه مثبت بودن (Non-negativity)، به صورت ضمنی در سه ویژگی بعدی نیز وجود دارد.مثالی از فاصله اقلیدسی و منهتنمطابق آنچه تاکنون گفته شد، چنانچه نقطه x1 دارای مختصات (1,2) و نقطه x2 دارای مختصات (3,5) باشد، فاصله اقلیدسی و منهتن برای این دو نقطه به صورت زیر محاسبه می‌شود:Euclidean distance: Manhattan distance: 2 + 3 = 5مثالی از فاصله اقلیدسی و منهتن و مینکوفسکی فاصله مینکوفسکی (Minkowski distance)فاصله مینکوفسکی حالت کلی از فاصله‌های اقلیدسی و منهتن است.فرمول معیار فاصله مینکوفکسی Minkowski distanceدر این فرمول h عددی حقیقی و بزرگتر از 1 است. h &gt;= 1فاصله‌هایی از این دست در برخی منابع به صورت Lp نیز نشان داده می‌شود که منظور از p همان h است.در فرمول ارایه شده، چنانچه مقدار h=1 در نظر گرفته شود، نتیجه همان فاصله منهتن و در صورتیکه h=2 باشد، فاصله اقلیدسی خواهد بود.فاصله اقلیدسی وزن‌دار (weighted Euclidean distance)در فرمول فاصله اقلیدسی، اگر مقدار وزن را با توجه به میزان اهمیت هر یک از مقادیر عددی، در فرمول لحاظ کنیم، فاصله اقلیدسی وزن‌دار (weighted Euclidean distance) به دست می‌آید.فرمول محسابه فاصله اقلدیدسی وزن دارالبته مقدار وزن در سایر انواع معیارهای سنجش فاصله نیز می‌تواند در نظر گرفته شود.فاصله سوپریمم(Supremum distance)فاصله سوپریمم حالت کلی از فاصله مینکوفسکی است در زمانی که h به سمت بی‌نهایت میل می‌کند. با استفاده از فاصله سوپریمم، می‌توان حداکثر فاصله بین دو شی را محاسبه نمود.فرمول فاصله سوپریمم به صورت زیر است و در حالت L بینهایت، با نام uniform norm نیز شناخته می‌شود.فرمول محاسبه فاصله سوپریمممثالی از فاصله سوپریممچنانچه نقطه x1 دارای مختصات (1,2) و نقطه x2 دارای مختصات (3,5) باشد، بیشترین فاصله (تفاوت) بین دو نقطه مذکور در این مثال، 5 - 2 = 3 مقدار سوپریمم فاصله بین دو شی است.</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Fri, 24 Jul 2020 19:11:59 +0430</pubDate>
            </item>
                    <item>
                <title>نرمال سازی در ماشین لرنینگ</title>
                <link>https://virgool.io/@alifallahi/%D9%86%D8%B1%D9%85%D8%A7%D9%84-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%84%D8%B1%D9%86%DB%8C%D9%86%DA%AF-lwpo4anuiq9l</link>
                <description>نرمال سازی در ماشین لرنینگنرمال سازی داده ها یکی از رایج ترین فعالیت ها در ماشین لرنینگ است. از جمله مزایای نرمال سازی داده می توان به بهبود عملکرد گرادیان کاهشی (gradient descent) بر روی داده های نرمال شده در مقایسه با داده های غیر نرمال اشاره کرد. در ادامه یک مثال از  نرمال سازی را به دو روش استفاده از کتابخانه numpy و حلقه for  بررسی می کنیم.برای نرمال سازی داده های فوق، مقادیر هر سطر را به توان 2 رسانده و با یکدیگر جمع می کنم.در ادامه تک تک درایه های ماتریس را به مقادیر محاسبه شده در مرحله قبل تقسیم می کنیم.برای پیاده سازی مثال فوق می توانیم از حلقه for به صورت زیر استفاده کنیم:x  = [
   [1,3,5],
   [7,9,11]
 ]
first_step = []
for i in range(len(x)):
    mytemp = 0
    for j in range(len(x[i])):
         mytemp += (x[i][j])**2
    first_step.append(mytemp ** (1/2))
print(&amp;quotWith for loop&amp;quot, first_step)نتیجه زیر پس از اجرای کد به دست می آید:With for loop [5.916079783099616, 15.84297951775486]برای پیاده سازی این مثال با استفاده از کتابخانه numpy تنها به یک خط کد نیاز است:import numpy as np
x  = 
[    
[1,3,5],
[7,9,11]
  ]
print(&amp;quotWith numpy&amp;quot, np.linalg.norm(x,axis=1,keepdims=True))نتیجه زیر پس از اجرای کد به دست می آید:With numpy [[ 5.91607978] [15.84297952]]بخش پایانی را نیز می توان به صورت زیر پیاده سازی نمود:x  = [    
[1,3,5],
[7,9,11]
  ]
frist_step = []
for i in range(len(x)):
     mytemp = 0
     for j in range(len(x[i])):
          mytemp += (x[i][j])**2
     frist_step.append(mytemp ** (1/2))
print(&amp;quotWith for loop&amp;quot, frist_step)

mytemp3 = []
for i in range(len(x)):
     mytemp2 = []
     for j in range(len(x[i])):
          mytemp2.append(x[i][j] / frist_step[i])
     mytemp3.append(mytemp2)
print(&amp;quotx_normalized =&amp;quot, mytemp3)نتیجه اجرای بخش پایانی نیز به صورت زیر است:x_normalized = [[0.1690308509457033, 0.50709255283711, 0.8451542547285166], [0.4418360821684622, 0.5680749627880228, 0.6943138434075835]]</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Fri, 20 Mar 2020 13:26:47 +0330</pubDate>
            </item>
                    <item>
                <title>مجموعه کدهای مفید پایتون در شبکه های عصبی عمیق</title>
                <link>https://virgool.io/@alifallahi/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%DA%A9%D8%AF%D9%87%D8%A7%DB%8C-%D9%85%D9%81%DB%8C%D8%AF-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%D8%B9%D9%85%DB%8C%D9%82-pqet6r5wz6iu</link>
                <description>در این پست، کدهای مفید و کاربردی مربوط به شبکه های عصبی و یادگیری عمیق قرار می گیرند. علت اینکه این کدها را در گیت هاب قرار ندادم حجم کم آن ها است.    * این پست به صورت پیوسته به روزرسانی می شود. آخرین به روزرسانی 1399/01/151. دریافت یک عکس به عنوان وروردی، تبدیل عکس به ماتریکس و درپایان تبدیل ماتریکس به عکس.نکته: در این مثال تصویر و کد در کنار یکدیگر قرار دارند. فراخوانی تصویر در خط 4 انجام شده است.import numpy as np
from PIL import Image

img = Image.open(&#039;orig.png&#039;).convert(&#039;RGBA&#039;)
arr = np.array(img)

# record the original shape
shape = arr.shape

# make a 1-dimensional view of arr
flat_arr = arr.ravel()

# convert it to a matrix
vector = np.matrix(flat_arr)

# do something to the vector
vector[:,::10] = 128

# reform a numpy array of the original shape
arr2 = np.asarray(vector).reshape(shape)

# make a PIL image
img2 = Image.fromarray(arr2, &#039;RGBA&#039;)
img2.show()2. تابع سیگموییدimport numpy as np

def sigmoid(x):
   s = 1/(1+np.exp(-x))
   return s

z = np.array([0,2])
print (sigmoid(z))3. محاسبه ترانهاده ماتریس (Transpose)یادآوری: در ترانهاده ماتریس جای سطر ها و ستون ها با یکدیگر عوض می شود. مارتیس ترانهاده با یک حرف T در کنار نام ماتریس اصلی نشان داده می شود. (حرف T بزرگ، بالا سمت راست، در جایگاه توان)محاسبه ماتریس ترانهاده در نامپایبرای محاسبه ماتریس ترانهاده در نامپای کافی است به صورت زیر عمل کنیم:import numpy as np
x = np.array([[1,2],[3,4]])

print(&amp;quotx =&amp;quot, x)
print(&amp;quotTranspose of x is &amp;quot, x.T)نتیجه اجرای این کد به صورت زیر است:4. رسم نمودارimport numpy as np
from numpy.polynomial.polynomial import polyfit
import matplotlib.pyplot as plt

x = np.array([1, 3, 5, 7])
y = np.array([1, 3, 9, 5])
plt.plot(x, y, &#039;ro&#039;)

# Fit with polyfit
b, m = polyfit(x, y, 1)
plt.plot(x, b + m * x)
plt.show()5. گرفتن ورودی از کاربرprint(&amp;quotHello World!&amp;quot)
myVar = input (&amp;quotWhat is your name: &amp;quot)
print(&amp;quotHello &amp;quot, myVar, &amp;quot, Nice to meet you!&amp;quot)
myVar2 = input(&amp;quotDo you want to close the window?&amp;quot)
if (myVar2 == &amp;quotyes&amp;quot):
      exit()
else:
      print(&amp;quotSorry! but I have to go&amp;quot)
      print(&amp;quotBye!&amp;quot)
      input()6. اضافه کردن درایه به مارتیس نامپای - Append in numpyimport numpy
a = numpy.array([[4], 
                             [7], 
                             [10]])
b = numpy.array([[400], [800], [500]])
newArray = numpy.append(a, b, axis = 1)
print(newArray)نتیجه اجرای این قطعه کد، به صورت زیر است:</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Fri, 20 Mar 2020 09:24:21 +0330</pubDate>
            </item>
                    <item>
                <title>تابع هزینه دسته بند سافت مکس (کلسیفیکشن چند کلاسی)</title>
                <link>https://virgool.io/@alifallahi/%D8%AF%D8%B3%D8%AA%D9%87-%D8%A8%D9%86%D8%AF-%D8%B3%D8%A7%D9%81%D8%AA-%D9%85%DA%A9%D8%B3-%DA%AF%D8%B1%D8%B3%DB%8C%D9%88%D9%86-%D9%84%D8%AC%D8%B3%D8%AA%DB%8C%DA%A9-%DA%86%D9%86%D8%AF-%DA%A9%D9%84%D8%A7%D8%B3%DB%8C-blfjx4jygkkj</link>
                <description>cross-entropy loss (Softmax) تابع تابع هزینه (loss function, cost function, objective) نشان‌دهنده میزان نارضایتی ما از نتیجه به دست آمده است. بدین ترتیب هرچه مقدار عددی این تابع کمتر باشد به این معنی است که نارضایتی ما کمتر بوده پس سیستم عملکرد بهتری داشته است.هدف ما در این برنامه، ارزیابی عملکرد سیستم پیاده‌سازی شده Softmax classifier  برای تشخیص تصویر موردنظر با توجه به 4 کلاس قایق، هواپیما، خودرو و گربه است.تابع کلسیفایر سافت مکسستون &quot;Scoring Function&quot; نشان دهنده امتیازاتی است که سیستم با توجه به هر کلاس، تصویر موردنظر را ارزیابی کرده است. برای مثال احتمال اینکه تصویر مورد نظر به کلاس «قایق» تعلق داشته باشد 3.44- و به همین ترتیب امتیاز کلاس هواپیما 1.16 محاسبه شده است. این دو امتیاز به این معنی هستند که طبق نظر سیستم، احتمال اینکه تصویر موردنظر یک هواپیما باشد بیشتر از آن است که یک قایق باشد.فرمول کلی دسته بند سافت مکس (رگرسیون لجستیک چند کلاسی) به صورت زیر است که در ادامه مرحله به مرحله آن را پیاده‌سازی می‌کنیم.فرمو دسته بند سافت مکسستون دوم جدول “Unnormalized Probabilities” است که مقادیر آن نشان دهنده «احتمال‌ها به صورت غیرنرمال» هستند. برای محاسبه مقادیر این ستون کافی است صورت کسر ارایه شده در فرمول بالا را در نظر بگیریم.فرمول احتمال به صورت غیرنرمال در سافت مکسدر این فرمول e به معنی عدد اویلر (Euler&#x27;s number) است که به صورت 2.71828 در نظر گرفته می‌شود. با استفاده از کتابخانه numpy این عدد به صورت خودکار فراخوانی می‌شود.به صورت خلاصه مقادیر ستون “Unnormalized Probabilities”حاصل عدد اویلر به توان اعداد ستون &quot;Scoring Function&quot; هستند.import numpy as np
x = np.array([-3.44, 1.16, -0.81, 3.91])
numerator = np.exp(x)
print(&amp;quotUnnormalized Probabilities &amp;quot,numerator)نتیجه اجرای این کد به صورت زیر است، که در ادامه مقادیر آن در ستون “Unnormalized Probabilities”نوشته شده‌اند.Unnormalized Probabilities [ 0.03206469 3.18993328 0.44485807 49.89895197]تابع سافت مکسدر ادامه برای محاسبه &quot;Normalized Probabilities&quot; ابتدا مقادیر ستون “Unnormalized Probabilities” را با یکدیگر جمع کرده و سپس هر یک از مقادیر ستون “Unnormalized Probabilities” را بر حاصل‌جمع به دست آمده تقسیم می‌کنیم.فرمول محاسبه احتمال نرمال سازی شده در تابع هزینه سافت مکسdenumerator_sum = np.sum(numerator)
print(&amp;quotNormalized probabilities &amp;quot, numerator/denumerator_sum)نتیجه اجرای این کد به صورت زیر است، که در ادامه مقادیر آن در ستون “Normalized Probabilities” نوشته شده‌اند.Normalized probabilities [0.0005986 0.05955167 0.00830489 0.93154484]تابع هزینه در شبکه عصبیهمانطور که مشاهده می‌شود سیستم پیاده‌سازی شده توانسته است با 93.15% تصویر موردنظر را متعلق به کلاس «گربه» شناسایی کند.در پایان می‌توانیم با محاسبه منفی لگاریتم  “Normalized Probabilities”، میزان Loss نهایی را محاسبه کنیم:تابع به دست آوردن هزینه در شبکه های عصبیresult = (np.log(numerator/denumerator_sum)) * (-1)
print(&amp;quotnegative log losss &amp;quot,result)Negative Log Loss [7.42091095 2.82091095 4.79091095 0.07091095]یادآوریهمانطور که در آغاز متن نیز گفته شد: تابع هزینه (loss function, cost function, objective) نشان‌دهنده میزان نارضایتی ما از نتیجه به دست آمده است. بدین ترتیب هرچه مقدار عددی این تابع کمتر باشد به این معنی است که نارضایتی ما کمتر بوده پس سیستم عملکرد بهتری داشته است.نکات تکمیلی:اعداد ستون &quot;Scoring Function&quot; به صورت تصادفی ایجاد شده‌اند.دلیل استفاده از کتابخانه “numpy” قابلیت های بردارسازی (Vectorization) است که سرعت اجرای کد را در مقایسه با استفاده از حلقه for به صورت قابل ملاحظه‌ای افزایش می‌دهد. در این راستا مطالعه مطلب زیر را پیشنهاد می‌کنم: «منظور از Vectorization (بردار سازی) در شبکه های عصبی چیست؟»http://vrgl.ir/7sJDeبرای نوشتن این مطلب از لینک زیر به عنوان رفرنس علمی استفاده شده است:http://cs231n.github.io/linear-classify</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Thu, 12 Mar 2020 14:35:33 +0330</pubDate>
            </item>
                    <item>
                <title>منظور از Vectorization (بردار سازی) در شبکه های عصبی چیست؟</title>
                <link>https://virgool.io/@alifallahi/%D9%85%D9%86%D8%B8%D9%88%D8%B1-%D8%A7%D8%B2-vectorization-%D8%A8%D8%B1%D8%AF%D8%A7%D8%B1-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-%D8%B4%D8%A8%DA%A9%D9%87-%D9%87%D8%A7%DB%8C-%D8%B9%D8%B5%D8%A8%DB%8C-%DA%86%DB%8C%D8%B3%D8%AA-zbqvpge81ykw</link>
                <description> وکتورایز vectorization استفاده از بردارسازی  در شبکه های عصبی  https://www.aparat.com/v/xmtkp یکی از نکات بسیار مهم در مباحث مربوط به یادگیری عمیق (Deep learning) و شبکه های عصبی (Neural networks) چگونگی پیاده سازی مدل ریاضیاتی مورد نظر است.رایج ترین توصیه برای افزایش سرعت برنامه نوشته شده و به طور کلی بهبود سطح نتیجه فاز پیاده سازی، پرهیز از به کار بردن حلقه های For به ویژه حلقه های For تو در تو تا حد ممکن است. راه حل این مسئله استفاده از تکنیک های  Vectorization است که در صورت ترجمه لغوی به «بردارسازی» ترجمه می شود.در این مطلب، به بررسی تفاوت زمان مورد نیاز  برای انجام ضرب داخلی دو ماتریس با استفاده از شیوه های زیر می پردازیم. For loop Vectorization معادله کلی دررگرسیون لجستیک (به انگلیسی: Logistic regression) به صورت زیر است:معادله رگرسیون لجستیک در این فرمول، W و X هر یک ماتریس هایی هستند که می توانند شامل تعداد زیادی درایه عددی باشند.مثال: فرض کنید W و X دارای مقادیر زیر هستند:برای محاسبه رگرسیون لجستیک، ابتدا ترانهاده ماتریس W را به دست می آوریم:و طبق فرمول ارایه شده برای لجستیک رگرشن، در ادامه خواهیم داشت:پس حاصل نهایی ضرب داخلی دو ماتریس  W و X  در این مثال برابر با 58 است. For loopدر حالت عادی برای پیاده سازی این روش در پایتون، از یک حلقه for استفاده می کنیم:a=[1,2,3] 
b=[7,9,11] 
c=0 
for i in range(len(a)): 
     c+=a[i]*b[i] 
print(c) Vectorization در حالت وکتورایز شده از کتابخانه numpy استفاده می کنیم:import numpy as np
a = [1,2,3]
b = [7,9,11]
c = 0
c = np.dot(a,b)
print(c)همانطور که در ویدیوی این پست مشاهده می کنید  اگر تعداد درایه های ماتریس ها زیاد باشد، برای اجرای حلقه for به زمان بسیار زیادتری نیاز است.</description>
                <category>AliFallahi</category>
                <author>AliFallahi</author>
                <pubDate>Sun, 08 Mar 2020 20:10:23 +0330</pubDate>
            </item>
            </channel>
</rss>