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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

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ß
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
__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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

__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.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
naheliegend
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.

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.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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?
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

__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.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

“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.
Antworten