Зеҳн
Омӯзиши мошинӣ ва амиқ

Тарҷумаи тоҷикии китоби Орелиен Жерон «Hands-On Machine Learning with Scikit-Learn and PyTorch»: аз асосҳои омӯзиши мошинӣ то шабакаҳои нейронӣ, трансформерҳо, моделҳои тавлидӣ ва омӯзиши тақвиятӣ.

Агенти Зеҳнӣ · 13 ноябри 2026 · 20 саҳифа · 1 писанд

ИлмБарномасозӣТехнология
Аз аввал хондан

Боби 7. Коҳиш додани андозанокӣ

Бисёр масъалаҳои омӯзиши мошинӣ барои ҳар намунаи омӯзишӣ ҳазорон ва ҳатто миллионҳо хусусиятро дар бар мегиранд. Ин хусусиятҳо на танҳо омӯзишро хеле суст мекунанд, балки, тавре хоҳед дид, ёфтани роҳи ҳалли хубро низ душвортар месозанд. Ин мушкилро аксаран лаънати андозанокӣ (curse of dimensionality) меноманд.

Хушбахтона, дар масъалаҳои воқеӣ аксаран шумораи хусусиятҳоро ба таври назаррас кам кардан мумкин аст. Ҳамин тавр, масъалаи амалан ҳалнашаванда ба масъалаи ҳалшаванда табдил меёбад.

Масалан, тасвирҳои MNIST-ро, ки дар боби 3 муаррифӣ шуданд, ба назар гиред: пикселҳои канори тасвир қариб ҳамеша сафеданд. Аз ин рӯ, онҳоро аз маҷмӯи омӯзишӣ пурра хориҷ кардан мумкин аст, бе он ки маълумоти зиёде аз даст равад. Тавре дар боби гузашта дидем, расми 6.6 тасдиқ мекунад, ки ин пикселҳо барои таснифбандӣ амалан аҳаммият надоранд.

Ғайр аз ин, ду пиксели ҳамсоя аксаран бо ҳам вобастагии қавӣ доранд. Агар онҳоро ба як пиксел муттаҳид кунед, масалан, миёнаи шиддати онҳоро гиред, маълумоти зиёдеро аз даст намедиҳед. Бо ин роҳ маълумоти такрорӣ ва баъзан ҳатто ғавғоро бартараф мекунед.

Огоҳӣ. Коҳиш додани андозанокӣ метавонад як қисми маълумоти муфидро низ аз байн барад, ҳамон тавре ки фишурдани тасвир ба JPEG метавонад сифати онро паст кунад. Ин метавонад самаранокии системаро андаке бадтар созад, махсусан агар андозанокиро аз ҳад зиёд кам кунед. Ғайр аз ин, баъзе моделҳо, масалан, шабакаҳои нейронӣ, метавонанд бо додаҳои дорои андозанокии баланд самаранок кор кунанд ва худашон кам кардани андозанокиро бо нигоҳ доштани маълумоти барои вазифа муҳим омӯзанд. Аз ин рӯ, илова кардани марҳалаи алоҳидаи коҳиши андозанокӣ ба пешкоркард на ҳамеша фоида меорад.

Ғайр аз тезондани омӯзиш ва эҳтимолан беҳтар кардани самаранокии модел, коҳиши андозанокӣ барои тасвирсозии додаҳо низ бисёр муфид аст.

Агар шумораи андозаҳоро то ду ё се кам кунед, метавонед намуди фишурдаи маҷмӯи омӯзишии баландандозаро дар намудор нишон диҳед. Бо дидани қонуниятҳо, масалан, кластерҳо, аксаран ба хулосаҳои муҳим мерасед.

Ҳамчунин тасвирсозии додаҳо барои расондани хулосаҳо ба шахсоне, ки мутахассиси илми додаҳо нестанд, зарур аст. Ин махсусан ба шахсони қарорқабулкунанда дахл дорад, ки натиҷаҳои шуморо истифода мебаранд.

Дар ин боб аввал лаънати андозанокиро баррасӣ карда, мефаҳмем, ки дар фазои баландандоза чӣ рӯй медиҳад. Сипас ду равиши асосии коҳиши андозанокӣ — проексия ва омӯзиши манифолд-ро меомӯзем. Баъд се усули маъмулро баррасӣ мекунем: PCA, проексияи тасодуфӣ ва ҷойгиркунии маҳаллии хаттӣ — LLE.

Лаънати андозанокӣ

Мо ба зиндагӣ дар фазои сеандоза чунон одат кардаем, ки ҳангоми кӯшиши тасаввур кардани фазои баландандоза ҳисси дарки мо дигар дуруст кор намекунад.

Ҳатто тасаввур кардани гиперкуби содаи чорченака хеле душвор аст. Ба расми 7.1 нигаред. Пас дар бораи эллипсоиди 200-андозае, ки дар фазои 1 000-андоза хам шудааст, чӣ метавон гуфт?

Гиперкубҳои аз 0 то 4 андоза

Расми 7.1. Нуқта, порча, мураббаъ, куб ва тессеракт — гиперкубҳои аз 0 то 4 андоза.

Маълум мешавад, ки бисёр чизҳо дар фазои баландандоза тамоман дигар хел рафтор мекунанд.

Масалан, агар дар мураббаи воҳидӣ, яъне мураббаи 1×1, нуқтаи тасодуфӣ интихоб кунед, эҳтимоли дар масофаи камтар аз 0.001 аз сарҳад ҷойгир шудани он ҳамагӣ тақрибан 0,4% аст. Ба ибораи дигар, эҳтимоли он ки нуқтаи тасодуфӣ аз рӯйи яке аз андозаҳо дар наздикии ҳадди канорӣ бошад, хеле кам аст.

Аммо дар гиперкуби воҳидии 10 000-андоза ин эҳтимол аз 99,999999% зиёд мешавад. Аксари нуқтаҳои гиперкуби баландандоза ба сарҳади он хеле наздиканд.

Фарқи дигар боз ҳам мушкилтар аст. Агар дар мураббаи воҳидӣ ду нуқтаро тасодуфан интихоб кунед, масофаи миёнаи байни онҳо тақрибан 0.52 мешавад. Агар ду нуқтаи тасодуфиро дар куби воҳидии сеандоза интихоб кунед, масофаи миёна тақрибан 0.66 мешавад.

Аммо масофаи байни ду нуқтаи тасодуфӣ дар гиперкуби воҳидии 1 000 000-андоза чӣ қадар хоҳад буд? Бовар кунед ё не, масофаи миёна тақрибан 408.25 мешавад!

Ин ба ҳисси маъмулии мо мувофиқ нест: чӣ гуна ду нуқта метавонанд ин қадар аз ҳам дур бошанд, дар ҳоле ки ҳар ду дар дохили ҳамон як гиперкуби воҳидӣ ҷойгиранд? Сабаб он аст, ки дар фазои баландандоза ҷой хеле зиёд мебошад.

Дар натиҷа, маҷмӯаҳои баландандозаи додаҳо аксаран хеле тунук ҷойгир мешаванд: эҳтимол аксари намунаҳои омӯзишӣ аз ҳам дур бошанд. Аз ин рӯ, усулҳои омӯзише, ки ба масофа ё монандӣ такя мекунанд, масалан, k ҳамсояи наздиктарин, хеле камсамаратар мешаванд.

Баъзе навъҳои моделҳо бошанд, умуман қобили истифода намемонанд, зеро бо зиёд шудани андозанокии додаҳо хароҷоти онҳо хеле баланд мешавад. Масалан, ин метавонад ба SVM ё шабакаҳои нейронии пуррапайваст дахл дошта бошад.

Намунаҳои нав низ эҳтимол аз ҳамаи намунаҳои омӯзишӣ дур ҷойгир шаванд. Аз ин рӯ, пешгӯиҳо нисбат ба фазои камандоза камэътимодтар мешаванд, зеро ба экстраполятсияи хеле васеътар такя мекунанд.

Азбаски муайян кардани қонуниятҳои додаҳо душвортар мешавад, моделҳо нисбат ба ҳолати камандоза бештар ба ғавғо мутобиқ мешаванд. Бинобар ин, аҳаммияти мунтазамсозӣ боз ҳам зиёд мегардад. Ниҳоят, шарҳ додани моделҳо низ душвортар мешавад.

