آموزشیادگیری ماشین

درس ۹۰ از ۹۹، هوش مصنوعی، حدود ۳۵ دقیقه خواندن

چرا پایتون، و چه مقدار کافی است

جواب کوتاه

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

چرا پایتون

این دو خط رو نگاه کنید. حتی اگه هیچ‌وقت برنامه ننوشتید، حدس بزنید چی کار می‌کنن:

درست حدس زدید: برای هر نمره توی فهرست نمره‌ها، اون نمره رو نشون می‌ده. این یه تیکه کد پایتون هست، و مهم‌ترین دلیل اینکه یادگیری ماشین با پایتون نوشته می‌شه همینه: آدم راحت می‌خونتش. سازنده‌هاش از اول همین رو می‌خواستن، و یکی از جمله‌های معروفشون اینه که «ساده بهتر از پیچیده‌ست».

برای همین پایتون توی خیلی از جاها اولین زبانیه که درس می‌دن. اسمش هم برخلاف ظاهرش ربطی به مار نداره؛ از اسم یه برنامه‌ی کمدی انگلیسی اومده. نسخه‌ای که الان همه استفاده می‌کنن، یعنی پایتون ۳، از سال ۲۰۰۸ اومده.

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

اولین خط

پایتون رو کجا بنویسیم؟ برای یادگیری ماشین، رایج‌ترین جا یه دفترچه‌ی کد هست که توی مرورگر باز می‌شه. دفترچه از چند تا خونه درست شده؛ توی هر خونه کد می‌نویسید، اجراش می‌کنید، و جوابش درست زیر همون خونه میاد:

توی خونه‌ی اول نوشتیم 2 + 3 و جواب شد ۵. توی خونه‌ی دوم یه عدد گذاشتیم توی یه اسم، بعد دو برابرش کردیم. خوبی دفترچه اینه که لازم نیست کل برنامه رو یه‌جا بنویسید و آخرش ببینید کار می‌کنه یا نه؛ یه خط می‌نویسید، جواب رو همون لحظه می‌بینید، و بعد خط بعد. برای یادگیری ماشین، که مدام باید داده رو نگاه کنید و یه چیزی رو امتحان کنید، این خیلی به درد می‌خوره.

یه راه دیگه هم هست: خود پایتون یه حالتی داره که یه خط می‌نویسید و همون لحظه جوابش رو می‌ده، مثل یه ماشین‌حساب. توی خط فرمان اگه بنویسید python3، همین حالت باز می‌شه. برای کار جدی‌تر هم کد رو توی یه فایل که آخر اسمش .py هست می‌نویسید و کل فایل رو یه‌جا اجرا می‌کنید.

متغیر

اولین چیزی که لازم دارید یه جا برای نگه داشتن چیزهاست. توی پایتون بهش می‌گن متغیر. متغیر رو مثل یه جعبه تصور کنید که یه برچسب روشه:

price = 120
city = "Tehran"
ready = True

علامت مساوی این‌جا یعنی «بذار توی». خط اول یعنی عدد ۱۲۰ رو بذار توی جعبه‌ای که اسمش price هست. از این به بعد هر جا بنویسید price، پایتون می‌ره و ۱۲۰ رو از توی جعبه درمیاره. اگه بعدا بنویسید price = 150، محتوای جعبه عوض می‌شه، ولی اسمش همونه.

توی جعبه‌ها چیزهای مختلف می‌شه گذاشت. عدد، مثل ۱۲۰ یا ۳.۵؛ متن، که باید بین دو تا علامت نقل‌قول باشه تا پایتون بفهمه اسم یه متغیر نیست؛ و درست یا غلط، که پایتون بهشون می‌گه True و False. لازم نیست از قبل بگید توی هر جعبه چی می‌ذارید؛ پایتون خودش از روی مقدار می‌فهمه.

با عددها هم همون حساب‌هایی رو می‌شه کرد که از مدرسه یادمونه: جمع با +، تفریق با -، ضرب با ستاره * و تقسیم با خط کج /. مثلا price * 2 می‌شه ۲۴۰.

متن و چاپ

