kleine Mathe-Spielereien

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

Immer noch auf das Suche nach verwertbaren synthetischen Daten
habe ich einmal Torch in einer eine MonteCarlo- Simulation verwendet .
Die erhaltenen Tensoren enthalten immer die notwenigen Kommata für eine
direkte Weiterverarbeitung.
Das ist bei numpy-arrays nicht der Fall.
Anbei der direkte Vergleich .

Gute Zeit OSWALD

Code: Alles auswählen


import torch
import matplotlib.pyplot as plt
import numpy as np

# Beispiel  mit TORCH   ergibt  direkt auswertbare  Daten  hier mit  1000 simulierten Endwerten
# plus  zusätzlicher Erweiterung der Datenmengen 

simulation_results = torch.randn(1000) * 10 + 50 # Beispiel-Daten
print("In diesem Tensor  sind die  Einzelwerte  durch Kommata getrennt : " )  
print("und deshalb für eine Weiterverarbeitung direkt verwendbar            : " , simulation_results)

# Tensor in NumPy-Array konvertieren
results_np = simulation_results.numpy()   
print("Nach  der Transformation  in einen numpy-array ")
print("ist das (ohne Kommata ) nicht mehr möglich :" , results_np)

# Histogramm plotten
plt.hist(results_np, bins=50, color='skyblue', edgecolor='black')
plt.title('Monte-Carlo-Simulation: Verteilung der Ergebnisse')
plt.xlabel('Wert')
plt.ylabel('Häufigkeit')
plt.axvline(np.mean(results_np), color='r', linestyle='--', label=f'Mittelwert: {np.mean(results_np):.2f}')
plt.legend()
plt.show()


OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

20.11.2025
Nach dieser Pseudo-Simulation ein weiteres
Beispiel zur synthetischen Datengewinnung.
OSWALD

Code: Alles auswählen


import torch
import numpy as np
import matplotlib.pyplot as plt

# Anzahl der Datenpunkte
n_samples = 100

# Feature (x) generieren: Zufällige Werte
# Wir verwenden torch.randn für eine Normalverteilung
x = torch.randn(n_samples, 3) * 10
print(x)
# Rauschen generieren
noise = torch.randn(n_samples, 1) * 2

# Target (y) generieren: y = 2*x + 5 + Rauschen (lineare Beziehung)
y = 2 * x + 5 + noise

# Visualisierung (optional)
# plt.scatter(x.numpy(), y.numpy())
# plt.xlabel("X")
# plt.ylabel("Y")
# plt.title("Synthetische Daten mit PyTorch")
# plt.show()





OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

20.11.2025
torch bietet zahlreiche Möglichkeiten
zur Generierung von verwertbaren synth. Daten
in beliebiger Menge. ein Beispiel
OSWALD

Code: Alles auswählen

import torch

torch.manual_seed(42) # Setzt den Seed für den CPU-Zufallszahlengenerator
matrix_a = torch.rand(4, 4,2)

torch.manual_seed(42)
matrix_b = torch.rand(6, 6,3)

print("Matrix A (mit Seed 42):\n", matrix_a)
print("Matrix B (mit demselben Seed 42):\n", matrix_b)
# matrix_a und matrix_b werden identisch sein

/code]
OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

21.11.2025
hier noch eine Auswahl zur Gewnerierung von Zufallsdaten mit torch
OSWALD

Code: Alles auswählen

import torch
# Create a 6x8 tensor with random values between 0 and 1
random_list = torch.rand(6,3 , 8)
print(random_list)


import torch
# Create a 2x2 tensor with random values from a normal distribution
normal_tensor = torch.randn(5, 5)
print(normal_tensor)

import torch
# Create a 4x3 tensor with random integers between 0 and 10
integer_tensor = torch.randint(0, 10, (6, 4))
print(integer_tensor)


import torch
# Set the random seed
torch.manual_seed(42)
# Create a 2x3 tensor with random values
seeded_tensor = torch.rand(5, 5)
print(seeded_tensor)




OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

21.11.2025
Hier ist etwas Geduld gefragt.
Mit jedem Start ein neues Bild, solange der Vorrat reicht.
Alles imSub-Bereich von Ki und mit torch.
ODSWAD

Code: Alles auswählen


#              Mit  jedem Start  einn neues Bild  
#              Laden eines Bildes mit Torchvision

import matplotlib.pyplot as plt
from torchvision import transforms
from PIL import Image
import requests
from io import BytesIO

# URL of the image
image_url = 'https://picsum.photos/200/300'

# Download the image
response = requests.get(image_url)
image = Image.open(BytesIO(response.content))

# Define a transform to convert the image to a tensor
transform = transforms.Compose([
    transforms.ToTensor()
])

# Apply the transform to the image
image_tensor = transform(image)

#Anzeigen des Bildes in Pytorch mit matplotlib
import matplotlib.pyplot as plt