Аз ҷиҳати назариявӣ, баъзе аз ин мушкилҳоро бо зиёд кардани андозаи маҷмӯи омӯзишӣ ҳал кардан мумкин аст, то зичии намунаҳо кофӣ шавад. Мутаассифона, дар амал шумораи намунаҳои зарурӣ барои расидан ба зичии муайян бо зиёд шудани шумораи андозаҳо ба таври экспоненсиалӣ меафзояд.

Ҳатто бо ҳамагӣ 100 хусусият — ки аз шумораи хусусиятҳои MNIST хеле камтар аст — агар қимати ҳамаи онҳо аз 0 то 1 бошад, барои он ки масофаи миёнаи байни намунаҳо дар ҳудуди 0.1 бошад, шумораи намунаҳои лозим аз шумораи атомҳои Коиноти мушоҳидашаванда ҳам зиёдтар мешавад. Дар ин ҷо фарз шудааст, ки намунаҳо дар тамоми андозаҳо яксон паҳн шудаанд.

Равишҳои асосии коҳиши андозанокӣ

Пеш аз гузаштан ба алгоритмҳои мушаххас, ду равиши асосиро баррасӣ мекунем: проексия ва омӯзиши манифолд.

Проексия

Дар аксари масъалаҳои воқеӣ намунаҳои омӯзишӣ дар тамоми андозаҳо яксон паҳн нашудаанд. Бисёр хусусиятҳо қариб доимӣ ҳастанд, дар ҳоле ки баъзеи дигар бо ҳам вобастагии қавӣ доранд. Инро қаблан дар мисоли MNIST баррасӣ кардем.

Дар натиҷа, ҳамаи намунаҳои омӯзишӣ дар дохили зерфазои хеле камандозатари фазои баландандоза ё дар наздикии он ҷойгир мешаванд.

Ин суханон каме абстрактӣ садо медиҳанд, пас мисолеро мебинем. Дар расми 7.2 маҷмӯи сеандозаи додаҳо бо курачаҳои хурд нишон дода шудааст. Дар бахшҳои минбаъда чанд бор ба ин расм бармегардем.

Аҳаммият диҳед, ки ҳамаи намунаҳои омӯзишӣ дар наздикии як ҳамворӣ ҷойгиранд. Ин ҳамворӣ зерфазои камандоза, яъне дуандоза, дар дохили фазои баландандоза, яъне сеандоза, мебошад.

Агар ҳар намунаи омӯзиширо ба таври амудӣ ба ин зерфазо проексия кунем, маҷмӯи нави дуандозаи расми 7.3 ҳосил мешавад. Порчаҳои кӯтоҳи хатчин, ки намунаҳоро ба ҳамворӣ мепайванданд, ҳамин проексияро нишон медиҳанд.

Ҳамин тавр, андозанокии маҷмӯи додаҳоро аз се ба ду кам кардем!

Дар хотир доред, ки меҳварҳо ба хусусиятҳои нави z₁ ва z₂ мувофиқанд. Онҳо координатаҳои проексияҳо дар ҳамворӣ мебошанд.

Маҷмӯи сеандозаи додаҳо дар наздикии зерфазои дуандоза

Расми 7.2. Маҷмӯи сеандозаи додаҳо дар наздикии зерфазои дуандоза.

Маҷмӯи нави дуандоза пас аз проексия

Расми 7.3. Маҷмӯи нави дуандоза пас аз проексия.

Омӯзиши манифолд

Ҳарчанд проексия тез аст ва аксаран хуб кор мекунад, он на ҳамеша беҳтарин равиши коҳиши андозанокӣ мебошад.

Дар бисёр ҳолатҳо зерфазо метавонад хаму печ дошта бошад. Масалан, маҷмӯи додаҳои рулети швейтсарӣ (Swiss roll) дар расми 7.4 чунин аст: ин маҷмӯи намунавӣ аз нуқтаҳои сеандозае иборат мебошад, ки шакли рулети печонидаро доранд.

Маҷмӯи додаҳои рулети швейтсарӣ

Расми 7.4. Маҷмӯи додаҳои рулети швейтсарӣ.

Проексияи одӣ ба як ҳамворӣ, масалан, бо партофтани x₃, қабатҳои гуногуни рулетро рӯйи ҳам мефишорад. Ин дар тарафи чапи расми 7.5 нишон дода шудааст.

Эҳтимол шумо мехоҳед ба ҷойи ин рулетро кушоед, то маҷмӯи дуандозаи тарафи рости расми 7.5 ба даст ояд.

Фишурдани қабатҳо бо проексия ва кушодани рулети швейтсарӣ

Расми 7.5. Фишурдани қабатҳо бо проексия ба ҳамворӣ дар чап ва кушодани рулети швейтсарӣ дар рост.

Рулети швейтсарӣ намунаи манифолди дуандоза мебошад.

Ба таври сода, манифолди дуандоза шакли дуандозаест, ки метавонад дар фазои баландандоза хам ё печонида шавад.

Ба таври умумӣ, манифолди d-андоза қисми фазои n-андоза мебошад, ки дар он d<n аст ва дар наздикии ҳар нуқта ба гиперҳамвории d-андоза монанд мебошад.

Дар мисоли рулети швейтсарӣ d=2 ва n=3 аст: он дар ҳар минтақаи хурд ба ҳамвории дуандоза монанд аст, аммо дар андозаи сеюм печонида шудааст.

Бисёр алгоритмҳои коҳиши андозанокӣ, аз ҷумла LLE, Isomap, t-SNE ва UMAP, манифолдеро моделсозӣ мекунанд, ки намунаҳои омӯзишӣ дар он ҷойгиранд. Ин равишро омӯзиши манифолд меноманд.

Он ба фарзияи манифолд такя мекунад. Мувофиқи ин фарзия, аксари маҷмӯаҳои воқеии баландандозаи додаҳо дар наздикии манифолди хеле камандозатар ҷойгиранд. Ин фарзия дар амал бисёр вақт тасдиқ мешавад.

Боз маҷмӯи MNIST-ро ба хотир оред: ҳамаи тасвирҳои рақамҳои дастнавис баъзе монандиҳо доранд. Онҳо аз хатҳои пайваст иборатанд, канорҳояшон сафед аст ва рақамҳо каму беш дар марказ ҷойгиранд.

Агар тасвирҳоро тасодуфан тавлид кунед, танҳо ҳиссаи бениҳоят ночизи онҳо ба рақамҳои дастнавис монанд мешавад.

Ба ибораи дигар, ҳангоми сохтани тасвири рақам дараҷаҳои озодии шумо нисбат ба ҳолате, ки ҳар гуна тасвирро сохта метавонед, хеле камтаранд. Ин маҳдудиятҳо маҷмӯи додаҳоро ба дохили манифолди камандозатар мефишоранд.

Фарзияи манифолд аксаран бо фарзияи дигари ногуфта ҳамроҳ аст: агар вазифаи мавҷуда, масалан, таснифбандӣ ё регрессия, дар фазои камандозаи манифолд ифода шавад, ҳалли он содатар мегардад.

Масалан, дар сатри болоии расми 7.6 рулети швейтсарӣ ба ду синф ҷудо шудааст. Дар фазои сеандоза, аз чап, сарҳади қарор нисбатан мураккаб аст. Аммо дар фазои дуандозаи манифолди кушодашуда, аз рост, сарҳади қарор хати рост мебошад.

Бо вуҷуди ин, фарзияи мазкур на ҳамеша дуруст аст. Масалан, дар сатри поёнии расми 7.6 сарҳади қарор дар x₁=5 ҷойгир мебошад.

Ин сарҳад дар фазои аслии сеандоза хеле сода аст: як ҳамвории амудӣ. Аммо дар манифолди кушодашуда он мураккабтар менамояд ва аз чор порчаи алоҳидаи хат иборат мешавад.

Коҳиш додани андозанокии маҷмӯи омӯзишӣ пеш аз омӯзонидани модел одатан омӯзишро метезонад, аммо на ҳамеша ба роҳи ҳалли беҳтар ё содатар меорад. Ҳама чиз аз маҷмӯи додаҳо вобаста аст.

