Das wahre Ausmaß des Fluchs der Dimensionalität visualisieren | von Florin Andrei | Mittel

0
25


Verwendung der Monte-Carlo-Methode zur Visualisierung des Verhaltens von Beobachtungen mit einer sehr großen Anzahl von Merkmalen

Stellen Sie sich einen Datensatz vor, der aus einer bestimmten Anzahl von Beobachtungen besteht, wobei jede Beobachtung N Merkmale aufweist. Wenn Sie alle Merkmale in eine numerische Darstellung umwandeln, könnten Sie sagen, dass jede Beobachtung ein Punkt in einem N-dimensionalen Raum ist.

Wenn N niedrig ist, entsprechen die Beziehungen zwischen den Punkten genau dem, was Sie intuitiv erwarten würden. Aber manchmal wird N sehr groß – das kann beispielsweise passieren, wenn Sie viele Options über One-Scorching-Codierung usw. erstellen. Bei sehr großen Werten von N verhalten sich Beobachtungen so, als ob sie spärlich wären oder als ob die Die Abstände zwischen ihnen sind irgendwie größer als man erwarten würde.

Das Phänomen ist actual. Wenn die Anzahl der Dimensionen N zunimmt und alles andere gleich bleibt, nimmt das N-Volumen, das Ihre Beobachtungen enthält, tatsächlich in gewissem Sinne zu (oder zumindest wird die Anzahl der Freiheitsgrade größer), und auch die euklidischen Abstände zwischen Beobachtungen nehmen zu . Die Punktegruppe wird tatsächlich spärlicher. Dies ist die geometrische Grundlage für der Fluch der Dimensionalität. Das Verhalten der auf den Datensatz angewendeten Modelle und Techniken wird als Folge dieser Änderungen beeinflusst.

Wenn die Anzahl der Funktionen sehr groß ist, kann viel schief gehen. Mehr Merkmale als Beobachtungen zu haben, ist ein typischer Aufbau für überangepasste Modelle im Coaching. Jede Brute-Power-Suche in einem solchen Bereich (z. B. GridSearch) wird weniger effizient – ​​Sie benötigen mehr Versuche, um die gleichen Intervalle entlang einer beliebigen Achse abzudecken. Ein subtiler Effekt wirkt sich auf alle Modelle aus, die auf Entfernung oder Nähe basieren: Wenn die Anzahl der Dimensionen auf einige sehr große Werte anwächst und Sie einen Punkt in Ihren Beobachtungen berücksichtigen, scheinen alle anderen Punkte weit entfernt und irgendwie nahezu gleich weit entfernt zu sein – Da diese Modelle für ihre Arbeit auf die Entfernung angewiesen sind, wird ihre Aufgabe durch den Ausgleich von Entfernungsunterschieden erheblich erschwert. Clustering funktioniert beispielsweise nicht so intestine, wenn alle Punkte nahezu den gleichen Abstand zu haben scheinen.

Aus all diesen und weiteren Gründen wurden Techniken wie PCA, LDA usw. entwickelt – in dem Bemühen, von der besonderen Geometrie von Räumen mit sehr vielen Dimensionen wegzukommen und den Datensatz auf eine Reihe weiterer Dimensionen zu reduzieren mit den darin enthaltenen tatsächlichen Informationen kompatibel sind.

Es ist schwierig, das wahre Ausmaß dieses Phänomens intuitiv zu erkennen, und Räume mit mehr als drei Dimensionen sind äußerst schwierig zu visualisieren. Lassen Sie uns daher einige einfache 2D-Visualisierungen erstellen, um unsere Instinct zu unterstützen. Es gibt eine geometrische Grundlage dafür, warum Dimensionalität zu einem Drawback werden kann, und das wollen wir hier veranschaulichen. Wenn Sie das noch nicht gesehen haben, könnten die Ergebnisse überraschend sein – die Geometrie hochdimensionaler Räume ist weitaus komplexer, als die typische Instinct vermuten lässt.