# Convert the tensor to channel-last format
image_np = image_tensor.permute(1, 2, 0).numpy()
print("Das ist der Tensor   :",image_np)
print("shape          :  ",image_np.shape)
print("Size             :  ", image_np.size)  
# Display the image
plt.imshow(image_np)
#plt.axis('off')  # Turn off axis labels
plt.show()


OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

23.11.2025
Als dreht sich heute nur noch um KI.
Auf jede meiner Fragen im Net erhalte ich
(unter Google) sofort eine Antwort von einer KI.
Ich möchte aber wissen , was ich bis heute von Python
helernt habe.
Deshalb habe ich mir ein schwieriges Programm gesucht,
um meinen tatsächlichen Wissensstand zu kontrollieren.
Ich habe aufgegeben nach dem 'Stein der Weisen (KI)
zu suchen und 'wende mich wieder allein Python zu.'.

OSWALD

Code: Alles auswählen


Doppler-Effekt: Synchrone Audio- und Videoausgabe.

# In diesem Programm wird nicht nur die Bewegung von Quelle und
       #Beobachter animiert dargestellt, sondern auch die Ausbreitung der
#Wellenzüge.


import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.animation
import sounddevice

# Simulationsdauer [s] und Abtastrate [1/s].
t_max = 32.0
abtastrate = 44100
# Frequenz, mit der die Quelle Schallwellen aussendet [Hz].
f_Q = 300.0
# Frequenz, mit der die dargestellten Wellenzüge ausgesendet
# werden [Hz].
f_Q_graph = 1.0
# Ausbreitungsgeschwindigkeit der Welle [m/s].
c = 20.0
# Lege die Startposition der Quelle und des Beobachters fest [m].
startort_Q = np.array([-150.0, 5.0])
startort_B = np.array([0.0, -5.0])
# Lege die Geschwindigkeit von Quelle und Beobachter fest [m/s].
v_Q = np.array([10.0, 0.0])
v_B = np.array([0.0, 0.0])
# Dargestellter Koordinatenbereich [m].
plotbereich_x = (-160, 160)
plotbereich_y = (-30, 30)


def signal_quelle(t):
    """Ausgesendetes Signal als Funktion der Zeit."""
    signal = np.sin(2 * np.pi * f_Q * t)
    signal[t < 0] = 0.0
    return signal


# Erzeuge ein Array von Zeitpunkten und lege ein leeres Array
# für das vom Beobachter empfangene Signal an.
t = np.arange(0, t_max, 1 / abtastrate)
signal_beob = np.zeros(t.size)

# Berechne für jeden Zeitpunkt die Positionen von Quelle und
# Beobachter.
r_Q = startort_Q + v_Q * t.reshape(-1, 1)
r_B = startort_B + v_B * t.reshape(-1, 1)

# Berechne für jeden Zeitpunkt t, zu dem der Beobachter ein
# Signal auffängt, die Zeitdauer dt, die das Signal
# von der Quelle benötigt hat. Dazu ist eine quadratische
# Gleichung der Form
#             dt² - 2 a dt - b = 0
# mit den unten definierten Größen a und b zu lösen.
r = r_B - r_Q
a = np.sum(v_Q * r, axis=1) / (c ** 2 - v_Q @ v_Q)
b = np.sum(r ** 2, axis=1) / (c ** 2 - v_Q @ v_Q)

# Berechne für jeden Zeitpunkt die beiden Lösungen der
# quadratischen Gleichung.
dt1 = a + np.sqrt(a ** 2 + b)
dt2 = a - np.sqrt(a ** 2 + b)

# Berücksichtige das Signal der positiven Lösungen.
# Beachte, dass die Amplitude mit 1/r abfällt.
idx1 = dt1 > 0
abstand = c * dt1[idx1]
signal_beob[idx1] = signal_quelle(t[idx1] - dt1[idx1]) / abstand

idx2 = dt2 > 0
abstand = c * dt2[idx2]
signal_beob[idx2] += signal_quelle(t[idx2] - dt2[idx2]) / abstand

# Normiere das Signal auf den Wertebereich -1 ... +1.
if np.max(np.abs(signal_beob)) > 0:
    signal_beob = signal_beob / np.max(np.abs(signal_beob))

# Erzeuge eine Figure und eine Axes.
fig = plt.figure(figsize=(12, 6))
fig.set_tight_layout(True)
ax = fig.add_subplot(1, 1, 1)
ax.grid()
ax.set_xlim(plotbereich_x)
ax.set_ylim(plotbereich_y)
ax.set_aspect('equal')
ax.set_xlabel('$x$ [m]')
ax.set_ylabel('$y$ [m]')

# Erzeuge zwei Kreise für Quelle und Beobachter.
kreis_quelle = mpl.patches.Circle((0, 0), radius=1.5,
                                  visible=False, color='black',
                                  fill=True, zorder=4)
ax.add_patch(kreis_quelle)
kreis_beobachter = mpl.patches.Circle((0, 0), radius=1.5,
                                      visible=False, color='blue',
                                      fill=True, zorder=4)
ax.add_patch(kreis_beobachter)

# Lege eine Liste an, die die kreisförmigen Wellenzüge speichert.
kreise = []