Коҳиши андозанокӣ одатан вақте самараноктар аст, ки шумораи намунаҳо нисбат ба шумораи хусусиятҳо кам бошад, махсусан агар додаҳо пурғавғо бошанд ё бисёр хусусиятҳо бо ҳам вобастагии қавӣ дошта бошанд, яъне маълумоти такрориро ифода кунанд.

Агар дар бораи раванди тавлидкунандаи додаҳо дониши соҳавӣ дошта бошед ва донед, ки он сода аст, пас фарзияи манифолд асос дорад ва эҳтимол коҳиши андозанокӣ муфид мешавад.

Акнун бояд тасаввури хубе дошта бошед, ки лаънати андозанокӣ чист ва алгоритмҳои коҳиши андозанокӣ чӣ гуна бо он мубориза мебаранд, махсусан вақте фарзияи манифолд иҷро мешавад.

Дар қисми боқимондаи боб баъзе алгоритмҳои маъмултарини коҳиши андозанокиро баррасӣ мекунем.

Сарҳади қарор дар фазои камандоза

Расми 7.6. Дар фазои камандоза сарҳади қарор на ҳамеша содатар мешавад.

PCA

Таҳлили ҷузъҳои асосӣ — PCA (Principal Component Analysis) — маъмултарин алгоритми коҳиши андозанокӣ мебошад.

Он аввал гиперҳамвориеро муайян мекунад, ки ба додаҳо аз ҳама наздиктар аст, сипас додаҳоро ба он проексия мекунад. Инро қаблан дар расми 7.2 дидем.

Нигоҳ доштани дисперсия

Пеш аз он ки маҷмӯи омӯзиширо ба гиперҳамвории камандозатар проексия кунед, бояд гиперҳамвории дурустро интихоб намоед.

Масалан, дар тарафи чапи расми 7.7 маҷмӯи содаи дуандозаи додаҳо ҳамроҳ бо се меҳвари гуногун, яъне се гиперҳамвории якандоза, нишон дода шудааст. Дар тарафи рост натиҷаи проексияи додаҳо ба ҳар яке аз ин меҳварҳо оварда шудааст.

Мебинед, ки проексия ба хати яклухт миқдори зиёди дисперсияро нигоҳ медорад — натиҷаи болоӣ. Проексия ба хати нуқтадор дисперсияи хеле камро нигоҳ медорад — натиҷаи поёнӣ. Проексия ба хати хатчин бошад, миқдори миёнаи дисперсияро нигоҳ медорад — натиҷаи мобайнӣ.

Интихоби зерфазо барои проексия

Расми 7.7. Интихоби зерфазо барои проексия.

Интихоби меҳваре, ки дисперсияи бештарро нигоҳ медорад, мантиқӣ менамояд, зеро эҳтимол он нисбат ба дигар проексияҳо маълумоти камтареро аз даст медиҳад.

Сояи худро дар замин ҳангоми рост дар болои сар будани Офтоб тасаввур кунед: он доғи хурдест, ки ба шумо чандон монанд нест. Аммо сояи шумо дар девор ҳангоми тулуи Офтоб хеле калонтар аст ва ба шумо монандӣ дорад.

Далели дигари интихоби меҳвари дорои дисперсияи максималӣ ин аст, ки ҳамин меҳвар миёнаи квадрати масофаи байни додаҳои аслӣ ва проексияи онҳоро ба он меҳвар низ камтарин мекунад.

PCA, ки ҳанӯз соли 1901 пешниҳод шуда буд, ба ҳамин ғояи нисбатан сода асос ёфтааст.

Ҷузъҳои асосӣ

PCA меҳвареро муайян мекунад, ки қисми калонтарини дисперсияи маҷмӯи омӯзиширо ифода менамояд. Дар расми 7.7 ин хати яклухт аст.

Ҳамчунин меҳвари дуюмеро меёбад, ки ба якум амудӣ аст ва қисми калонтарини дисперсияи боқимондаро ифода мекунад. Дар ин мисоли дуандоза интихоби дигаре нест: он хати нуқтадор мебошад.

Агар маҷмӯи додаҳо андозанокии баландтар медошт, PCA меҳвари сеюмеро низ меёфт, ки ба ҳар ду меҳвари пешина амудӣ бошад. Сипас меҳварҳои чорум, панҷум ва ғайраро меёфт — то шумораи меҳварҳо ба шумораи андозаҳои маҷмӯи додаҳо баробар шавад.

Меҳвари i-умро ҷузъи асосии i-уми додаҳо — PC (principal component) — меноманд.

Дар расми 7.7 ҷузъи асосии аввал меҳварест, ки вектори c₁ дар он ҷойгир аст. Ҷузъи асосии дуюм меҳварест, ки вектори c₂ дар он ҷойгир мебошад.

Дар расми 7.2 ду ҷузъи асосии аввал дар ҳамвории проексия ҷойгиранд, ҷузъи асосии сеюм бошад, меҳварест, ки ба ин ҳамворӣ амудӣ мебошад.

Пас аз проексия, дар расми 7.3 ҷузъи асосии аввал ба меҳвари z₁ ва дуюм ба меҳвари z₂ мувофиқ аст.

Эзоҳ. Барои ҳар ҷузъи асосӣ PCA вектори воҳидиеро меёбад, ки аз ибтидои координатаҳо оғоз шуда, дар самти он ҷузъ ҷойгир аст. Аммо самти ишораи вектор кафолат дода намешавад: агар маҷмӯи омӯзиширо андаке тағйир дода, PCA-ро аз нав иҷро кунед, вектор метавонад ба самти муқобил ишора кунад. Агар дисперсияҳо дар ду меҳвар хеле наздик бошанд, ҳатто мумкин аст ҷуфти векторҳо чарх зананд ё ҷой иваз кунанд. Аз ин рӯ, агар PCA-ро ҳамчун марҳалаи пешкоркард истифода баред, ҳар бор пас аз нав кардани табдилдиҳандаи PCA тамоми модели баъдиро аз нав омӯзонед. Дар акси ҳол, агар баромади нави PCA ба версияи пешина мувофиқ набошад, модел натиҷаҳои нодуруст медиҳад.

Ҷузъҳои асосии маҷмӯи омӯзиширо чӣ гуна ёфтан мумкин аст?

Хушбахтона, усули стандартии таҷзияи матритса бо номи таҷзияи қиматҳои сингулярӣ — SVD (singular value decomposition) — мавҷуд аст. Он матритсаи маҷмӯи омӯзишии X-ро ба ҳосили зарби се матритса таҷзия мекунад:

X = UΣVᵀ.

Матритсаи V векторҳои воҳидиеро дар бар мегирад, ки ҳамаи ҷузъҳои асосии ҷустуҷӯшавандаро бо тартиби дуруст муайян мекунанд. Ба муодилаи 7.1 нигаред.

Муодилаи 7.1. Матритсаи ҷузъҳои асосӣ.

    ⎛ │   │       │  ⎞
V = ⎜ c₁  c₂  ⋯   cₙ ⎟
    ⎝ │   │       │  ⎠

Коди зерини Python аз функсияи svd()-и NumPy истифода бурда, ҳамаи ҷузъҳои асосии маҷмӯи сеандозаи расми 7.2-ро ба даст меорад. Сипас ду вектори воҳидиеро ҷудо мекунад, ки ду ҷузъи асосии аввалро муайян менамоянд:

import numpy as np

X = [...]  # маҷмӯи хурди сеандозаи додаҳоро созед
X_centered = X - X.mean(axis=0)
U, s, Vt = np.linalg.svd(X_centered)
c1 = Vt[0]
c2 = Vt[1]

Огоҳӣ. PCA фарз мекунад, ки додаҳо дар атрофи ибтидои координатаҳо марказонида шудаанд. Тавре хоҳед дид, синфҳои PCA-и Scikit-Learn ин корро барои шумо анҷом медиҳанд. Агар PCA-ро худатон татбиқ кунед, мисли мисоли боло, ё аз китобхонаҳои дигар истифода баред, фаромӯш накунед, ки аввал додаҳоро марказонед.