حالا که جعبه داریم، بیایید یه چیزی نشون بدیم. تابع print هر چیزی که بهش بدید رو چاپ می‌کنه. با متن‌ها هم می‌شه کارهای جالبی کرد:

name = "Sara"
score = 17.456
print("Hello " + name)
print(f"{name} got {score:.1f}")
print(len(name), name.upper(), name[0])
Hello Sara
Sara got 17.5
4 SARA S

خط سوم دو تا متن رو با علامت جمع چسبوند به هم. خط چهارم یه ترفند خیلی پرکاربرده: اگه قبل از نقل‌قول یه fبذارید، هر چی بین آکولاد بنویسید، جاش مقدار اون جعبه میاد. اون :.1f هم یعنی «با یه رقم اعشار نشونش بده»؛ برای همین ۱۷٫۴۵۶ شد ۱۷٫۵. خط آخر هم سه کار با متن کرد: len تعداد حرف‌ها رو داد، یعنی ۴،upper همه رو بزرگ کرد، و name[0] حرف اول رو داد؛ چون متن هم مثل فهرست، از صفر شماره می‌خوره.

با عددها هم چند تا علامت دیگه هست که توی داده زیاد لازمتون می‌شه. 7 / 2 می‌شه ۳٫۵، تقسیم معمولی.7 // 2 می‌شه ۳، یعنی فقط قسمت درستش. 7 % 2 می‌شه ۱، یعنی باقی‌مونده؛ مثلا برای اینکه بفهمید یه عدد زوجه یا فرد. و 2 ** 10 می‌شه ۱۰۲۴، یعنی ۲ به توان ۱۰.

یه چیز عجیب هم هست که دیر یا زود می‌بینید: 0.1 + 0.2 توی پایتون می‌شه0.30000000000000004، و اگه بپرسید با ۰٫۳ برابره، می‌گه نه. پایتون خراب نیست؛ کامپیوتر عددها رو به صورت صفر و یک نگه می‌داره، و ۰٫۱ توی صفر و یک، مثل یک‌سوم توی ده‌دهی، تموم نمی‌شه و یه کم گرد می‌شه. پس هیچ‌وقت دو تا عدد اعشاری رو با مساوی دقیق مقایسه نکنید؛ اول گردشون کنید یا ببینید فرقشون خیلی کوچیکه. round(0.1 + 0.2, 2) == 0.3جواب درست، یعنی True، می‌ده.

فهرست

داده‌ی یادگیری ماشین تقریبا هیچ‌وقت یه عدد تنها نیست؛ صدها و هزارها عدده. برای نگه داشتن چند تا چیز کنار هم، پایتون فهرست داره:

فهرست رو با کروشه می‌سازید و چیزهای توش رو با ویرگول جدا می‌کنید. این‌جا سه تا نمره رو گذاشتیم توی یه فهرست به اسم scores. هر خونه‌ی فهرست یه شماره داره، و این یه نکته داره که همه اولش اشتباه می‌کنن: شماره‌ها از صفر شروع می‌شن، نه یک. پس scores[0] می‌شه ۱۲ و scores[1] می‌شه ۱۵.

scores.append(18)   # [12, 15, 9, 18]
len(scores)         # 4

با append یه چیز به آخر فهرست اضافه می‌کنید، و len می‌گه فهرست چند تا خونه داره. هر چیزی هم که بعد از علامت # بیاد، یادداشته و پایتون اصلا نگاهش نمی‌کنه؛ برای خودتون می‌نویسید که بعدا یادتون بمونه.

این فهرست ساده، پدربزرگ همون بردارهاییه که توی درس‌های قبل دیدیم. یه فهرست از فهرست‌ها هم، که هر خونه‌ش خودش یه فهرسته، همون ماتریس یا جدوله.

دیکشنری

فهرست برای چیزهای پشت سر همه که با شماره پیداشون می‌کنید. ولی گاهی هر چیز یه اسم داره؛ مثلا یه خونه، متراژ داره، تعداد اتاق داره، شهر داره. برای این، پایتون دیکشنری داره. مثل یه کمد که روی هر کشوش یه اسم نوشته:

house = {"size": 80, "rooms": 2, "city": "Tehran"}
print(house["size"])
house["price"] = 4200
print(house)
for key, value in house.items():
    print(key, "->", value)