# Startindex für die nächste Audioausgabe.
audio_index = 0


def audio_callback(outdata, frames, time, status):
    """Stelle neue Audiodaten zur Ausgabe bereit."""
    global audio_index

    # Gib im Fehlerfall eine Fehlermeldung aus.
    if status:
        print(status)

    # Extrahiere den benötigten Ausschnitt aus den Daten. Durch
    # das Slicing kann es passieren, dass 'audiodaten' weniger
    # Datenpunkte als die Anzahl der 'frames' enthält.
    audiodaten = signal_beob[audio_index: audio_index + frames]

    # Schreibe die Daten in das Ausgabe-Array.
    outdata[:audiodaten.size, 0] = audiodaten

    # Fülle das Ausgabe-Array ggf. mit Nullen auf.
    outdata[audiodaten.size:, 0] = 0.0

    # Erhöhe den Index um die Anzahl der verwendeten Datenpunkte.
    audio_index += audiodaten.size


def update(n):
    """Aktualisiere die Grafik zum n-ten Zeitschritt."""
    # Ignoriere den von der Animation übergebenen Bildindex n und
    # verwende stattdessen den Index, der sich aus der
    # Audioausgabe ergibt, sodass Audio- und Videoausgabe synchron
    # erfolgen.
    n = min(audio_index, t.size - 1)

    # Aktualisiere die Positionen von Quelle und Beobachter.
    kreis_quelle.center = r_Q[n]
    kreis_beobachter.center = r_B[n]
    kreis_quelle.set_visible(True)
    kreis_beobachter.set_visible(True)

    # Erzeuge zum Startzeitpunkt einen neuen Kreis oder wenn
    # seit dem Aussenden des letzten Wellenzuges mehr als eine
    # Periodendauer vergangen ist.
    if not kreise or t[n] >= kreise[-1].startzeit + 1 / f_Q_graph:
        kreis = mpl.patches.Circle(kreis_quelle.center, radius=0,
                                   color='red', linewidth=1.5,
                                   fill=False, zorder=3)
        kreis.startzeit = t[n]
        kreise.append(kreis)
        ax.add_patch(kreis)

    # Aktualisiere die Radien aller dargestellten Kreise.
    for kreis in kreise:
        kreis.radius = (t[n] - kreis.startzeit) * c

    # Färbe den Beobachter rot, wenn ein Wellenzug auftrifft.
    kreis_beobachter.set_color('blue')
    for kreis in kreise:
        d = np.linalg.norm(kreis.center - kreis_beobachter.center)
        if abs(d - kreis.radius) < kreis_beobachter.radius:
            kreis_beobachter.set_color('red')

    # Färbe die Quelle rot, wenn ein Wellenzug ausgesendet wird.
    d = np.linalg.norm(kreise[-1].center - kreis_quelle.center)
    if abs(d - kreise[-1].radius) < kreis_quelle.radius:
        kreis_quelle.set_color('red')
    else:
        kreis_quelle.set_color('black')

    return kreise + [kreis_quelle, kreis_beobachter]


# Erzeuge einen Ausgabestrom für die Audioausgabe.
stream = sounddevice.OutputStream(abtastrate, channels=1,
                                  callback=audio_callback)

# Erzeuge die Animation.
ani = mpl.animation.FuncAnimation(fig, update,
                                  interval=30, blit=True)

# Starte die Audioausgabe und die Animation.
with stream:
    plt.show(block=True)








OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

2q4.11.2025
In Ergänzung zu den obigen Beispielen mit Torch.
Vom Zufallsgenerator für synth.Daten zu
Tensoren und zur bitmap ---> 'Bild'
Datenmege nach oben ..... hardware
Gute Zeit OSWALD

Code: Alles auswählen