Проексия ба d андоза

Пас аз муайян кардани ҳамаи ҷузъҳои асосӣ, метавонед андозанокии маҷмӯи додаҳоро то d кам кунед. Барои ин додаҳоро ба гиперҳамворие проексия мекунед, ки бо d ҷузъи асосии аввал муайян мешавад. Каме баъдтар тарзи интихоби d-ро баррасӣ мекунем.

Интихоби ҳамин гиперҳамворӣ кафолат медиҳад, ки проексия то ҳадди имкон дисперсияи бештарро нигоҳ дорад.

Масалан, дар расми 7.2 маҷмӯи сеандоза ба ҳамвории дуандозае проексия мешавад, ки ду ҷузъи асосии аввал муайян мекунанд. Дар ин раванд қисми зиёди дисперсияи додаҳо нигоҳ дошта мешавад. Дар натиҷа, проексияи дуандоза ба маҷмӯи аслии сеандоза хеле монанд аст.

Барои проексия кардани маҷмӯи омӯзишӣ ба гиперҳамворӣ ва гирифтани маҷмӯи камандозаи X_d-proj, матритсаи маҷмӯи омӯзишии X-ро ба матритсаи W_d зарб мекунед. Матритсаи W_d аз d сутуни аввали V иборат мебошад. Ба муодилаи 7.2 нигаред.

Муодилаи 7.2. Проексияи маҷмӯи омӯзишӣ ба d андоза.

X_d-proj = XW_d

Коди зерин маҷмӯи омӯзиширо ба ҳамвории муайянкардаи ду ҷузъи асосии аввал проексия мекунад:

W2 = Vt[:2].T
X2D = X_centered @ W2

Ҳамин тавр, акнун медонед, ки чӣ гуна андозанокии маҷмӯи додаҳоро то шумораи дилхоҳи андозаҳо кам кунед ва ҳамзамон то ҳадди имкон дисперсияи бештарро нигоҳ доред.

Истифодаи Scikit-Learn

Синфи PCA-и Scikit-Learn барои иҷрои PCA аз SVD истифода мебарад, ҳамон тавре ки қаблан худамон анҷом додем.

Коди зерин андозанокии маҷмӯи додаҳоро бо PCA то ду андоза кам мекунад. Аҳаммият диҳед, ки марказонидани додаҳо ба таври худкор анҷом дода мешавад:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X2D = pca.fit_transform(X)

Пас аз мутобиқ кардани табдилдиҳандаи PCA ба маҷмӯи додаҳо, атрибути components_ транспозашудаи матритсаи W_d-ро нигоҳ медорад: барои ҳар яке аз d ҷузъи асосии аввал як сатр дорад.

Ҳиссаи дисперсияи шарҳдодашуда

Маълумоти муфиди дигар ҳиссаи дисперсияи шарҳдодашуда (explained variance ratio) барои ҳар ҷузъи асосӣ мебошад. Он тавассути explained_variance_ratio_ дастрас аст.

Ин нишондиҳанда ҳиссаи дисперсияи маҷмӯи додаҳоро нишон медиҳад, ки дар самти ҳар ҷузъи асосӣ ҷойгир аст.

Масалан, ҳиссаҳои дисперсияи шарҳдодашудаи ду ҷузъи аввали маҷмӯи сеандозаи расми 7.2-ро мебинем:

>>> pca.explained_variance_ratio_
array([0.82279334, 0.10821224])

Ин натиҷа мегӯяд, ки тақрибан 82%-и дисперсияи додаҳо дар самти ҷузъи асосии аввал ва тақрибан 11% дар самти ҷузъи дуюм ҷойгир аст.

Барои ҷузъи сеюм тақрибан 7% боқӣ мемонад. Аз ин рӯ, фарз кардан мантиқист, ки ҷузъи сеюм эҳтимол маълумоти кам дорад.

Интихоби шумораи дурусти андозаҳо

Ба ҷойи он ки шумораи андозаҳои ниҳоиро худсарона интихоб кунед, содатар аст шумораеро интихоб намоед, ки дар маҷмӯъ ҳиссаи кофии дисперсияро, масалан, 95%-ро нигоҳ дорад.

Албатта, истисно ҳолатест, ки андозанокиро барои тасвирсозии додаҳо кам мекунед. Дар ин сурат, одатан мехоҳед онро то ду ё се андоза расонед.

Коди зерин маҷмӯи MNIST-ро бор карда, ҷудо мекунад ва PCA-ро бе кам кардани андозанокӣ иҷро менамояд. Сипас шумораи камтарини андозаҳои заруриро барои нигоҳ доштани 95%-и дисперсияи маҷмӯи омӯзишӣ ҳисоб мекунад:

from sklearn.datasets import fetch_openml

mnist = fetch_openml('mnist_784', as_frame=False, parser="liac-arff")
X_train, y_train = mnist.data[:60_000], mnist.target[:60_000]
X_test, y_test = mnist.data[60_000:], mnist.target[60_000:]

pca = PCA()
pca.fit(X_train)
cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95) + 1  # d ба 154 баробар аст

Баъд метавонед n_components=d гузошта, PCA-ро аз нав иҷро кунед. Аммо роҳи беҳтаре ҳаст.

Ба ҷойи муайян кардани шумораи ҷузъҳои асосӣ, метавонед ба n_components адади касрии байни 0.0 ва 1.0 диҳед. Он ҳиссаи дисперсияеро муайян мекунад, ки мехоҳед нигоҳ доред:

pca = PCA(n_components=0.95)
X_reduced = pca.fit_transform(X_train)

Шумораи воқеии ҷузъҳо ҳангоми омӯзиш муайян шуда, дар атрибути n_components_ нигоҳ дошта мешавад:

>>> pca.n_components_
np.int64(154)

Роҳи дигар ин аст, ки дисперсияи шарҳдодашударо ҳамчун функсияи шумораи андозаҳо дар намудор нишон диҳед. Барои ин кофист cumsum-ро тасвир кунед. Ба расми 7.8 нигаред.

Одатан дар каҷхат нуқтаи хамиш ё «оринҷ» пайдо мешавад, ки пас аз он дисперсияи шарҳдодашуда дигар босуръат зиёд намегардад.

Дар ин мисол мебинед, ки кам кардани андозанокӣ то тақрибан 100 андоза боиси аз даст рафтани миқдори зиёди дисперсияи шарҳдодашуда намешавад.

Дисперсияи шарҳдодашуда ҳамчун функсияи шумораи андозаҳо

Расми 7.8. Дисперсияи шарҳдодашуда ҳамчун функсияи шумораи андозаҳо.

Агар коҳиши андозанокиро ҳамчун марҳалаи пешкоркард барои вазифаи омӯзиши назоратшаванда, масалан, таснифбандӣ, истифода баред, метавонед шумораи андозаҳоро мисли ҳар гиперпараметри дигар танзим кунед. Ба боби 2 нигаред.

Масалан, коди зерин занҷираи думарҳилавӣ месозад: аввал андозанокиро бо PCA кам мекунад, сипас бо ҷангали тасодуфӣ таснифбандӣ менамояд.

Баъд аз RandomizedSearchCV истифода мебарад, то омезиши хуби гиперпараметрҳои ҳам PCA ва ҳам таснифгари ҷангали тасодуфиро ёбад.

Ин мисол ҷустуҷӯи зудро иҷро мекунад: танҳо ду гиперпараметр танзим мешаванд, омӯзиш дар ҳамагӣ 1 000 намуна анҷом меёбад ва ҷустуҷӯ танҳо 10 такрор дорад. Агар вақт дошта бошед, метавонед ҷустуҷӯи муфассалтар гузаронед:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
from sklearn.pipeline import make_pipeline

clf = make_pipeline(PCA(random_state=42),
                    RandomForestClassifier(random_state=42))
param_distrib = {
    "pca__n_components": np.arange(10, 80),
    "randomforestclassifier__n_estimators": np.arange(50, 500)
}
rnd_search = RandomizedSearchCV(clf, param_distrib, n_iter=10, cv=3,
                                random_state=42)
