it-swarm.com.de

Nächste Nachbarn in hochdimensionalen Daten?

Ich habe eine Frage vor ein paar Tagen gefragt, wie man die nächstgelegenen Nachbarn für einen bestimmten Vektor findet. Mein Vektor hat jetzt 21 Dimensionen und bevor ich fortfahre, weil ich weder aus dem Bereich Machine Learning noch aus Mathe stamme, beginne ich mir einige grundlegende Fragen zu stellen:

  • Ist die euklidische Distanz eine gute Messgröße, um die nächsten Nachbarn überhaupt zu finden? Wenn nicht, was sind meine Optionen?
  • Wie kann man außerdem die richtige Schwelle für die Bestimmung der k-Nachbarn bestimmen? Gibt es eine Analyse, um diesen Wert herauszufinden?
  • Früher wurde mir vorgeschlagen, kd-Trees zu verwenden, aber die Wikipedia-Seite besagt eindeutig, dass kd-Tree für große Dimensionen fast einer Brute-Force-Suche entspricht. Wie kann in diesem Fall der nächste Nachbarn in einem Millionen-Punkt-Datensatz effizient gefunden werden?

Kann jemand bitte einige (oder alle) der obigen Fragen klären?

139
Legend

Ich studiere derzeit solche Probleme - Klassifizierung, nächster Nachbarn - zum Abrufen von Musikinformationen.

Möglicherweise interessieren Sie sich für Ungefährer nächster Nachbar (ANN). Die Idee ist, dass Sie dem Algorithmus erlauben, in der Nähe von Nachbarn (möglicherweise nicht dem nächsten Nachbarn) ausreichend zurückzukehren. Sie reduzieren dadurch die Komplexität. Sie erwähnten den kd-Baum; das ist ein Beispiel. Aber wie Sie sagten, funktioniert kd-tree in hohen Dimensionen schlecht. Tatsächlich verschlechtern sich all aktuelle Indexierungstechniken (basierend auf der Raumpartitionierung) zur linearen Suche nach ausreichend hohen Dimensionen [1] [2] [3].

Unter ANN Algorithmen vor kurzem vorgeschlagen, vielleicht der beliebteste ist Stelle Sensitive Hashing (LSH), die in einem Satz einen Satz von Punkten in einem hochdimensionalen Raum abbildet von Bins, dh eine Hash-Tabelle [1] [3]. Im Gegensatz zu traditionellen Hashes zeigt ein locality-sensitive -Hash near in dieselbe Ablage.

LSH hat einige große Vorteile. Erstens ist es einfach. Sie berechnen einfach den Hash für alle Punkte in Ihrer Datenbank und erstellen dann eine Hash-Tabelle. Zur Abfrage berechnen Sie einfach den Hashwert des Abfragepunkts und rufen dann alle Punkte in derselben Ablage aus der Hashtabelle ab.

Zweitens gibt es eine strenge Theorie, die seine Leistung unterstützt. Es kann gezeigt werden, dass die Abfragezeit sublinear in der Größe der Datenbank ist, d. H. Schneller als die lineare Suche. Wie viel schneller hängt davon ab, wie viel Annäherung wir tolerieren können.

Schließlich ist LSH mit jeder Lp-Norm für 0 < p <= 2 kompatibel. Um Ihre erste Frage zu beantworten, können Sie daher LSH mit der euklidischen Entfernungsmetrik oder mit der Manhattan-Metrik (L1) verwenden. Es gibt auch Varianten für Hamming-Distanz und Cosinus-Ähnlichkeit.

Eine anständige Übersicht wurde von Malcolm Slaney und Michael Casey für das IEEE Signal Processing Magazine im Jahr 2008 verfasst [4].

LSH wurde scheinbar überall angewendet. Vielleicht möchten Sie es einmal ausprobieren.


[1] Datar, Indyk, Immorlica, Mirrokni, "Locality-Sensitive Hashing Scheme basierend auf p-Stable Distributions", 2004.

