Hi,
Stichwort: k-means-algorithms.
Ich möchte relativ leicht und schnell k-Punkte in einen n-dimensionalen Raum einfügen.
Irgendwas mit "random" ist mir zu unsicher, da dort die Möglichkeit besteht, dass die selben Punkte entstehen.
Hat jemand damit Erfahrung? Ich weiß auch nicht, wo im n-dimensionalen Raum die "Ecken" sind, falls es dort welche gibt.
Gruß
How to set k points in a n-dimensional space?
-
- User
- Beiträge: 439
- Registriert: Mittwoch 8. August 2018, 16:42
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
- __blackjack__
- User
- Beiträge: 14033
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@naheliegend: Also so ganz grundsätzlich ist die letzte Frage eigentlich erst einmal zu klären: Wie sieht der Wertebereich für die einzelnen Werte aus? Ganze Zahlen? Da dann Start- und Endwert? Oder Gleitkommazahlen? Zwischen -1 und 1? Oder andere Grenzen?
Falls es ganze Zahlen sind, kann man einfach ganze Zahlen zwischen 0 und dem Produkt der ”Ausdehnung” aller Dimensionen erstellen und die dann in Koordinaten umwandeln. Das ginge mit `range()` und `random.sample()`. Also angenommen man hat einen Würfel mit Koordinaten die jeweils von 0 bis 10 gehen, dann kann man einfach Zahlen zwischen 0 und 10³ ziehen und die dann in zwei Schritten mit `divmod()` auf drei Koordinatenwerte runterbrechen.
Falls es ganze Zahlen sind, kann man einfach ganze Zahlen zwischen 0 und dem Produkt der ”Ausdehnung” aller Dimensionen erstellen und die dann in Koordinaten umwandeln. Das ginge mit `range()` und `random.sample()`. Also angenommen man hat einen Würfel mit Koordinaten die jeweils von 0 bis 10 gehen, dann kann man einfach Zahlen zwischen 0 und 10³ ziehen und die dann in zwei Schritten mit `divmod()` auf drei Koordinatenwerte runterbrechen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
-
- User
- Beiträge: 439
- Registriert: Mittwoch 8. August 2018, 16:42
Danke...__blackjack__ hat geschrieben: Donnerstag 6. September 2018, 17:57 @naheliegend: Also so ganz grundsätzlich ist die letzte Frage eigentlich erst einmal zu klären: Wie sieht der Wertebereich für die einzelnen Werte aus? Ganze Zahlen? Da dann Start- und Endwert? Oder Gleitkommazahlen? Zwischen -1 und 1? Oder andere Grenzen?
Falls es ganze Zahlen sind, kann man einfach ganze Zahlen zwischen 0 und dem Produkt der ”Ausdehnung” aller Dimensionen erstellen und die dann in Koordinaten umwandeln. Das ginge mit `range()` und `random.sample()`. Also angenommen man hat einen Würfel mit Koordinaten die jeweils von 0 bis 10 gehen, dann kann man einfach Zahlen zwischen 0 und 10³ ziehen und die dann in zwei Schritten mit `divmod()` auf drei Koordinatenwerte runterbrechen.
Hatte eigentlich gedacht den min und max Wert für jeden Parameter zu finden und in diesem Bereich Werte zu würfeln.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
-
- User
- Beiträge: 439
- Registriert: Mittwoch 8. August 2018, 16:42
Aber ich habe es jetzt einfach so gemacht, dass ich mir zufällig Werte zwischen [-2, 2] erzeugen lasse, da durch die z-Standardisierung die Werte meistens in diesem Bereich liegen.
Erzeugt 3 centroids im n=20 dimensionalen Raum.
Sicher geht das schöner :- ] Habt Nachsicht mit mir.
Erzeugt 3 centroids im n=20 dimensionalen Raum.
Code: Alles auswählen
import random
def initial_centroids(number, dim):
init_cen = {}
for v in range(number):
init_cen[v] = []
for w in range(dim):
init_cen[v].append(random.uniform(-2.0, 2.0))
return init_cen
c={}
c = initial_centroids(3, 20)
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
-
- User
- Beiträge: 439
- Registriert: Mittwoch 8. August 2018, 16:42
Salz in die Wunde.__deets__ hat geschrieben: Freitag 7. September 2018, 09:50 Und was ist mit deiner Unsicherheit? Einfach wie weggeblasen? Denn dein Code adressiert die nicht. Und wozu baust du ein dictionary, wenn du einfach eine Liste nehmen könntest?

Finde Dictionaries irgendwie schöner. Und später habe ein Dict, wo ich die Punkte dem nächsten centroid zuordne.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
“Irgendwie schöner” ist ein ziemlich schlechtes Argument. Falsche Datenstrukturen führen zu falschen Programmen.
Und eine Lösung für den problem besteht darin, einen centroid mit allen bestehenden abzugleichen, ob er zu nah an einem bestehenden ist. Und ihn dann zu verwerfen, und einfach einen neuen zu erzeugen. Für kleine n ist das einfach zu machen. Erst bei großen müsste man über eine Optimierung Nachdenken.
Und eine Lösung für den problem besteht darin, einen centroid mit allen bestehenden abzugleichen, ob er zu nah an einem bestehenden ist. Und ihn dann zu verwerfen, und einfach einen neuen zu erzeugen. Für kleine n ist das einfach zu machen. Erst bei großen müsste man über eine Optimierung Nachdenken.