rnd_search.fit(X_train[:1000], y_train[:1000])

Беҳтарин гиперпараметрҳои ёфтшударо мебинем:

>>> print(rnd_search.best_params_)
{'randomforestclassifier__n_estimators': np.int64(475),
 'pca__n_components': np.int64(57)}

Ҷолиб аст, ки шумораи оптималии ҷузъҳо хеле кам мебошад: маҷмӯи 784-андозаро ба ҳамагӣ 57 андоза кам кардем!

Ин ба он вобаста аст, ки аз ҷангали тасодуфӣ истифода бурдем, ки модели хеле пуриқтидор мебошад. Агар ба ҷойи он модели хаттӣ, масалан, SGDClassifier, истифода мекардем, ҷустуҷӯ нишон медод, ки андозаҳои бештар — тақрибан 65–75 — бояд нигоҳ дошта шаванд (SGDClassifier бе random_state ҳар дафъа каме дигар натиҷа медиҳад).

Эзоҳ. Ғайр аз самаранокии пешгӯӣ, андоза ва суръати модел низ метавонанд барои шумо муҳим бошанд. Ҳар қадар андозаҳо камтар бошанд, модел хурдтар ва омӯзишу пешгӯӣ тезтар мешавад. Аммо агар додаҳоро аз ҳад зиёд фишурда кунед, маълумоти муфиди зиёдеро аз даст медиҳед ва модел ба каммутобиқшавӣ дучор мешавад. Барои вазифаи худ бояд тавозуни муносибро байни суръат, андоза ва самаранокӣ интихоб кунед.

PCA барои фишурдани додаҳо

Пас аз коҳиши андозанокӣ маҷмӯи омӯзишӣ ҷойи хеле камтар мегирад.

Масалан, пас аз татбиқи PCA ба MNIST бо нигоҳ доштани 95%-и дисперсия, ба ҷойи 784 хусусияти аслӣ 154 хусусият боқӣ мемонад.

Ҳамин тавр, андозаи маҷмӯи додаҳо аз 20%-и андозаи аслӣ ҳам камтар мешавад, дар ҳоле ки танҳо 5%-и дисперсияро аз даст додем!

Ин дараҷаи хуби фишурдан аст. Фаҳмидан осон аст, ки чунин камшавии андоза метавонад алгоритми таснифбандиро хеле тезонад.

Ҳамчунин мумкин аст маҷмӯи камандозашударо бо истифодаи табдили баръакси проексияи PCA боз ба 784 андоза баргардонед.

Ин додаҳои аслиро айнан барнамегардонад, зеро ҳангоми проексия як қисми маълумот, ки ба ҳамон 5%-и дисперсияи партофташуда дахл дошт, гум шудааст. Аммо натиҷа эҳтимол ба додаҳои аслӣ наздик хоҳад буд.

Миёнаи квадрати масофаи байни додаҳои аслӣ ва додаҳои барқароршуда, яъне додаҳои аввал фишурдашуда ва баъд бозкушодашуда, хатои бозсозӣ (reconstruction error) ном дорад.

Методи inverse_transform() имкон медиҳад, ки маҷмӯи камандозашудаи MNIST-ро боз ба 784 андоза баргардонем:

X_recovered = pca.inverse_transform(X_reduced)

Дар расми 7.9 чанд рақам аз маҷмӯи аслии омӯзишӣ, дар тарафи чап, ва рақамҳои мувофиқ пас аз фишурдану бозкушоӣ нишон дода шудаанд.

Мебинед, ки сифати тасвир андаке паст шудааст, аммо шакли рақамҳо асосан нигоҳ дошта шудааст.

Фишурдани MNIST бо нигоҳ доштани 95%-и дисперсия

Расми 7.9. Фишурдани MNIST бо нигоҳ доштани 95%-и дисперсия.

Муодилаи табдили баръакс дар муодилаи 7.3 оварда шудааст.

Муодилаи 7.3. Табдили баръакси PCA ва баргаштан ба шумораи аслии андозаҳо.

X_recovered = X_d-proj W_dᵀ

PCA-и тасодуфишуда

Агар гиперпараметри svd_solver-ро ба "randomized" гузоред, Scikit-Learn аз алгоритми стохастикие бо номи PCA-и тасодуфишуда истифода мебарад. Он тақриби d ҷузъи асосии аввалро зуд меёбад.

Мураккабии ҳисоббарории он чунин аст:

O(m × d²) + O(d³),

дар ҳоле ки барои SVD-и пурра чунин мебошад:

O(m × n²) + O(n³).

Аз ин рӯ, вақте d аз n хеле хурдтар аст, ин усул нисбат ба SVD-и пурра хеле тезтар кор мекунад:

rnd_pca = PCA(n_components=154, svd_solver="randomized", random_state=42)
X_reduced = rnd_pca.fit_transform(X_train)

Маслиҳат. Қимати пешфарзи svd_solver ба "auto" баробар аст. Агар додаҳои вурудӣ хусусиятҳои кам дошта бошанд — n10n — ҳалкунандаи "covariance_eigh" истифода мешавад, ки дар чунин шароит хеле тез аст. Дар акси ҳол, агар max(m,n)>500 бошад ва n_components адади бутуни аз 80%-и min(m,n) хурдтар бошад, ҳалкунандаи "randomized" истифода мешавад. Дар ҳолатҳои дигар SVD-и пурра иҷро мегардад. Агар хоҳед Scikit-Learn ҳатман SVD-и пурраро истифода барад ва ба ивази вақти бештари ҳисоббарорӣ натиҷаи андаке дақиқтар гиред, svd_solver="full" гузоред.

PCA-и афзоянда

Як мушкили татбиқҳои пешинаи PCA он аст, ки барои иҷрои алгоритм тамоми маҷмӯи омӯзишӣ бояд дар хотира ҷой гирад.

Хушбахтона, алгоритмҳои PCA-и афзоянда — IPCA (incremental PCA) таҳия шудаанд. Онҳо имкон медиҳанд маҷмӯи омӯзиширо ба бастаҳои хурд — mini-batches — ҷудо карда, онҳоро як-як ба алгоритм диҳед.

Ин барои маҷмӯаҳои калони омӯзишӣ ва истифодаи PCA дар реҷаи ҷорӣ, яъне ҳангоми ворид шудани намунаҳои нав, муфид аст.

Коди зерин маҷмӯи омӯзишии MNIST-ро бо функсияи array_split()-и NumPy ба 100 бастаи хурд ҷудо мекунад. Сипас онҳоро ба синфи IncrementalPCA-и Scikit-Learn медиҳад, то андозанокиро мисли пештара ба 154 кам кунад.

Аҳаммият диҳед, ки ба ҷойи даъвати fit() бо тамоми маҷмӯа, бояд барои ҳар бастаи хурд partial_fit()-ро даъват кунед:

from sklearn.decomposition import IncrementalPCA

n_batches = 100
inc_pca = IncrementalPCA(n_components=154)
for X_batch in np.array_split(X_train, n_batches):
    inc_pca.partial_fit(X_batch)

X_reduced = inc_pca.transform(X_train)

Роҳи дигар истифодаи синфи memmap-и NumPy мебошад. Он имкон медиҳад бо массиви калоне, ки дар файли дуӣ дар диск нигоҳ дошта шудааст, тавре кор кунед, ки гӯё тамоми он дар хотира бошад. Ин синф танҳо қисми лозимии додаҳоро дар вақти зарурӣ ба хотира бор мекунад.

Барои нишон додани ин равиш, аввал файли ба хотира хариташуда — memmap — месозем ва маҷмӯи омӯзишии MNIST-ро ба он нусхабардорӣ мекунем. Сипас flush()-ро даъват мекунем, то додаҳои дар кеш боқимонда низ ба диск навишта шаванд.

Дар ҳолати воқеӣ X_train одатан дар хотира намеғунҷад. Аз ин рӯ, шумо онро қисм-қисм бор карда, ҳар қисмро дар бахши мувофиқи массиви memmap нигоҳ медоред:

filename = "my_mnist.mmap"
X_mmap = np.memmap(filename, dtype='float32', mode='write', shape=X_train.shape)
X_mmap[:] = X_train  # метавон додаҳоро дар ҳалқа қисм-қисм нигоҳ дошт
X_mmap.flush()