[2] Weber, Schek, Blott, "Eine quantitative Analyse und Leistungsstudie für Ähnlichkeitssuchmethoden in hochdimensionalen Räumen", 1998.

[3] Gionis, Indyk, Motwani, "Ähnlichkeitssuche in hohen Dimensionen durch Hashing", 1999.

[4] Slaney, Casey, "Lokalität-sensitives Hashing, um nächstgelegene Nachbarn zu finden", 2008.

158
Steve Tjoa

I. Die Distanzmetrik

Erstens ist die Anzahl der Merkmale (Spalten) in einem Datensatz kein Faktor für die Auswahl einer Abstandsmetrik zur Verwendung in kNN. Es gibt einige veröffentlichte Studien, die sich genau mit dieser Frage befassen, und die üblichen Vergleichsgrundlagen sind:

  • die zugrunde liegende statistische Verteilung Ihrer Daten;

  • die Beziehung zwischen den Merkmalen, aus denen Ihre Daten bestehen (sind sie unabhängig - d. h. wie sieht die Kovarianzmatrix aus); und

  • der Koordinatenraum, aus dem Ihre Daten abgerufen wurden.

Wenn Sie keine Vorkenntnisse über die Distribution (en) haben, aus denen Ihre Daten entnommen wurden, kommt mindestens eine (gut dokumentierte und gründliche) Studie zu dem Schluss, dass die euklidische Distanz die beste Wahl ist.

YEuklidische Metrik, die in groß angelegten Web Recommendation Engines sowie in der aktuellen akademischen Forschung verwendet wird. Von Euklidischen berechnete Entfernungen haben eine intuitive Bedeutung und die Berechnungsskalen - das heißt, die euklidischen Entfernungen werden auf dieselbe Weise berechnet, unabhängig davon, ob sich die beiden Punkte in zwei Dimensionen oder im Raum mit zweiundzwanzig Dimensionen befinden.

Es ist für mich nur ein paar Mal fehlgeschlagen. Jeder dieser Fälle, die euklidische Distanz, ist fehlgeschlagen, weil das zugrunde liegende (kartesische) Koordinatensystem eine schlechte Wahl war. Und Sie werden dies normalerweise erkennen, weil zum Beispiel die Pfadlängen (Entfernungen) nicht mehr additiv sind - wenn der metrische Raum ein Schachbrett ist, ist die Manhattan-Entfernung besser als die euklidische, ebenso wenn der metrische Raum die Erde ist und Ihre Entfernungen trans sind - Kontinentalflüge, eine Entfernungsmessung, die für ein Polarkoordinatensystem geeignet ist, ist eine gute Idee (z. B. beträgt die Fahrzeit von London nach Wien 2,5 Stunden, von Wien nach St. Petersburg weitere 3 Stunden, mehr oder weniger in der gleichen Richtung, und von London nach St Petersburg ist nicht 5,5 Stunden, sondern etwas mehr als 3 Stunden.)

