Sun'iy Intellekt.pdf

Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Full Transcript

Sun’iy Intellekt December 20, 2023 1 Kirish 1.1 Sun’iy intellekt kursi Sun’y intellekt (SI) hozirgi rivojlanib borayotgan zamonning eng taraqiy etgan fanlaridan biri bo’lib, uning natijalarini deyarli hayotimizning har bir javhasiga kirib keldi. Hamda...

Sun’iy Intellekt December 20, 2023 1 Kirish 1.1 Sun’iy intellekt kursi Sun’y intellekt (SI) hozirgi rivojlanib borayotgan zamonning eng taraqiy etgan fanlaridan biri bo’lib, uning natijalarini deyarli hayotimizning har bir javhasiga kirib keldi. Hamda kunlik tur- mushimizda bu natijalardan doimiy foydalanimiz va ko’pnicha, hattoki, bu narsaga e’tibor ham bermaymiz. Ushbu soha matematika va boshqa bir qancha sohalarining birlashuvidan hosil bo’lib, ushubu fanlarning yutuqlari esa amaliyotga keng tadbiq qilingan desak adashmaymiz. Bularga ko’plab namumanalar keltirish mumkin, masalan, Google tarjimon (Google Translate), ChatGPT, haydovchisiz avtomobillar va boshqalari. Sun’iy intellekt - mashinalarning yoki dasturlarning intellekti bo’lib, bu intellekt inson yoki hayvon intellektining aksi hisoblanadi. Ya’ni, qisqa qilib aytganda, mashina yoki dasturniga odam intellek- tiga o’xshash, lekin tabiiy bo’lmagan intellekt berishdir. Biz ushbu darslar davomida, intellekt va ong so’zlarni o’zaro almashtirish orqali ishlatamiz. Ushbu kursning maqsadi o’rganuvchilarga ushbu sohaga kirish va shu soha mutaxasisi bo’lish uchun eng zarur bo’lgan ko’nikmalarni berishdan iborat. Yuqorida ta’kidlaganimizdek, bu soha bir qancha fanlarning birlashuvidan tashkil topgani uchun boshlovchilarga bir nechta fanlarni bilish ta’labini qo’yadi. Odatda, ko’pchilik ma’lum bir darajada oliy matematikani bilish yetarli deb hisoblashadi. Bizning fikrimizcha, bu faqat tayyor modellarni ishga tushirish va ulardan foydalanish uchun yetarli. Ushbu vazifani 2-3 yil dasturlash tarjibasi bor va ingliz tilini yaxshi biluvchi dasturchilar ham SI kutubxonalarning tayyor qo’llamalaridan foydalanib amalaga oshirishmoqda hamda buning nati- jalarni bizning davlatda ham ko’rish mumkin. Lekin biz ushbu kursda sohani matematik jihatdan chuquroq o’rganishni ham oldimizga maqsad qilib qo’ydik, shuning uchun o’rganuvchilarni mak- tab darsligi darajasida matematik bilimlarga ega deb ta’svur qilamiz va shu asosida undan keyin zarur bo’lgan fanlarni ma’lum bir qismini chuquroq o’rganib chiqmiz. Bundan tashqari o’rganish jarayonida dasturlash hamda SIning eng so’ngi va foydali kutubxonalarni Python dasturlash tilida o’rganamiz. O’rganish zurur bo’lgan sohalar juda ko’p bo’lib, biz imkon qadar eng zarurlarni va ulardan ham mu’lum bir bo’limlarni ushbu qo’llanmada keltiramiz. Quyidagi fanlar SIni o’rganish uchun asos bo’lib xizmat qiladi: 1. Dasturlash tili (Python) - biz mashinaga ong berishimiz uchun unga buyruq berish kerak bo’ladi. Bu uchun esa eng yaxshi dastur Python hisoblanadi. 2. Chiziqli algebra - biz ma’lumotlarni asosan jadvallar, ketma-ketliklar ko’rinishda mashina xotirasida saqlaymiz, ular bilan ishlash uchun esa birinchi navbata chiziqli algebra zarur bo’ladi. 1 3. Ehtimollar nazariyasi va matematik statistika - bu ikki fan SI paydo bo’lishidan oldin ham mavjuda bo’lib, SI asosan ushbu ikki fan ichidagi soha sifatida bo’lgan, hamda hozirgi kunda ham SI ko’pchilik holda ushbu sohalarga tayanadi. 4. Mashinali o’rganish - SIning eng tayyangan va hozirgi kundagi mavjud deyarli hamma metod- lar ushbu soha asosida amalga oshirilgan. 5. Algoritmlar va ma’lumotlar strukturasi - Qanday qilib ma’lumotlarni saqlash va ular bilan ishlash uchun turli xil algoritmlarni o’rganadi. Masalan, insonlarni ro’yxatini yoshi bo’yicha tartiblash. SI har xil sohalarga qo’llash orqali yana bir qancha fanlar vujudga kelgan, ulardan: 5. Kompyuterli ko’rish (Computer Vision) - ushbu soha asosan grafik ma’lumotlar bilan ishlash uchun xizmat qiladi. Lekin hozirgi kunda berilgan rasmni yoki videoni matn yordamida tasvirlash ham mumkin. 6. Tabiiy tillar bilan ishlash (Natural Language Processing) - Bu soha tabiiy tillar bilan ishlash uchun xizmat qiladi. 7. Mustahkamlab o’rganish (Reinforcement Learning) - Bu soha asosan robotatexnikada ishlati- ladi. Ingliz tilidan O’zbek tiliga Artificial Intelligence atamasini Sun'iy Intelekt, Machine Learning atamasini Mashinali o'rganish, Computer Vision atamasini Kompyuterli ko'rish va Reinforcement Learning atamasini esa Mustahkamlab o'rganish ko’rinishida tarjima qildik. Odatda ushbu fanlar universitet talabalariga alohida fan sifatida o’tiladi, hammda asosan o’sha fandan chiqmasdan chuquroq shu fan talabalar tomonidan o’rganiladi. Bu esa ba’zida qo’yilgan maqsadga yetib borishga to’sqinlik qiladi. Masalan, biz chiziqli algebrani 4 oy davomida o’rgansak shundan keyin biz mashinali o’rganish sohasiga o’tishimiz mumkin. Bu esa o’rganuvchining fanga va zamonga bo’lgan ishtiyoqini so’ndiradi. Shu sababdan bu qo’llanmada biz yuqoridagi birinchi 5 ta fani birgalikda o’tishni lozim topdik. Ya’ni birinchi Python dasturlash tilidan ma’lum bir tushun- chalar o’tiladi, undan so’ng chiziqli algebradan biror mavzu o’rganilib undagi vazifalar Python dasturlash tilida amalga oshiriladi va shu tarizda davom etiladi. Umid qilamizki, bunday metod yordamida biz o’rganuvchilarni qisqa va eng zarur qismlarni o’rganishni ta’minlaymiz. Keyingi qolgan fanalar esa alohida yo’nalish tanlangandan so’ng bemalol o’rganish mumkin va odatda biri ikkinchisini o’rganishni talab qilmaydi. Chunki biz dastlabki asos bo’lgan bilim va ko’nikmalarni birinchi 5 ta fandan olamiz. Bundan tashqari, yuqorida keltirilgan fanlar bilan cheklanmasdan zarur o’rinlarda, boshqa fanlarga ham murojaat qilib ularning yutuqlaridan foy- dalanamiz. Ushbu qo’llanmada biz asosan mashinali o’rganish faniga chuquroq kirishamiz hamda qolgan asos fanlarning ham shu fanga zarur qismlarni qisqacha o’rganib ketamiz. Ammo shu bilan birgalikda faqat nazariy bilinlar bilan cheklanmasdan, albatta mashinali o’rganishda keng qo’llaniladigan al- goritmlarni o’rganib, ularning dasturini yozib chiqamiz. Bunday algoritmlar yordamida bir qator qiziq masalalarni yechib natijalar olamiz, jumladan rasmlarni klassifikatsiya qilish, xatlarni spam (har aloqasi bo’lmagan elektron xabarlar) yoki yo’qligini tekshirish, va hakozolar. Har bir mantiqiy yakunlangan mavzudan so’ng albatta mavzuga doir masala va topshiriqlar berib boriladi. Ularning oldingilariga juda o’xshash bo’lib, asosan takomilashgan ko’rinishi yoki mavjud imkoniyatlardan boshqacharoq ko’rinishida bo’ladi. Masalar sodda va tushunarli bo’lishi uchun zaruriy alohida qo’llanmaga ilovalar qo’shiladi. 2 Ushbu fan va unga asos bo’luvchi fanlarni chuqur nazariy qismlarini o’rganish orqali haqiqiy mu- taxasis bo’lish mumkin bo’ladi. Chunki ko’pchilik hozirgi kundagi kurslarda va amaliy masalalarda soha vakillari tayyor algoritmlardan foydalanishni afzal ko’rishadi. Bu narsani amaliy masalarni yechishda ishlatish juda ham maqullanadi, sababi oldindan tayyor bo’lgan narsani qayta ishlab chiqishdan ko’ra uning tayyoridan foydalanish oson. Agar biz ushbu kitobda algoritmlarning va usullarning nazariy qismiga o’tib ularni o’rganadigan bo’lsak, u holda siz aziz o’quvchilarni qiyin ahvolga solib qo’ygan bo’lamiz hamda natija biz kutganmizidek ham bo’lmaydi. Shuning uchun biz, ushbu kitobda, ko’proq amaliy qismlariga e’tiborimizni qaratib nazariy qismlarning eng ker- akli bo’lgan joylarini bir ko’zdan kechirib ketamiz. Masalan, hozirda qo’llanilayotgan ko’pchilik algoritmlarning asosida funksiyaning optimal parameterlarini topish yotadi. Bunday muammo- larni yechishning bir qancha usullari bo’lib, ulardan eng keng qo’llanilayotgani gradent (qiyalik) bo’yicha tushishdir. Ushbu optimal parameterlarni topish usulini soddaroq holdagi modellarda ko’rib, tassavur hosil qilamiz va undan so’ng, tayyor kutubxonalardan foydalanib o’zimiga kerakli modellarni qurib o’rganamiz. Hamda bu muammolardagi har xil matematik shartlar bilan o’zimizni qiynamaymiz. Ushbu qo’llanmada ba’zi mavzular yoki ma’lumotlar qo’shimcha sifatida kiritiladi, bu esa tala- balarni yanada chuquroq bilim olishiga va nazariy muammoni oldindan ko’ra olish qobilyatini os- hiradi. O’rganuvchiga qulaylik maqsadida bu qismlarni o’qish ixtiyoriy bo’ladi. 1.2 SIning tarixi Yuqorida aytganimizdek ushbu soha ancha yillardan beri mavjud hamda asosan statistika fanining bir bo’limi sifatida shaklangan. Dastlabki urunishlar davri ham har xil manbalarda farqli beriladi, hattoki ularning ichida SI afsonalari ham mavjud. Lekin hozirgi mavjud va o’z ahamiyatiga ega bo’lgan SI, quyidagi farazga tayanadi: odamning fikrilashini mexanik ko’rinishga o’tkazish mumkin. Ushbu firklashnig o’rganishning uzoq tarixi mavjud. Ushbu g’oyalar asrlar davomida rivojlangan bo’lib, Aristotel (Sillogizmni tahlil qilgan), Evklid (matematikani tahlil qilgan), Al-Xorazmiy (al- gebrani ishlab chiqan) va boshqalar. SI alohida fan yo’nalish sifatida 1956 yilda tashkil etilgan. Ushbu davr davomida bir qancha bosqichlardan o’tib kelgan: 1. Kibernetika va dastlabki neyron tarmoqlari (1930 yillar) 2. Alan Turing test (1950 yil) 3. SI o’yinlari (1951) 4. Belgili firklash (1955) 5. Alohida fan sifatida qabul qilindi (1956) 6. 1956-1974 yillarda algebra masalarini yechish 7. Ko’plab yondashuvlar ishlab chiqilishi 8. Qidiruv algoritmlari 9. Tabiiy til 10. Mikro-dunyolar 11. Birinchi SI to’xtashi (1974-1980) 12. 1980-1987 (Birinchi portlash) - Expert tizimlari 13. Ikkinchi SI to’xtashi (1987-1993) 14. SI (1993-2011) 15. Chuqur o’rganish (Deep Learning), katta ma’lumotlar (Big data). Yuqoridagi tarix bu juda qisqa va umumiy bo’lib, unda ma’lum bir davrlarga bo’lib ko’rsatilgan hamda SI asosan mashinaga bog’liq ravishda berilgan. SIning matematik asoslari esa aytib 3 o’tilganidek Aristotel, Evklid va Al-Xorizmiylar davrida ham mavjud bo’lgan. SIning birinchi amaliy natijalar ma’lum bir turdagi narsalarni kelajakda bashorat qilish haqida bo’lib. Unda chiz- iqli regressiya usulidan 1805-yilda Yevropalik olimlar ishlab chiqilgan. Usbu usul oddiy kichik kvadratlar usuli yordmida quyidagi chiziqli modeling paramterlarni berilgan jadvalga asosan top- gan. Bizga quyidagilar berilgan deb tassavur qilaylik: 𝑥11 𝑥12 … 𝑥1𝑛 ⎛ ⎜ 𝑥21 𝑥22 … 𝑥2𝑛 ⎞ ⎟ 𝑋=⎜ ⎜ ⎟ (1) ⎜ … … … … ⎟ ⎟ ⎝𝑥𝑚1 𝑥𝑚2 … 𝑥𝑚𝑛 ⎠ ya’ni 𝑋 ∈ 𝑅𝑚×𝑛 - bu har bir qatorida obyektlarni saqlaydi va biz buni modelga kiruvchi qiymatlar deb ataymiz. 𝑦1 ⎛ ⎜ 𝑦2 ⎞ ⎟ 𝑦=⎜ ⎜ ⎟ (2) ⎜…⎟ ⎟ ⎝𝑦𝑚 ⎠ ya’ni 𝑦 ∈ 𝑅𝑚 - bu har bir 𝑋 ning qatoridagi obyektga mos qiymat va buni esa obyektning maqsadli qiymati deb ataymiz. Bizning vazifamiz yuqoridagilardan foydalanib, agar bizga 𝑋 ning biror qatoriga o’xshash qiymatlar obyekt sifatida kelsa, biz shu obyektga mos 𝑦 qiymatni topishimiz kerak. Buning uchun esa quyida eng sodda chiziqli regressiya modelidan foydalanishgan 1805-yilda. 𝑦 ̂ = 𝑤0 + 𝑤1 𝑥1 + 𝑤2 𝑥2 + ⋯ + 𝑤𝑛 𝑥𝑛 (3) bu yerda 𝑦 ̂ 𝑦 ning taqribiy qiymati hisoblangan. Ushbu modeldagi asosiy muammo bu uning parameterlarining aniq qiymatini topishdir. Buning uchun oddiy kichik kvadratlar usulidan foy- dalanishgan 𝑛 2 ||𝑦 ̂ − 𝑦|| = ∑ [𝑦 ̂ − 𝑦] = 0 (4) 𝑖=1 Ma’nosi, haqiqiy qiymat 𝑦 va taqribiy qiymat 𝑦 ̂ o’rtasidagi farq 0 (bunda shart qanoatlantiruvchi parameter qiymatlarnini topish ko’p hollarda ilojsiz) bo’lishi kerak degani. Yuqorida ko’rgan modelimiz eng sodda model, lekin hozirgi kundagi eng ko’p qo’llanilayotgan usullar ham huddi shu kabi g’oyaga ega bo’lib, faqat ularda parameterlar soni haddan tashqari ko’p va har bir muommoga mos ravishda turli xil yechimlar o’ylab topilgan. Ya’ni hozirgi za- monaviy usullarda ham biz optimal parameterlarning qiymatlarni topishga harakat qilamiz, faqat model chiziqli bo’lmaydi. Bu kabi metodlarni biz Chiziqli algebra va mashinali o’rganish kurslarida batafsil ko’rib chiqamiz. [ ]: %%javascript MathJax.Hub.Config({ TeX: { equationNumbers: { autoNumber: "AMS" } } 4 }); internal link name 2 Python dasturlash tili 2.1 Kirish Dasturlash tili hisoblash mashinasiga (kompyuter) buyruqlarni ketma-ketiligini berishga muljallan- gan qattiy gramatik qoidalarga ega notabiiy tildir. Ushbu buyruqlar ketma-ketligini biz kod (code) deb nomlaymiz va ba’zida dastur kori yoki matni deb ham nomlashimiz mumkin. Chunki kod oddiy mant fayllardan iborat bo’ladi odatda. Lekin bundan mustasno hollatlar ham mavjud. Biz har doim ma’lum bir turdagi narsalarni ularning xusisyatlariga ko’ra bir nechta qismlarga ajratish orqali o’rganamiz va shunda ulardan qachon va qanday vaziyatda foydalanishni yaxshi- roq anglaymiz. Shu kabi, dasturlash tillari ularning bajarilishi jihatidan bir qancha turlarga bo’lnadi: quyi, o’rta va yuqori darajadagi dasturlash tillari. Python dasturlash tili yuqorida darajadagi dasturlash tili hisoblanadi. Buni keyinchalik bosqichma-bosqich tahlil qilib boramiz. Ya’na bir boshqasi esa o’zgaruvchilarga ko’radir. Xotirada ma’lumotlarni saqlashda biz har doim o’zgaruvchilardan foydalanamiz, ularga ko’ra esa tillar ikkiga statik va dinamik turlarga bo’linadi. Python esa dinamik tildir. Lekin hozirgi kunda ko’pchilik dasturlash tillari o’zida qo’shimcha imkoniyatlar yaratmoqda, masalan, C# tilida var kalit so’zi, C++ tilida esa auto kalit so’zlari kiritilgan. 2.2 Mashina xotirasida qiymatlarni saqlash Biz mashina xotirasida har doim qiymat(son)larni saqlaymiz undan boshqa narsani emas va o’z navbatida bu sonlarni ham biz o’nlik sanoq sistemasida emas, balki ikkilik sanoq sistemasida saqlaymiz. Masalani, 23 soni bu o’nlikda desak, unda uning ikkilik ko’rinishi 10111 bo’ladi. Agar shu soni 32 bitli xotiraga saqlamoqchi bo’lsak, uning oldiga 27 ta nol qo’shamiz, ya’ni 00000000000000000000000000010111. Agar shu son -23 bo’lsa, unda u quyidagicha bo’ladi 10000000000000000000000000010111, ya’ni soning manifiyligini bildirish uchun birinchi nol 1 ga aylanadi. Bu degani birinchi bit sonning manifiy yoki musbatligi uchun ajratiladi, qolgan 31 bitga esa sonning o’zini saqlaymiz. Odatda ko’pchilik o’rganuvchilarda savol tug’uladi: Nimaga biz soni ikkilik ko'rinishda saqlanishini bilishimiz kerak, chunki biz dasturlash tillari bilan ishlayotganimizda ular biz o'zgaruvchiga o'zlashtirgan qiymatni to'g'iridan-to'g'iri ikkilik ko'rinishga o'tkazsa? Bu jarayon shunday bo’lishi rost, faqat biz nega saqlanayotgan qiymatlarning turlarni va ayniqsa biz haqiqiy sonlar bilan amallar bajarayotganimizda qiymatlarni yuqolishini ham bilishimiz kerak. Buni esa faqat sonlarni qanday xotirada joylashtirishga bog’liqligi asosida tushunishimiz mumkin. Masalan, − 200 3 soni 32 bitli xotirada IEEE 754 standart bo’yicha quyidagicha bo’ladi. Biz qo’shimcha ushbu misolda soddaroq holni qaraymiz, ya’ni bu haqiqiy standartdagi berilgan hamma hollarni o’z ichiga olmaydi. Berilgan 32 razryadni 3 ta qismga bo’lamiz: 1. ishora (musbat yoki manifiy uchun) 1 bit; 2. exponenta uchun 8 bit; 5 3. hamda, mantissa uchun qolgan 23 bit. Ishora Exponenta Mantissa 1 8 23 1. Berilgan son manifiy bo’lgani uchun, birinchi bit ga 1 yozamiz. 2. Exponentani quyidagicha hisoblaymiz. Birinchi soni quyidagi ko’rinishda yozamiz: 23 102. Keyin esa, 10 sonining darajasidagi 2 sonini ikkilik sanoq sistemasiga o’tkazib, uni Exponen- tagaga yozamiz. 210 → 102. Lekin bizda 8 bit bor, shuning uchun 102 oldiga 6 nol qo’shamiz, ya’ni 000000102. 3. Matnissa qismi 23 ikkilik sanoq sistemasiga o’tkazish orqali amalga oshirladi. Buning uchun shu soni 2 ko’paytiramiz va butun qismidagi soni (0 yoki 1) saqlab qo’yamiz. Quyidagi jadvalda ushbu jarayon batafsil keltirilgan. Keyinchalik SIning zamonaviy kutubxonalarida bu kabi ta’nlovlarni ko’rishimiz mumkin bo’ladi. Masalan, numpy kutubxonasida numpy.float32 va numpy.float64 o’zgaruvchi turlari mavjud. Bizda har doim muammo bo’ladi qaysi birini tanlash kerak degan, agar biz sonlarni ikkilik ko’rinishda saqlash qanday ekanligini bilsak unda bu qiyinchilikni yengan bo’lamiz. Son ko’paytiriluvchi son (2) Ikkilik ko’rinish 1 2 1+ 3 3 ∗2 1 2 1 0+ 3 3 ∗2 10 1 2 1+ 3 3 ∗2 101 2 1 0+ 3 3 ∗2 1010 1 2 1+ 3 3 ∗2 10101 … … … … … … … … … 1 2 1+ 3 3 ∗2 10101010101010101010101 Yuqoridagi takrorlash 23 ta raqam bo’lgunicha davom etadi va sonning qolgan qismi tashlab yu- boriladi. Ko’rib turganimizdek, biz xotiraga kichkina sonni ham aniq(to’liq) holda saqlay olmas ekanmiz. Shuning uchun sonlarning turlari bilan xotirada ishlayotganda, har bir qismdan maqsadli foydalanish zarur bo’ladi. Hamda ular o’rtasidagi har xil amallarda (+, -, *, /) har doim yaxlit- lash xatoligi mavjud bo’ladi va bu o’z navbatida ba’zi vaqtlarda tanlagan matematik modelimiz xatoliklarga olib keladi. 2.3 O’zgaruvchilar Agar xotiraga biror qiymatni joylashtirmoqchi bo’lsak, u holda bizga kerakli bo’lgan qismga muro- jaat qiluvchi nom kerak bo’ladi va bu nomni biz o’zgaruvchi deb ataymiz. Bu o’zgaruvchi mashinan- ing operartiv xoritasi (RAM: Random Access Memory)dan joy egallaydi va biz shu o’zgaruvchiga yangi qiymat yuklashimiz bilan eski qiymatni o’chiradi va yangisini ikkilik (ikkilika o’tkazish jaray- oni haqida biz umuman bosh qotirmaymiz) ko’rinishga o’tkazib yozadi va bizda boshqa eski qiy- matni olishga imkon bo’lmaydi. Quyida bir qator namunalar berilgan. 6 [ ]: # modullarni avtomatik yuklash uchun zarur %load_ext autoreload %autoreload 2 [ ]: a = 4 Python tilida o’zlashtirish amali sifatida tenglik amalidan foydalanamiz, yuqoridagi kod a nomli o’zgaruvchi e’lon qildi va unga 4 qiymatni o’zlashtirdi, ya’ni aning qiymati 4 ga teng. Biz o’zgaruvchilarda qanday qiymat saqlanganligini doimiy bilishimiz zarur bo’ladi. Buning uchun eng sodda holatda print funksiyasidan foydalanamiz hamda bu jarayoni chop qilish deb ataymiz. Hamda, biz ba’zi kodning qatorlarni o’zmiz uchun eslatma sifatida yozish uchun va bu eslatmani mashina buyruq sifatida qaramasligi uchun # belgisidan foydalanamiz, keyinchalik buni izoh deb ataymiz. [ ]: # Bu izoh qatori: bu qatorni mashini buyruq sifatida qabul qilmaydi. # Ushbu kod ishlashi natijasida hech narsa ro'y bermaydi [ ]: # o'zgaruvchi e'loni va unga 4 qiymat yozildi a = 4 # a o'zgaruvchining qiymatni ko'rish uchun print funksiyasidan foydalanish print(a) 4 Python tilida bir qator tayyor funksiyalar mavjud va ulardan foydalanish uchun ularning yo’riqnomasini o’qib chiqish zarur bo’ladi. Lekin umumiy bir holat biz funksiya nomidan keyin qavs ichiga unga zarur bo’lgan qiymatlarni berishimiz kerak. Bu qiymatlar o’zgarmaslar ko’rinishida ham bo’lishi mumkin. Misollar: [ ]: # o'zgaruvchi e'loni va unga 4 qiymat yozildi a = 4 # ushbu funksiya bittadan oshiq qiymatlarni qabul qiladi. Natija: 4 14 20 # quyida 14 va 20 sonlari o'zgarmas sonlardir print(a, 14, 20) 4 14 20 Yuqorida butun turdagi o’zgaruvchilar bilan ishladik, bundan tashqari bir qator turlar mavjud: 1. int - butun 2. float - haqiqiy 3. str - matn Matni saqlovchi o’zgaruvchilarni e’lon qilishda, o’zgaruvchiga zarur matn ' yoki " ichida beriladi. Misollar: [ ]: # Yoshi 14 age = 14 # Familiyasi. Matni ikkita " (qo'shtirnoq) ichiga yozdik fam = "Abdusamatov" # Ismi. Matni ikkita ' (tirnoq) ichiga yozdik 7 # Diqqat ikkisining ham umuman bir-birdan farqi yo'q. ism = 'Doniyor' # Og'irligi kgda # sonning butun va haqiqiy qismini ajratish uchun. (nuqta)dan foydalanamiz vazn = 78.5 # chop etish print(fam, ism, age, vazn) Abdusamatov Doniyor 14 78.5 Yuqoridagi kodga e’tibor bersak, biz umuman o’zgaruvchi turini aytmadik, lekin Python o’zi bu narsani berilgan qiymatga qarab aniqlab oladi. Shuning uchun ham ushbu dinamik turga ega dasturlash tilidir. Bundan tashqari, bitta o’zgaruvchiga dastur ishlash davomida bir nechta har xil qimay bersa ham oxirgisni olib, qolganlarini unutgan holda ishlayveradi. O’zgaruvchi turini bilmoqchi bo’lsak, biz type funksiyasidan foydalanamiz. Misollar. [ ]: # a o'zgaruvchisi e'loni va unga 4 qiymat berildi a = 4 # a o'zgaruvchisining turi type(a) # natija int [ ]: int Endi shu o’zgaruvchiga boshqa turli xil qiymatlar berib ko’raylik [ ]: # Birinchi a turi int a = 4 # Endi uning turi float a = 3.14 type(a) [ ]: float [ ]: # Birinchi a turi float a = 3.14 # Endi uning turi str a = 'salom' type(a) [ ]: str Yuqorida 3 ta o’zgaruvchi turini e’lon qilishni va ular bilan ishlashni o’rgandik. Lekin ko’pchilik boshlovchilar adashadigan bir holat bor. Masalan quyidagi kodga va uning natijasiga e’tibor be- raylik. [ ]: # age o'zgaruvchisiga 25 raqami yozildi age = 25 # age matni chop qilinyapti, bu age o'zgaruvchisi emas!!! # Natija: age 8 print('age') age Yuqoridagi kodda biz age nomli o’zgaruvchi e’lon qildik va unga 25 qiymatni o’zlashtirdik. Lekin 5-qataorda biz age degan matn turidagi qiymatni chop qildik, age o’zgaruvchisi emas. Quyida esga ikki holni ham qayta ko’ramiz. [ ]: # age ga 25 raqami yozildi age = 25 # age o'zgaruvchising qiymati chop qilinyapti print(age) # age matni chop qilinyapti print('age') 25 age 2.3.1 O’zgaruvchi nomlarni aniqlashga cheklovlar va tavsiyalar Biz xotiraning bir qismini band qilish va shu qismga o’zimizga kerak bo’ladigan qiymatni yozib qo’yishimiz uchun o'zgaruvchi tushunchasi bilan tanishdik. Lekin biz ma’lum bir qattiy qoidalarga ega bo’lgan dasturlash tili bilan ishlar ekanmiz, bizda o’zgaruvchilarni e’lon qilishda albatta cheklovlarga egamiz. Quyida ushbu qoidalarning ba’zilari: 1. o’zgaruvchi har doim katta-kichik (masalan, katta harf deb A, kichik deb esa a) harflar va tag chiziq _ bilan boshlanadi; 2. o’zgaruvchining qolgan belgilari katta-kichik harflar, raqamlar (0, 1, 2, …, 9) va tag chiziq _ belgisi bo’lishi mumkin. 3. har doim katta va kichik harflardan ikki xil o’zgaruvchi paydo bo’ladi. Masalan, age, Age, AGE lar hammasi alohida o’zgaruvchilar, hattoki ma’nosi bir bo’lsa ham. Quyida birinchi mumkin bo’lgan o’zgaruvchilarga misollarni ko’ramiz, keyin esa uning teskarisiga. [ ]: # Mumkin bo'lgan o'zgaruvchilar # bolaning yoshi boy_age = 25 # o'rtacha yosh mean_age = 22 # Uning familiyasi his_familiy = 'Abdurahmonov' [ ]: # Katta-kichik harflaridan farq # qiluvchi o'zgaruvchilar # age o'zgaruvchisi age = 15 # Bu o'zgaruvchi bilan age o'zgaruvchisi # ikkita alohida o'zgaruvchi Age = 25 9 [ ]: # Taqiqlangan o'zgaruvchilar 12boy_age = 25 mean age = 22 his familiy = 'Abdurahmonov' Cell In, line 2 12boy_age = 25 ^ SyntaxError: invalid decimal literal Agar oxirgi kod qismini ishga tushursak biz yuqoridagi kabi xatolikni ko’rishimiz aniq. Har doim dastur bajarilishidan oldin, birinchi kiritilgan kod manti sintaktik tahlildan o’zkaziladi. Agar mat- nda hech qanday sintaktik xato mavjud bo’lmasa, keyingi bajarilish qismlariga o’tkaziladi. Tavsiyalar. Dastur oson o’qilishi va tushunarli bo’lishi uchun biz har doim o’zgaruvchilarga ularning saqlashi mumkin bo’lgan qiymatiga qarab nom berishimiz zarur. Masalan yuqorida, age o’zgaruvchisiga doimiy inson (yoki boshqa narsaning) yoshini saqlashimiz maqsadga muvofiq bo’ladi. Agar buning uchun bir nechta so’z zarur bo’lsa, unda tag _ chiziq bilan yoki har bir so’zning bosh harifini katta harflar orqali ifodalash bilan erishishimiz mumkin. Masalan, mean_age - o’rtacha yosh. Yana bir boshqa tavsiya esa, albatta ingliz tilidagi so’zlardan foydalanishdir. Oxirgisi esa agar o’zgaruvchi nomi haddan tashqari uzun bo’lib, qayta yozishga halaqit qilsa unda uni qisqartirib yozish mumkin. Misol uchun, familiy_name o’rniga fam_name yoki number_of_objects o’rniga esa n_objs 2.4 Funksiya qaytargan qiymatni olish va ularni chop qilish Biz shu vaqtgacha faqat ikkita funksiya bilan tanishdik. Shunda ham, faqat ular bilan qisman ishlashni o’rgandik. Shuning uchun ushbu bo’limda, funksiyaning qiymat qaytarishini va ularning natijalarini boshqa o’zgaruvchi saqlab, keyinchalik ulardan foydalanishni o’rganamiz. Python das- turlash tilida har bir funksiya qiymat qaytaradi. Lekin, odatada, dasturlash tillarida biz funksiyalar qiymat qaytarishi yoki qaytarmasligiga qarab ikki turga ajratamiz. Pythonda esa bu holat faqat None o’zgarmas qiymati bilan amalga oshiriladi. Hozir keling bu qismlarga chuqur kirishmasdan, uning o’rniga, sodda misollar bilan mavzuni tushunaylik. Bu kabi holatlarni esa kelgusida ko’rib chiqaylik. Keling type funksiyasi qaytargan qiymatni, biror o’zgaruvchiga yozaylikda, keyin uni print funksiyasi yordamida chop qilaylik quyidagi kodada berilgan kabi. [ ]: # age o'zgaruvchisiga 25 yozish age = 25 # age o'zgaruvchisi turini olish age_type = type(age) # va natijani chop qilish print(age_type) 10 2.5 print funkiyasi Ushbu bo’limda biz print funksiyasi bilan batafsil tanishishga harakat qilamiz. Chunki biz ushbu funkisyadan ushbu kitob davomida juda ko’p o’rinlarda foydalanimiz. Ushbu funksiya 5 qiymat (argument deb ham nomlaymiz) qabul qiladi, ular: 1. *values - ushbu argumentga biz chop qilmoqchi bo’lgan qiymatlarimizni beramiz, masalan: [ ]: age = 14 fam = "Abdusamatov" ism = 'Doniyor' vazn = 78.5 # chop etish print(fam, ism, age, vazn) Abdusamatov Doniyor 14 78.5 Ushbu argument bir nechta qiymatlarni o’z ichiga oladi. Yuqoridagi kodga e’tibor bersak, undagi 4 ta qiymat ham ushbu argumentga tegishli, shuning uchun ham argumentda (*values) * belgisi bor. Bu kabi tafsilotlarni keyinchalik o’rni kelgandi o’rganamiz. 2. sep - bu satr (matn) turida qiymat qabul qilib, *values argumentidagi qiymatlarni o’rtasiga ajratuvchi sifatida yoziladi. Shuning uchun ham uning nomi sep ya’ni separator ning qisqartmasi. Quyidagi misolni diqqat bilan o’rganing. [ ]: age = 14 fam = "Abdusamatov" ism = 'Doniyor' vazn = 78.5 # turli xil chop etishlar # ajratuvchi sifatida ustun '|' belgisidan foydalanimiz print(fam, ism, age, vazn, sep='|') # ajratuvchi sifatida ustun '|' belgisidan foydalanimiz # va orasiga bo'sh joy ham qo'shamiz print(fam, ism, age, vazn, sep=' | ') Abdusamatov|Doniyor|14|78.5 Abdusamatov | Doniyor | 14 | 78.5 Ushbu kodni diqqat bilan kuzatsak, eng farqli bo’lgan tomoni aniqlashmiz mumkin, bu esa biz kodda sep='|' kodni ishlatishimiz. Biz birinchi 4 ta qiymatni (fam, ism, age, vazn) ketma-ket vergul bilan ajratib yozdik va bular jamoa bo’lib *valuesga tegishli bo’ldi. Lekin sep agrumentiga kelganda esa, biz unining nomni berdik, bu kabi funksiya argumentining nomni yozish oshkor ko’rinishda argumentga qiymat berish deb nomlanadi hamda bu shunday qilmasak xatolik ro’y beradi. Bu kabi xatolar nega chiqishi va nega yana shu kabi ko’rinishda foydalanishimiz zarur ekanligini vaqti kelib o’rganamiz. 3. end - bu argument print funksiyasi ishlagandan keyin qanday qiymat qo’yishni aniqlaydi, odatda keyingi qatorga tushish qiymat sifatida turadi. Yuqoridagi kodga e’tibor bersak, unnda ikki chop qilishimiz (print fuknisyasini birinchi va ikkinchi marta chaqirgan qism) natijalari alohida ikki qatorga yozilgan. Keling bir tekshirib ko’ramiz. 11 [ ]: # Yoshi 14 age = 14 fam = "Abdusamatov" ism = 'Doniyor' vazn = 78.5 # ushbu koddan keyin albatta keygi chop qilish natijalari yangi qatordan␣ ↪yoziladi print(fam, ism, age, vazn, sep='|') # Bunda keyingi chop qilish bilan buning o'rtasida faqat bo'sh joy bo'ladi print(fam, ism, age, vazn, sep=' | ', end=' ') # orada bo'sh joy bor print(fam, ism, age, vazn, sep=' | ', end=' ') Abdusamatov|Doniyor|14|78.5 Abdusamatov | Doniyor | 14 | 78.5 Abdusamatov | Doniyor | 14 | 78.5 Yuqoridagi kod bizga end argumentiga qiymat bermasak natijada keyingi chop qilishlar yangi qa- tordan boshlanishini ko’rdik. Ushbu funksiyaning boshqa yana 2 ta argumenti bo’lib, biz ularni keyinchalik mustaqil o’rganishga qoldiramiz. 2.6 Tarmoqlanuvchi dasturlash Shu vaqtgacha biz faqat chiziqli dasturlashdan foydalandik, ya’ni biz yozgan kodlarning hammasi chiziqli (ketma-ket) ravishda ishladi va biror shartga ko’ra ma’lum bir kod qismi qolib ketmadi, al- batta izohlardan tashqari (# belgisi bilan boshlanuvchi qatorlar). Bunday kodlash bilan murakkab dasturlarni yozishning iloji yo’q, shuning uchun endilikda biz bosqichma-bosqich chiziqli dasturlash- dan tarmoqli dasturlashga, undan keyin esa takrorlanuvchi dasturlashga o’tamiz. Albatta biz har doim ushbu uchta turdan bir vaqtda foydalanamiz. Keling, amaliy misolga o’tsak. Masalan, foydalanuvchi o’zinning shaxsiy sahifasiga kirmoqchi. Buning uchun u dasturga o’zing yashirin paroli va email pochtasini yozishi kerak. Agar foydalanuvchi kiritgan ma’lumotlar mos bo’lmasa, unda biz foydalanuvchiga bu haqida xabar berishimiz kerak. Bu kabi buyruqlarni yozishda, biz if-elif-else buyruq strukturasidan foydalanamiz. Avval soddaroq holni qaraylik, bizda 𝑎, 𝑏 ∈ 𝑅 (ikkita haqiqiy sonlar ) berilgan bo’lsin. Ulardan qaysi biri katta ekanligini chop qilishimiz kerak, quyidagicha. [ ]: # birinchi son a = 20 # ikkinchi son b = 15 # Bu yerda # 1) if kalit so'z, har doim yozilishi kerak # ma'nosi - agar # keyin bo'sh joy tashlab # Shartni yozamiz: a > b # Undan so'ngi ikki nuqta (:) majburiy qo'yiladi if a > b: # agar a > b shart to'g'iri bo'lsa 12 # else kalit so'zgacha bo'lgan # hamma qatordagi kodlar bajariladi # faqat biz print funksiyani # qator boshidan 2 ta bo'sh joydan keyin yozdik print("Birinchi son katta") # agar a > b shart noto'g'iri bo'lsa, # else kalit so'zi va ikkit nuqta(:) majburiy else: # agar a > b shart noto'g'iri bo'lsa # u holda else: dan keyingi hamma kod # bajariladi # faqat biz print funksiyani # qator boshidan 2 ta bo'sh joydan keyin yozdik print("Ikkinchi son katta") Ikkinchi son katta Yuqoridagi kodda hozirgacha bo’lgan eng qiyini. Shuning uchun batafsil har xil misollar yordamida tushunishga harakat qilamiz: 1. joriy holda 𝑎 = 20 va 𝑏 = 15. Shunga asosan 𝑎 > 𝑏 → 20 > 15 ifoda to’g’iri, ya’ni 20 soni har doim 15 dan katta bo’ladi. 2. Ushbu holni ifodalash uchun biz, Pythonda if kalit so’zini yozamiz, undan so’ng esa bizga zarur bo’lgan shartni ya’ni a > n va oxirda esa ikki nutqani (:) 3. demak, agar 𝑎 soni 𝑏 sonidan katta bo’lsa (bu joriy holda to’g’iri), u holda print("Birinchi son katta") shu kodni ishlatamiz, ya’ni Birinchi son katta natija chiqadi. 4. print("Birinchi son katta") kod qismi if ga tegishligini ifodalash uchun biz print("Birinchi son katta") ni if ga qaraganda bir nechta bo’sh joy tashlab, ichkariga kiritgan holda yozamiz (ushbu holda 2 ta). 5. Bu narsani biz ingliz tilida ‘indentation’ deb ataymiz, o’zbek tilida chekinish deb tarjima qilsak to’g’iri bo’ladi deb o’ylaymiz. Bu narsa dastur kodida sintaktik xato bermasligi uchun, biz har doim bir sondagi bo’sh joy tashlashimiz kerak. Ushbu kitobda biz har doim 2 ta tashlaymiz. 6. Ushbu kodning ikkinchi qismida, ya’ni if dagi shart noto’g’iri bo’lganda, biz boshqa kod print("Ikkinchi son katta") ni ishga tushirmoqchimiz. Buning uchun biz chekinishi (in- dentation) if bilan bir xil boshlanuvchi else (manosi, boshqa holda) kalit so’zni ikki nuqta bilan yozamiz hamda keyingi qatorga ikkitalik chekinishdan keyin esa print("Ikkinchi son katta") yozamiz. Yuqoridagi kod bajarilishi natijasida bizga Ikkinchi son katta yozuvi chiqadi. Chunki 𝑎 o’zgaruvchining qiymati 𝑏 nikidan katta. Keling qulay bo’lishi uchun quyidagi atama kir- itsak: ushbu kod ishga tushish natijasida bir qismdagi kod ishga tushiriladi (hozirgi holda, print("Birinchi son katta")), shu kodlarni if ning va else ning kodlari deymiz. 2.7 Mantiqiy(bool) tur bilan ishlash Bundan oldingi kod yordamida biz tarmoqlanuvchi dasturlashni o’rgandik. Aslida biz if kalit so’zidan keyin qo’ygan ifodamiz rost (True) yoki yolg’on (False) ekanligini tekshirdik. Agar ifoda rost bo’lsa, if ning kodi bajariladi, aks holde else niki. Ushbu 𝑎 > 𝑏 ifodaning natijasi ikki xil bo’lishi mumkin: rost(True) yoki yolg’on(False). Bu kabi turni Pythonda ifodalash uchun biz 13 bool turidan foydalanamiz. Ushbu turda faqat ikkita qiymat bo’ladi: True yoki False. Bu turda o’zgaruvchi e’lon qilmoqchi bo’lsak, unda biz True yoki False qiymatlaridan ishlatamiz. True va False qiymatlari literal qiymatlar deyiladi. [ ]: # bool turidagi o'zgaruvchi a = True print(a) b = False print(b) True False Bunday turni katta, kichik va teng amallari orqali ham yaratishimiz mumkin. [ ]: # a o'zgaruvchisi a = 15 # b o'zgaruvchisi b = 20 # a > b ifodani boshqa bool # turidagi o'zgaruvchiga # yuklash c = a > b print(c) False Natija har doim False chiqdi chunki 𝑏 o’zgaruvchisining qiymati 𝑎 nikidan katta. Keling bun- dan oldingi kodi qayta yozaylik. Faqat yuqoridagi kod kabi, shart natijasini boshqa alohida o’zgaruvchiga yuklab. [ ]: a = 20 b = 15 c = a > b if c: print("Birinchi son katta") else: print("Ikkinchi son katta") Birinchi son katta Ushbu turda bir qancha turli xil amallar mavjud bo’lib, ular odatiy matematik amallardan far- qlanadi, ular: 1. and - amali ikkita qiymat ham rost (True) bo’lsa natija ham rost True [ ]: a = True b = True # natija True c = a and b print(c) 14 a =True b = False # natija False c = a and b print(c) True False 2. or - amali ikkita qiymatdan biri rost (True) bo’lsa, natija ham rost True [ ]: a = True b = True # natija True c = a or b print(c) a =True b = False # natija True c = a or b print(c) a =False b = False # natija False c = a or b print(c) True True False 3. not - amali qiymatni teskarisiga o’tkazadi, rost bo’lsa yolg’on yoki yolg’on bo’lsa rostga [ ]: a = True # natija False c = not a print(c) a = False # natija rost c = not a print(c) False True 2.8 if-elif-else operatori O’tgan boblarda biz ushbu operatorning qisqartirilgan ko’rinishi bilan tanishdik. Ushbu qismda esa to’liq o’rganib chiqamiz. Avvalo ushbu operator ishlashi uchun eng kamida operatorning if qismi bo’lishi shart. Qolgan ikki qismi elif va else kodga qarab zurur bo’lsa ishlatiladi. 15 [ ]: # email o'zgaruvchisi email = '[email protected]' # yuqoridagi email to'g'iriligini tekshirish if email == '[email protected]': # if ning kodi print("Kiritilgan email to'g'iri") Kiritilgan email to'g'iri Bu operatorning elif (else if) qismi bir vaqtda undan oldingi if yoki elif ga teskarilikni hamda ya’na bitta shartni bildiradi. Quyidagi kiritilgan 𝑎 raqamini so’zlar bilan ifodalashga misolni ko’raylik. [ ]: a = 5 # a=0 bo'lgan holat if a == 0: print('Nol') # # a=1 bo'lgan holat elif a == 1: print('Bir') elif a == 2: print('Ikki') elif a == 3: print('Uch') elif a == 4: print('To\'rt') elif a == 5: print('Besh') elif a == 6: print('Olti') elif a == 7: print('Yetti') elif a == 8: print('Sakkiz') elif a == 9: print('To\'qiz') else: print("Kiritilgan son 0 va 9 orasida bo'lishi shart") Besh Yuqoridagi kod birinchi if yordamida 𝑎 o’zgaruvchisi qiymatini 0 ga tekshiradi, agar teng bo’lmasa o’zidan keyingi, birinchi elif ishlaydi va bu soning qiymatini 1 ga tengligini tekshiradi va shu tarzda davom etadi. Oxirida esa, raqamlar tugagandan so’ng, else qismida raqam chegaradan chiqib ketdimi yo’qmi shu tekshiriladi. Agar ushbu ketma-ketlikning biror shart to’g’iri bo’lsa, shu qismdagi kod ishlaydi va dasturning qolgan qismlariga (shartlariga) o’tilmaydi. Yuqoridagi qiymat 5 bo’lgani uchun biz Besh ni natija sifatida ko’rdik. Demak, beshgacha bo’lgan 6 shartni bittalab tekshirilgan va ulardan birinchi beshtasi noto’g’iri bo’lgan. 16 2.9 Namunalar Keling yuqorida o’rganib chiqqan mavzularimizga ozroq qo’shimcha qilib internet sahifasiga kirishga ruxsat bor yoki yo’qligini tekshiruvchi kichkina dastur yozib ko’raylik va shu orqali olgan bilim- larimizni mustahkamlaylik. Buning uchun foydalanuvchi tomonidan qiymatlarni kiritishni birinchi o’rganaylik. Buning uchun biz input(str) funksiyasidan foydalanamiz, bu funksiya bizga str (satr) turida qiymat qaytaradi. Quyida foydalanuvchi kiritgan matni chop qiluvchi dastur. [ ]: # matni name o'zgaruvchisiga yozish name = input('Ismingizni kiriting: ') # Kiritilgan qiymatni chop qilish print('Sizning ismingiz:', name) Sizning ismingiz: Alisher Yuqorida ko’rib turganimizdek, biz birinchi input() funksiyasi orqali foydalanuvchi o’zining ismini yozishi uchun maydonni hosil qilyabmiz. Foydalanuvchi o’zining ismini kiritib, keyin ‘kiritish’ (En- ter) tugmasini bosgandan so’ng, biz input() funksiyasi qaytargan natijasini ekranga chiqarayap- miz. Agar qaytarilgan qiymat, masalan, foydalanuvchi yoshi bo’lsa unda, biz bu qiymatni butun songa o’tkazishimiz kerak, chunki input() funksiyasi har doim sart qaytaradi. Buning uchun bizda tayyor funkiyalar har bir tur uchun mavjud. Oson bo’lishi uchun avval str va int o’zgaruvhisi farqiga oid ba’zi sodda misollarni qarab chiqaylik. Quyidagi kodda ulardan bir nechtasiga namuna keltirilgan. [ ]: # a qiymatni insoning yoshini saqlaydi # a o'garuvchisi satr butun emas a = '25' # keyinig o'zgaruvchini qaraylik # bu o'zgaruvchi butun turda b = 20 # agar o'zgaruvchini qo'shsak # unda xatolik yuz beradi # chunki satr turiga butun turni # qo'shish mumkin emas c = a + b print(c) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) d:\Courses\AI courses\Sun'iy Intellekt.ipynb Cell 71 line 1 6 b = 20 8 # agar␣ ↪o'zgaruvchini qo'shsak 9 # unda xatolik yuz␣ ↪beradi 17 10 # chunki satr␣ ↪ ↪turiga butun turni 11 # qo'shish mumkin␣ ↪emas ---> 12 c = a + b 13 print(c) TypeError: can only concatenate str (not "int") to str Agar yuqoridagi kodni to’g’irlab ishlatmoqchi bo’lsak, unda 𝑎 sonini int turiga o’kazishimiz zarur. Buning uchun int() funksiyasini ishlatamiz. [ ]: a = '25' b = 20 # a ning qiymatini int turiga # o'girib uni d # o'zgaruvchisiga saqladik d = int(a) c = d + b print(c) 45 Bir eng muhim jihatdni turdan boshqa turga o’zgaruvchini o’tkazishdan oldin bilishimiz kerak. Odatda biz hamma turlarni boshida satr ko’rinishida, ya’ni satr turida olamiz va ularning qanday ma’lumot ekanligiga qarab mos turlarga o’giramiz. Lekin har doim ham bunday qilishning iloji yo’q. Masalan, tassavur qilaylik foydalanuvchi o’zining yoshini kiritish jarayonida xatolik qilib qo’ydi. Misol uchun ‘22’ o’rniga ‘22a’ yoki ‘22’ kiritib qo’ydi. Unda yuqoridagi int() funksiyasi xatolik qaytaradi va dastur oxirigacha yetmasdan yakunlanadi. Quyidagi kodda ushbu hol uchun ba’zi bir misollarni ko’ramiz. [ ]: # to'g'ir holat age = '22' # natija print(type(age)) # endi int turiga o'tkazaylik age = int(age) # natija print(type(age)) # xato hollatlar age = int('22a') # bu yerda xatolik bor # bu joyga kod kelmaydi print(age) 18 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) d:\Courses\AI courses\Sun'iy Intellekt.ipynb Cell 75 line 1 8 print(type(age)) 9 # xato hollatlar ---> 10 age = int('22a') #␣ ↪bu yerda xatolik bor 11 # bu joyga kod␣ ↪kelmaydi 12 print(age) ValueError: invalid literal for int() with base 10: '22a' Bu kabi hollatlarda biz ValueError ga ega bo’lamiz, buning ma’nosi kiritilgan qiymatni (‘22a’) int turiga o’girib bo’lmaydi. Endi asosiy maqsadimiz bo’lgan, dasturga qaytsak bo’ladi. [ ]: email = input('Emailingizni kiriting: ') password = input('passwordingizni kiriting: ') # birinchi shart a = email == '[email protected]' # ikkinchi shart b = password == 'qwerty1234' # foydalanuvchi sahifasiga kirishi # uchun ikkisi ham # bir vaqtda to'g'iri # bo'lishi kerak if a and b: print("Siz shaxsiy sahifangizdasiz") else: print("Email yoki parolingiz xato kiritilgan") Siz shaxsiy sahifangizdasiz 19 2.10 Topshiriqlar 3 Chiziqli algebra 3.1 Kirish Ushbu fan matematikaning sohalaridan biri bo’lib, asosan vektorlar va matritsalar ustida amalarni o’rganadi. Lekin umumiy holda vektor fazolar va chiziqli transformatsiyalarni vekotrlar va ma- tritsalar asosida o’rganadi. Biz ushbu qo’lanmada ko’proq amaliy o’rganganimiz uchun, chiziqli algebraning soddaroq bo’lgan qismi ya’ni vektorlar va matritsalar ustida amallarni o’rganimiz. Lekin mashinali o’rganish fanida bizga ba’zi transformatsiyalar zarur bo’ladi, ularni esa qisman o’rganamiz. Vektor deb kattalik va yo’nalishga ega bo’lgan qiymatga aytamiz. Masalan, 𝑎(3, 4) vektor ikki o’lchovli fazoda quyidagicha tasvirlanadi. [ ]: # Ushbu kod faqat quyidagi rasmni ushbu qo'llanmaga qo'shish uchun ishlatildi from IPython.display import display, Image display(Image(filename="2d-vector-example.png", height=400, width=400)) Biz ushbu darslar davomida uning geometrik xususiyatini hozircha qaramasdan, uning o’rniga oddiy o’zgaruvchi deb Python dasturlash tilida o’rganamiz. Agar vektordagi qiymatlar soni boshqacha bo’lsa, masalan 𝑎(3, 5, 2, 6) unda bu kabi vektorlarni biz tasavur qilishimizning imkoni yo’q. Shun- ing uchun ularning chizmasiga e’tibor bermasdan, uning o’lchovi va yo’nalishiga e’tibor beramiz. 20 Hamda vektorni tashkil etuvchi qiymatlarni (so’ngi holda, 3, 5, 2, 6) uning elementlari deb nom- laymiz. Agar uning biror elementiga murojaat qilmoqchi bo’lsak, unda quyidagicha yozamiz 𝑎1 va bu murojaatni indekslash deb ataymiz. Bu kab indekslash matematikaga xos bo’lib, dasturlash tillarida bu narsa farqlanadi. Masalan, bizga elementlari haqiqiy sonlardan iborat bo’lgan 𝑎 vek- tor berilgan desak, uni odatda quyidagicha ko’rishida yozamiz: 𝑎 ∈ 𝑅𝑛. Demak 𝑎 vektorda 𝑛 ta element bor va uning 𝑖-elementi 𝑎𝑖 bilan belgilanadi. E’slatma. Biz vektorlarni belgilashda unlarning haqiqiy ko’rinishdan foydalanmadik, aslida har bir vektor qiymatga va songa ega bo’lgani uchun va ularni vektorlig- ini anglatish uchun yuqoridagi faqat son qiymat emas balki uning yo’nalishini ham ko’rsatishimiz kerak. Lekin bu yo’nalishni matnlarda berishning iloji yo’q, uning o’rniga odatda biz 𝑎⃗ dan foydalanamiz, masalan yuqoridagi vektorni to’g’iri ko’rinishi 𝑎(3, ⃗ 5, 2, 6) bo’ladi. Biz ushbu qo’llanmada bu belgini ishlatmaymiz. Bu yerda 𝑅 harfi har doim haqiqiy sonlar to’plamini anglatadi. Misol uchun agar bizda 𝑏 ∈ 𝑅 bo’lsa, u holda biz 𝑏 ning qiymati haqiqiy son deb tushunamiz hamda odatda biz bu son (o’zgaruvchi) haqiqiy yoki butun deb yozmasdan shu qisqa belgilashdan foydalanamiz. Ushbu bosqichma-boshqich sohaga kirish, umid qilamizki kelajakda chuquroq fani o’rganishga ko’mak beradi. 3.2 Vektorlarni Pythonda e’lon qilish Ushbu turdagi o’zgaruvchilarni e’lon qilish uchun Pythonda ikki xil o’zgaruvchi turi mavjud ulardan birinchi tuple(qulaylik uchun biz shu turdan foydalanib turamiz). Misollar: [ ]: # a vektor o'zgaruvchisi e'loni va uning qiymati a = (3, 4) # Chop qilish print(a) # 4 o'lchovli vektor b = (4, 6, 23, 6) print(b) # Agar bir o'lchovchli bo'lsa, har doim bitta vergul quyish shart, shunda oddiy␣ ↪sondan farq qiladi. c = (4, ) print(c) (3, 4) (4, 6, 23, 6) (4,) 3.2.1 Indekslash Keling hozir biror insoni uning yoshi, bo’yi va vazni bilan ifodalovchi vektorni qaraylik. Hammda shu misol orqali qanday qilib inkeslash Pythonda ishlashini tushunib olaylik. Matematikadan farqli ravishda, Pythonda indekslash har doim 0 dan boshlanadi, ya’ni 𝑎1 ni ifodalash biz Pythonda a deb kod yozamiz. [ ]: # inson: yoshi, bo'yi va vazni human = (18, 175, 70) 21 # uning har bir parameterni chop qilish # agar insonning faqat yoshini chop qilmoqchi bo'lsak, # unda, uning 0 chi indeksini chop qilaylik print(human) 18 E’tibor bering, biz hech qachon insoni ifodalovchi bir nechta qiymatlarni bitta o’zgaruvchi os- itga jamlaganimizda, har bir qiymatga o’zgaruvchi e’lon qilmaymiz va human deb uning yoshini tushunamiz, human deb esa uning bo’yining uzunligini. Agar indekslashda xato qilsak, masalan, qiymatlarning joyini almashtirib qo’ysak, unda dastur bizga qiymatlarni chiqarishda davom et- taveradi, faqat natijalar xato bo’ladi. Buni ko’rish uchun keling, print funksiyasida nimani chop qilayotgan ekanimizni matnlar orqali tasvirlaylik. [ ]: # inson: yoshi, bo'yi va vazni human = (18, 175, 70) # yoshini chop qilish print('Berilgan insoning yoshi:', human) # agar indekslashda boshqa qiymat berib qo'ysak # unda ham ishlayveradi print('Berilgan insoning yoshi:', human) print('Berilgan insoning yoshi:', human) Berilgan insoning yoshi: 18 Berilgan insoning yoshi: 70 Berilgan insoning yoshi: 175 Yuqoridagi kod bizga yaqqol ushbu turdagi xatolikni ko’rsatib berdi. Shuning uchun biz har doim qaysi o’ringa qanday qiymat qo’yanimizni esalab qolishimiz hamda shunga mos ravishda ularga murojaat qilishimiz zarur bo’ladi. Ushbu kodning oxirgi ikkitasi yosh qiymatini emas balki boshqa narsalarni chop qilmoqda. Biroq uning birinchisidagi qiymat 70 bunda yosh mavjud xato bo’lsa ham, lekin ikkinchisi bizga aniq xatoligi ko’rinib turibdi. Birinchi kabi xatolik bizga koddagi kamchiliklarni topishimizga xalaqit qiladi. Shuning uchun eng yaxshisi kodni yozishda e’tiborli bo’lishdir. Quyidagi kod yuoqirdagi kodning to’liq va to’g’iri holatini ifodalaydi. [ ]: # inson: yoshi, bo'yi va vazni human = (18, 175, 70) # yoshini chop qilish print('Berilgan insoning yoshi:', human, 'yosh') print('Berilgan insoning bo\'yi:', human, 'sm') print('Berilgan insoning vazni:', human, 'kg') Berilgan insoning yoshi: 18 yosh Berilgan insoning bo'yi: 175 sm Berilgan insoning vazni: 70 kg Odatda biz qiymatlarning birligini xotirada saqlamaymiz, ularni mantiqan o’zimiz bil- amiz, lekin foydalanuvchiga (dasturdan kimdir foydalansa), unda biz ularga qiymatlar haqida qo’shimcha axborotni berishimiz zarur bo’ladi. E’tibor bering, biz quyidagicha matndan foydalandik 'Berilgan insoning bo\'yi:', ya’ni \ belgisi. Agar matnda 22 tirnoq ’ belgisini ishlatish zarur bo’lsa, unda biz uning oldiga \ belgisini qo’yishimiz yoki uni qo’shtirnoq (“) belgisi yordamida yozishimiz kerak bo’ladi. Quyidagicha. [ ]: # inson: yoshi, bo'yi va vazni human = (18, 175, 70) # yoshini chop qilish print('Berilgan insoning yoshi:', human, 'yosh') # Yuqoridagi va paski satrlar faqat tirnoq (') # bilan yozilgan # o'rtadi esi qo'shtirnoq bilan print("Berilgan insoning bo'yi:", human, 'sm') print('Berilgan insoning vazni:', human, 'kg') Berilgan insoning yoshi: 18 yosh Berilgan insoning bo'yi: 175 sm Berilgan insoning vazni: 70 kg 3.3 Vektorlar ustida amallar Chiziqli algebra kursida vektorlar ustida minglab amallarni ko’rib o’rganish mumkin. Lekin biz ushbu kitobda bizga zarur bo’lgan amallarni zarur o’rinlarda ketma-ket o’ganib boramiz. Ushbu amallarni tushinish uchun odatda biz geometrik usuldan foydalanamiz, aks holda bu amallar ba’zida ma’noga ega bo’ladi, ya’ni biz uni hayotiy tushunchalar bilan anglashimiz mumkin, ko’plarini emas yo’q. Masalan, yuqoridagi misoldagi kabi ikki insoni 3 qiymat bilan ifodalaylik va ularni bir biriga qo’shaylik, nima hosil bo’ladi, bu narsa bizga tushunarsiz. Lekin boshqa hollarda tushu- nish mumkin, masalan, inson faqat oylik moashi va bolalari soni bilan ifodalansa, unda ikki insoning moashining yig’indisi va birgalikda bolalarining soni deb tushunish mumkin. Keling umumiylikni yuqotmasdan, vektorlar ustida amallarni ko’rib chiqaylik. Birinchilari hammamiz eng ko’p ish- latadigan 4 arfimetik amallardir. 1. Ikki vektorni qo’shish va ayirish amallari mos indekslardagi qiymatlarining yig’idisi va ayir- masi bilan yangi vektor hosil qilishdir, ya’ni 𝑎, 𝑏 ∈ 𝑍 3 (ma’nosi, ikkita vektor berilgan va har birida 3 tadan butun turdagi qiymat mavjud), unda umumiy ko’rinishi 𝑐 = 𝑎 ± 𝑏. Agar har bir elementi bo’yicha yozmoqchi bo’lsak, u holda 𝑐1 = 𝑎1 + 𝑏1 , 𝑐2 = 𝑎2 + 𝑏2 , 𝑐3 = 𝑎3 + 𝑏3. Pythonda kodi. Bu yerda 𝑍 butun sonlar (masalan, …, -10, -9, …, -2, -1, 0, 1, 2, …, -10, … ) to’plamini ifodalaydi. Ba’zi manbalarda ushbu to’plamni 𝐼 harfi bilan ham belgilashadi. [ ]: # ikkita butun turdagi tuple o'zgaruvchisi a = (2, 4, -3) b = (4, 2, 5) # ularning har bir elementini alohida alohida qo'shish # va yangi c vektorini hosil qilish c = (a + b, a + b, a + b) # chop qilish print('a+b=', c) # ularning har bir elementini alohida alohida ayirish # va yangi c vektorini hosil qilish 23 c = (a - b, a - b, a - b) # chop qilish print('a-b=', c) a+b= (6, 6, 2) a-b= (-2, 2, -8) Ushbu yig’indining geometrik ma’nosi quyidagi ikki o’lchovli koordinatalar sistemasida keltirilgan. Unga ko’ra, agar ikki 𝑎 va 𝑏 vektorlarni bir-biriga qo’shsak, u holda ikkisning yo’nalishidan hosil bo’lgan yangi vektorni tasavur qilamiz. Masalan, ikkita kishi aravani bir tomonga qaratib tortib ketyabdi va ularning tortish kuchlari orasida ma’lum bir burchak bor, shunda arava qandaydir tezlik bilan harakatlanishi mumkin. [ ]: # Ushbu kod faqat quyidagi rasmni ushbu qo'llanmaga qo'shish uchun ishlatildi from IPython.display import display, Image display(Image(filename="vector_pm_operation.png", height=400, width=400)) 2. Ikki vektor o’rtasida ko’paytirish amalining bir nechta ko’rinishlari mavjud. Shuning uchun biz hozir skalyar ko’paytmani (ko’p adabiyotlarda nuqtali ko’paytma (dot product)) o’rganamiz. Bu ko’paytma ikki vektorning mos elementlarining ko’paytmasning yig’indisi hisoblanadi. Matematik ko’rinishi, agar yuqoridagidek 3 ta elemenetdan tashkil topgan bo’lsa, ya’ni 𝑎, 𝑏 ∈ 𝑍 3. 𝑐 = 𝑎𝑏 = 𝑎1 𝑏1 + 𝑎2 𝑏2 + 𝑎3 𝑏3. [ ]: # ikkita butun turdagi tuple o'zgaruvchisi a = (2, 4, -3) b = (4, 2, 5) # ularning har bir elementini alohida alohida qo'shish # va yangi c vektorini hosil qilish c = a * b + a * b + a * b # chop qilish print('a*b=', c) 24 a*b= 1 3. Oxirgi sonlar ustida mavjud bo’lgan bo’lish amali vektorlar ustida aniqlanmagan. 4. Ikki vektor orasidagi masofa. Ushbu amalni sonlar ustida doimiy ishlatamiz hamda u har doim musbat bo’ladi. Chunki biz ikki kishining yoshilarining farqi qancha desak unda biz, masalan, 15 yosh deymiz. Aslida esa kichigidan kattasini ayirsak unda manifiy son hosil bo’ladi, aytaylik 45 yoshli odam 60 yoshli odamdning yoshidan ayirsak, unda -15 bo’ladi. Bu esa ikkis orasidagi masofani, ya’ni farqni ifoday olmaydi. Shuning uchun masofa mus- bat bo’lishi kerak. Buning uchun biz matematikada sonning moduli degan tushunchani ish- latamiz, masalan, |𝑎|. Bunda 𝑎 ning qiymati musbat bo’lsa ham manifiy bo’lsa ham musbat son chiqadi. Biz yuqorida fazoda tartib aniqlanmaganligi haqida bahs yuritgan edik, ya’ni bir vektorni ikkinchi vektordan katta yoki kichik deyish mumkin emas. Shuning uchun ham ikki vektor orasidagi masofa ma’lum bir shartlarni qanoatlantirishi kerak hamda eng asosiysi vektorlar nechta elementdan tashkil topishidan qattiy nazar masofa bitta son bo’lishi kerak. Shundagina biz ularni solishtira olamiz. Ushbu amalni ikki vektorni parameter sifatida oluvchi funksiya ko’rnishida yozamiz, ya’ni 𝜌(𝑥, 𝑦). 𝜌(𝑥, 𝑦) ≥ 0 - manifiy bo’lmasligi zarur; 𝜌(𝑥, 𝑦) = 0 ↔ 𝑥 = 𝑦 - ikki vektor teng bo’lsa, ularning orasidagi masofa 0 ga teng bo’lishi kerak; 𝜌(𝑥, 𝑦) < 𝜌(𝑥, 𝑦) + 𝜌(𝑥, 𝑧) - 3 ta vektor o’rtalaridagi masofaning burchak sharti. Vektorlar ustida oddiy sonlardan farqli ravishda bo’lish amali mavjud emasligini ko’rdik. Buning sababini o’rganish uchun avval vektorlar o’rtasidagi yuqorida keltirilgan ko’paytmani muhokama qilaylik. Chunki yuqorida aytilgan ko’paytma bu skalyar ko’payma va bu ikki vektorning ko’paytmasini bitta songa o’kazadi. Shuning uchun ham odatda bu skalyar ko’paytma vektor- lar o’rtasidagi umumiy ma’nodagi ko’paytmani anglatmaydi. Biz qo’shish amaliga ayirish amalini teskari deymiz, ya’ni biror soni ikkinchi songa qo’shsak va keyin ayirsak natija o’zgarmaydi. Bo’lish ham xudi shunday ko’paytirish amalining teskarisi va yuqoridagi skalyar ko’paytma vektor natija bermasligi sababli bo’lish amali aniqlanmagan. Albatta bu sabab qisman to’g’iri lekin to’liq emas, chunki ushbu ko’paytmani boshqacha aniqlash ham mumkin, ammo bu holda ham amallarning ba’zi xossalari yuqoladi. Bu kabi holatlar chiziqli algebra kursida to’liq o’rganiladi. Biz esa boshqa tafsilotlarini keltirmadik. Shu o’rinda yana bir boshqa narsani ta’kidlash joizki, avvalgi ikki qo’shish va ayirish amalarining ma’nosi ravshan. Lekin, yana, ko’paytmaniki tushunarsiz. Ushbu ko’paytmani bir nechta amaliy va nazariy ko’rinishda tushuntirish mumkin. Biz ulardan eng keraklisi bo’lgan geometrik ma’nosini keltiramiz. Bu ko’paytma shu ikki vektor orasidagi burchakka aloqador, ya’ni 𝑎 ⋅ 𝑏 = ||𝑎||||𝑏||𝑐𝑜𝑠𝜃 (5) bu yerda 𝜃 - ikki vektorning orasidagi berchak qiymati. Agar ikki vektor bir biriga perpendikulyar bo’lsa, u holda bu ko’paytma natijasi 0 ga teng bo’ladi. Bu kabi vektor xosalari Chiziqli algebrada va boshqa fanlarda juda muhim ahamiyat kasb etadi. 3.3.1 Vektorlar o’rtasida taqqoslash amallari Biz odatda ikki narsani qaysi bir kattaroq yoki kichikroqligini aniqlash uchun har doim ularni olishtiramiz. Agar qiymat ikkita son bo’lsa, unda ularni taqqoslab bo’ladi, chunki ular bitta sonlar o’qida joylashgan va tartiblangan. Masalan, natural sonlar (1, 2, 3, 4, …) har doim biri ikkinchidan keyin keladi va ular tartibga ega. Lekin bu kabi taqqoslashlarni vektorlar o’rtasida kiritib bo’lmaydi 25 chunki ular bittandan ortiq elementlar orqali ifodalanadi hamda ikki va undan katta o’lchovli fazoda tartib yo’q. Keling, misol uchun Alisher va Baxromni olaylik va ularni yoshi, bo’yi hamda vazni bilan ifodalaylik. Masalan, Alisher(22, 180, 86) va Baxrom(24, 175, 90). Agar bizga shu qiymatlarni berib, kim katta desa qanday aniqlaymiz? Bu narsaning iloji yo’q, bo’lsa ham aynan qaysidir bir elementi bo’yicha aytamiz, bunday hollarda esa biz sonlar ustida ishlayotgan bo’lib qolamiz. Odatda biz mashinali o’rganish fanida shunga o’xshash muammolarga duch kelamiz. Masalan, sodda qilib aytsak, biror bemor 10 ta har xil ko’rsatgichlar bilan ifodalangan (yoki aniqlangan), misol uchun: yoshi, jinsi, qon bosimi, yurak urushi va boshqalar. Bizning vazifa esa, ushbu bermorn- ing holatini aniqlash bo’ladi. Bunda biz yuqoridagi 10 ko’rsatgichni vektor shaklida tasvirlab, ulardan bitta qiymat hosil qilishimiz kerak bo’ladi, misol uchun bemordaning holato ‘yaxshi’ yoki ‘yomon’. Bu kabi narsalar agar vektorning elementlari bir biriga bog’liq narsalarni ifodalasa juda oson. Tassavur qilaylik, odamning pul mablag’lari, ikkita alohida bank hisobida va ikki xil valyu- tada. Masalan, Alisher (20, 150000) va Baxrom(15, 200000), ya’ni Alisherning 20 dollari va 150 ming so’m puli bor hamda Baxromning esa 15 dollari va 200 ming so’m puli bor. Ushbu miso- ladigi kabi hollarda biz bemalol kimda ko’p pul borligini aytishimiz mumkin, albatta bir valyuta ko’rinishiga o’tkazib va ularning yig’indisini olgan holda. Lekin birinchi bemor haqidagi misolda esa bu narsaning iloji yo’q. Ushbu bo’limda aytmoqchi bo’lgan asosiy fikrimiz bu vektor element- larni odatda bitta qiymatga o’tkazib olamiz va shu orqali ularni tushunamiz. Bu haqida mashinali o’rganish bo’limlarida batafsil o’rganib chiqamiz. 3.3.2 Vektorlar ustida amalarning matematik ko’rinishi Biz oldingi bobda asosan 3 ta elementdan iborat bo’lgan vektor uchun qo’shish, ayrish va ko’paytirish amalarini yozdik. Aslida agar ularning elementi ko’p bo’lsa qanday yozamiz? Buni ushbu qismda batafsil o’rganib chiqamiz va shu bilan birgalikda ba’zi matematik ifodalarni ham o’rganamiz. Tassavur qilaylik bizda 𝑎 ∈ 𝑅𝑛 (n ta haqiqiy elementdan iborat vektor) bor. 1. Uning elementlarining yig’indisining topishni matematik ifodalamoqchi bo’lsak, u holda eng sodda yo’li quyidagicha: 𝑎1 + 𝑎2 + ⋯ + 𝑎𝑛. Lekin bu shakda yozish har doim ham qulay emas, ayinqsa ifoda uzun bo’lganda. Shuning uchun quyidagi belgidan foydalanamiz ∑ - yig’indi 𝑛 belgisi. Hamda oldingi ifodani quyidagicha yozamiz: 𝑎1 + 𝑎2 + ⋯ + 𝑎𝑛 = ∑𝑖=1 𝑎𝑖. O’qilishi, yig’indi 𝑖 = 1 dan 𝑛 gacha (𝑛 har doim kiradi). 2. Agar ushbu vektorning hamma elementlarning bir-birga ko’paytmasini topish kerka bo’lsa, u 𝑛 holda ∏ ko’paytma belgisidan foydalanamiz - 𝑎1 ∗ 𝑎2 ∗ ⋯ ∗ 𝑎𝑛 = ∏𝑖=1 𝑎𝑖. O’qilishi, ko’paytma 𝑖 = 1 dan 𝑛 gacha (𝑛 har doim kiradi). 3. Demak ikki vektor o’rtasidagi skalyar ko’paytmani quyidagicha yozish mumkin, agar 𝑎, 𝑏 ∈ 𝑅𝑛 𝑛 berilgan bo’lsa. 𝑎𝑏 = ∑𝑖=1 𝑎𝑖 𝑏𝑖. 4 Pythonda operatorlari Bundan oldingi Pythonga oid boblarda biz tarmoqlanuvchi dasturlashni o’rgandik. Lekin o’tgan chiziqli algebraga oid bobda biz vektorlar ustida amallar bilan ishladik. Lekin ularni Pythonda faqat uchta elementdan ibroat bo’lgan holatini ko’rib chiqdik. Shuning uchun bu bobda biz Python n ta elementdan iborat bo’gan vektorlar bilan ishlashni o’rganamiz. Buning uchun bizga Takrorlanuvchi dasturlashni o’rganishimiz kerak bo’ladi ya’ni kodning ma’lum bir qismi bir nechta marta qayta ishga tushiriladi. Hamda bu orqali biz murakkab dasturlarni yozish imkoniyatiga ega bo’lamiz. Pythonda bundan takrorlanishlarni amalga oshirish uchun 2 operator mavjud, bular while va 26 for. Keling birinchi while operatori bilan ishlab ko’raylik, chunki for operatorining ma’lum bir maqsadlar uchun qulayroq. Quyidagi kodda biz ‘Salom’ so’zini 5 marta chop qilishni amalga oshirganmiz. [ ]: # n ta takrorlashlar soni n = 5 # i sanagich i = 1 # 1. while kalit so'zi # 2. shart # 3. ikki nutqa (:) # 4. if dagi kabi while i 6 a = 12 TypeError: 'tuple' object does not support item assignment 2. Ushbu turga yangi element ham qo’sha olmaymiz. U turida boshida bir marta qiymat bi- lan e’lon qilamiz va uning elementlari soni boshqa oshira olmaymiz. Demak buning iloji yo’q. Lekin ba’zi yangi o’rganuvchilar quyidagi kodni ham tuple ga element qo’shish sifatida qarashadi. Bu esa, afsuski, umumam noto’g’iri. Quyidagi kodda 𝑎 o’zgaruvchisiga umuman yanig qiymat yozilyabdi, ya’ni uning xotiradagi oldingi joyiga ko’rsatgich yuqolib, 𝑎 nomli o’zgaruvchiga yangi xotiradan joy berilyabdi. [ ]: a = (2, -8, 3, 2) print(a) # ushbu jarayon element # qo'shish hisoblanmaydi a = (2, -8, 3, 2) + (6, 9) print(a) (2, -8, 3, 2) (2, -8, 3, 2, 6, 9) Albatta ushbu o’zgaruvchining juda keng ishlatiladigan o’rinlari mavjud, bu kabi o’rinlarni ushbu qo’llanma davomida o’rni kelganda muhokama qilib o’rganib ketamiz. Ushbu bobda biz e’tibor qaratmoqchi bo’lgan tur esa list, ya’ni ro’yxat turidir. Ushbu tur olingi turga nisbatan an- cha moslashuvchan bo’lib, u bilan bir qator imkoniyatlarga ega bo’lamiz hamda bundan keyinig o’rinlarda asosan ushbu turdan foydalanamiz. Ko’pchilik dasturlash tillarida bo’lagani kabi, Pythonda ham turlar bilan ishlash bir birga juda o’xshaydi, aytmoqchi bo’lganimiz, bu turha tuple bilan deyarli bir xil ko’rinishda ishlaydi faqat bir qator ustunlilar bilan. Keling, birinchi, qanday e’lon qilish hanmda uning u bilan dastlabki ammalarni ko’rsakda, keyin boshqa uning xususiyatlarni muhokama qilsak. 31 [ ]: # list turida a o'zgaruvchisi a = [3, 6, 2, 9] # uning hamma elementlari # chop qilish print(a) # elementlarining qiymatlarni olish # 2-elementi print("2-elementi:", a) print("a o'zgaruvchisining turi:", type(a)) [3, 6, 2, 9] 2-elementi: 6 a o'zgaruvchisining turi: [ ]: # elementlarining yig'indisini # topish a = [3, 6, 2, 9] s = a i = 1 n_a = len(a) while i < n_a: s = s + a[i] i = i + 1 print("Elementlarining yig'indisi:", s) Elementlarining yig'indisi: 20 Yuqoridagi ko’rgan ikkita kodimiz bu tuple turi bilan bir xil, faqat yagona farqi bu e’lon qilishda, ya’ni oddiy () qavslarning o’rniga biz to’rburchak [] qavslardan foydalandik. Esda tuting, yuqorida biz len() funksiyasidan foydalandik, ushbu funksiya tuple o’zgaruvchisi uchun qanday ishlasa bu uchun ham shunday vazifada ishlayveradi. Hozir navbat ushbu turning imkoniyatlariga keldi, ulardan ba’zi birlari: 1. dinamik ravishda yangi element qo’shish. Buning uchun list turining append() metodinidan foydalanamiz. O’zgaruvhilarning metodlarga murojaat qilish o’zgaruvchidan keyin nuqta (.) belgisini qo’yamiz va kerakli metod nomni yozib, undan so’ng qavs ichida zarur parameterlarni beramiz. list turida e’lon qilingan o’zgaruvchining append() metodiga murojaat qilish orqali unga yangi element qo’sha,iz. Afsuski, ushbu metod tuple turida mavjud emas. [ ]: # bo'sh list ages = [] # yangi yosh qo'shish ages.append(22) print("Yoshlar: ", ages) # foydalanuvchidan yangi yosh qo'shishni so'rash # masalan 4 ta insoning yoshini n = 4 # sanagich i = 0 32 # takrorlash bittalab kiritish uchun while i < n: # albatta yosh qiymati butun # shuning uchun int() funksiyasi # yordamida int turiga o'tkazamiz yosh = int(input('inson yoshini kiriting: ')) # endi append() metodi ages.append(yosh) # bitta yosh kiritdik # shuning uchun sanagichni bittaga oshiramiz i = i + 1 print("Siz kiritgan yoshlar:", ages) Yoshlar: Siz kiritgan yoshlar: [22, 31, 24, 62, 45] 2. Element qiymatini o’zgartirish. Bu ish oddiy bajariladi, ya’ni uning mos elementiga murojaat qilinib unga yangi qiymat yoziladi. Quyidagi koda uchta yoshning oxirgisining qiymatini o’zgartiramiz va qayta chop qilamiz. [ ]: ages = [22, 33, 44] print("Boshlang'ich qiymatlar:", ages) # oxigi element qiymatini o'zgartirish ages = 55 print("O'zgarishdan keyingi qiymatlar:", ages) Boshlang'ich qiymatlar: [22, 33, 44] O'zgarishdan keyingi qiymatlar: [22, 33, 55] 3. Mavjud elementni o’chirish. Yuqordagi misol kabi yoshlardan oxirgi qiymatni o’chiramiz. [ ]: ages = [22, 33, 44] print("Boshlang'ich qiymatlar:", ages) # oxirgi qiymatni o'chirish # pop metodi orqali oxirgi qiymatni o'chirish ages.pop() print("O'chirishdan keyingi qiymatlar:", ages) Boshlang'ich qiymatlar: [22, 33, 44] O'chirishdan keyingi qiymatlar: [22, 33] pop() metodi yordamida element indeksi bo’yicha o’chiramiz, masalan 2-elementni. [ ]: ages = [22, 33, 44] print("Boshlang'ich qiymatlar:", ages) # oxirgi qiymatni o'chirish ages.pop(1) print("O'chirishdan keyingi qiymatlar:", ages) 33 Boshlang'ich qiymatlar: [22, 33, 44] O'chirishdan keyingi qiymatlar: [22, 44] Yuqoridagi ikkita kodning asosiy farqi shuki pop() metodiga, aslida, biz o’chirmoqchi bo’lgan qiymatimizning indeksini berishimiz kerak. Agar shu qiymatni bermasak, u oxirgi elementi o’chirish kerak deb tushunadi hamda o’chirilgan qiymat indeksini qaytaradi. Oxirigi kodda esa biz bu metodga 1 berdik, shuning uchun u 2-elementi o’chirdi. Albattda elementni o’chirishning boshqa usullari ham mavjud, ularni keyinchalik sekin astalik bilan o’ganamiz. 5.1 list o’zgaruvchisining metodlari Ushbu qismda bu tur o’zgaruvchisida mavjud bo’lgan bir qator metodlarni o’rganib chiqamiz, ular- dan: 1. clear() metodi, o’zgaruvchidagi hamma elementlarni o’chirib, uni bo’sh holatga o’tkazadi. [ ]: ages = [22, 33, 44] print("Boshlang'ich qiymatlar:", ages) ages.clear() print("O'chirishdan keyingi qiymatlar:", ages) Boshlang'ich qiymatlar: [22, 33, 44] O'chirishdan keyingi qiymatlar: [] 2. Ushbu turdagi bir o’zgaruvchini boshqa turga to’g’iridan-to’g’ir o’zlashtirganda, uning har bir elementi nusxalanishning o’rniga uning xotiradagi manzilini ko’rsatgich sifatida o’zlashtirib qo’yadi. Bu esa ikki o’zgaruvchining bir xiligiga ya’ni elementlari bittaligi olib keladi. Hamda birining elementini o’zgartirsangiz unda boshqasi ham bu o’zgarishni sezadi. Ta’savur qiling, sizda bitta bank plastik kartasi bor va unda ma’lum bir miqdorda pul turibdi. Siz ushbu kartadan foydalanish uchun ikki xil bank sistemasining ilovasidan foydalanasiz, agar bittasi orqali qandaydir to’lov amalga oshirsangiz ikkinchisiga ham bu o’zgarish ta’sir qiladi, chunki ikkisi ham bir joyni ko’rib turibdi. Xudi shu holat quyida ikkita list turi o’zgaruvchisi ustida sodir bo’ladi. [ ]: a = [3, 4, 2, 6] print("Boshlang'ich qiymatlar:", a) # to'g'ridan-to'g'iri o'zlashtirish # endi a bilan b o'zgaruvchilari # bir joyni ko'rib turibdi b = a # b ning elementini o'zgartiraylik b = 55 # endi a ni chop qilsak # a ning 1 elementi ham o'zgardi print("O'chirishdan keyingi qiymatlar:", a) Boshlang'ich qiymatlar: [3, 4, 2, 6] O'chirishdan keyingi qiymatlar: [3, 55, 2, 6] Ushbi holatdan chiqib ketish uchun biz copy() metodidan foydalanamiz. Bu metod har bir ele- mentni alohida xotira manziliga nusxalab, keyin undan list turidagi o’zgaruvchi hosil qilib, oxirida 34 uni alohida o’zgaruvchi sifatida e’lon qiladi. Quyidagi kod oldingi kodning takomillashganidir. [ ]: a = [3, 4, 2, 6] print("Boshlang'ich qiymatlar:", a) # to'g'ridan-to'g'iri o'zlashtirish # endi a bilan b o'zgaruvchilari # bir joyni ko'rib turibdi b = a.copy() # b ning elementini o'zgartiraylik b = 55 # endi a ni chop qilsak # a ning 1 elementi endi o'zgarmaydi print("O'chirishdan keyingi qiymatlar:", a) Boshlang'ich qiymatlar: [3, 4, 2, 6] O'chirishdan keyingi qiymatlar: [3, 4, 2, 6] 3. count() metodi orqali biz ro’yxatdagi elementlarning qiymati biror berilgan songa teng bo’lganlarining nechta ekanligini aniqlashimiz mumkin. [ ]: a = [3, 4, 2, 6, 2, 3, 2] # 2 lar soni n_2 = a.count(2) # chop qilish print(n_2) # 3 lar soni n_3 = a.count(3) # chop qilish print(n_3) 3 2 4. index() metodi ro’yxatdagi elementlar ichidan berilgan songa teng bo’lgan birinchi element- ning o’rnini (indeksni qaytaradi.) [ ]: a = [3, 4, 2, 6, 2, 3, 2] # 2 ning indexsi n_2 = a.index(2) # chop qilish print(n_2) # 3 ning indeksi n_3 = a.index(3) # chop qilish print(n_3) 2 0 35 5. insert() metodi yangi elementni ko’rsatilgan indeksdan oldingi o’ringa qo’shadi va undan keyingi hamma elementlar bitta indeksga suriladi. [ ]: a = ['A', 'B', 'D', 'F'] print(a) # Alifbo tartibiga C harfini qo'shamiz a.insert(2, 'C') print(a) # Alifbo tartibiga E harfini qo'shamiz a.insert(4, 'E') print(a) ['A', 'B', 'D', 'F'] ['A', 'B', 'C', 'D', 'F'] ['A', 'B', 'C', 'D', 'E', 'F'] 6. reverse() metodi ro’yxatning elementlarini teskari tartibda joylashtiradi. [ ]: a = ['A', 'B', 'D', 'F'] # boshlang'ich tartib print(a) # teskari tartib a.reverse() print(a) ['A', 'B', 'D', 'F'] ['F', 'D', 'B', 'A'] 7. sort() metodi listdagi elementlarni tartiblaydi agar ular o’rtasida taqqoslash amali mavjud bo’lsa. [ ]: a = [3, 4, 2, 6, 2, 3, 2] print('Tartiblanmagan: ', a) a.sort() print('Tartiblangan: ', a) # lekin quyida list elemenlari # o'rtasida taqqoslash amali mavjud emas # shuning uchun tartiblash xatolik # yuzaga chiqarad a = ['A', 3, 5, 'B'] print(a) a.sort() print(a) Tartiblanmagan: [3, 4, 2, 6, 2, 3, 2] Tartiblangan: [2, 2, 2, 3, 3, 4, 6] ['A', 3, 5, 'B'] 36 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) d:\Courses\AI courses\Sun'iy Intellekt.ipynb Cell 147 line 1 10 a = ['A', 3, 5,␣ ↪'B'] 11 print(a) ---> 12 a.sort() 13 print(a) TypeError: ' dist: # shunday bo'lsa # yaqin masofa yangisiga o'tadi min_dist = dist # indeks ham o'zgaradi min_ind = i # sanagichni oshirish i = i + 1 # natijalarni chop etish print("Haqiyqiy javob: ", test_digits[k]) # min_ind - eng yaqin rasm indeksi print("Algoritm topgan javob: ", digits[min_ind]) Haqiyqiy javob: 7 Algoritm topgan javob: 7 Yuqorida biz algoritmni test to’plamdagi 1-rams uchun ishlatib ko’rdik, natijalar to’g’iri chiqidi. Quyidagi jadvalda bir nechata ishlatishlari natijasi keltirilgan. Haqiqiy javob (qaysi Algoritmning javobi(qaysi Test to’plamdagi rasm indeksi raqamligi) raqamligi) 0 7 7 10 0 0 355 8 8 Yuqorida biz sinov qilgan hamma indekslarda natijalar bir xil chiqayabdi, lekin aslida unday emas, chunki har doim algorimtda xatolik bo’ladi. Bu haqida keyinchalik batafsil mulohasa yuritamiz. Hozirgi algorimning o’rtacha bahosi esa 98%, ya’ni birinchi 100 ta rasmdan 98 tasini to’g’iri topa oladi. Bu juda yuqori natija chunki masalamiz juda sodda. Yuroqidagi kodning hamma test rasm- larni tekshirish uchun takomillashtirib, uni experiments.py faylida nearest_neighboor_mnist() funksiyasi sifatida hosil qildik. Lekin biz uni hamma rasmlar bilan ishlatsak taxminan 33 soatdan ko’p vaqt ketib qoladi. Ushbu algorimtning kamchilik va yutuqlarini batafsil mulohaza qilamiz. 51 [ ]: from experiments import nearest_neighboor_mnist accuracy = nearest_neighboor_mnist(100) print('Ushbu metodning aniqligi: ', accuracy * 100, '%') Ushbu metodning aniqligi: 98.0 % Siz aziz o’quvchilar bilan hozirgi kunda keng qo’llanilaytogan masalalardan biri bo’lgan, berilgan rasmda qanday raqam yozilganini aniqlash dasturini tuzib o’rgandik. Ushbu algoritm faqat amaliy dastur orqali tushuntirildi hamda natijalar olindi. Keyingi qismlarda biz ushbu algoritmning mo- hiyatini kengroq o’rganishga kirishamiz. 8.3 Eng yaqin qo’shni algoritmi Eng sodda va tushunarli bo’lgan algoritmlardan biri bu ‘Eng yaqin qo’shni’ algoritmidir. Biz bundan oldingi boblarda MNIST raqmlari yozilgan to’plam bilan ishlab rasmlardagi raqamlarni aniqlovchi dastur tuzdik va undan natijalar oldik. Ushbu dasturda foydalangan algoritmimiz bu ‘Eng yaqin qo’shni’ algoritmidir. Ushbu qismda biz shu algoritmni chuqoroq tahlil qilib, matematik usulda ifodalashga harakat qilamiz. Buning uchun keling birinchi navbatda uning geometrik ma’nozini tushinishga harakat qilib ko’raylik. Yuqoridagi dasturda biz har bir rasmni 28 ga 28 piksellarda ifodaladik, bu esa 784 o’lchamli vektor degani va bu o’lchamni biz geometrik tarzda tasvirlay olmaymiz. Shuning uchun yuqoridagi masalani boshqa juda sodda masalaga almashtiramiz. Tasavur qilaylik, it va bo’rilar faqat bo’yi va uzunligi (boshidan dumigacha bo’lgan uzunlik) bilan vektor ko’rinishida berildi. Masalan, quyidagi 2 o’lchovli koordinatalar sistemasida ulardan bir nechtasi berilgan. [ ]: from IPython.display import display, Image display(Image(filename="dog_wolf_sample_2D.png", height=600, width=600)) 52 Ushbu rasmda uch xil turdagi shakllar joylashgan: aylana itlarni ifodalaydi, uchburchak bo’rilarni va oxirgi ‘X’ belgisi esa yangi bizga berilgan hayvoni ifodalaydi. Bu shu yangi hayvon itmi yoki bo’rimi shuni aytishimiz kerak. Buni esa shu rasmga qarab bu hayvon itlarga yaqin bo’lsa, uni it deymiz, aks holda uni bo’ri deymiz. Hozirgi holda bu albatta bo’ri. Buning uchun biz ushbu yangi hayvonga eng yaqin bo’lgan hayvonni topshimiz kerak bu hayvon bo’ri bo’lgani uchun ham biz yangi hayvoni bo’ri turiga masub deymiz. Ushbu sodda masalani geometrik usulda tushunish qiyin emas. Lekin birinchi rasmlardagi raqam masalasini esa bu kabi chimza yordamida tasvirlab bo’lmaydi. Uning o’rniga biz u shunchaki tasavur qilib ishlaymiz. Oldingi misolni yechishda biz hozirgidek sodda chizmadan emas balki ularning orasidagi masofani topish uchun maxsus masofa 𝜌(𝑥, 𝑦) funksiyasidan foydalandik. Hamda ixtiyoriy rasm berilsa unni bizda oldindan mavjud bo’lgan rasmlar bilan solishtirib unga eng yaqinini topdik va shu orqali yangi kelgan rasmda qanday raqam bor ekanligini aniqladik. 8.4 Atamalar Keling endi, birinchi, ba’zi bir atamalarni kiritsakda va shu atamalarga izchil rioya qilib kitobni davom ettirsak. Birinchi atamamiz, bu obyekt ba’zida esa namuna ham deymiz. Yuqoridagi misol- larda bular: hayvonlar va rasmlar obyekt yoki naumuna deyiladi. Ular o’rtasidagi juda nozik farq bu naumunalar deb biz yechimi bo’lgan obyektlarga aytishimiz mumkin, obyektlarni esa hammasiga qo’llash mumkin. Ikkinchisi esa, o’rgatuvchi va test to’plamlar. Algoritmni o’rgatish uchun ish- latiladigan namunalar bu o’rgatuvchi to’plam deyiladi, uning qanday ishlayotgani tekshirish uchun 53 esa biz test obyektlardan foydalanamiz, buni esa test to’plam deymiz. Keyinchalik boshqa turdagi to’plamlarni ham qo’shamiz. Keyingisi esa biz qanday masalani yechayotganimizga oid bo’lib, yuqoridagai ikki misolda ham biz yangi obyektni qaysidir jamoaga tegishli ekanligini aniqlashmiz zarur bo’ldi, masalan rasmda qan- day raqam joylashgan yoki yangi hayvon qaysi hayvonligi. Obyektni qaysi turga kirishini umumiy holda obyektning ‘Sinfi’ deymiz. Masalan, itlar sinfi yoki bo’rilar sinfi va hakozo. Oxirgisi esa alomat bo’lib, har bir obyekt ifodaluvchi qiymatlar uning alomatlari deyiladi. Biz ingliz tilidagi ‘feature’ so’zini shu tarizda tarjima qildik. Yuqoridagi misollarda: rasmlar uchun uning piksellari alomatlari deymiz, ‘It va bo’ri’ misolida esa ularning bo’yi va uzunligini alomat- lar deb ataymiz. Ba’zida sohani yaxshi tushunmaganlar bu tushunchani simptomlar(symptoms) bilan adashtirishadi, aslida bu so’z faqat fizik va ruhiy alomatlarni ifodalash uchun ishlatiladi va odata kasalikning qanday sharoitda ekanligni anglatadi. Biz mashinali o’rganishda umumiy- roq holni qaraymiz. Ushbu alomatlar qo’yilgan masalaga ko’ra ikki qismga bo’linadi. Obyektni tasvirlovchi alomatlar va maqsadli (target) alomat(lar). Yuqorida ‘It va bo’ri’ masalasida ularning bo’yi va uzunligi tasvirlovchi alomatlar bo’lsa, ularning qaysi sinfga tegishli bo’lishi maqsadli alo- mat hisoblanadi. Chunki obyektlarning tasvirlanishi orqali ularning qaysi sinfga tegishli bo’lishini aniqlashimiz asosiy maqsadimizdir. 8.5 O’rgatuvchili o’rganish Ushbu ingiliz tilidagi ‘Supervised Learning’ atamasini biz o’rgatuvchili o’rganish deb tarjima qildik hamda ushbu qo’llanma davomida shunday deb murojaat qilamiz. Biz birinchi sodda masala kordik va uni yaxshiroq tushinish uchun esa yanada sodda misolni geometrik usulda bayon qildik. Endi bu qismda ushbu o’rgangan ‘Eng yaqin qo’shni’ algoritmi asosida Mashinali o’rganish fanining ba’zi nazariy qoidalari va ta’riflarini o’tganamiz. Keling birinchi ‘O’rgatuvchi (supervised)’ so’zini yuqoridagi masalada aniqlashtirib olsak. Ra- malarni o’zida jamlagan MNIST rasmlar to’plami, oldin ham aytganimizdek, ikki qismdan ibo- rat: birinchisi algoritmni o’rgatish va ikkinchisi esa uni test qilish. Birinchi qismdagi to’plamdagi hamma ramsda qanday raqamlar turganini bizga ayon. Xudi shunday, yuqoridagi “It va bo’ri”ga oid to’plamda ham 10 ta (5 ta it va 5 ta bo’ri) hayvoning qiymati oldindan bor va ularning qanday hayvon ekanligini ham bilamiz. Mana shu MNISTning birinchi to’plami va yuqoridagi ramsdagi 10 ta hayvon bizning algoritm uchun “O’rgatuvchi”. Shuning uchun ham bu turdagi masalalarni “O’rgatuvchili o’rganish” deb nomlaymiz. Demak soddaroq qilib aytsak algortimni o’rgatish uchun oldindan yechimi bo’lgan namunalar berilar ekan biz shularga qarab yangi muammoni yechimini topishimiz “O’rgatuvchili o’rganish” bo’lar ekan. 8.5.1 O’rgatuvchili o’rganishning turlari Ushbu turdagi o’rganishning o’zini ham maqsadli alomatning turlariga qarab bir qancha turlarga ajratib o’rganamiz: 1. Regressiya - ushbu turda maqsadli alomat ma’lum bir son bo’lib uni topish talab etiladi. Masalan, ertangi haroratni topish yoki uyning narxini baholashlar regressiya masalalaridir. 2. Klassifikatiya (Sinflash) - bunda maqsadli alomat toifali bo’ladi, son bo’lmaydi. Bu toifalilar odatda mantlar bilan ifodalanadi. Masalan, yuqoridagi misolda yangi obyektning qaysi sinfga tegishli bo’lishi bu klassifikatsiya masalasidir. 54 8.5.2 Matematik ifodalanishi Biz kelajakda o’qigan narsalarnimizni tushunish uchun har doim matematik ifodalashga zarurat bo’ladi. Chunki bu soha vaklillari har doim ilmiy maqola o’qishiga to’g’iri kelishi mumkin, bunda esa masalarni qanday ifodalashni bilish juda muhim hisoblanadi. Shuning uchun har bir turdagi masaladan so’ng biz ushbu masalaning matematik ko’rinishini yozib ketamiz va bir necha boblardan so’ng biz deyarli hamma algoritmlarni matematik ko’rinishda ifodalaymiz. Klassifikatsiya masalasi. Aytaylik bizga yuqoridagi masalardagi obyektlarni ifodalovchi 𝑋 = {𝑥1 , 𝑥2 , … , 𝑥𝑚 } to’plam berilgan. Bu yerdagi har bir 𝑥𝑖 ∈ 𝑅𝑛 , 𝑖 ∈ {1, 2, … , 𝑚} to’plamdagi bitta obyektni tafsiflaydi. Namuna uchun, ‘it va bo’ri’ misolida 𝑥1 = (𝑦𝑜𝑠ℎ, 𝑏𝑜′ 𝑦), aniq qiymat bo’lsa, u holda 𝑥1 = (85, 95) birinchi obyektnining qiymatini saqlaydi. 𝑋 to’plam o’zida vektorlarni saqlagani uchun u umumiy holda 𝑋 ∈ 𝑅𝑚×𝑛 bo’ladi, ya’ni o’lchami 𝑚 × 𝑛 bo’lgan matritsa. Hamda har bir obyektning maqsadli alomatini ifodalash uchun 𝑦 = {𝑦1 , 𝑦2 , … , 𝑦𝑚 }, har bir sinfning qiymati 1 dan to sinflarning sonigacha 𝑐 o’zgaradi, ya’ni 𝑦𝑖 ∈ {1, 2, … , 𝑐}. Biz qisqalik uchun har doim sinfning nomlarini matn ko’rinishda tasvirlamasdan, uning o’rnida, ularni ixtiyoriy tartibda tartiblab, ularga tartibi bo’yicha raqamlar beramiz. Bu keyichalik dasturlash va eng asosiysi mashinali o’rganishda zarur bo’ladi. Masalan, yuqoridagi ‘it va bo’rida’ ‘it’ lars sinfini 1 desak ‘bo’r’ larni 2 deymiz. Masalaning qo’yilishi Ushbu masalada bizning asosiy maqsadimiz yuqoridagi ikki o’zgaruvchi, 𝑋 va 𝑦, bizga oldindan o’rgatuvchi to’plam sifatida berilsa, u holda yangi obyekt 𝑥∗ uchun maqsadli alomatning (𝑦) qiymatini topishimiz kerak bo’ladi. Buni sodda matematik ko’rinishda quyidagicha yozamiz, 𝑦 = 𝑓(𝑥). Biz shunday funksiya (ba’zida, algoritm, usul yoki operator) topishimiz kerak bo’ladi, unga 𝑥∗ qiymat sifatida bersak, u 𝑓(𝑥∗ ) bizga 𝑦 ning qiymatini qaytarishi kerak. Sodda misol sifatida valyuta ayriboshlash funksiyasini qarab chiqaylik. Agar bizga joriy AQSH dollorining O’zbekiston so’miga nisbati berilgan bo’lsa, u holda 𝑔 funksiyaga biz AQSH dollorda qiymat ko’rsatsak, u bizga shu qiymatning O’zbekiston so’mida qancha bo’lishini qaytarishi kerak. Xudi shunday, yuqoridagi funksiya (ba’zida, algoritm, usul yoki operator) qo’yilgan masalaga beril- gan 𝑋 va 𝑦 asosida mos javob qaytarishi kerak. Endi yuqoridagi biz ko’rib chiqqan ikki masalanining matematik ifodalanishi qisqacha yozib qo’sak. Birinchi masalada, biz rasmlar bilan ishladik. Aslida rasmlar 28 × 28 ko’rinishidagi jadval (ma- tritsa) edi. Lekin biz uni 784 o’lchamli vektor ko’rinishiga o’tkazib oldik. Shunda, obyektlarni o’zida saqlovchi o’rgatuvchi to’plam 𝑋 ∈ 𝑅60000×784 va maqsadli alomat 𝑦 = {𝑦1 , 𝑦2 , … , 𝑦60000 } bo’ladi. Bu yerda har bir 𝑦𝑖 ∈ {1, 2, 3, … , 10}, chunki 𝑐 = 10. Ikkinchi namunamiz ham bir- inchisiga o’xshaydi, faqat ancha soddaroq, o’rgatuvchi to’plam 𝑋 ∈ 𝑅10×2 va maqsadli alomat 𝑦 = {𝑦1 , 𝑦2 , … , 𝑦10 }, 𝑦 ∈ {1, 2} Regressiya masalasi. Ushbu tur masalalar boshqalaridan ko’ra ko’proq uchraydi, chunki ko’pchilik masalalar ushbu turga keltirib yechiladi. Ushbu turning oldingisidan asosiy farqi bu 𝑦 qiymati sinflar qiymatini saqlamasan, o’rniga haqiqiy sonlarni saqlaydi, ya’ni $y={y^1, y^2, …, y^m} $, bu yerda har bir 𝑦𝑖 ∈ 𝑅. 8.6 Xulosa Ushbu bobda mashinali o’rganishga oid bir qator muhim mavzularni o’rganib chiqdik. Shulardan eng muhimi o’zimiz uchun sodda klassifikatsiya algoritmi bo’lgan Eng yaqin qo’shni algoritm ni o’rganib chiqdik. Ushbu metod sodda bo’lishi qaramsdan ko’pchilik amaliy masalalarni yechishda hozirda ham keng qo’llaniladi. Guvohi bo’lganimizdek, bizning algoritm 98% aniqlik bilan ishladi hamda bu ko’rsatgich juda aniq hisoblanadi. Bundan tashqari kelajakda o’rganmoqchi bo’lgan 55 mashinali o’rganish algoritmlari uchun zarur bo’lgan eng zarur mavzularni ham ko’rib chiqdik. Bundan keyingi bobni biz statistik tahlil uchun bag’ishlasakda hamda uning ichida ba’zi algoritm- larni o’rgansak. Chunki, yuqorida ta’kidlaganimizdedk, mashinali o’rganish fani statistik tahlilning bir qismi bo’lib rivojlanib kelgan. 9 Statistika asoslar va ehtimollik Ushbu ikki fanni o’rganishning o’zi insondan uzoq yillik qattiq mehnat talab etadi. Lekin ushbu qo’llanmada biz bu ikki fanni sodda ikki bo’lim sifatida berib ketmoqchimiz, chunki bizning maqsadimiz sun’iy intellektni o’rganish. Qo’llanmaning ushbu qismini Martin Buntinas va Ger- ald M. Funklar tomonidan yozilgan Statistics for the Sciences (Fanlar uchun statistika) kitobidan va boshqa bir qancha manbalardan foydalanamiz. Hamda ushbu bo’limda biz mashinali o’rganish fanida ba’zi kiritilmay qolib ketgan atamalarni kiritamiz va ularni kamchiliklarini to’ldiramiz. 9.1 Statistika 9.1.1 Statistika nima Ko’pchilik statistikani odatda ma’lum bir ma’umotlarni har xil jadvallarga yoki diagrammalarga chiqarib tasvirlashni tushunishadi. Yok bo’lmasam oddiygini bu yil nechta chaqaloq tug’ilibdi? dey- ishadi va uning javobini olgandan so’ng shu bu yilgi statsitika deyiladi. Aslida esa bu statsitikaning bir kichginagina yo’nalishi bo’lib, tavsiflovchi statistika deyiladi. Balki bu soha undan ancha keng bo’lib, asosan muhitdagi haqiqiy holatni aniqlik bilan bilishning iloji bo’lmaganda yoki bo’lsa ham juda ko’p harakatlar talab qilinganda, bu fan qanday qilib shu narsalarni ma’lum bir noaniqlik bo’lsa ham aytish mumkinligini o’rganadi. Masalan, ma’lum bir davlatda hamma aholisdan so’rovnoma olish kerak bo’lsa, unda buning uchun juda katta harajat va mehnat talab qilinadi. Uning o’rniga shu aholining ma’lum bir qismidan shu so’rovnomani olib, xulosa chiqarilsa va xulosadagi xatolikni kamligiga ishonch hosil qilinsa, unda shuncha qiyinchilik yuzaga kelmadi. Biz ko’pchilik mahsulotlarni qopida, masalan unning qopida, 50 ± 3% yoki shunga o’xshash sonlar bo’ladi. Bu kabi narsalar ko’pchiligimizga notanish yoki qanday ma’no anglatishiga qiziqmaymiz. Ushbu qoplash jarayonini hech qachon aniq 50 kglik qilishning iloji yo’q yoki hamma qopni tekshirib bo’lmaydi, chunki ishlab chiqarilgan mahsulot sotilib ketaveradi. Keling birinchi bitta namunani yaxshilab o’rganib chiqaylikda keyin, shu asosida ba’zi birlamchi atamalarni kiritaylik. Namumna 1. Louis Harris va sheriklari har xil mavzular yuzasidan so’rovnomalar o’tkazishadi. Ushbu so’rnomalar ba’zida yuzma-yuz, ba’zida esa telefon yoki boshqa vaqtlarda Internet orqali olib boriladi. 1991-yilda, shunday so’rovlardan biri Amerikalik balog’atga yetgan kishilar o’rtasida olib borildi. Ushbu so’rov davomida jami bo’lib 1256 kishi tasodifiy tanlab olinib, ularga quyidagi savol- lar (parhez, siqlishni boshqarish, o’rindiq kamaridan foydalanish, va shu kabilar) berilib, ularning javoblari yig’ildi. Shu savollardan biri, biz muloha qilmoqchi bo’lganimiz, ‘Siz semirib ketmaslik uchun o’zingizning parhezingizda qattiq amal qilasizmi?’ Natijada, Harris qatnashuvchilarning 57% savolga ‘Ha’ deb javob berganlarligini aytdi. Hamda bu natijalarning xatosining kattaligi musbat yoki manifiy 3% edi. Ushbu so’rovdagi qiymatlar to’liq bo’lmagan ma’lumotlardan olindi, ya’ni Amerkada taxminan 200 million yoshi kattalar mavjud bo’lib, so’rovda ulardan bor yo’gi 1256 kishi qatnashdi. Ushbu so’rovda qatnashishi kerak bo’lgan 200 million kishilar to’plamini biz populatsiya deb ataymiz. Agar ushbu savollarni hamma insonlarga berib, ularning javobini to’liq olganimzida bu narsa sen- sus bo’lar edi, ya’ni sensus murojaat qilamiz. 200 million aholi bo’lishiga qaramasdan, Harris 56 so’rovnomada ulardan 1256 tasining javobini oldi. Bu narsani, ya’ni to’liq bo’lmagan so’rovni, biz namuma deb aytamiz. Ko’rib turganimizdek ushbu so’rovni populyatsiyada o’kzasak, unda davlat uchun yoki so’rovni o’tkazayotganlar uchun juda katta harajat bo’ladi. Shuning uchun bunday populyatsiydan so’rov olish deyarli ko’p hollarda amaliy bo’lmaydi. Ushbu muammodan chiqib ketish uchun esa ‘sinchikov- lik bilan olib borilgan sensus yetarli deb aytadi’ Samuel Johnson. Bunga misol sifatida esa, agar ovqatning ta’mini bilmoqchi bo’lsagniz shu ovqatni to’liq yeb tugatishingiz shart emas, ozroq qismi bilan bilish mumkin deb o’zing gapini quvatlaydi. Ushbu so’rovnoma ishtirok etgan odamlarni biz birlik deb ataymiz. Ushbu birliklarning, yuqoridagi misolda esa odamlarning, turli xil o’ziga xos fazilatlarni yoki ularning yuqoridagi savollarga javob bergan natijalarini o’zgaruvchi deb nomlaymiz. Yuqoridagi so’rovda esa bunga misol sifatida odamning yoshi, og’irligi, parhez haqidagi savolga bergan javoblarning barchasini biz o’zgaruvchi deb ataymiz. E’tibor bering statistikada o’zgaruvchi va dasturlashdagi o’zgaruvchi atamalarni deyarli bir xil narsani anglatayabdi, ya’ni ma’lum bir qiymatnining unga bog’lik jarayon asosida o’zgarishi. Ushbu o’zgaruvchilarni ikki qimsga ajratamiz: toifali va miqdoriy o’zgaruvchilar. Toifali o’zgaruvchiga so’ruvdagi savollarga ‘Ha’ yoki ‘Yo’q’ deb javob berish, insoning jinsi, ranglar va shu kabilar kiradi. Miqdoriyga esa son bilan ifodalnuvchi qiymatlar, masalan, yosh, vaznlar kiradi. Yuqoridagi klassifikatsiya misolida ham bizdagi raqamlarning qiymatlari toifali edi, ya’ni ular son emas edi yoki ‘It’ yoki ‘bo’ri’ ham shular jumlasidan. Namuna natijasida yoki namunandan hosil bo’lgan son statisitka deyiladi. Agar shu son butun boshli populyatsiyadan hosil qilinsa unda esa parametr deyiladi. Ushu parametrlarni belgilash uchun odatda biz grek harflaridan foydalanamiz, masalan 𝜋 n yuqoridagi toifali o’zgaruvchining populyatsiya ulushini belgilash uchun yoki 𝜇 ni esa miqdoriy o’zgaruvchining o’rtacha qiymatini bel- gilash uchun ishlatamiz. Agar yuqoridagi Amerkalik yoshi kattalar o’rtasidagi o’tkazilgan so’rovni barcha uchun o’tkazish mumkin emas, shuning uchun ham 𝜋 qiymatni qiymati ma’lum emas. Namunadan olingan dalilar (qiymatlar) asosida biz populyatsiya haqida xulosa qilishimiz mumkin. Shuning uchun ham 𝑝 statistika 𝜋 parameter bilan bir xil bo’lmaydi, ya’ni ko’pchilik hollarda 𝜋 parametr noma’lum bo’ladi. Chunki shu so’rovni qayta bir sharoitda bir necha bor takrorlasak ham 𝑝 statistika har doim har xil chiqadi, lekin 𝜋 parametr o’zgarishsiz qoladi. Harrisning misolidagi ushbu o’zgarishlar xatolining chegarasi deb yuritiladi. Biz odatda populatsiyaning paramterlarni hisoblashga imkonimiz bo’lmaydi, shuning uchun deyarli hamma joyda numunalar haqida so’z yu- ritamiz. Zarur joylarda esa populyatsini so’zini oshkor ravishda qo’shamiz. Eslatma. Biz yuqorida, birinchi mashinali o’rganishda odamni ifodalovchi qiymatlarni alomatlar deb nomladik, lekin hozir shu narsalarni biz o’zgaruvchi deb statistika fanida o’rgandik. Ushbu ikki turli nomlanish ko’pincha o’zaro almashtirilib ishlatiladi. Shun- ing uchun ushbu qo’llanma davomida biz ikkisini ham ishlatishga harakat qilamiz. Das- turlashda ko’pincha o’zgaruvchi, qolgan qismlarda esa alomat deb yuritamiz. Biz yuqoridagi so’rovda 1256 ta odam qatnashganining guhovi bo’ldik, bu esa to’liq odamlar emas. Ushbu qatnashish natijasida hosil bo’lgan qiymatlarni, masalan, jadvalni kuzatuvlar deb ataymiz, chunki bu kuzatish doimiy o’zgarib turishi mumkin. Masalan, biz odamdan so’rov olinganda bir nec- tha qiymatlar olinadi, shuning uchun uni kuzatuvlar deymiz, shunchaki kuzatuv deyishning o’rniga. Shunda kuzatuvlardan hosil bo’lgan to’plamga biz berilganlar deb ataymiz. E’slatma. Hozirgi kunda kompyuter fanlarida ingliz tilidagi ‘Data’ so’zi tarjimasi ko’p joylarda ma’lumotlar deb tarjima qilandi. Lekin ushbu so’zning o’zbek tilida aniq tar- 57 jimasi yo’q va shu bilan birgalikda rus tilida ham. Agar ushbu so’zni ma’lumotlar deb tarjima qilsak, bu so’zning ma’nosi bir qancha narsalarga nisbatan ishlatilishi mumkin bo’lib, Data ta’rifiga ba’zi qarama-qarshililarni keltirib chiqaradi. Chunki bu so’zning ta’rifida ‘Zamonaviy kompyuter tizimlarida hamma data bu raqamli’ degan tushuncha bor. Lekin ‘ma’lumotlar’ o’zing ichiga raqamlini ham raqamsizni ham qamrab oladi, hattoki anolig bo’lgan gaplarni ham biz ma’lumot deyishimiz mumkin. Agar shuni ‘berilganlar’ desak, xuddi rus tilidagiga o’xshab, unda, bizning fikrimizcha, kompyu- terda albatta qiymatlar 0 yoki 1 ko’rnishda beriladi, boshqacha bo’lishi mumkin emas. Agar boshqa sohada, masalan, ‘berilganlar’ deyilsa shu sohaga oid narsani tushunishimiz mumkin. Sodda matematik masalada: ‘To’g’iri to’rt burchakning bo’yi va eni berilgan uning yuzini toping.’ Ushbu matnda hamma narsa tushunarli, ya’ni bizga qiymatlar son ko’rinishda yoki ikkita belgi ko’rinishida beriladi, boshqa narsa emas. Endi shu misolni ma’lumotlar deb yozib ko’rsak, unda juda boshqacha ko’rinishga ega bo’ladi. Albatta to’g’iri to’rt burchakning bo’yi va eni ham biz uchun ma’lumot, u narsa aniq daladagi belgilan maydon ham bo’lishi mumkin emasmi? Yoki oliy ma’lumotli deganda nimani tushunamiz? 9.1.2 Beshta sonli xulosa Tassavur qilaylik bizga isnoning yoshlarini ifodalovchi berilganlar to’plami bor. Biz ushbu to’plam ustida beshta eng muhim qiymatlari aosida xulosa chiqarishimizga Beshta sonli xulosa deb nom- lanadi. Bu sonlar ushbu to’plamdagi eng kichik, eng katta yoshlar, o’rtacha daraja (rank), birinchi chorak va 3 chorak. Sodda qilib aytganda bizga berilgan yoshlar to’pla

Use Quizgecko on...
Browser
Browser