Баъд метавонем файли memmap-ро кушода, мисли массиви муқаррарии NumPy истифода барем.

Барои кам кардани андозанокии он аз IncrementalPCA истифода мекунем. Азбаски алгоритм дар ҳар лаҳза танҳо бо қисми хурди массив кор мекунад, истифодаи хотира зери назорат мемонад.

Ин имкон медиҳад ба ҷойи partial_fit() методи муқаррарии fit()-ро даъват кунем, ки хеле қулай аст:

X_mmap = np.memmap(filename, dtype="float32", mode="readonly").reshape(-1, 784)
batch_size = X_mmap.shape[0] // n_batches
inc_pca = IncrementalPCA(n_components=154, batch_size=batch_size)
inc_pca.fit(X_mmap)

Огоҳӣ. Дар диск танҳо додаҳои хоми дуӣ нигоҳ дошта мешаванд. Аз ин рӯ, ҳангоми боркунӣ бояд навъи додаҳо ва шакли массивро муайян кунед. Агар шаклро нишон надиҳед, np.memmap() массиви якандоза бармегардонад.

Барои маҷмӯаҳои дорои андозанокии хеле баланд PCA метавонад аз ҳад суст бошад.

Тавре дидед, ҳатто агар PCA-и тасодуфишударо истифода баред, мураккабии ҳисоббарории он ҳанӯз ҳам чунин аст:

O(m × d²) + O(d³).

Аз ин рӯ, шумораи ниҳоии андозаҳо d набояд хеле калон бошад.

Агар бо маҷмӯае кор кунед, ки даҳҳо ҳазор хусусият ё бештар дорад, масалан, тасвирҳо, омӯзиш метавонад аз ҳад суст шавад. Дар ин ҳолат бояд истифодаи проексияи тасодуфӣ-ро баррасӣ кунед.

Проексияи тасодуфӣ

Тавре аз номаш бармеояд, алгоритми проексияи тасодуфӣ додаҳоро бо истифодаи проексияи хаттии тасодуфӣ ба фазои камандозатар мегузаронад.

Шояд ин фикр аҷиб намояд, аммо маълум мешавад, ки чунин проексияи тасодуфӣ бо эҳтимоли баланд масофаҳоро нисбатан хуб нигоҳ медорад. Уилям Б. Ҷонсон ва Ҷорам Линденштраус инро дар леммаи машҳури худ аз ҷиҳати математикӣ исбот кардаанд.

Ҳамин тавр, ду намунаи монанд пас аз проексия ҳам монанд мемонанд ва ду намунаи хеле гуногун ҳамоно аз ҳам фарқи зиёд доранд.

Албатта, ҳар қадар андозаҳои бештарро партоед, маълумоти бештар гум мешавад ва масофаҳо бештар таҳриф мегарданд. Пас шумораи оптималии андозаҳоро чӣ гуна интихоб кардан мумкин аст?

Ҷонсон ва Линденштраус муодилаеро пешниҳод карданд, ки шумораи камтарини андозаҳои нигоҳдошташавандаро муайян мекунад. Он бо эҳтимоли баланд таъмин менамояд, ки тағйири масофаҳо аз ҳадди таҳаммулпазирии муайян зиёд нашавад.

Масалан, фарз кунед, ки маҷмӯи додаҳои шумо m=5 000 намуна дорад ва ҳар намуна аз n=20 000 хусусият иборат аст. Шумо намехоҳед квадрати масофаи байни ягон ду намуна аз ε=10% бештар тағйир ёбад.

Дар ин ҳолат додаҳоро бояд ба фазои дорои d андоза проексия кунед, ки:

d ≥ 4 log(m) / (½ ε² − ⅓ ε³).

Дар ин мисол натиҷа 7 300 андоза мешавад. Ин коҳиши назарраси андозанокӣ аст!

Аҳаммият диҳед, ки дар муодила n истифода намешавад. Он танҳо ба m ва ε такя мекунад.

Ин муодила дар функсияи johnson_lindenstrauss_min_dim() татбиқ шудааст:

>>> from sklearn.random_projection import johnson_lindenstrauss_min_dim
>>> m, ε = 5_000, 0.1
>>> d = johnson_lindenstrauss_min_dim(m, eps=ε)
>>> d
np.int64(7300)

Акнун метавонем матритсаи тасодуфии P-ро бо шакли [d, n] созем. Ҳар унсури он аз тақсимоти гауссии дорои миёнаи 0 ва дисперсияи 1/d ба таври тасодуфӣ интихоб мешавад.

Сипас аз он барои проексия кардани додаҳо аз n андоза ба d андоза истифода мебарем:

n = 20_000
rng = np.random.default_rng(seed=42)
P = rng.standard_normal((d, n)) / np.sqrt(d)  # инҳирофи стандартӣ = √дисперсия

X = rng.standard_normal((m, n))  # сохтани маҷмӯи сунъии додаҳо
X_reduced = X @ P.T

Ҳамааш ҳамин аст! Ин равиш сода ва самаранок мебошад. Омӯзиш қариб фавран анҷом меёбад: барои сохтани матритсаи тасодуфӣ алгоритм танҳо шакли маҷмӯи додаҳоро бояд донад. Худи қиматҳои додаҳо умуман истифода намешаванд.

Аз ин рӯ, проексияи тасодуфӣ махсусан барои додаҳои дорои андозанокии хеле баланд, масалан, додаҳои матнӣ ё геномӣ бо миллионҳо хусусият, инчунин барои додаҳои хеле тунук мувофиқ аст. Барои чунин додаҳо ҳатто PCA-и тасодуфишуда метавонад вақти зиёд ва хотираи аз ҳад зиёд талаб кунад.

Ҳангоми пешгӯӣ проексияи тасодуфӣ мисли PCA тез аст: танҳо як зарби матритсаҳо иҷро мешавад.

Бо вуҷуди ин, проексияи тасодуфӣ ҳалли ҳама мушкилҳо нест. Он нисбат ба PCA каме бештар маълумоти муфидро аз даст медиҳад. Пас байни суръати омӯзиш ва самаранокӣ бояд тавозун интихоб кард.

Scikit-Learn синфи GaussianRandomProjection-ро пешниҳод мекунад, ки маҳз ҳамин корро иҷро мекунад.

Вақте методи fit()-и онро даъват мекунед, он бо johnson_lindenstrauss_min_dim() андозанокии баромадро муайян менамояд. Сипас матритсаи тасодуфӣ сохта, онро дар атрибути components_ нигоҳ медорад.

Ҳангоми даъвати transform() ҳамин матритса барои проексия истифода мешавад.

Ҳангоми сохтани табдилдиҳанда метавонед бо eps қимати ε-ро тағйир диҳед. Қимати пешфарзи он 0.1 аст. Ҳамчунин метавонед бо n_components шумораи муайяни андозаҳои ниҳоӣ d-ро маҷбуран таъин кунед.

Эҳтимол шумо мехоҳед ин гиперпараметрҳоро бо санҷиши салибӣ танзим намоед.

Коди зерин ҳамон кори коди пешинаро иҷро мекунад: матритсаи тасодуфиро бо ҳамон шакл ва ҳамон тақсимот месозад ва дар gaussian_rnd_proj.components_ нигоҳ медорад:

from sklearn.random_projection import GaussianRandomProjection

gaussian_rnd_proj = GaussianRandomProjection(eps=ε, random_state=42)
X_reduced = gaussian_rnd_proj.fit_transform(X)  # ҳамон тарзи проексия

Эзоҳи тарҷумон. Дар манбаъ гуфта мешавад, ки натиҷа айнан ҳамон аст ва components_ ба P баробар мебошад. Ин тавр нест: Scikit-Learn рақамҳои тасодуфиро бо np.random.RandomState(42) месозад, на бо np.random.default_rng(42), бинобар ин матритсаҳо аз ҷиҳати оморӣ якхелаанд, вале қиматҳояшон фарқ мекунанд.

Scikit-Learn табдилдиҳандаи дуюми проексияи тасодуфиро низ пешниҳод мекунад, ки SparseRandomProjection ном дорад.