#  1.                              Erzeugung von Zufalls-Matrizen  und Tensoren
#  2.                              Erstellung einer  Bitmap  aus  Tensoren
import torch 
x = torch.rand((6,8, 3 ))   #    Matrix (hier   2D  und Farbe    -> Bild)
print(x)

 
#################################
import matplotlib.pyplot as plt
import numpy as np 
from bitmap import BitMap
tensor  = ([[[0.2752, 0.2771, 0.2272],
         [0.0216, 0.8198, 0.7874],
         [0.1280, 0.9265, 0.3432],
         [0.1446, 0.2345, 0.7920],
         [0.8068, 0.3140, 0.9211],
         [0.0259, 0.0333, 0.3102],
         [0.1606, 0.8945, 0.3264],
         [0.0832, 0.6151, 0.8872]],

        [[0.6397, 0.0602, 0.7886],
         [0.5545, 0.7710, 0.5090],
         [0.3861, 0.1520, 0.1537],
         [0.7465, 0.0316, 0.7108],
         [0.9825, 0.8839, 0.6118],
         [0.7419, 0.0893, 0.9006],
         [0.0721, 0.5595, 0.8934],
         [0.2904, 0.1725, 0.3220]],

        [[0.2637, 0.6273, 0.3890],
         [0.9703, 0.6399, 0.8096],
         [0.0013, 0.2654, 0.3301],
         [0.2378, 0.4126, 0.4720],
         [0.9360, 0.6645, 0.7847],
         [0.0470, 0.4570, 0.7433],
         [0.4580, 0.9922, 0.9418],
         [0.2662, 0.8459, 0.6025]],

        [[0.1408, 0.0032, 0.7725],
         [0.0298, 0.5469, 0.7878],
         [0.7678, 0.3125, 0.1460],
         [0.0501, 0.4877, 0.9303],
         [0.8927, 0.6384, 0.7855],
         [0.0932, 0.2247, 0.9271],
         [0.5782, 0.0564, 0.2795],
         [0.8985, 0.5049, 0.2210]],

        [[0.9450, 0.2706, 0.7669],
         [0.5578, 0.5603, 0.5820],
         [0.3710, 0.8383, 0.7674],
         [0.2861, 0.4116, 0.8847],
         [0.4335, 0.1761, 0.5212],
         [0.1821, 0.3320, 0.7835],
         [0.2771, 0.0595, 0.2235],
         [0.5497, 0.5970, 0.0776]],

        [[0.1234, 0.9276, 0.6487],
         [0.2229, 0.2746, 0.5632],
         [0.6341, 0.1391, 0.6137],
         [0.2288, 0.8777, 0.2009],
         [0.2771, 0.5167, 0.9786],
         [0.0094, 0.8415, 0.7888],
         [0.5392, 0.0812, 0.9291],
         [0.9139, 0.0344, 0.0937]]]) 
plt.imshow(tensor)
plt.colorbar()
plt.show()

OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

24.11.2025
der neu erzeugte Tensor muss natürlich a
jedes Mal usgetauscht werden
OSWALD
OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

26.11.25
mit 8 GB RAM sind 30x30 BitMaps mit Tensoren
in Torch nicht mehr darstellbar.

Deshalb werde ich meinen PC mit
2 mal 16 GB aufpeppen.
für windows 10 scheint mir das der beste Weg zu sein
OSWALD
S innvoll?
Benutzeravatar
__blackjack__
User
Beiträge: 14251
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ausgehen von einer 30×30 Bitmap mit sagen wir mal vier Kanälen (RGBA) und 8 Byte pro Wert (Gleitkommazahlen), also 28,800 Bytes, ist es sehr sinnvoll 32 GiB RAM zu installieren wenn man das in 8 GiB nicht mehr untergebracht bekommt. :-D
“All tribal myths are true, for a given value of 'true'.” — Terry Pratchett, The Last Continent
OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

@_blackjack
Leider ist daraus bis jetzt nichts geworden.
bei Mediamarkt online angeblich vorrätig, vor vOrt heute
wegen Knappheit nicht lleferbar. Preis 3 mal höher als vor.her
Jetzt neuer Versuch bei anderem Händler.
Oder warten bis .....C.
OSWALD
OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

30.11.2025.
Hier weitere Methoden zur Vermehrung von synth. Daten,u.a.
durch broacasting von tensoren. oder multiplikation
OSWALD

Code: Alles auswählen


import torch

tensor_a = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(tensor_a)

tensor_b = torch.tensor([[110, 120, 130]]) 
print(tensor_b)


broadcasted_result = tensor_a + tensor_b 
print(f"Broadcasted Addition Result: \n{broadcasted_result}")

matrix_multiplication_result = torch.matmul(tensor_a, tensor_a.T)
print(f"Matrix Multiplication Result (tensor_a * tensor_a^T): \n{matrix_multiplication_result}")

 




OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

4.12.2025

Im Gegensatz zur Beschaffung von ' DDR4 32 GB RAM'
war der Einbau in meinen PC ein Kinderspiel.
Hier nun ein Beispiel. Ich habe die Obergrenze der Leistung
noch nicht ausgetestet.
Gute Zeit OSWALD

Code: Alles auswählen


#              Laden eines Bildes mit Torchvision bei 32 GB RAM

import matplotlib.pyplot as plt
from torchvision import transforms
from PIL import Image
import requests
from io import BytesIO

# URL of the image
image_url = 'https://picsum.photos/2000/3000'

# Download the image
response = requests.get(image_url)
image = Image.open(BytesIO(response.content))

# Define a transform to convert the image to a tensor
transform = transforms.Compose([
    transforms.ToTensor()
])

# Apply the transform to the image
image_tensor = transform(image)

#Anzeigen des Bildes in Pytorch mit matplotlib
import matplotlib.pyplot as plt

# Convert the tensor to channel-last format
image_np = image_tensor.permute(1, 2, 0).numpy()
print("Das ist der Tensor   :",image_np)
print("shape          :  ",image_np.shape)
print("Size             :  ", image_np.size)  
# Display the image
plt.imshow(image_np)
#plt.axis('off')  # Turn off axis labels
plt.show()


OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

4.12.2025
das dürfte die Grenze sein
OSWALD

Code: Alles auswählen


              Laden eines Bildes mit Torchvision bei 32 GB RAM

