Die Curse of Dimensionality kommt hier in die Quere. Sie könnten in Erwägung ziehen, die Hauptkomponentenanalyse (PCA) anzuwenden, um die Dimensionalität zu reduzieren, aber soweit ich weiß, hat niemand eine großartige Antwort darauf.
Ich habe mit dieser Art von Problem vor (in Audio-und Video-Fingerabdruck), manchmal mit bis zu 30 Dimensionen behandelt. Die Analyse ergab normalerweise, dass einige der Dimensionen keine relevanten Informationen für die Suche enthielten (eigentlich unscharfe Suche, mein Hauptziel), also habe ich sie aus den Indexstrukturen weggelassen, um auf die Daten zuzugreifen, aber sie in die Logik einbezogen, um Übereinstimmungen von a zu bestimmen Liste der Kandidaten, die während der Suche gefunden wurden. Dies reduzierte effektiv die Dimensionalität auf ein kontrollierbares Niveau.
Ich vereinfachte die Dinge weiter, indem ich die verbleibenden Dimensionen stark quantisierte, so dass der gesamte multidimensionale Raum in eine 32-Bit-Ganzzahl abgebildet wurde. Ich benutzte dies als Schlüssel in einer STL-Map (ein rot-schwarzer Baum), obwohl ich eine Hash-Tabelle hätte verwenden können. Ich konnte in einer Minute oder zwei Millionen solcher Datensätze dynamisch zu einer solchen Struktur hinzufügen (RAM-basiert), und die Suche dauerte durchschnittlich etwa eine Millisekunde, obwohl die Daten keineswegs gleichmäßig verteilt waren. Die Suche erforderte eine sorgfältige Aufzählung der Werte in den Dimensionen, die dem 32-Bit-Schlüssel zugeordnet wurden. Sie waren jedoch so zuverlässig, dass sie in einem kommerziellen Produkt verwendet werden konnten. Ich glaube, dass es bis heute in iTunes Match verwendet wird, wenn meine Quellen korrekt sind. :)
Die Quintessenz ist, dass ich empfehle Ihnen einen Blick auf Ihre Daten und tun etwas Brauch, das Features nutzt es für die schnelle Indizierung und Suche. Finde die Dimensionen, die am meisten variieren und voneinander am meisten unabhängig sind. Quantisieren Sie diese und verwenden Sie sie als Schlüssel in einem Index. Jeder Bucket im Index enthält alle Elemente, die diesen Schlüssel gemeinsam haben (es wird wahrscheinlich mehr als einen geben). Um die nächsten Nachbarn zu finden, klicken Sie auf "nahe" Tasten und suchen Sie in jedem Bereich nach Werten in der Nähe. Viel Glück.
p.s. Ich schrieb ein Papier über meine Technik, verfügbar here. Entschuldigung wegen der Paywall. Vielleicht finden Sie eine kostenlose Kopie an anderer Stelle. Lass es mich wissen, wenn du Fragen dazu hast.
Danke, aber ich möchte die Dimensionalität der Daten nicht reduzieren, da ich exaktes kNN im Originalraum haben möchte. –
Gut genug, obwohl ich nie den Wert gesehen habe, nach einer festen Anzahl von Nachbarn in unterschiedlicher Entfernung zu suchen. Die Suche nach einer variablen Anzahl von Nachbarn in einer festen Entfernung erschien mir immer praktischer. –
@Randall, schön. Bedeutet "32-Bit-Schlüssel in einer STL-Karte" eine exakte Übereinstimmung oder auch 32 1-Bit-Nachhölzer? Irgendwelche Ideen zu [bit-string-nearest-neighbour-searching] (http://stackoverflow.com/questions/9959728/bit-string-nearest-neighbour-searching) - sieht NP-komplett aus? – denis