Stellen Sie sich ein Quadrat der Größe 1 vor, das im Ursprung zentriert ist. In das Quadrat schreiben Sie einen Kreis ein.

ein in ein Quadrat eingeschriebener Kreis
ein in ein Quadrat eingeschriebener Kreis

Das ist der Aufbau in 2 Dimensionen. Denken Sie nun im allgemeinen, N-dimensionalen Fall. In drei Dimensionen haben Sie eine Kugel, die in einen Würfel eingeschrieben ist. Darüber hinaus haben Sie eine N-Kugel, die in einen N-Würfel eingeschrieben ist, was die allgemeinste Artwork ist, es auszudrücken. Der Einfachheit halber werden wir diese Objekte als „Kugel“ und „Würfel“ bezeichnen, unabhängig davon, wie viele Dimensionen sie haben.

Das Volumen des Würfels ist fest, es ist immer 1. Die Frage ist: Was passiert mit dem Volumen der Kugel, wenn die Anzahl der Dimensionen N variiert?

Beantworten wir die Frage experimentell mit der Monte-Carlo-Methode. Wir werden eine sehr große Anzahl von Punkten generieren, die gleichmäßig, aber zufällig innerhalb des Würfels verteilt sind. Für jeden Punkt berechnen wir seinen Abstand zum Ursprung. Wenn dieser Abstand weniger als 0,5 (der Radius der Kugel) beträgt, liegt der Punkt innerhalb der Kugel.

zufällige Punkte
zufällige Punkte

Wenn wir die Anzahl der Punkte innerhalb der Kugel durch die Gesamtzahl der Punkte dividieren, erhalten wir ungefähr das Verhältnis des Volumens der Kugel zum Volumen des Würfels. Da das Volumen des Würfels 1 ist, ist das Verhältnis gleich dem Volumen der Kugel. Die Näherung wird besser, wenn die Gesamtpunktzahl groß ist.

Mit anderen Worten, das Verhältnis inside_points / total_points nähert sich dem Volumen der Kugel an.

Der Code ist ziemlich einfach. Da wir viele Punkte benötigen, müssen explizite Schleifen vermieden werden. Wir könnten NumPy verwenden, aber es ist nur CPU-basiert und Single-Threaded, daher wird es langsam sein. Mögliche Alternativen: CuPy (GPU), Jax (CPU oder GPU), PyTorch (CPU oder GPU) usw. Wir werden PyTorch verwenden – aber der NumPy-Code würde quick identisch aussehen.

Wenn Sie dem verschachtelten folgen torch Anweisungen generieren wir 100 Millionen zufällige Punkte, berechnen ihre Abstände zum Ursprung, zählen die Punkte innerhalb der Kugel und dividieren die Anzahl durch die Gesamtzahl der Punkte. Der ratio Das Array enthält am Ende das Volumen der Kugel in verschiedenen Dimensionen.

Die einstellbaren Parameter sind für eine GPU mit 24 GB Speicher festgelegt – passen Sie sie an, wenn Ihre {Hardware} anders ist.

system = torch.system("cuda:0" if torch.cuda.is_available() else "cpu")
# drive CPU
# system = 'cpu'

# cut back d_max if too many ratio values are 0.0
d_max = 22
# cut back n in case you run out of reminiscence
n = 10**8

ratio = np.zeros(d_max)

for d in tqdm(vary(d_max, 0, -1)):
torch.manual_seed(0)
# mix massive tensor statements for higher reminiscence allocation
ratio[d - 1] = (
torch.sum(
torch.sqrt(
torch.sum(torch.pow(torch.rand((n, d), system=system) - 0.5, 2), dim=1)
)
<= 0.5
).merchandise()
/ n
)

# clear up reminiscence
torch.cuda.empty_cache()

Lassen Sie uns die Ergebnisse visualisieren:



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here