Seite 1 von 1

How to set k points in a n-dimensional space?

Verfasst: Donnerstag 6. September 2018, 17:23
von naheliegend
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ß

Re: How to set k points in a n-dimensional space?

Verfasst: Donnerstag 6. September 2018, 17:57
von __blackjack__
@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.

Re: How to set k points in a n-dimensional space?

Verfasst: Freitag 7. September 2018, 09:06
von naheliegend
__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.
Danke...
Hatte eigentlich gedacht den min und max Wert für jeden Parameter zu finden und in diesem Bereich Werte zu würfeln.

Re: How to set k points in a n-dimensional space?

Verfasst: Freitag 7. September 2018, 09:33
von naheliegend
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.

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)
Sicher geht das schöner :- ] Habt Nachsicht mit mir.

Re: How to set k points in a n-dimensional space?

Verfasst: Freitag 7. September 2018, 09:50
von __deets__
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?

Re: How to set k points in a n-dimensional space?

Verfasst: Freitag 7. September 2018, 11:48
von naheliegend
__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?
Salz in die Wunde. :mrgreen: Mir fällt keine schnelle Lösung ein dieses Problem zu lösen.
Finde Dictionaries irgendwie schöner. Und später habe ein Dict, wo ich die Punkte dem nächsten centroid zuordne.

Re: How to set k points in a n-dimensional space?

Verfasst: Freitag 7. September 2018, 12:33
von __deets__
“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.