Kann cupy.mean() ein falsches Ergebnis liefern?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Was verstehst Du unter "Idiodensicher" ?

CuPy.mean() überlässt der GPU die Berechnung des arithmetischen Mittels. Und tut im Prinzip das selbe wie die Mittlwertfunktionen anderer Bibliotheken...

Das arithmetische Mittel ist immer empfindlich gegenüber "Ausreißern"...

Wenn Du den Mittelwert (...mean() ) eines Arrays von Messwerten berechnet, könnte folgendes Array eine Verzerrung bewirken...

2,3,5,5,51,4,1

Ein kleiner dummer Ausreißer... 51 und unser schöner Mittelwert fliegt uns um die Ohren.

...Auch wenn mean() keinen (Rechen)Fehler macht, das Ergebnis kann , in Folge von starken Abweichungen im Input , nicht den Erwartungen entsprechen.

....Insofern gibt's kein "Idiodensicher"

Ohne dass Du einen konkreten Verdacht lieferst, weshalb CuPy falsch rechnen sollte, wäre es müßig der Sache auf den Grund zu gehen.

Wenn Du begründete Zweifel hegst, vergleiche das Ergebnis mit der gleichnamigen Funktion von NumPy.


Trephleyck 
Fragesteller
 12.12.2023, 13:37

Ich meine, in C muss man mehr Mitdenken ,als bei Python. Also zB. Ist die maximale Zahl von float64 , die Zahl: 1,7976931348623157 × 10^308

Wenn zB. die Summe von Zwei Zahlen ,die maximale Zahl übersteigt, wird jedes mal die maximale Zahl geteilt.

Bzw. bei einer additon 4bit Zahl: 10 + 9 = 15 (2^5 - 1 ) oder 12 + 8 = 15 usw.

Dadurch ergibt eine es bei ca. die Hälfte ein Durchschnitt von 7,5 von zwei Zahlen.

U.a weis ich nicht, ob man es beachten muss oder es eine Fehlerhaft Abweichungen gibt. Wie die binäre Darstellung von 3,3333333333. Was bei der Berechnung ein Drift Verursachen kann.

0
Erzesel  12.12.2023, 17:50
@Trephleyck
Wenn zB. die Summe von Zwei Zahlen ,die maximale Zahl übersteigt, wird jedes mal die maximale Zahl geteilt.

Das liegt an der Art, wie Zahlen in einem IEEE_754 Register verarbeitet werden

Das für Computer verwendete IEEE_754-Format nimmt Rundungsfehler in kauf! Eine Addition unter ca 1E+291 fällt dabei garnicht ins Gewicht.

Wenn Du mit Deinen Berechnungen an den Limits des IEEE_754-Format arbeitest, musst Du mit Fehler akzeptieren.

Es obliegt dem Programmierer die verwendeten Zahlen entsprechend zu runden/normalisieren

Wenn Du mit einer Präzision jenseits IEEE754 rechnen musst, musst Du auf Bibliotheken wie

.umsteigen. Allerdings sind derartige Funktionen extrem langsam , da sie nicht mit den floatingpoint-Registern des Prozessors rechnen können.

was rechnest Du denn zusammen?

Bzw. bei einer additon 4bit Zahl: 10 + 9 = 15 (2^5 - 1 ) oder 12 + 8 = 15 usw.

bei mir ergibt:

  • 10 + 9 = 19
  • 2^5 - 1 =31 (2 hoch 5 ist 32)
  • 12 + 8 = 20

hexzahlen kannst Du nicht gemeint haben da wäre:

0x10 + 0x9 = 0x19 (= dezimal 25)

0x12 + 0x8 = 0x1A (= dezimal 26)

was die Mittelwerte angeht:
(10 + 9)/2 = 9.5
(12 + 8)/2 = 10

und 7.5 liegt tatsächlich in der Mitte zwischen 5 und 10 oder 6 und 9 ...etc.

0
Trephleyck 
Fragesteller
 12.12.2023, 21:07
@Erzesel

1. Ja, dass mit dem Maschinengenauigkeit hatte ich vergessen.

2. Habe Mist gemacht bei dem Bsp. . Wollte schreiben:

0xA + 0x9 = 0xF (10+9)

0xC + 0x8 = 0xF (12+8)

10000 Basis 2 = 2^5 = 0x10 (ich weiß, dass macht man nicht 😳)

Was ich bei ,,2^5 - 1,, meinte: 0x10 - 0x1 = 0xF 😳

Da es ein 4bit Bsp. ist, geht es nur zu 0xF. Und ich habe in Datentype von einer Ganzzahl gedacht.

3. Kann man ,,bigfloat,, ,,mpmath,, mit Cupy oder numba zusammen verwenden?

0
Erzesel  13.12.2023, 09:50
@Trephleyck

Wie wäre es, wenn Du es einfach mal ausprobierst ?

Normalerweise ist für die meisten Operationen die Maschinengenaugkeit völlig ausreichend. Wenn Du etwas vorhast, was an die Grenzen des Normalen stößt, musst eben selbst ausprobieren was geht (oder nicht)...

...ist ja nun keine Wissenschaft ein paar kleine Versuchsprogramme zu schreiben ...

Wenn ich beim programmieren eines größeren Projektes auf Probleme stoße, lege ich es kurz bei Seite und experimentiere mit den Funktionen, welche ich verwenden möchte oder deren Funktionsweise mir nicht klar ist...

1