Séria "Classification Tree" obsahuje:
Classification Tree: 2D Problém
Definícia problému:
Máme n skupín dát, kde n je neznáme číslo. Použitím SVM algoritmu chceme postupne nájsť koeficienty všetkých sepáratov oddeľujúcich tieto skupiny. Počet všetkých separátov je (n-1). Nájdené koeficienty je ďalej potrebné uložiť do vhodnej dátovej štruktúry, aby sme ich mohli neskôr využiť v kroku klasifikácie.
Riešenie problému:
Aby sme nemuseli každý separátor hľadať manuálne, ako to bolo v predošlom príklade, na vyriešenie problému použijeme funkciu vytvorenú v Matlabe.
Funkcia create___nodes nájde koeficienty všetkých separátorov opakovaným volaním funkcie yalmip_SVM, ktorú som uverejnila v príspevku Yalmip & SVM: Universal Function, pomocou for slučiek.
Prvým vstupným parametrom do funkcie je premenná train_struct, ktorá je typu struct array a obsahuje polia name a data. V poli name sa nachádzajú mená jednotlivých skupín dát a v poli data tréningové matice. Premenná je rozmeru 1xn, kde n je počet všetkých skupín. Význam druhého vstupného parametru gamma je vysvetlený v článku Yalmip & SVM: Universal Function.
Ako sa pracuje s premennou typu struct array nájdeme napr. na stránke MathWorks.
function output = create_nodes(train_struct, gamma)
n = length(train_struct);
output = [];
for i = 1:(n-1)
train_class1 = train_struct(i).data;
train_class2 = [];
for j = (i+1):n
train_rest = train_struct(j).data;
train_class2 = [train_class2, train_rest];
end
[a_opt, b_opt] = yalmip_SVM(train_class1, train_class2, gamma);
node = [];
node.a = a_opt;
node.b = b_opt;
node.left = train_struct(i).name;
if (i == (n-1))
node.right = train_struct(end).name;
else
node.right = [];
end
output = [output, node];
end
end
Výstupom z funkcie je premenná output, tiež typu struct array rozmeru 1x(n-1). Táto premenná predstavuje náš klasifikačný strom zložený z jednotlivých uzlov. Pre 4 skupiny dát by takýto strom vyzeral nasledovne. (Môj algoritmus vytvára stromy, ktoré sa vždy ďalej vetvia smerom doprava.)
Premenná output obsahuje polia a, b, right a left. Oválnym uzlom postupne vypĺňame všetky tieto polia. Do polí a a b sa po jednotlivých iteráciach zapisujú hodnoty koeficientov separátorov. Polia left a right obsahujú informácie o dcérskych uzloch. Z obrázka vyplýva, že pole left bude vždy obsahovať názov skupiny. Do poľa right sa môže zapísať názov poslednej skupiny alebo podradený oválny uzol. Z rozmeru premennej vyplýva, že obsahuje iba oválne uzly. Kedže takéto uzly v sebe majú informáciu o pravej aj ľavej strane, je to postačujúce.