80
{'size': 80, 'rooms': 2, 'city': 'Tehran', 'price': 4200}
size -> 80
rooms -> 2
city -> Tehran
price -> 4200

دیکشنری رو با آکولاد می‌سازید، و هر خونه‌ش یه جفته: اسم، دونقطه، مقدار. به اسم می‌گن کلید. house["size"]یعنی کشوی size رو باز کن، که ۸۰ درمیاد. برای اضافه کردن یه کشوی تازه هم کافیه بهش مقدار بدید، مثل خط چهارم. حلقه رویitems هم هر بار یه کلید و مقدارش رو با هم می‌ده.

یه ردیف از جدول داده، دقیقا همینه؛ ستون‌ها کلیدن و خونه‌ها مقدار. یه فهرست از دیکشنری‌ها هم یه جدول کامله: هر دیکشنری یه خونه، با همه‌ی ویژگی‌هاش. خیلی از داده‌هایی که از اینترنت میان هم دقیقا همین شکلی‌ان.

حلقه

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

خط اول یه جعبه به اسم total می‌سازه که اولش صفره. خط دوم می‌گه «برای هر s توی scores». یعنی پایتون یکی‌یکی می‌ره سراغ خونه‌های فهرست، هر بار اون خونه رو می‌ذاره توی s، و خط زیری رو اجرا می‌کنه. بار اول ۱۲ به صفر اضافه می‌شه، بار دوم ۱۵، بار سوم ۹. آخرش total می‌شه ۳۶.

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

یعنی توی پایتون فاصله‌ی اول خط فقط برای قشنگی نیست، معنی داره. اگه خط چهارم رو هم تو ببرید، بعد از هر نمره یه بار جمع رو نشون می‌ده: ۱۲، ۲۷، ۳۶. خیلی از خطاهای اول کار هم همین‌جاست، پس همیشه چهار تا فاصله، و همه‌جا یکسان. آخر خط حلقه هم اون دونقطه یادتون نره؛ یعنی «حالا بلوکش میاد».

شرط

گاهی باید بسته به یه چیزی، دو تا کار مختلف بکنیم. مثلا اگه نمره ۱۰ یا بیشتره بنویسیم قبول، وگرنه بنویسیم دوباره. برای این، پایتون شرط داره:

بعد از if یه سوال میاد که جوابش درست یا غلطه، این‌جا «آیا s بزرگ‌تر یا مساوی ۱۰ هست؟». اگه درست باشه، بلوک زیر if اجرا می‌شه؛ وگرنه، بلوک زیر else. باز هم همون دونقطه و همون تورفتگی.

برای مقایسه شش تا علامت دارید: بزرگ‌تر >، کوچیک‌تر <، بزرگ‌تر یا مساوی >=، کوچیک‌تر یا مساوی <=، مساوی == و نامساوی !=. دقت کنید که مساوی توی مقایسه دو تاست؛ یه مساوی تنها یعنی «بذار توی»، که توی بخش متغیر دیدیم.

شرط رو می‌شه گذاشت توی حلقه، و این‌جاست که کار جالب می‌شه. مثلا این سه خط از یه فهرست هزارتایی، فقط نمره‌های قبولی رو می‌شمره:

passed = 0
for s in scores:
    if s >= 10:
        passed = passed + 1

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

تابع

فرض کنید میانگین نمره‌ها رو توی ده جای مختلف برنامه لازم دارید. به جای اینکه ده بار همون چند خط رو بنویسید، یه بار می‌نویسیدش، یه اسم روش می‌ذارید، و هر جا لازم شد صداش می‌کنید. به این می‌گن تابع:

def average(xs):
    return sum(xs) / len(xs)

average([12, 15, 9])   # 12.0

تابع مثل یه دستگاهه. یه چیزی از یه طرف بهش می‌دید، که بهش می‌گن ورودی، و یه چیزی از طرف دیگه تحویل می‌گیرید، که بهش می‌گن خروجی. با def تابع رو تعریف می‌کنید؛ اسمش این‌جا average هست و ورودیش رو توی پرانتز xs صدا می‌زنیم. خط زیری، باز هم با تورفتگی، کار دستگاهه: همه رو جمع کن، تقسیم بر تعدادشون کن. و return یعنی «این رو پس بده».