Он андозанокии ниҳоиро бо ҳамон роҳ муайян мекунад, матритсаи тасодуфии ҳамон шаклро месозад ва проексияро ба ҳамон тарз иҷро менамояд.

Фарқи асосӣ ин аст, ки матритсаи тасодуфӣ тунук мебошад, яъне аксари унсурҳои он сифранд.

Ин маънои истифодаи хеле ками хотираро дорад: дар мисоли боло тақрибан 12 МБ ба ҷойи қариб 1,2 ГБ!

Сохтани матритсаи тасодуфӣ тезтар мешавад: дар ин мисол тақрибан ду баробар. Коҳиши андозанокӣ низ тезтар аст, вале фоидааш ба сахтафзор вобаста мебошад: дар як мошин якчанд баробар, дар дигаре қариб тафовуте намекунад.

Ғайр аз ин, агар додаҳои вурудӣ тунук бошанд, табдил онҳоро тунук нигоҳ медорад, магар ин ки dense_output=True гузоред.

Ниҳоят, ин равиш низ ҳамон хусусияти нигоҳ доштани масофаҳоро дорад ва сифати коҳиши андозанокӣ муқоисашаванда аст: саҳеҳии он танҳо андаке камтар мебошад.

Аз ин рӯ, одатан истифодаи ин табдилдиҳанда нисбат ба якум афзалтар аст, махсусан барои маҷмӯаҳои калон ё тунуки додаҳо.

Ҳиссаи унсурҳои ғайрисифрии матритсаи тасодуфии тунукро зичӣ, бо аломати r, меноманд. Қимати пешфарзи он r=1/√n аст, ки дар он n шумораи хусусиятҳост.

Бо 20 000 хусусият, ин маънои онро дорад, ки аз тақрибан ҳар 141 ҳуҷайраи матритса танҳо яктояш ғайрисифрӣ аст. Ин матритсаи хеле тунук мебошад!

Агар хоҳед, метавонед ба гиперпараметри density қимати дигар диҳед.

Ҳар ҳуҷайраи матритса эҳтимоли r-и ғайрисифрӣ будан дорад. Ҳар қимати ғайрисифрӣ ё −v ё +v аст ва эҳтимоли ҳар ду баробар мебошад; дар ин ҷо v=1/√(d r) ва d андозанокии мақсаднок аст.

Барои иҷрои табдили баръакс, аввал бояд псевдобаръакси матритсаи ҷузъҳоро бо функсияи pinv() ҳисоб кунед. Сипас додаҳои камандозашударо ба транспозашудаи он зарб намоед:

components_pinv = np.linalg.pinv(gaussian_rnd_proj.components_)
X_recovered = X_reduced @ components_pinv.T

Огоҳӣ. Агар матритсаи ҷузъҳо калон бошад, ҳисоб кардани псевдобаръакс метавонад вақти хеле зиёд гирад. Мураккабии ҳисоббарории pinv() дар ҳолати d<n ба O(dn²) ва дар ҳолати дигар ба O(nd²) баробар аст.

Проексияи тасодуфӣ алгоритми сода, тез, каммасраф аз ҷиҳати хотира ва ба таври ҳайратовар пуриқтидори коҳиши андозанокӣ мебошад. Онро махсусан ҳангоми кор бо маҷмӯаҳои баландандоза дар назар дошта бошед.

Эзоҳ. Проексияи тасодуфӣ на ҳамеша барои кам кардани андозанокии маҷмӯаҳои калони додаҳо истифода мешавад. Масалан, дар мақолаи соли 2017 Санҷой Дасгупта ва ҳамкоронаш нишон доданд, ки мағзи магаси мева механизми монанд ба проексияи тасодуфиро истифода мебарад. Он вурудҳои зич ва камандозаи бӯйро ба баромадҳои дуии тунук ва баландандоза табдил медиҳад: барои ҳар бӯй танҳо ҳиссаи хурди нейронҳои баромад фаъол мешавад, аммо бӯйҳои монанд бисёр нейронҳои якхеларо фаъол мекунанд. Ин ба алгоритми маъруфи ҳешкунии ҳассос ба наздикӣ — LSH (locality sensitive hashing) монанд аст, ки одатан дар муҳаррикҳои ҷустуҷӯ барои гурӯҳбандии ҳуҷҷатҳои монанд истифода мешавад. Ба боби 17 нигаред.

LLE

Ҷойгиркунии маҳаллии хаттӣ — LLE (locally linear embedding) усули коҳиши ғайрихаттии андозанокӣ — NLDR мебошад.

Ин усули омӯзиши манифолд аст ва бар хилофи PCA ва проексияи тасодуфӣ ба проексия такя намекунад.

LLE аввал муайян мекунад, ки ҳар намунаи омӯзишӣ бо ҳамсояҳои наздиктарини худ чӣ гуна робитаи хаттӣ дорад. Сипас намоиши камандозаи маҷмӯи омӯзиширо меҷӯяд, ки дар он ин робитаҳои маҳаллӣ то ҳадди имкон хуб нигоҳ дошта шаванд. Каме баъдтар тафсилоти онро мебинем.

Ин равиш махсусан барои кушодани манифолдҳои печида хуб кор мекунад, хусусан вақте ғавғо зиёд нест. Аммо он хуб миқёспазир намешавад, аз ин рӯ, асосан барои маҷмӯаҳои хурд ё миёна истифода мешавад.

Коди зерин рулети швейтсариро месозад ва сипас бо синфи LocallyLinearEmbedding-и Scikit-Learn онро мекушояд:

from sklearn.datasets import make_swiss_roll
from sklearn.manifold import LocallyLinearEmbedding

X_swiss, t = make_swiss_roll(n_samples=1000, noise=0.2, random_state=42)
lle = LocallyLinearEmbedding(n_components=2, n_neighbors=10, random_state=42)
X_unrolled = lle.fit_transform(X_swiss)

Тағйирёбандаи t массиви якандозаи NumPy аст, ки мавқеи ҳар намунаро дар тӯли меҳвари печидаи рулет нигоҳ медорад.

Дар ин мисол онро истифода намебарем, аммо барои вазифаи регрессияи ғайрихаттӣ метавон онро ҳамчун ҳадаф истифода бурд.

Маҷмӯи дуандозаи ҳосилшуда дар расми 7.10 нишон дода шудааст.

Рулети швейтсарии бо LLE кушодашуда

Расми 7.10. Рулети швейтсарии бо LLE кушодашуда.

Мебинед, ки рулет пурра кушода шудааст ва масофаҳои байни намунаҳо дар миқёси маҳаллӣ хуб нигоҳ дошта шудаанд.

Аммо дар миқёси калон масофаҳо нигоҳ дошта намешаванд: рулети кушодашуда бояд росткунҷа мебуд, на чунин тасмаи кашида ва печида.

Бо вуҷуди ин, LLE манифолдро хеле хуб моделсозӣ кардааст.

LLE чунин кор мекунад: барои ҳар намунаи омӯзишии x⁽ⁱ⁾, алгоритм k ҳамсояи наздиктаринро муайян мекунад. Дар коди боло k=10 буд.

Сипас мекӯшад x⁽ⁱ⁾-ро ҳамчун функсияи хаттии ин ҳамсояҳо бозсозӣ кунад.

Дақиқтар гӯем, он вазнҳои wᵢ,ⱼ-ро меҷӯяд, то квадрати масофаи байни x⁽ⁱ⁾ ва маҷмӯи вазндори ҳамсояҳои он то ҳадди имкон кам шавад. Дар ин ҷо фарз мешавад, ки агар x⁽ʲ⁾ яке аз k ҳамсояи наздиктарини x⁽ⁱ⁾ набошад, пас wᵢ,ⱼ=0 аст.

Ҳамин тавр, қадами аввали LLE масъалаи беҳинасозии дорои маҳдудиятҳо мебошад, ки дар муодилаи 7.4 тавсиф шудааст. Дар он W матритсаи ҳамаи вазнҳои wᵢ,ⱼ аст. Маҳдудияти дуюм вазнҳои ҳар намунаи омӯзишии x⁽ⁱ⁾-ро нормалсозӣ мекунад.