import matplotlib.pyplot as plt
from torchvision import transforms
from PIL import Image
import requests
from io import BytesIO

# URL of the image
image_url = 'https://picsum.photos/5000/5000'

# Download the image
response = requests.get(image_url)
image = Image.open(BytesIO(response.content))

# Define a transform to convert the image to a tensor
transform = transforms.Compose([
    transforms.ToTensor()
])

# Apply the transform to the image
image_tensor = transform(image)

#Anzeigen des Bildes in Pytorch mit matplotlib
import matplotlib.pyplot as plt

# Convert the tensor to channel-last format
image_np = image_tensor.permute(1, 2, 0).numpy()
print("Das ist der Tensor   :",image_np)
print("shape          :  ",image_np.shape)
print("Size             :  ", image_np.size)  
# Display the image
plt.imshow(image_np)
#plt.axis('off')  # Turn off axis labels
plt.show()





OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

4.12.2025
Welche Datenmengen mit 32 RAM bewältigt werden können
zeigt sehr anschaulich dieser kleine Code mit torch.
OSWALD

Code: Alles auswählen


import torch 
x = torch.rand((5856,4888, 100 ))   
print(x)
print(x.shape)


OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

4.12.2025
Hier zeige ich ein "Baby von ddr4 32 GB RAM."
OSWALD

Code: Alles auswählen

#              Laden eines Bildes mit Torchvision bei 32 GB RAM

import matplotlib.pyplot as plt
from torchvision import transforms
from PIL import Image
import requests
from io import BytesIO

# URL of the image
image_url = 'https://picsum.photos/5/5'

# Download the image
response = requests.get(image_url)
image = Image.open(BytesIO(response.content))

# Define a transform to convert the image to a tensor
transform = transforms.Compose([
    transforms.ToTensor()
])

# Apply the transform to the image
image_tensor = transform(image)

#Anzeigen des Bildes in Pytorch mit matplotlib
import matplotlib.pyplot as plt

# Convert the tensor to channel-last format
image_np = image_tensor.permute(1, 2, 0).numpy()
print("Das ist der Tensor   :",image_np)
print("shape          :  ",image_np.shape)
print("Size             :  ", image_np.size)  
# Display the image
plt.imshow(image_np)
#plt.axis('off')  # Turn off axis labels
plt.show()







OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

7.12.2025
Themawechsel. Diffentialgleichung.
Hier ein erster Versuch einen Zusammenhang zwischen
Zinsen , Konjunktur und iInflation darzustellen.
Es sollten noch diverse Parameter hinzukommen.
Jedenfalls ein schwieriges Thema.
OSWALD

Code: Alles auswählen


!/usr/bin/python
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
#Die Anfangsbedingungen werden gesetzt:

# Zinsen ,Inflation, konjunktur
S0, I0, R0 =  3 , +5,  + 4
#und ebenso die Modellparameter alpha und beta:

alpha, beta  = 4e-4, 2e-2
#Die rechten Seiten der Differentialgleichungen werden 
#als eine vektor-wertige Funktion geschrieben:

def deriv(u, t, alpha, beta):
   S, I, R = u
   dSdt = -alpha * S * I
   dIdt = alpha * S * I - beta  * I
   dRdt = beta * I
   return dSdt, dIdt, dRdt
#dann setzen wir auch die Anfangsbedingungen als Vektor der Werte S0, I0 und R0:

y0 = S0, I0, R0
#wir möchten die Lösung zu diskrete Zeitschritte bestimmen und 
#legen dafür ein Zeitintervall und Zeitschritte fest:

T = np.linspace(0, 365, 365)  # 
##Anschließend lösen wir das S-I-R Modells zu den diskreten Zeitpunkten:

ret = odeint(deriv, y0, T, args=(alpha, beta))
S, I, R = ret.T
#Mit Hilfe der matplotlib Erweiterung können wir das Ergebnis visualisieren:
      ##################################################                                                                 
plots = plt.plot(T, S, 'b', alpha=0.5, lw=3, label='Zinsen %   ') \
   + plt.plot(T, I, 'r', alpha=0.5, lw=3, label='Inflation %    ') \
   + plt.plot(T, R, 'g', alpha=0.5, lw=4, label='Konjunktu %  ')
 
  ############################################## # #####

plt.xlabel('Zeit [Tage]')
plt.ylabel(' % -Satz')
plt.legend(handles=plots)
plt.show()



OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

9.12.2025
In dieser DGL ist der Zinssatz = 0,
also folgen die beiden abhänigen Variablen
mit Konjunktur steigend und die Inflation geht gegen NULL.

Generell gilt, dass das Ergebnis jeweils von der gewählten unabhänigen
Variablen abhängt.
Das Ganze ist natürlich wieder einmal nur eine Spielerei ohne jegliche Garantie
auf Praxistauglichkeit.
OSWALD

Code: Alles auswählen


import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
#Die Anfangsbedingungen werden gesetzt:

# Zinsen ,Inflation, konjunktur
S0, I0, R0 =  0 , +3,  + - 1
#und ebenso die Modellparameter alpha und beta:

alpha, beta  = 4e-4, 2e-2
#Die rechten Seiten der Differentialgleichungen werden 
#als eine vektor-wertige Funktion geschrieben:

def deriv(u, t, alpha, beta):
   S, I, R = u
   dSdt = -alpha * S * I
   dIdt = alpha * S * I - beta  * I
   dRdt = beta * I
   return dSdt, dIdt, dRdt
#dann setzen wir auch die Anfangsbedingungen als Vektor der Werte S0, I0 und R0:

y0 = S0, I0, R0
#wir möchten die Lösung zu diskrete Zeitschritte bestimmen und 
#legen dafür ein Zeitintervall und Zeitschritte fest:

T = np.linspace(- 20, 365, 365)  # 
##Anschließend lösen wi das S-I-R Modells zu den diskreten Zeitpunkten:

ret = odeint(deriv, y0, T, args=(alpha, beta))
S, I, R = ret.T
#Mit Hilfe der matplotlib Erweiterung können wir das Ergebnis visualisieren:
      ##################################################                                                                 
plots = plt.plot(T, S, 'b', alpha=0.5, lw=3, label='Zinsen %   ') \
   + plt.plot(T, I, 'r', alpha=0.5, lw=3, label='Inflation %    ') \
   + plt.plot(T, R, 'g', alpha=0.5, lw=4, label='Konjunktu %  ')
 
  ############################################## # #####

plt.xlabel('Zeit [Tage]')
plt.ylabel(' % -Satz')
plt.legend(handles=plots)
plt.show()


OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

9.12.2025
Bisher wurde das S .I.R. Modell nur in der Epidemiologie
angewendet..
Ist dieses Modell also für meine Zwecke n icht geeignet ?
Jetzt bin ich auf den Begriff Markow-Kette gestossen.
Wenn ich das richtig verstanden habe, geht es babei darum,
dass von einem Punkt aus direkt auf die Entwicklung , was danach kommt an,
also die F rage, wie entwickelt sich der diskrete Wert weiter.
Am Ende wäre das dann die Kurve, zu der sich der Ausgangswert entwicklt.
Vielleicht könnte das ein Mathematiker besser erklären.
OSWALD
OSWALD
User
Beiträge: 661
Registriert: Freitag 18. März 2022, 17:32

17.12.2025
Die Random Forest Methode hat den Nachteil, dass eine große Menge
an Daten anfällt .Jetzt will ikch testen,
ob mein neuer 32 GB RAM sich bewährt.
Das ist der Fall.
Gute Zeit OSWALD

Code: Alles auswählen

#                 Klassifizierung von Textdokumenten mithilfe spärlicher Merkmale 
#                 Beispiel  mit   Random Forist
from time import time
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer

categories = [
    "alt.atheism",
    "talk.religion.misc",
    "comp.graphics",
    "sci.space",
]


def size_mb(docs):
    return sum(len(s.encode("utf-8")) for s in docs) / 1e6


def load_dataset(verbose=False, remove=()):
    """Load and vectorize the 20 newsgroups dataset."""

    data_train = fetch_20newsgroups(
        subset="train",
        categories=categories,
        shuffle=True,
        random_state=42,
        remove=remove,
    )

    data_test = fetch_20newsgroups(
        subset="test",
        categories=categories,
        shuffle=True,
        random_state=42,
        remove=remove,
    )

    # order of labels in `target_names` can be different from `categories`
    target_names = data_train.target_names

    # split target in a training set and a test set
    y_train, y_test = data_train.target, data_test.target

    # Extracting features from the training data using a sparse vectorizer
    t0 = time()
    vectorizer = TfidfVectorizer(
        sublinear_tf=True, max_df=0.5, min_df=5, stop_words="english"
    )
    X_train = vectorizer.fit_transform(data_train.data)
    duration_train = time() - t0

    # Extracting features from the test data using the same vectorizer
    t0 = time()
    X_test = vectorizer.transform(data_test.data)
    duration_test = time() - t0

    feature_names = vectorizer.get_feature_names_out()

    if verbose:
        # compute size of loaded data
        data_train_size_mb = size_mb(data_train.data)
        data_test_size_mb = size_mb(data_test.data)

        print(
            f"{len(data_train.data)} documents - "
            f"{data_train_size_mb:.2f}MB (training set)"
        )
        print(f"{len(data_test.data)} documents - {data_test_size_mb:.2f}MB (test set)")
        print(f"{len(target_names)} categories")
        print(
            f"vectorize training done in {duration_train:.3f}s "
            f"at {data_train_size_mb / duration_train:.3f}MB/s"
        )
        print(f"n_samples: {X_train.shape[0]}, n_features: {X_train.shape[1]}")
        print(
            f"vectorize testing done in {duration_test:.3f}s "
            f"at {data_test_size_mb / duration_test:.3f}MB/s"
        )
        print(f"n_samples: {X_test.shape[0]}, n_features: {X_test.shape[1]}")

    return X_train, X_test, y_train, y_test, feature_names, target_names