این همون تابعیه که توی درس ریاضیش دیدیم: یه چیزی می‌ره تو، یه چیزی میاد بیرون. اون sum و len و print هم که تا حالا دیدیم، تابع‌هایی‌ان که خود پایتون از قبل ساخته.

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

میان‌برها

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

scores = [12, 15, 9, 18, 11]
print(len(scores), sum(scores), min(scores), max(scores))
print(sorted(scores))
print(round(sum(scores) / len(scores), 2))
print(list(range(5)))
passed = [s for s in scores if s >= 10]
print(passed)
doubled = [s * 2 for s in scores]
print(doubled)
5 65 9 18
[9, 11, 12, 15, 18]
13.0
[0, 1, 2, 3, 4]
[12, 15, 18, 11]
[24, 30, 18, 36, 22]

خط دوم توی یه خط تعداد، جمع، کوچیک‌ترین و بزرگ‌ترین رو داد؛ همون کاری که با حلقه چند خط می‌شد. sortedمرتب کرد، round گرد کرد، و range(5) عددهای صفر تا چهار رو ساخت؛ دقت کنید پنج خودش جزوش نیست. این آخری توی حلقه‌ها خیلی به کار میاد، مثلا for i in range(100) یعنی صد بار تکرار کن.

دو خط آخر یه ترفند مخصوص پایتونه که بهش می‌گن ساختن فهرست توی یه خط. بخونیدش مثل یه جمله: «یه فهرست از s بساز، برای هر s توی scores، اگه s بزرگ‌تر یا مساوی ۱۰ بود». همون کاری که توی بخش شرط با چهار خط کردیم، توی یه خط. خط آخر هم هر نمره رو دو برابر کرد. این شکل نوشتن رو توی کد یادگیری ماشین زیاد می‌بینید، پس خوندنش رو یاد بگیرید.

خوندن داده از فایل

داده‌ی واقعی معمولا توی یه فایله، و رایج‌ترین شکلش فایل CSV هست، کوتاه‌شده‌ی Comma-Separated Values، یعنی «مقدارهای جداشده با ویرگول». یه فایل متنی ساده‌ست که هر خطش یه ردیف جدوله و خونه‌هاش با ویرگول جدا شدن. یه فایل ساختگی ساختیم به اسم houses.csv، با متراژ و قیمت پنج تا خونه، که خط اولش اسم ستون‌هاست:

size,price
50,2600
65,3300
80,4100
100,5000
120,6100

و بی هیچ کتابخونه‌ی بیرونی، این‌جوری می‌خونیمش:

sizes, prices = [], []
with open("houses.csv") as f:
    next(f)                      # first line is the header
    for line in f:
        size, price = line.strip().split(",")
        sizes.append(float(size))
        prices.append(float(price))
print(sizes)
print(prices)
[50.0, 65.0, 80.0, 100.0, 120.0]
[2600.0, 3300.0, 4100.0, 5000.0, 6100.0]

with open فایل رو باز می‌کنه و آخر کار خودش می‌بنده. next(f) خط اول رو رد می‌کنه، چون اسم ستون‌هاست، نه عدد. بعد برای هر خط، strip فاصله و خط تازه‌ی آخرش رو برمی‌داره،split(",") از جای ویرگول‌ها می‌شکنتش، و float متن «50» رو به عدد ۵۰ تبدیل می‌کنه. این تبدیل خیلی مهمه؛ هر چیزی که از فایل میاد اولش متنه، حتی اگه شبیه عدد باشه. توی کار واقعی، کتابخونه‌های آماده همه‌ی این‌ها رو با یه خط می‌کنن، ولی خوبه بدونید پشتش همین اتفاق می‌افته.

آماده‌ها

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

توی قفسه‌ی خود پایتون، ابزار برای کار با اینترنت، پایگاه داده، ساختن عدد شانسی، جستجو توی متن و آزمایش کد هست. توی مخزن رسمیش هم تا اول اکتبر ۲۰۲۶ بیش از ۹۰۰ هزار بسته بوده. هر کدوم از این‌ها یه کتابخونه هست: یه دسته تابع آماده که یکی دیگه نوشته.