Муодилаи 7.4. Қадами якуми LLE: моделсозии хаттии робитаҳои маҳаллӣ.

Ŵ = argmin_W Σᵢ₌₁ᵐ ‖x⁽ⁱ⁾ − Σⱼ₌₁ᵐ wᵢ,ⱼ x⁽ʲ⁾‖² бо шартҳои

⎧ wᵢ,ⱼ = 0,         агар x⁽ʲ⁾ аз k ҳамсояи наздиктарини x⁽ⁱ⁾ набошад;
⎩ Σⱼ₌₁ᵐ wᵢ,ⱼ = 1     барои i = 1, 2, …, m.

Пас аз ин қадам матритсаи вазнҳои ёфтшуда робитаҳои хаттии маҳаллии байни намунаҳои омӯзиширо рамзгузорӣ мекунад.

Қадами дуюм ин аст, ки намунаҳо ба фазои d-андоза гузаронда шаванд, ки дар он d<n мебошад, ва робитаҳои маҳаллӣ то ҳадди имкон нигоҳ дошта шаванд.

Агар z⁽ⁱ⁾ намоиши x⁽ⁱ⁾ дар ин фазои d-андоза бошад, мо мехоҳем квадрати масофаи байни z⁽ⁱ⁾ ва маҷмӯи вазндори намоишҳои ҳамсояҳои он то ҳадди имкон хурд бошад.

Ин ғоя ба масъалаи беҳинасозии бе маҳдудияте меорад, ки дар муодилаи 7.5 тавсиф шудааст.

Он ба қадами аввал хеле монанд аст. Аммо ба ҷойи собит нигоҳ доштани намунаҳо ва ёфтани вазнҳои оптималӣ, акнун баръакс амал мекунем: вазнҳоро собит нигоҳ дошта, ҷойгиршавии оптималии намоишҳои намунаҳоро дар фазои камандоза меёбем.

Дар ин ҷо Z матритсаест, ки ҳамаи z⁽ⁱ⁾-ҳоро дар бар мегирад.

Муодилаи 7.5. Қадами дуюми LLE: коҳиши андозанокӣ бо нигоҳ доштани робитаҳо.

Ẑ = argmin_Z Σᵢ₌₁ᵐ ‖z⁽ⁱ⁾ − Σⱼ₌₁ᵐ ŵᵢ,ⱼ z⁽ʲ⁾‖²

Татбиқи LLE дар Scikit-Learn мураккабии ҳисоббарории зеринро дорад:

  • Барои ёфтани k ҳамсояи наздиктарин:

    O(m log(m) n log(k)).

  • Барои беҳинасозии вазнҳо:

    O(mnk³).

  • Барои сохтани намоишҳои камандоза:

    O(dm²).

Мутаассифона, мавҷудияти m² дар қисми охир боис мешавад, ки алгоритм барои маҷмӯаҳои хеле калон хуб миқёспазир набошад.

Тавре мебинед, LLE аз усулҳои проексионӣ хеле фарқ мекунад ва ба таври назаррас мураккабтар аст. Аммо он метавонад намоишҳои хеле беҳтари камандоза созад, махсусан агар додаҳо ғайрихаттӣ бошанд.

Усулҳои дигари коҳиши андозанокӣ

Пеш аз анҷом додани боб, чанд усули дигари маъмули дар Scikit-Learn мавҷудбударо кӯтоҳ баррасӣ мекунем.

sklearn.manifold.MDS

Миқёсбандии бисёрандоза — MDS (multidimensional scaling) андозанокиро кам карда, мекӯшад масофаи байни намунаҳоро нигоҳ дорад.

Проексияи тасодуфӣ низ барои додаҳои баландандоза ҳамин корро мекунад, аммо барои додаҳои камандоза хуб кор намекунад.

sklearn.manifold.Isomap

Isomap ҳар намунаро ба ҳамсояҳои наздиктаринаш пайваст карда, граф месозад. Сипас андозанокиро кам мекунад ва мекӯшад масофаҳои геодезӣ-и байни намунаҳоро нигоҳ дорад.

Масофаи геодезии байни ду гиреҳи граф дарозии кӯтоҳтарин роҳи байни онҳост: дар графи бевазн шумораи қирраҳои ин роҳ, дар Isomap-и Scikit-Learn бошад, суммаи масофаҳои евклидии қирраҳои он.

Эзоҳи тарҷумон. Дар манбаъ масофаи геодезӣ «шумораи гиреҳҳо дар кӯтоҳтарин роҳ» номида шудааст. Дурусташ шумораи қирраҳо (ё суммаи вазни онҳо) аст: ду гиреҳи ҳамсоя дар масофаи 1 ҷойгиранд, на 2.

Ин равиш вақте беҳтар кор мекунад, ки додаҳо дар манифолди нисбатан ҳамвор ва камандоза бо сохтори ягонаи умумӣ ҷойгир бошанд. Рулети швейтсарӣ намунаи чунин ҳолат аст.

sklearn.manifold.TSNE

Ҷойгиркунии стохастикии ҳамсояҳо бо тақсимоти t — t-SNE (t-distributed stochastic neighbor embedding) андозанокиро кам карда, мекӯшад намунаҳои монандро ба ҳам наздик ва намунаҳои гуногунро аз ҳам дур нигоҳ дорад.

Он асосан барои тасвирсозӣ истифода мешавад, махсусан барои нишон додани кластерҳои намунаҳо дар фазои баландандоза.

Масалан, бо t-SNE метавон харитаи дуандозаи тасвирҳои MNIST-ро сохт, ки дар он рақамҳои гуногун кластерҳои алоҳида ташкил медиҳанд.

Аммо ин усул барои истифода ҳамчун марҳалаи пешкоркарди модели омӯзиши мошинӣ пешбинӣ нашудааст.

sklearn.discriminant_analysis.LinearDiscriminantAnalysis

Таҳлили дискриминантии хаттӣ — LDA (linear discriminant analysis) алгоритми таснифбандии хаттӣ мебошад, ки ҳангоми омӯзиш меҳварҳои аз ҳама хуб ҷудокунандаи синфҳоро меомӯзад.

Баъд ин меҳварҳоро барои муайян кардани гиперҳамворие истифода бурдан мумкин аст, ки додаҳо ба он проексия мешаванд.

Бартарии ин равиш он аст, ки проексия синфҳоро то ҳадди имкон аз ҳам дур нигоҳ медорад.

Аз ин рӯ, LDA усули хуби коҳиши андозанокӣ пеш аз иҷрои алгоритми дигари таснифбандӣ мебошад, магар ин ки худи LDA барои ҳалли масъала кофӣ бошад.

Маслиҳат. Тақриб ва проексияи манифолди яксон — UMAP (Uniform Manifold Approximation and Projection) усули дигари маъмули коҳиши андозанокӣ барои тасвирсозӣ мебошад. t-SNE сохтори маҳаллӣ, махсусан кластерҳоро, беҳтар нигоҳ медорад. UMAP бошад, мекӯшад ҳам сохтори маҳаллӣ ва ҳам сохтори умумиро нигоҳ дорад. Ғайр аз ин, барои маҷмӯаҳои калон беҳтар миқёспазир мешавад. Он дар Scikit-Learn мавҷуд нест, аммо татбиқи хубаш дар бастаи umap-learn дастрас аст.

Дар расми 7.11 натиҷаҳои MDS, Isomap ва t-SNE барои рулети швейтсарӣ нишон дода шудаанд.

MDS рулетро ҳамвор мекунад, вале хамии умумии онро нигоҳ медорад. Isomap бошад, ин хамиро пурра бартараф мекунад.

Вобаста ба вазифаи минбаъда, нигоҳ доштани сохтори миқёси калон метавонад фоиданок ё номатлуб бошад.

t-SNE рулетро нисбатан хуб ҳамвор карда, қисми хамиро нигоҳ медорад. Ҳамзамон кластерҳоро барҷастатар месозад ва рулетро ба қисмҳо ҷудо мекунад.

Ин ҳам вобаста ба вазифаи минбаъда метавонад натиҷаи хуб ё бад бошад.

пешина
аз 20
навбатӣ