2014-01-14 9 views
7

Ich muss die Histogramm-Schnittpunkt-Kernel-Matrizen für die Verwendung von LIBSVM in MATLAB vorberechnen.Wie vektorisiert man die Schnittpunktkernfunktion in MATLAB?

Angenommen, x, y sind zwei Vektoren. Die Kernfunktion ist K (x, y) = Summe (min (x, y)). Um effizient zu sein, sollten in den meisten Fällen die Operationen vektorisiert werden.

Was ich tun möchte, ist wie Berechnung der Kernel-Matrizen wie Berechnung der euklidischen Abstand zwischen zwei Matrizen, wie pdist2 (A, B, 'euklidischen'). Nachdem ich die Funktion 'intKernel' definiert hatte, konnte ich den Schnittstellenkern durch Aufruf von pdist2 (A, B, intKernel) berechnen.

Ich weiß, dass die Funktion 'pdist2' eine Option sein kann. Aber ich habe keine Ahnung, wie ich die selbstdefinierte Entfernungsfunktion schreiben soll. Ich weiß zwar nicht, wie ich den Schnittpunkt-Kernel zwischen Vektor (1-mal-M) und Matrix (M-mal-N) in einem Condens-Ausdruck kodieren soll.

"Repmat" möglicherweise nicht durchführbar, weil die Matrix wirklich groß ist, sagen wir, 20000-von-360000.

Jede Hilfe wäre willkommen.

Grüße, Peiyun

Antwort

2

Ich denke, pdist2 eine gute Wahl ist, so dass ich Ihnen helfen, Ihre Distanzfunktion zu definieren.

Gemäß dem Dokument muss die selbstdefinierte Abstandsfunktion 2 Eingänge haben: der erste ist ein 1-by-N-Vektor; Das zweite ist eine M-by-N-Matrix (sei vorsichtig mit der Reihenfolge!).

Um die Verwendung von repmat zu vermeiden, die in der Tat speicher consumant ist, können Sie bsxfun verwenden einige grundlegende Operationen auf Daten mit Expansion über Singletons Dimensionen anzuwenden. In Ihrem Fall können Sie das Folgende tun:

distance_kernel = @(x,Y) sum(bsxfun(@min,x,Y),2); 

Summation wird über die Spalten erfolgt eine Spaltenvektor als Ausgabe zu erhalten.

Dann rufen Sie einfach pdist2 und Sie sind fertig.

+0

Ich habe diese Art von Ausdruck zuvor versucht, während es für subskribierte Zuordnung Dimensionskonflikt verursachen würde. Zum Beispiel a = rand (1, 10); b = Rand (10, 10); pdist2 (a, b, @ (x, Y) Summe (bsxfun (@min, x, Y), 1)); – Peiyun

+0

Ich habe es herausgefunden. Der distance_kernel sollte sein: distance_kernel = @ (x, Y) Summe (bsxfun (@min, x, Y), 2), und es wird über Spalten summieren. – Peiyun

+0

@Peiyun Ja, du hast Recht, ich bearbeite meine Antwort. – Bentoy13