#Analyse eines Bag-of-Words-Dokumentenklassifikators 
#Wir trainieren nun einen Klassifikator zweimal: einmal mit den Textbeispielen
#inklusive Metadaten und einmal ohne Metadaten.
#In beiden Fällen analysieren wir die Klassifikationsfehler
#anhand eines Testdatensatzes mithilfe einer Konfusionsmatrix und untersuchen die Koeffizienten, die die Klassifikationsfunktion der trainierten Modelle definieren.

#Modell ohne Metadatenentfernung 
#
X_train, X_test, y_train, y_test, feature_names, target_names = load_dataset(
    verbose=True
)

#2034 documents - 3.98MB (training set)
#1353 documents - 2.87MB (test set)
#4 categories
#vectorize training done in 0.314s at 12.670MB/s
#vectorize testing done in 0.207s at 13.853MB/s
#Unser erstes Modell ist eine Instanz der RidgeClassifierKlasse. Es handelt sich um ein lineares Klassifikationsmodell, das den mittleren quadratischen Fehler auf {-1, 1}-kodierten Zielwerten verwendet, einen für jede mögliche Klasse. Im Gegensatz zu anderen Modellen LogisticRegressionliefert RidgeClassifieres keine Wahrscheinlichkeitsvorhersagen (es gibt keine predict_probaentsprechende Methode), lässt sich aber oft schneller trainieren.
##############################################
from sklearn.linear_model import RidgeClassifier

clf = RidgeClassifier(tol=1e-2, solver="sparse_cg")
clf.fit(X_train, y_train)
pred = clf.predict(X_test)
#Wir erstellen eine Konfusionsmatrix dieses Klassifikators, um festzustellen,
#ob es ein Muster in den Klassifizierungsfehlern gibt.
#################################################
import matplotlib.pyplot as plt
from sklearn.metrics import ConfusionMatrixDisplay

fig, ax = plt.subplots(figsize=(10, 5))
ConfusionMatrixDisplay.from_predictions(y_test, pred, ax=ax)
ax.xaxis.set_ticklabels(target_names)
ax.yaxis.set_ticklabels(target_names)
_ = ax.set_title(
    f"Confusion Matrix for {clf.__class__.__name__}\non the original documents"
)

plt.show()
###############################
#Konfusionsmatrix für RidgeClassifier auf den Originaldokumenten
#
#Wir stellen außerdem fest, dass einige Dokumente dieser sci.spaceKlasse
#falsch klassifiziert werden können, comp.graphicswährend der umgekehrte
#Fall deutlich seltener vorkommt. Eine manuelle Überprüfung dieser falsch klassifizierten Dokumente wäre erforderlich, um diese Asymmetrie zu verstehen. Möglicherweise ist das Vokabular des Weltraumthemas spezifischer als das der Computergrafik.

#Ein besseres Verständnis dafür, wie dieser Klassifikator seine Entscheidungen trifft,
# erhalten wir, indem wir die Wörter mit den höchsten durchschnittlichen
#Merkmalseffekten betrachten:
########################################
import numpy as np
import pandas as pd

def plot_feature_effects():
    # learned coefficients weighted by frequency of appearance
    average_feature_effects = clf.coef_ * np.asarray(X_train.mean(axis=0)).ravel()

    for i, label in enumerate(target_names):
        top5 = np.argsort(average_feature_effects[i])[-5:][::-1]
        if i == 0:
            top = pd.DataFrame(feature_names[top5], columns=[label])
            top_indices = top5
        else:
            top[label] = feature_names[top5]
            top_indices = np.concatenate((top_indices, top5), axis=None)
    top_indices = np.unique(top_indices)
    predictive_words = feature_names[top_indices]

    # plot feature effects
    bar_size = 0.25
    padding = 0.75
    y_locs = np.arange(len(top_indices)) * (4 * bar_size + padding)

    fig, ax = plt.subplots(figsize=(10, 8))
    for i, label in enumerate(target_names):
        ax.barh(
            y_locs + (i - 2) * bar_size,
            average_feature_effects[i, top_indices],
            height=bar_size,
            label=label,
        )
    ax.set(
        yticks=y_locs,
        yticklabels=predictive_words,
        ylim=[
            0 - 4 * bar_size,
            len(top_indices) * (4 * bar_size + padding) - 4 * bar_size,
        ],
    )
    ax.legend(loc="lower right")

    print("top 5 keywords per class:")
    print(top)

    return ax
plt.show()

_ = plot_feature_effects().set_title("Average feature effect on the original data")
#Durchschnittlicher Merkmalseffekt auf die Originaldaten
#top 5 keywords per class:
 #Wir können beobachten, dass die aussagekräftigsten Wörter oft stark positiv