import random
random.choice(scores)

با import یه کتابخونه رو میارید توی برنامه‌تون، بعد با یه نقطه بعد از اسمش، تابع‌هاش رو صدا می‌کنید. این‌جا تابع choice یکی از نمره‌ها رو شانسی برمی‌داره. بسته‌های مخزن رسمی رو هم قبلش با یه دستور توی خط فرمان نصب می‌کنید و بعد همین‌جوری import می‌کنید.

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

خطاها رو بخونید

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

scores = [12, 15, 9]
print(scores[3])
Traceback (most recent call last):
  File "e1.py", line 2, in <module>
    print(scores[3])
          ~~~~~~^^^
IndexError: list index out of range

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

دومی، جمع متن با عدد. age = "17" و بعد age + 1 این پیام رو می‌ده:

TypeError: can only concatenate str (not "int") to str

یعنی «فقط می‌تونم متن رو به متن بچسبونم، نه عدد رو». ۱۷ این‌جا بین نقل‌قوله، پس متنه، و پایتون نمی‌دونه منظورتون «۱۷ به‌علاوه‌ی یک» بوده یا «۱۷ و بعدش یک». این همون اتفاقیه که با خوندن فایل می‌افته، اگه float یاint رو فراموش کنید.

سومی، فراموش کردن تورفتگی بعد از حلقه:

IndentationError: expected an indented block after 'for' statement on line 2

پیام خیلی روشنه: بعد از for توی خط ۲، انتظار یه بلوک تورفته داشت. و چهارمی، غلط تایپی توی اسم؛ مثلا نوشتید totl به‌جای total:

NameError: name 'totl' is not defined

یعنی «جعبه‌ای با این اسم نمی‌شناسم». پایتون با اسم‌ها خیلی دقیقه؛ حتی بزرگ و کوچیک بودن حرف‌ها هم فرق می‌کنه، وTotal با total دو تا جعبه‌ی جدان. هر وقت خطایی دیدید که نفهمیدید، همون خط آخرش رو عینا جستجو کنید؛ تقریبا همیشه یکی قبلا همون رو پرسیده.

پایتون کنده؟

یه حرف رایج اینه که پایتون کنده. راسته، ولی نصفه. خودمون امتحانش کردیم: ۱۰ میلیون عدد رو یه بار با یه حلقه‌ی معمولی جمع زدیم، یه بار با همون sum آماده:

import time
nums = list(range(10_000_000))
t = time.perf_counter()
total = 0
for x in nums:
    total = total + x
loop = time.perf_counter() - t
t = time.perf_counter()
total2 = sum(nums)
built = time.perf_counter() - t
print(f"loop: {loop:.2f} s   sum(): {built:.2f} s   same: {total == total2}")
loop: 0.36 s   sum(): 0.02 s   same: True

جواب هر دو یکی بود، ولی حلقه‌ی خودمون ۰٫۳۶ ثانیه طول کشید و sum ۰٫۰۲؛ حدود ۱۵ برابر سریع‌تر. دو بار اجرا کردیم و دفعه‌ی دوم ۰٫۳۸ و ۰٫۰۳ شد؛ عددها روی هر کامپیوتر فرق می‌کنه، ولی فاصله‌شون همین حدوده. دلیلش اینه که توی حلقه، پایتون برای هر عدد جدا کلی کار اضافه می‌کنه: نگاه می‌کنه این چیه، عدده یا متن، جمعش چطوریه. ولیsum قلبش به یه زبان سریع‌تر نوشته شده و این کارها رو یه‌جا می‌کنه.

کتابخونه‌های یادگیری ماشین هم همین کار رو می‌کنن، خیلی بیشتر. شما با پایتون ساده می‌گید «این دو تا ماتریس رو ضرب کن»، و کار سنگین رو یه تیکه کد خیلی سریع، و گاهی کارت گرافیک، انجام می‌ده. برای همین قانون طلایی اینه: هر جا یه کار رو روی کل داده می‌شه یه‌جا انجام داد، حلقه ننویسید. پایتون نقش فرمون رو داره، و موتور جای دیگه‌ست.

