Support Vector Machine házi feladat

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor kérlek javíts rajta egy rövid szerkesztéssel.

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót


Forrás

Én javarészt ebből dolgoztam: http://www.ecs.soton.ac.uk/~srg/publications/pdf/SVM.pdf

Classification (pontok csoportosítása)

Az alapprobléma, amivel bevezetik az egészet, az az, hogy van a síkon egy rakás pontunk, festve vannak pirosra és kékre, és keresünk egy olyan egyenest, amely úgy választja szét őket, hogy az egyik oldalon kék, a másik oldalon piros pontjaink legyenek, mindezt optimálisan úgy, hogy az egyeneshez legközelebb eső piros pont távolságának és a legközelebb eső kék pont távolságának összege maximális legyen. 00 Az ábra megjelöli a szeparáló egyenest ténylegesen meghatározó pontokat, a support-vektorkat, ebből jó, ha kevés van. A fenti leírásban a (2.1) képlet adja meg a bemeneti problémát, az eredmény alakja (2.2), a jól-szeparálási feltétel a (2.4) , az optimalitási feltétel végül pedig a (2.6)-(2.7). Általánosabban viszont természetesen nem síkról és szeparáló egyenesről van szó, hanem bemeneti vektorokról és ezek terében vett szeparáló hipersíkról, ez viszont a képleteket már nem zavarja.

Egy egyszerű classification kód:

X = [[0 1];[1 -1];[2 1]];
Y = [1; -1; 1];
[nsv alpha bias] = svc(X,Y,'linear',10);
svcplot(X,Y,'linear',alpha,bias,0,1);

Játszani egyébként sokat lehet az =uiclass= formon, pl: svc1.gif

Generalised problémán a fenti doksi azt érti, hogy nem ijedünk meg, ha nem sikerül szeparálnunk az osztályokat, akkor is megadunk egy elválasztóegyenest, de úgy számolunk, hogy a rossz oldalra eső tanítópontoknál egy "büntetőfüggvényt" ( loss function ) használunk. Ezt a (2.5) ábra és az alatta levő képletek mutatják, én jelenleg ezen a ponton vesztem el a képletek fonalát :) 01

Ezután (2.3 fejezet) arról van szó, hogy az egyenessel nem szeparálható ponthalmazt hogyan is kezeljük. 02 Ekkor egy transzformációval (ez lesz a kernelfüggvény ) magasabb dimenzióba transzformáljuk az egész problémát, utána ott keresünk elválasztó (hiper)síkot. A hipersík ezután az eredeti problémán (pl síkban) ábrázolva úgy néz ki, mint egy magasabbrendű polinom. 03

A 3-mas fejezet ezekután különféle kernelfüggvényeket mutat be, mindezek matematikája szerintem már nem érdekel minket, annyit kell majd tudni, hogy milyen jellegű ponthalmazok osztályozására mely függvények lesznek hatékonyabbak (adnak optimálisabb szeparálást).

Regression (függvény approximációja)

Célszerű hozzá minimum átfutni az osztályozással foglalkozó részt.

Az 5-ös fejezet adja az osztályozási probléma átfogalmazását regressziós problémára. Regresszió esetén olyan egyenest keresünk, amelyhez a legközelebb esnek a tanítópontok (fent X). A közelség mértéke a doksiban négyféle lehet, mi majd az epszilon-intensive-el fogunk dolgozni, úgy néztem, amely epszilon-nál kisebb hibát tökéletességnek vesz.

Ha elég jól rásimul a tanítópontokra az approximációs görbe, akkor jó néhány pont az epszilon sávon belül lesz, ilyenkor ezeknél már 0 a loss function, így nem befolyásolják az approximációt, vagyis nem számítanak support vectornak. Ha a tanító pontoknak csak mondjuk 70%-a vagy akár csak 20%-a lett SV, akkor jól illik a függvény (vagy túl nagy lett az epszilon).

A nemlineáris probléma itt is ugyanúgy műküdik mind az osztályozásnál, tehát magasabb dimenzióban nézi az svm a problémát. Számunkra ez szemléletesen annyit jelent, hogy magasabbrendű függvényt adhatunk a pontok "fedésére". Az =uiregress= -el sokat lehet játszani svr1.gif, és a fenti doksiban és sok screenshot van példaként felhozva.

  • Valaki majd mondja el, mit kell csinálni, hogy az =uiregress= el is induljon! Nekem (Baba) nem fut.

Mindkét problémához jól használható a konzulensüktől kapott =start.m=.

Az ='rbf'= kernelfüggvény ajánlott, a globális =p1= (pé egy) változóba kell a szigma paramétert tenni, szigma = pi-nél kb. jó, ezt érdemes variálni, és az eredményeket nézegetni (buta vs. overfitting). Amit még variálni lehet, az a C (kb. mozgásszabadság a kernel megválasztásakor), epszilon (az epszilon-érzéketlenséghez) és a tanítópontok száma.

A függvényekről röviden:

  • Ha már kiválasztottuk kedvenc kernelünket, loss functionünket és paramétereinket, akkor az =svr= függvény tanítópontok X listájából és az ezen helyeken felvett Y függvényértékek listájából megépíti a support vector machinet.
  • Az eredményt egész jól megjeleníti az =svrplot= .
  • Az =svroutput= a már megépített svm-hez a tanítópontokon kívüli inputokra adott választ mondja meg.
  • Az =svrerror= pedig, ha a teljes inputlistára a valódi függvényértékeket is megmondjuk, kiszámolja, hogy mekkora egy adott loss function-nel az svm hibája.



-- FarkasGabor - 2005.11.20.