Abgesehen von den Fällen, in denen Ihre Daten zu einem nicht kartesischen Koordinatensystem gehören, ist die Auswahl der Entfernungsmetrik in der Regel nicht wesentlich. (Siehe dies Blog-Beitrag von einem CS-Studenten, der mehrere Entfernungsmetriken anhand ihrer Auswirkung auf den kNN-Klassifikator vergleicht - Chi-Quadrat liefert die besten Ergebnisse, aber die Unterschiede sind nicht groß. Eine umfassendere Studie ist in Die akademische Arbeit Vergleichsstudie der Distanzfunktionen für die nächsten Nachbarn - Mahalanobis (im Wesentlichen euklidisch normalisiert, um die Kovarianz der Dimensionen zu berücksichtigen) war die beste in dieser Studie.

Eine wichtige Voraussetzung: Damit Entfernungsmetrikberechnungen sinnvoll sind, müssen Sie Ihre Daten neu skalieren. - Selten ist es möglich, ein kNN-Modell zu erstellen, um genaue Vorhersagen zu erstellen, ohne dies zu tun. Wenn Sie beispielsweise ein kNN-Modell erstellen, um die sportliche Leistung vorherzusagen, und Ihre Erwartungsvariablen Größe (cm), Gewicht (kg), Körperfett (%) und Ruhepuls (Schläge pro Minute) sind, kann dies ein typischer Datenpunkt sein sieh ungefähr so ​​aus: [180.4, 66.1, 11.3, 71]. Offensichtlich wird die Entfernungsberechnung von der Höhe dominiert, während der Beitrag von Körperfett% nahezu vernachlässigbar sein wird. Anders ausgedrückt: Wenn stattdessen die Daten anders angegeben werden, sodass das Körpergewicht nicht in Kilogramm, sondern in Gramm angegeben wird, beträgt der ursprüngliche Wert von 86,1 86.100, was sich erheblich auf Ihre Ergebnisse auswirkt. Genau das tun Sie auch nicht wollen. Die wahrscheinlich gebräuchlichste Skalierungstechnik ist das Subtrahieren des Mittelwerts und Dividieren durch die Standardabweichung (Mittelwert und SD-Referenz werden für jede Spalte oder jedes Merkmal in diesem Datensatz separat berechnet; X bezieht sich auf einen einzelnen Eintrag/eine einzelne Zelle in einer Datenzeile):

X_new = (X_old - mu) / sigma


II. Die Datenstruktur

Wenn Sie sich Gedanken über die Leistung der kd-Baumstruktur machen, ist A Voronoi Tessellation ein konzeptionell einfacher Container, der jedoch die Leistung drastisch verbessert und besser skaliert als kd -Bäume.

dat

Dies ist nicht die gebräuchlichste Methode, um kNN-Trainingsdaten zu speichern, obwohl die Anwendung von VT für diesen Zweck sowie die daraus resultierenden Leistungsvorteile gut dokumentiert sind (siehe z. B. dies Microsoft Research-Bericht ). Die praktische Bedeutung davon ist, dass Sie, vorausgesetzt, Sie verwenden eine 'Mainstream'-Sprache (z. B. im TIOBE-Index ), eine Bibliothek finden sollten, um VT durchzuführen. Ich weiß, dass es in Python und R mehrere Optionen für jede Sprache gibt (z. B. das voronoi -Paket für R verfügbar unter CRAN )

Die Verwendung eines VT für kNN funktioniert folgendermaßen:

Wählen Sie aus Ihren Daten zufällig w Punkte aus - dies sind Ihre Voronoi-Zentren. Eine Voronoi-Zelle kapselt alle benachbarten Punkte, die jedem Zentrum am nächsten liegen. Stellen Sie sich vor, Sie weisen jedem Voronoi-Zentrum eine andere Farbe zu, sodass jeder einem bestimmten Zentrum zugewiesene Punkt mit dieser Farbe gezeichnet wird. Solange Sie eine ausreichende Dichte haben, werden auf diese Weise die Grenzen jedes Voronoi-Zentrums (als die Grenze, die zwei Farben trennt) gut angezeigt.

Wie wählt man die Voronoi-Zentren aus? Ich verwende zwei orthogonale Richtlinien. Berechnen Sie nach der zufälligen Auswahl der w-Punkte die VT für Ihre Trainingsdaten. Überprüfen Sie als nächstes die Anzahl der Datenpunkte, die jedem Voronoi-Zentrum zugewiesen sind - diese Werte sollten ungefähr gleich sein (gegebene gleichmäßige Punktdichte über Ihren Datenraum). In zwei Dimensionen würde dies ein VT mit Kacheln der gleichen Größe verursachen. Dies ist die erste Regel, hier die zweite. Wählen Sie w durch Iteration aus - führen Sie Ihren kNN-Algorithmus mit w als variablem Parameter aus und messen Sie die Leistung (Zeit, die erforderlich ist, um eine Vorhersage durch Abfragen des VT zurückzugeben).

Stellen Sie sich vor, Sie haben eine Million Datenpunkte. Wenn die Punkte in einer gewöhnlichen 2D-Datenstruktur oder in einem kd-Baum gespeichert wären, würden Sie im Durchschnitt ein paar Millionen Entfernungsberechnungen für durchführen. jeweils neue Datenpunkte, deren Antwortvariable Sie vorhersagen möchten. Natürlich werden diese Berechnungen an einem einzelnen Datensatz durchgeführt. Mit einem V/T wird die Suche nach dem nächsten Nachbarn in zwei Schritten nacheinander gegen zwei verschiedene Datenpopulationen durchgeführt - zuerst gegen die Voronoi-Zentren, dann, sobald das nächste Zentrum gefunden ist, entsprechen die Punkte innerhalb der Zelle Diese Zentren werden durchsucht, um den tatsächlich nächsten Nachbarn zu finden (durch aufeinanderfolgende Entfernungsberechnungen). Zusammen sind diese beiden Suchvorgänge viel schneller als ein einzelner Brute-Force-Suchvorgang. Das ist leicht zu erkennen: Angenommen, Sie wählen für 1 Million Datenpunkte 250 Voronoi-Zentren aus, um Ihren Datenraum zu unterteilen. Im Durchschnitt hat jede Voronoi-Zelle 4.000 Datenpunkte. Anstatt also durchschnittlich 500.000 Entfernungsberechnungen (Brute Force) durchzuführen, führen Sie weitaus weniger durch, durchschnittlich nur 125 + 2.000.

III. Berechnung des Ergebnisses (die vorhergesagte Antwortvariable)

Es gibt zwei Schritte, um den vorhergesagten Wert aus einem Satz von kNN-Trainingsdaten zu berechnen. Der erste ist das Identifizieren von n oder der Anzahl der nächsten Nachbarn , die für diese Berechnung verwendet werden sollen. Die zweite ist , wie ihr Beitrag zum vorhergesagten Wert gewichtet wird.

W/r/t die erste Komponente, können Sie den besten Wert von n durch Lösen eines Optimierungsproblems bestimmen (sehr ähnlich zur Optimierung der kleinsten Quadrate). Das ist die Theorie; In der Praxis verwenden die meisten Leute nur n = 3. In jedem Fall ist es einfach, Ihren kNN-Algorithmus über eine Reihe von Testinstanzen (zur Berechnung der vorhergesagten Werte) für n = 1, n = 2, n = 3 usw. auszuführen und den Fehler als Funktion von n zu zeichnen. Wenn Sie nur einen plausiblen Wert für n haben möchten, verwenden Sie einfach n = 3.

Die zweite Komponente ist, wie der Beitrag jedes Nachbarn gewichtet wird (unter der Annahme, dass n> 1 ist).

Die einfachste Gewichtungsmethode besteht darin, jeden Nachbarn mit einem Gewichtungskoeffizienten zu multiplizieren, der nur 1/(dist * K) oder der Kehrwert der Entfernung von diesem Nachbarn zur Testinstanz ist, die häufig mit einer empirisch abgeleiteten Konstante K multipliziert wird Ich bin kein Fan dieser Technik, weil sie die nächsten Nachbarn oft übergewichtet (und gleichzeitig die entfernteren untergewichtet). Die Bedeutung davon ist, dass eine gegebene Vorhersage fast vollständig von einem einzelnen Nachbarn abhängig sein kann, was wiederum die Empfindlichkeit des Algorithmus gegenüber Rauschen erhöht.

Eine unbedingt bessere Wichtungsfunktion, die diese Einschränkung weitgehend vermeidet, ist die Gaußsche Funktion , die in Python sieht aus wie das:

def weight_gauss(dist, sig=2.0) :
    return math.e**(-dist**2/(2*sig**2))

Um einen vorhergesagten Wert unter Verwendung Ihres kNN-Codes zu berechnen, identifizieren Sie die n nächsten Nachbarn zu dem Datenpunkt, dessen Antwortvariable Sie vorhersagen möchten ('Testinstanz'), und rufen dann die weight_gauss-Funktion auf, die einmal für jeden der n Nachbarn übergeben wird Diese Funktion gibt das Gewicht für jeden Nachbarn zurück, das dann als der Koeffizient dieses Nachbarn in der Berechnung des gewichteten Durchschnitts verwendet wird.

77
doug

Was Sie vor sich haben, ist bekannt als Fluch der Dimensionalität . Es ist manchmal nützlich, einen Algorithmus wie PCA oder auszuführen ICA um sicherzustellen, dass Sie wirklich alle 21 Dimensionen benötigen und möglicherweise eine lineare Transformation finden, die es Ihnen ermöglicht, weniger als 21 mit ungefähr derselben Ergebnisqualität zu verwenden.

Update: Ich bin auf sie in einem Buch namens Biomedical Signal Processing von Rangayyan gestoßen (ich hoffe, ich erinnere mich daran richtig). ICA ist keine triviale Technik, wurde aber von Forschern in Finnland entwickelt, und ich denke, dass Matlab-Code dafür öffentlich zum Download zur Verfügung steht. PCA ist eine weit verbreitete Technik, und ich glaube, Sie sollten in der Lage sein, R oder andere Software-Implementierungen zu finden. PCA wird durch iteratives Lösen linearer Gleichungen durchgeführt. Ich habe es schon zu lange gemacht, um mich daran zu erinnern, wie. =)

