2013-12-10 11 views
5

Ich möchte verschiedene Maschinenlernalgorithmen vergleichen. Als Teil davon muss ich in der Lage sein, eine grid search for optimal hyperparameters durchzuführen. Allerdings bin ich nicht wirklich auf die Idee, eine separate Implementierung einer Rastersuche für jeden festen Algorithmus und eine feste Teilmenge seiner Hyperparameter zu schreiben. Stattdessen möchte ich, dass es eher wie in scikit-learn aussieht, aber vielleicht mit nicht so viel Funktionalität (ich brauche zum Beispiel nicht mehrere Raster) und in MATLAB geschrieben.algorithm-agnostic hyperparameter Gittersuche in MATLAB

Bisher Ich versuche, die Logik des noch zu verstehen grid_search.m

function model = grid_search(algo, data, labels, varargin) 
    p = inputParser; 
    % here comes the list of all possible hyperparameters for all algorithms 
    % I will just leave three for brevity 
    addOptional(p, 'kernel_function', {'linear'}); 
    addOptional(p, 'rbf_sigma', {1}); 
    addOptional(p, 'C', {1}); 

    parse(p, algo, data, labels, varargin{:}); 

    names = fieldnames(p.Results); 
    values = struct2cell(p.Results); % a cell array of cell arrays 

    argsize = 2 * length(names); 
    args = cell(1, argsize); 
    args(1 : 2 : argsize) = names; 
    % Now this is the stumbling point. 
end 

Die Aufrufe an die grid_search Funktion geschrieben werden soll wie folgt aussehen:

m = grid_search('svm', data, labels, 'kernel_function', {'rbf'}, 'C', {[0.1], [1], [10]}, 'rbf_sigma', {[1], [2], [3]}) 
m = grid_search('knn', data, labels, 'NumNeighbors', {[1], [10]}, 'Distance', {'euclidean', 'cosine'}) 

Der erste Anruf dann würde versuchen, alle Kombinationen des RBF-Kernels mit Einschränkungen und Sigmas:

{'rbf', 0.1, 1} 
{'rbf', 0.1, 2} 
{'rbf', 0.1, 3} 
{'rbf', 1, 1} 
{'rbf', 1, 2} 
{'rbf', 1, 3} 
{'rbf', 10, 1} 
{'rbf', 10, 2} 
{'rbf', 10, 3} 

Die Idee hinter der args Variable ist, dass es ein Zellen-Array der Form {'name1', 'value1', 'name2', 'value2', ..., 'nameN', 'valueN'} ist, die später an den entsprechenden Algorithmus übergeben werden würde: algo(data, labels, args{:}). Der {'name1', 'name2', ..., 'nameN'} Teil davon ist einfach. Das Problem ist, dass ich nicht verstehen kann, wie man den {'value1', 'value2', ..., 'valueN'} Teil bei jedem Schritt erstellt.

verstehe ich, dass die Maschine Terminologie zu lernen ist nicht jedem bekannt weshalb unten kommt ein in sich geschlossenes Beispiel:

die Besatzung der TARDIS Angenommen der folgenden Klassen von Wesen bestehen:

tardis_crew = {{'doctor'}, {'amy', 'clara'}, {'dalek', 'cyberman', 'master'}} 

Da es immer nur ein Ort für einen Timelord ist, ein Begleiter und ein Schuft, mir bitte zeigen, wie die folgenden Zellenfelder zu generieren:

{'Timelord', 'doctor', 'Companion', 'amy', 'Villain', 'dalek'} 
{'Timelord', 'doctor', 'Companion', 'amy', 'Villain', 'cyberman'} 
{'Timelord', 'doctor', 'Companion', 'amy', 'Villain', 'master'} 
{'Timelord', 'doctor', 'Companion', 'clara', 'Villain', 'dalek'} 
{'Timelord', 'doctor', 'Companion', 'clara', 'Villain', 'cyberman'} 
{'Timelord', 'doctor', 'Companion', 'clara', 'Villain', 'master'} 

Die Lösung sollte allgemein sein, d. H. Wenn sich die Anzahl der Wesen in einer Klasse ändert oder mehr Klassen von Wesen hinzugefügt werden, sollte es immer noch funktionieren. Ich würde eine Schritt-für-Schritt-Beschreibung anstelle von Code auch sehr schätzen.

PS: Die non-stripped Github-Version des ursprünglichen grid_search.m könnte Ihnen eine bessere Vorstellung davon geben, was ich meine.

Antwort

2

Es scheint, dass Sie das kartesische Produkt einer beliebigen Anzahl von Sätzen generieren möchten. Ich denke, dass diese ALLCOMB Funktion das für Sie tun wird, aber wenn Sie Details eines (iterativen) Algorithmus wünschen, damit Sie es selbst implementieren können, überprüfen Sie this answer.

Bearbeiten: Vielen Dank für die Bereitstellung einer allgemeinen Formulierung für Menschen ohne ML-Kenntnisse.

+0

Ich bekam einen netten Trick '[A {:}] = ndgrid (varargin {:})' aus dem ALLCOMB Skript und überschrieb tatsächlich (löschte alle 'full()' Aufrufe) vom ursprünglichen 'ndgrid. m' Matlab-Funktion. Es funktioniert jetzt, aber ich habe ein sehr vages Verständnis davon. Wenn ich einen besseren bekomme, werde ich definitiv updaten. Für jetzt ist hier die [hackische Version] (https://gist.github.com/all3fox/615542bdaea8f41e7de1) – alisianoi