یه پیش‌بینی کوچیک

حالا همه رو کنار هم بذاریم و با پایتون خالی، یه پیش‌بینی واقعی کنیم. همون پنج تا خونه‌ی ساختگی فایل بالا رو داریم. سوال: یه خونه‌ی ۹۰ متری چند می‌ارزه؟ بهترین خطی که از وسط این نقطه‌ها رد می‌شه رو با فرمولرگرسیون خطی پیدا می‌کنیم:

sizes  = [50, 65, 80, 100, 120]
prices = [2600, 3300, 4100, 5000, 6100]

n = len(sizes)
mx = sum(sizes) / n
my = sum(prices) / n
top = sum((x - mx) * (y - my) for x, y in zip(sizes, prices))
bottom = sum((x - mx) ** 2 for x in sizes)
slope = top / bottom
start = my - slope * mx
print(f"price = {start:.1f} + {slope:.2f} * size")
print(f"90 m2 -> {start + slope * 90:.0f}")
price = 91.6 + 49.74 * size
90 m2 -> 4568

ببینید چقدر از چیزهایی که یاد گرفتید این‌جاست: فهرست، len و sum، ساختن عدد توی یه خط با حلقه، zip که دو تا فهرست رو جفت‌جفت کنار هم می‌ذاره، توان با **، و چاپ با f. خط‌های وسط فقط همون فرمول شیب خطه: چقدر متراژ و قیمت با هم بالا پایین می‌رن، تقسیم بر چقدر خود متراژ بالا پایین می‌ره. نتیجه می‌گه هر متر حدود ۴۹٫۷۴ به قیمت اضافه می‌کنه، و خونه‌ی ۹۰ متری حدود ۴۵۶۸.

چقدر کافیه

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

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

اشتباه‌های رایج

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

از کجا اومد

پایتون تقریبا هم‌سن اینترنت امروزیه:

خیدو فان روسوم دسامبر ۱۹۸۹، توی تعطیلات، شروع به ساختن پایتون کرد و نسخه‌ی اولش سال ۱۹۹۱ منتشر شد. اسمش هم از یه برنامه‌ی کمدی تلویزیونی بریتانیایی اومده، نه از مار. پایتون ۲ سال ۲۰۰۰ اومد و پایتون ۳ سال ۲۰۰۸؛ نسخه‌ی ۳ عمدا با قبلی کامل جور نبود تا چند تا اشتباه قدیمی درست بشه، و برای همین جابه‌جایی سال‌ها طول کشید. پایتون ۲ اول ژانویه‌ی ۲۰۲۰ کامل کنار گذاشته شد؛ اگه جایی کدی دیدید که print رو بی پرانتز نوشته، مال همون دوره‌ست.

حالا که ابزار رو دارید، درس بعد همه‌ی این‌ها رو کنار هم می‌ذاره:اولین پروژه‌ی کامل، از داده‌ی خام تا یه مدل که پیش‌بینی می‌کنه.

جمع‌بندی. آنچه از این درس با خودتان می‌برید.

  • پایتون رو آدم راحت می‌خونه؛ برای همین همه‌جا هست.
  • توی دفترچه‌ی کد، هر خط جوابش رو همون‌جا نشون می‌ده.
  • متغیر، فهرست، حلقه، شرط، تابع: همین پنج تا.
  • تورفتگی یعنی این خط مال اون بالاییه.
  • کار سنگین رو کتابخونه‌های آماده می‌کنن.

خودتون رو بسنجید

۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو می‌بینید: چند تا درست، چند تا نادرست.

خودتون رو بسنجید

۱۵ پرسش

  • هر بار پرسش‌ها و ترتیب گزینه‌ها عوض می‌شه.
  • تا آخر نمی‌گیم کدوم جواب درست بوده؛ می‌تونید برگردید و جوابتون رو عوض کنید.
  • آخرش کارنامه می‌گیرید: چند تا درست، چند تا نادرست.
  • اگه وسطش بستید، دوباره که باز کنید از همون‌جا ادامه می‌دید.

فصل‌های این درس

درس بعد