#mit einer einzelnen Klasse und negativ mit allen anderen Klassen assoziiert sind.
#Die meisten dieser positiven Assoziationen sind leicht zu interpretieren.
#Einige Wörter wie „ "god"und“ sind jedoch sowohl mit „ als auch "people"“ positiv assoziiert,
#da diese beiden Klassen erwartungsgemäß einen gemeinsamen Wortschatz aufweisen.
#Es gibt aber auch Wörter wie „ und“ , die nur mit „als“ positiv assoziiert sind .
#Darüber hinaus ist in dieser Version des Datensatzes das Wort „ Atheismus“ aufgrund
# von Verunreinigungen im Datensatz durch Metadaten,
#wie beispielsweise E-Mail-Adressen von Absendern vorheriger E-Mails in der Diskussion,
#eines der wichtigsten prädiktiven Merkmale für Atheismus (siehe unten)
#"talk.misc.religion""alt.atheism""christian""morality""talk.misc.religion""caltech"

data_train = fetch_20newsgroups(
    subset="train", categories=categories, shuffle=True, random_state=42
)

for doc in data_train.data:
    if "caltech" in doc:
        print(doc)
        break
#From: livesey@solntze.wpd.sgi.com (Jon Livesey)
#Subject: Re: Morality? (was Re: <Political Atheists?)
#Organization: sgi
#Lines: 93
#Distribution: world
#NNTP-Posting-Host: solntze.wpd.sgi.com

 
(
    X_train,
    X_test,
    y_train,
    y_test,
    feature_names,
    target_names,
) = load_dataset(remove=("headers", "footers", "quotes"))

clf = RidgeClassifier(tol=1e-2, solver="sparse_cg")
clf.fit(X_train, y_train)
pred = clf.predict(X_test)

fig, ax = plt.subplots(figsize=(10, 5))
ConfusionMatrixDisplay.from_predictions(y_test, pred, ax=ax)
ax.xaxis.set_ticklabels(target_names)
ax.yaxis.set_ticklabels(target_names)
_ = ax.set_title(
    f"Confusion Matrix for {clf.__class__.__name__}\non filtered documents"
)
 
_ = plot_feature_effects().set_title("Average feature effects on filtered documents")
# Durchschnittliche Auswirkungen von Merkmalen auf gefilterte Dokumente
plt.show() 
 
from sklearn import metrics
from sklearn.utils.extmath import density


def benchmark(clf, custom_name=False):
    print("_" * 80)
    print("Training: ")
    print(clf)
    t0 = time()
    clf.fit(X_train, y_train)
    train_time = time() - t0
    print(f"train time: {train_time:.3}s")

    t0 = time()
    pred = clf.predict(X_test)
    test_time = time() - t0
    print(f"test time:  {test_time:.3}s")

    score = metrics.accuracy_score(y_test, pred)
    print(f"accuracy:   {score:.3}")

    if hasattr(clf, "coef_"):
        print(f"dimensionality: {clf.coef_.shape[1]}")
        print(f"density: {density(clf.coef_)}")
        print()

    print()
    if custom_name:
        clf_descr = str(custom_name)
    else:
        clf_descr = clf.__class__.__name__
    return clf_descr, score, train_time, test_time
    plt.s
    how()
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression, SGDClassifier
from sklearn.naive_bayes import ComplementNB
from sklearn.neighbors import KNeighborsClassifier, NearestCentroid
from sklearn.svm import LinearSVC

results = []
for clf, name in (
    (LogisticRegression(C=5, max_iter=1000), "Logistic Regression"),
    (RidgeClassifier(alpha=1.0, solver="sparse_cg"), "Ridge Classifier"),
    (KNeighborsClassifier(n_neighbors=100), "kNN"),
    (RandomForestClassifier(), "Random Forest"),
    # L2 penalty Linear SVC
    (LinearSVC(C=0.1, dual=False, max_iter=1000), "Linear SVC"),
    # L2 penalty Linear SGD
    (
        SGDClassifier(
            loss="log_loss", alpha=1e-4, n_iter_no_change=3, early_stopping=True
        ),
        "log-loss SGD",
    ),
    # NearestCentroid (aka Rocchio classifier)
    (NearestCentroid(), "NearestCentroid"),
    # Sparse naive Bayes classifier
    (ComplementNB(alpha=0.1), "Complement naive Bayes"),
):
    print("=" * 80)
    print(name)
    results.append(benchmark(clf, name))
 
indices = np.arange(len(results))
results = [[x[i] for x in results] for i in range(4)]

clf_names, score, training_time, test_time = results
training_time = np.array(training_time)
test_time = np.array(test_time)

fig, ax1 = plt.subplots(figsize=(10, 8))
ax1.scatter(score, training_time, s=60)
ax1.set(
    title="Score-training time trade-off",
    yscale="log",
    xlabel="test accuracy",
    ylabel="training time (s)",
)
fig, ax2 = plt.subplots(figsize=(10, 8))
ax2.scatter(score, test_time, s=60)
ax2.set(
    title="Score-test time trade-off",
    yscale="log",
    xlabel="test accuracy",
    ylabel="test time (s)",
)

for i, txt in enumerate(clf_names):
    ax1.annotate(txt, (score[i], training_time[i]))
    ax2.annotate(txt, (score[i], test_time[i]))
plt.show() 



Antworten