Die Idee ist, dass Sie Ihre Signale in unabhängige Eigenvektoren (wirklich diskrete Eigenfunktionen) und deren Eigenwerte aufteilen, 21 in Ihrem Fall. Jeder Eigenwert zeigt den Beitrag, den jede Eigenfunktion zu jeder Ihrer Messungen liefert. Wenn ein Eigenwert klein ist, können Sie die Signale sehr genau darstellen, ohne die entsprechende Eigenfunktion zu verwenden, und so werden Sie eine Dimension los.

15
Phonon

Die besten Antworten sind gut, aber alt, daher möchte ich eine 2016-Antwort addieren.


Wie gesagt, in einem hochdimensionalen Raum lauert der Fluch der Dimensionalität um die Ecke und macht die traditionellen Ansätze wie den beliebten k-d-Baum so langsam wie ein Brute-Force-Ansatz. Infolgedessen wenden wir unser Interesse an Approximate Nearest Neighbor Search (ANNS) an, was den Prozess zugunsten einer gewissen Genauigkeit beschleunigt. Sie erhalten eine gute Näherung der genauen NN mit einer guten Wahrscheinlichkeit.


Heiße Themen, die es wert sein könnten:

  1. Moderne Ansätze von [~ # ~] lsh [~ # ~] , wie Razenshteyn 's.
  2. RKD-Wald : Wald (e) von randomisierten kd-Bäumen (RKD), wie in [~ # ~] flann [~ # ~ beschrieben ] , oder in einem neueren Ansatz war ich Teil von kd-GeRaF .
  3. [~ # ~] lopq [~ # ~] steht für lokal optimierte Produktquantisierung, wie beschrieben hier . Es ist sehr ähnlich dem neuen Babenko + Lemptitsky Ansatz .

Sie können auch meine relevanten Antworten überprüfen:

  1. Zwei Sätze von hochdimensionalen Punkten: Finde den nächsten Nachbarn im anderen Satz
  2. Vergleich der Laufzeit von Nearest Neighbor-Abfragen auf verschiedenen Datenstrukturen
  3. PCL-KD-Tree-Implementierung extrem langsam
9
gsamaras

Um Ihre Fragen einzeln zu beantworten:

  • Nein, die euklidische Distanz ist eine schlechte Metrik im hochdimensionalen Raum. Grundsätzlich gibt es in großen Dimensionen wenig Unterschiede zwischen dem nächsten und dem nächsten Nachbarn.
  • Viele Arbeiten/Forschungsarbeiten sind in hochdimensionalen Daten enthalten, aber die meisten Dinge erfordern eine Menge mathematischer Erleichterung.
  • KD-Baum ist schlecht für hochdimensionale Daten. Vermeiden Sie es auf jeden Fall

Hier ist eine schöne Zeitung, damit Sie in die richtige Richtung gehen. " Wann ist in Nearest Neighbor sinnvoll ?" von Beyer et al.

Ich arbeite mit Textdaten der Abmessungen 20K und darüber. Wenn Sie einen textbezogenen Rat benötigen, kann ich Ihnen vielleicht helfen.

8
BiGYaN

Die Kosinusähnlichkeit ist eine übliche Methode zum Vergleichen von Vektoren hoher Dimension. Da es sich um eine Ähnlichkeit und nicht um eine Entfernung handelt, möchten Sie sie maximieren und nicht minimieren. Sie können auch eine domänenspezifische Methode zum Vergleich der Daten verwenden. Wenn Ihre Daten beispielsweise DNA-Sequenzen waren, könnten Sie eine Sequenzähnlichkeit verwenden, die die Wahrscheinlichkeit von Mutationen berücksichtigt.

Die Anzahl der nächsten Nachbarn hängt von der Art der Daten, der Geräuschentwicklung usw. ab. Es gibt keine allgemeinen Regeln. Sie müssen nur herausfinden, was für Ihre spezifischen Daten und Ihr Problem am besten ist, indem Sie alle Werte innerhalb eines Bereichs ausprobieren . Die Leute haben ein intuitives Verständnis dafür, dass je mehr Daten vorhanden sind, desto weniger Nachbarn brauchen Sie. In einer hypothetischen Situation, in der Sie alle möglichen Daten haben, müssen Sie nur den nächstgelegenen Nachbarn suchen, um sie zu klassifizieren.

Das k-Nearest-Neighbor-Verfahren ist bekanntermaßen rechenintensiv. Dies ist einer der Hauptgründe, warum sich andere Algorithmen wie Support-Vektor-Maschinen zuwenden.

5
Colin

kd-Bäume funktionieren mit hochdimensionalen Daten nicht wirklich gut. Da der Beschneidungsschritt nicht mehr viel hilft, ist die nächstliegende Kante - eine eindimensionale Abweichung - fast immer kleiner als die volldimensionale Abweichung zu den bekannten nächsten Nachbarn.

Darüber hinaus funktionieren kd-Bäume für alles, was ich weiß, nur gut mit Lp-Normen, und es gibt den Entfernungskonzentrationseffekt, der dazu führt, dass entfernungsbasierte Algorithmen mit zunehmender Dimensionalität abnehmen.

Für weitere Informationen möchten Sie vielleicht den Fluch der Dimensionalität und die verschiedenen Varianten davon nachlesen (es gibt mehr als eine Seite!)

Ich bin nicht überzeugt, dass es sehr nützlich ist, die nächsten Nachbarn von Euklidisch nur blind anzunähern, z. mit LSH oder zufälligen Projektionen. Eventuell ist es notwendig, eine viel feiner abgestimmte Abstandsfunktion zu verwenden!

4
Erich Schubert

KD Trees funktionieren gut für 21 Dimensionen, wenn Sie vorzeitig aufhören. Wenn Sie 5% aller Punkte sehen, sagen Sie FLANN tut dies (und andere Beschleunigungen) 128 -Dim SIFT-Vektoren. (Leider führt FLANN nur die euklidische Metrik.... Und die schnelle und solide scipy.spatial.cKDTree Führt nur Lp - Metriken aus...... Diese können für Ihre -Daten.) .__ Hier gibt es natürlich einen Kompromiss zwischen Geschwindigkeit und Genauigkeit.

(Wenn Sie Ndata, Nquery, Datenverteilung, Beschreiben könnten, könnte dies den Benutzern helfen, ähnliche Daten auszuprobieren.)

Hinzugefügt 26. April, Laufzeiten für cKDTree mit Cutoff auf meinem alten Mac-PPC, um eine sehr grobe Vorstellung von der Machbarkeit zu geben:

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=1000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.1 % of the 1000000 points, 0.31 % of 188315 boxes; better 0.0042 0.014 0.1 %
3.5 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.253

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=5000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.48 % of the 1000000 points, 1.1 % of 188315 boxes; better 0.0071 0.026 0.5 %
15 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.245
3
denis

Ich denke, Cosinus auf tf-idf von booleschen Funktionen würde für die meisten Probleme gut funktionieren. Das liegt daran, dass seine bewährte Heuristik in vielen Suchmaschinen wie Lucene zum Einsatz kommt. Die euklidische Distanz zeigt nach meiner Erfahrung schlechte Ergebnisse für alle textähnlichen Daten. Die Auswahl verschiedener Gewichtungen und K-Beispiele kann mit Trainingsdaten und der Auswahl von Brute-Force-Parametern erfolgen.

3
yura

Sie könnten eine z-Ordnungskurve versuchen. Es ist einfach für die 3-Dimension.

3
Bytemain

Viel hängt davon ab, warum Sie die nächsten Nachbarn kennenlernen möchten. Sie können in den mittleren Verschiebungsalgorithmus http://en.wikipedia.org/wiki/Mean- Shift schauen, wenn Sie wirklich die Modi Ihres Datensatzes suchen möchten. 

3
phunctor

die Entfernung ist wahrscheinlich die beste für das genaue Abrufen von Informationen in hochdimensionalen Daten. Sie können es als ungefähre Voronoi-Tessellation ansehen.

3
Tim

Ich habe das gleiche Problem erlebt und kann folgendes sagen. 

  1. Die euklidische Entfernung ist eine gute Entfernungsmetrik, jedoch ist sie rechnerisch teurer als die Manhattan-Entfernung und liefert manchmal etwas schlechtere Ergebnisse. Daher würde ich die spätere wählen.

  2. Der Wert von k kann empirisch ermittelt werden. Sie können verschiedene Werte ausprobieren und die resultierenden ROC-Kurven oder ein anderes Präzisions-/Abrufmaß prüfen, um einen akzeptablen Wert zu finden.

  3. Sowohl die euklidischen als auch die Manhattan-Entfernungen respektieren die Dreieck-Ungleichung , sodass Sie sie in metrischen Bäumen verwenden können. Tatsächlich ist die Leistung von KD-Bäumen stark beeinträchtigt, wenn die Daten mehr als 10 Dimensionen haben (ich habe dieses Problem selbst erlebt). Ich habe VP-Bäume als bessere Option gefunden.

2

Ist die euklidische Distanz eine gute Messgröße, um die nächsten Nachbarn überhaupt zu finden? Wenn nicht, was sind meine Optionen?

Ich würde vorschlagen soft subspace clustering , ein ziemlich gebräuchlicher Ansatz heutzutage, bei dem Feature-Gewichtungen berechnet werden, um die relevantesten Abmessungen zu finden. Sie können diese Gewichte beispielsweise verwenden, wenn Sie die euklidische Entfernung verwenden. Siehe Fluch der Dimensionalität für allgemeine Probleme und auch dieser Artikel kann Sie irgendwie aufklären:

Ein Clusteralgorithmus vom Typ k-mean für das Clustering von gemischten numerischen und kategorialen Datendatensätzen