kleine Mathe-Spielereien

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

8.5.2023
ich habe nun das riesige N_Array wesentlich verkleinert
und festgestellt, dass die Leerstellen in gleicher Relation wie die
Integerwerte verringert wurden.
Woran kann ich erkennen, ob analog auch die Ergebnisse zu
bewerten sind ? Die Zahlen geben das nicht her.
(Siehe auch variable explorer bei Spyder)


Gruß OSWALD

Code: Alles auswählen


import matplotlib.pyplot as plt
import numpy as np
import pandas as pd 
import seaborn as sns
blue_bowl_prob = 0.5 
white_bowl_prob = 0.5 
football_blue = 3 
basket_blue = 0
football_white = 1
basket_white = 4
tot_blue = football_blue+basket_blue
tot_white = football_white+basket_white
p_blue = [football_blue/tot_blue,basket_blue/tot_blue]
p_white = [football_white/tot_white,basket_white/tot_white]
N_array = np.array([10,50,70,100,1000]).astype(int)
picked_bowl = ['Blue','White']
picked_ball = ['Football','Basketball']
est_prob_array = []
for n in N_array:
    N_events = n
    final_state = []
    for i in range(N_events):
        p_bowl = np.random.choice(picked_bowl,p=[blue_bowl_prob,white_bowl_prob])
        if p_bowl == 'Blue':
            p_ball = np.random.choice(picked_ball,p = p_blue)
        if p_bowl == 'White':
            p_ball = np.random.choice(picked_ball,p = p_white)
        final_state.append(p_bowl+' '+p_ball)
    final_data = pd.DataFrame(final_state).value_counts()
    #est_prob = final_data['Blue Football']/([final_data['Blue Football']+final_data['White Football'])
    #est_prob_array.append(est_prob)

    print(final_data) 
from sklearn.datasets import make_classification
x,y=make_classification(n_features=2,n_informative=2,n_redundant=0,class_sep=4,n_samples=1000)
x[:,0],x[:,1] = (x[:,0]*10).astype(int),(x[:,1]*10).astype(int)
plt.figure(figsize=(6,4))
sns.scatterplot(x=x[:,0],y=x[:,1],hue=y,size=1)
plt.xlabel('Feature 1',fontsize=14)
plt.ylabel('Feature 2',fontsize=14)
plt.legend(title='Label',fontsize=10)
plt.grid()
plt.show() 


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

[12.5.023
'Ist ein Ergebnis richtig oder falsch,palsibel oder
nicht plausibel', das hat mir keine Ruhe gelassen.
Deshalb habe ich versucht, weiter in die völlig neue Materie
einzudringen. Es musste also eine ganze Menge von
neuen Begriffen geklärt werden.
Mit dem folgenden Programm aus dem Internet
glaube ich ein großes Stück weiter gekommen zu sein.
Niemand kann als nfänger stets das Rad neu erfinden
und kann n ur auf vorhandenes Wissen aufbauen,
Das ist das große Verdienst von -open souce-
für die die Entwicklung der Informatik , die in Deutschland
- habe ich jüngst gelesen -
durch stringiten 'Datenschutz' benachteiligt wird..
Guten Zeit OSWALD

Code: Alles auswählen

[

#Vorhersagen und testen  der Datena auf Übereinstimmung , Genauigkeit
 
# scikit-learn - Dataset Library
from sklearn import datasets
# Train test - split function
from sklearn.model_selection import train_test_split
# Gauss - Naive Bayes Model
from sklearn.naive_bayes import GaussianNB

# Das Iris - Dataset laden
iris_blumen = datasets.load_iris()
# print("Iris Dataset: ", iris_blumen)

# Die Namen der Merkmale ausgeben
print("Merkmale: \n", iris_blumen.feature_names)

# Die Namen der Labels ausgeben
print("Labels: \n", iris_blumen.target_names)

# Ausgabe des Datenformats
print("Datenformat:\n", iris_blumen.data.shape)

# Ausgabe der ersten 10 Datenmerkmale
print(iris_blumen.data[0:10])

# Aufteilen der Daten in Trainingsset u. Testset
# 70% für Training und 30% für das Testen
X_train, X_test, y_train, y_test = train_test_split(iris_blumen.data,
            iris_blumen.target, test_size=0.3, random_state=115)

# Gaussian - Klassifizierer generieren
NB_iris = GaussianNB()

# Das Klassifizierungsmodell mit den Trainingsdaten trainieren
NB_iris.fit(X_train, y_train)

# Die Vorhersagen - aus dem Test - Dataset
y_pred = NB_iris.predict(X_test)
print()
print("Vorhersagen vergleichen mit Testdaten:")
print("Vorhersagen:",y_pred)
print()

print("Testdaten:  ",y_test)
print("weitestgehende Übereinstimmung der Daten " )
print()
       

# Modul für die Genauigkeitsmessung der Vorhersage importieren
from sklearn import metrics
print("Genauigkeit: ", metrics.accuracy_score(y_test, y_pred))



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

14.05.2023
'Auf der Suche nach dem Stein der Weisen'
habe ich das bisher Beste gefunden.
Mein System scheint jedoch nicht die optimale Visualisierung
zu schaffen. Ein Update von Spyder gelingt nicht .
Auf jeden Fall bin ich mit dem Ergebnis zufrieden.
Vor allem ist der Code gur nachvollziehbar. Es ist
für mich das Maximale. Alles weitere ist offenbar
Blackbox .
Gute Zeit OSWALD

Code: Alles auswählen


# get the modules we need
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
 

#DAS DATENSET
#Die Daten unseres Beispiels sind bewusst neutral und einfach gehalten, um eine optimale Verständlichkeit zu gewährleisten. Als Trainingsdaten dient eine Datenreihe von 0 bis 9 (Samples), um ein Target mit 0 und 1 zu klassifizieren. Die Reihe könnte etwa zehn Patienten repräsentieren, die einen medizinischen Test absolvieren. Bei im Voraus bekannten Labels (Target) spricht man auch von Supervised Learning. Wir wollen nun das System soweit trainieren, dass die tiefen Zahlen wahrscheinlich mit 0 und die hohen Zahlen wahrscheinlich mit 1 zu klassifizieren sind (Listing 4).

1
2
X=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y=[0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
 

#Listing 4
 
##// arrays for the input (X) and output (y) values:
X = np.arange(10).reshape(-1, 1)
y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
#Wir können mit dem Befehl np.arange(10) ein Array erstellen, das alle ganzen Zahlen von 0 bis 9 enthält. Als Konvention betrachten wir x als zweidimensionales Array (Matrix) und y als eindimensionales Target (Vektor). Reshape (-1,1) bedeutet, dass wir nur ein Feature als Kolonne haben. Features sind die Merkmalsträger, die dem Modell helfen, unbekannte Muster zu finden. Anschließend definieren wir das Modell, das bereits mit der Fit-Methode die Daten trainiert, um eine Beziehung zwischen den Einflussvariablen (Determinanten) und dem Target herzustellen (Listing 5).

#Listing 5
 
# Once you have input and output prepared, define your classification model.
model= LogisticRegression(solver='liblinear', random_state=0)
model.fit(X, y)
print(model)
#Nachdem das Modell aufgebaut ist, können wir mit predict() eine erste Klassifikation mit einem Score versuchen und gleich die Konfusionsmatrix erstellen (Listing 6).

 

#Listing 6
 
print(model.predict(X))
print(model.score(X, y))
#/ One false positive prediction: The fourth observation is a zero that was wrongly predicted as one.
print(confusion_matrix(y, model.predict(X)))
 

 
#Real:    [0 0 0 0 1 1 1 1 1 1]
#Predict: [0 0 0 1 1 1 1 1 1 1]
Score: 0.9
#Confusion Matrix:
#0: [[3 1]  :4
#1:  [0 6]] :6
 

#Und siehe da: Ein False Positive (Fehlalarm) hat sich eingeschlichen. Das Modell hat eine 0 irrtümlich als 1 klassifiziert, vergleichbar mit einem System, das fälschlicherweise eine ruhige Situation als Brandalarm bewertet. Die Konfusionsmatrix zeigt das als Fehlalarm an. Idealerweise zeigt die Matrix bei einem 100 Prozent Score folgendes Bild:

1
2
#0: [[3 1]  :4
#1:  [0 6]] :6
#DAS DATENSET WIRD ZUM BILD
#Im nächsten Schritt erfolgt die visuelle Aufbereitung der Matrix, um eine optische Beziehung zwischen den realen und den vorausgesagten Daten herzustellen (Listing 7).

 

#Listing 7
  
plt.rcParams.update({'font.size': 16})
fig, ax = plt.subplots(figsize=(4, 4))
ax.imshow(X)
ax.grid(False)
ax.xaxis.set(ticks=(0, 1), ticklabels=('Predicted 0s', 'Predicted 1s'))
ax.yaxis.set(ticks=(0, 1), ticklabels=('Actual 0s', 'Actual 1s'))
ax.set_ylim(1.5, -0.5)
for i in range(2):
  for j in range(2):
    ax.text(j, i, [i, j], ha='center', va='center', color='red')
    plt.show() 


#Abb. 1: Konfusionsmatrix mit Pyplot
 

#Die Grafik in Abbildung 1 lässt sich auch einfacher und moderner mit einer zusätzlichen Bibliothek erzeugen. Wir benötigen dafür die Python Library seaborn (Abb. 2), die sich am besten über die integrierte Command Line Shell direkt in VS Code mit Pip Install installieren lässt (Listing 8).

 

#Listing 8
 
import seaborn as sns
#// get the instance of confusion_matrix:
cm = confusion_matrix(y, model.predict(X))
sns.heatmap(cm,  annot=True)
plt.title('heatmap confusion matrix')
plt.show()
 


#Abb. #2: Konfusionsmatrix mit Seaborn
 

#Die Klasse 0 hat also drei richtige Fälle (True Negatives), die Klasse 1 sechs richtige Fälle (True Positives) erkannt. Die Nutzergenauigkeit zeigt ebenfalls ein einziges falsches positives Ergebnis. Die Nutzergenauigkeit (Consumer Risk versus Producer Risk) wird auch als Überlassungsfehler oder Fehler vom Typ 1 bezeichnet. Fehler vom Typ 2 sind dann False Negatives.

#Mit der Funktion .heatmap() aus der Bibliothek seaborn wird der Diagrammtyp definiert. Die folgenden Argumente parametrisieren das Aussehen des Diagramms. Werfen wir einen Blick in die Analyse des Fehlers, der durch den voreingestellten Schwellenwert der Wahrscheinlichkeit bei 0.5 definiert ist. Die Diskriminierung zwischen 0 und 1 hat zu früh stattgefunden, sodass unser Modell eine 0 zu früh als 1 klassifiziert hat. Natürlich lassen sich diese sogenannten Hyperparameter optimieren, um eine gerechtere Verteilung der Klassifikation zu finden. Dazu muss man sagen, dass die Wirkung auf diskrete, dichotome Variablen [0,1] sich nicht mit dem Verfahren der klassischen linearen Regressionsanalyse erklären und verifizieren lässt.

#HYPERPARAMETER
#Die momentane Verteilung mit der zugehörigen Klassifikation sieht wie in Abb. 3 gezeigt aus.

 


#Abb. 3: Die ersten drei Samples werden als 0, die restlichen als 1 gewertet
 

#Listing 9
 
sns.set(style = 'whitegrid')
sns.regplot(X, model.predict_proba(X)[:,1], logistic=True,
                     scatter_kws={"color": "red"}, line_kws={"color": "blue"}) #label=model.predict(X))
plt.title('Logistic Probability Plot')
plt.show()
 

#In Listing 9 ist in der Funktion regplot die geschätzte Wahrscheinlichkeit als Target enthalten.
#Nicht jeder Klassifizierer bietet die internen Wahrscheinlichkeiten an. Auch der Naive-Bayes-Klassifikator ist probabilistisch (Kasten: „Naive-Bayes-Klassifikator“). Die entsprechende Entscheidungsgrenze (Decision Boundary) ist für die Analyse optisch erkennbar und hilft, das Ergebnis zu interpretieren oder einen besseren Solver zu finden (Abb. 4).

 

#Naive-Bayes-Klassifikator

#Der Naive-Bayes-Klassifikator ist nach dem englischen Mathematiker Thomas Bayes benannt und leitet sich aus dem Bayes-Theorem ab. Die grundlegende Annahme besteht darin, von einer strengen Unabhängigkeit der verwendeten Merkmale auszugehen (deshalb „Naive“).

 


#Abb. 4: Decision Boundary mit dem False Positive (blauer Punkt auf weißer Fläche)
 

##     T	precision	   recall   	   f1-score 	  support 	    CM      
#0	1.00	0.75	0.86	4	[[3 1
#1	0.86	1.00	0.92	6	[0 6]]
#Tabelle 1: Classification Report

#Der Tabelle 1 können wir entnehmen, dass es einen Fall von Falsch-Positiv und keinen Fall von Falsch-Negativ gibt. Das bedeutet, dass nur in 86 Prozent aller Fälle ein positives Ergebnis auch einer Erkrankung entspricht. Die Precision errechnet sich dabei so:

1
2
#Truepositiv / (Truepositiv + Falsepositiv) =
#6 / (6+1) = 0.8571 = <strong>0.86</strong>

#Es ist also entscheidend, in die Genauigkeit der Tests (Screening) auch die Falsch-Positiv-Fälle mit einzubinden. Ähnliche Beispiele zur bedingten Wahrscheinlichkeit befinden sich übrigens auf der Webseite „Lügen mit Statistik“. Auch hier habe ich einmal einen Fall nachgerechnet und visualisiert (aus dem Gebiet der Mammografie). Wie in Abbildung 5 gezeigt, sehen die Falsch-Positiv-Werte schon komplexer aus.

 


#Abb. 5: Nichtlineare Analyse von Falsch-Positiv in einem Hyperplane (Support Vector Machine)
 

#OPTIMIEREN DER OPTIK
#Nun wollen wir die erwähnten Hyperparameter ins Spiel bringen, von denen es einige gibt und die einen Teil der Modellevaluation ausmachen.

#C ist eine positive Gleitkommazahl (standardmäßig 1,0), die die relative Stärke der Regularisierung definiert. Kleinere Werte zeigen eine stärkere Regularisierung an.
#Solver ist eine Zeichenfolge (standardmäßig liblinear), die entscheidet, welchen Solver ich zum Anpassen des Modells verwende, und die Teil eines Kernels sein kann. Andere Optionen sind newton-cg, lbfgs, sag und saga.
#max_iter ist eine Ganzzahl (standardmäßig 100), die die maximale Anzahl von Iterationen durch den Solver während der Modellanpassung definiert.
 

#In Listing 10 erkennen wir die voreingestellten Modellparameter, die sich natürlich verändern lassen. Es ist allerdings nicht möglich, den besten Wert für einen Modellhyperparameter in Bezug auf ein bestimmtes Problem direkt zu ermitteln. Stattdessen kann man Erfahrungswerte nutzen, Werte kopieren, die bei anderen Problemen verwendet wurden, oder durch Ausprobieren nach dem besten Wert suchen. Ich benutze vor allem den Wert C (Regulator), um den Kernel oder den Solver zu optimieren.

#Listing 10
 
model = LogisticRegression(solver='liblinear', C=1, random_state=0).fit(X, y) 
#/ show more model details
print(model)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
  intercept_scaling=1, max_iter=100, multi_class='warn',
  n_jobs=None, penalty='l2', random_state=0, solver='liblinear',
  tol=0.0001, verbose=0, warm_start=False)
#Die eigentliche Anpassung besteht darin, schlicht und ergreifend einen anderen Solver einzusetzen:

 
model = LogisticRegression(solver='<strong>lbfgs</strong>', C=1, random_state=0).fit(X, y)
print(classification_report(y, model.predict(X)))
#Die Ergebnisse sind nun optimal in Bezug auf die Güte des Algorithmus unserer Zahlenreihe und kann auch einem optischen Vergleich mit einem Decision Tree standhalten (Abb. 6).

 


#Abb. 6: Optimale Entscheidung der Klassifikation
 

#Das Entscheidungsbaumverfahren (Decision Tree) ist eine verbreitete Möglichkeit der Regression oder Klassifikation über ein multivariates Datenset. Das Verfahren kann beispielsweise verwendet werden, um die Zahlungsfähigkeit von Kunden zu klassifizieren oder eine Funktion zur Vorhersage von Falschmeldungen zu bilden. In der Praxis stellt das Verfahren den Data Scientist aber vor große Herausforderungen bezüglich Interpretation und Overfitting (Auswendiglernen der trainierten Beispiele), obwohl der Baum selbst eine transparente und lesbare Grafik bietet. Dazu nutzen wir in VS Code den installierten Graphviz 2.38 sowie eine zusätzliche Zeile im Code, die uns direkt die Pfadangaben im OS-Pfad setzt (Listing 11). Somit können wir direkt im Code Anpassungen an eine andere Version vornehmen oder die Plattform konfigurieren (Abb. 7).

#Listing 11
 
from sklearn.tree import DecisionTreeClassifier     #rtoong>
from converter import app, request
import unittest
import os
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'








os.environ["PATH"] += os.pathsep + 'C:/Program Files/Pandoc/'

















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

15.5.2023
Nach Nntfernung einiger kleiner Fahler sieht die Optik
nun schon wesentlich besser aus.
Ich verstehe nur eInen Bruchteil dessen,
was ich herunter geladen habe.
Deshalb muss ich mich intensiv darum kümmern.
Anbei die neue Version
Gute Zeit OSWALD




# get the modules we need
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix


#DAS DATENSET
#Die Daten unseres Beispiels sind bewusst neutral und einfach gehalten,
# um eine optimale Verständlichkeit zu gewährleisten.
#Als Trainingsdaten dient eine Datenreihe von 0 bis 9 (Samples),
# um ein Target mit 0 und 1 zu klassifizieren.
#Die Reihe könnte etwa zehn Patienten repräsentieren,
#die einen medizinischen Test absolvieren.
# Bei im Voraus bekannten Labels (Target) spricht man auch von Supervised Learning.
#Wir wollen nun das System soweit trainieren, dass die tiefen Zahlen wahrscheinlich
#mit 0 und die hohen Zahlen wahrscheinlich mit 1 zu klassifizieren sind (Listing 4).


1
2
X=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y=[0, 0, 0, 0, 1, 1, 1, 1, 1, 1]


#Listing 4

##// arrays for the input (X) and output (y) values:
X = np.arange(10).reshape(-1, 1)
y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
#Wir können mit dem Befehl np.arange(10) ein Array erstellen,
#das alle ganzen Zahlen von 0 bis 9 enthält. Als Konvention betrachten wir x
#als zweidimensionales Array (Matrix) und y als eindimensionales Target (Vektor).
# Reshape (-1,1) bedeutet, dass wir nur ein Feature als Kolonne haben.
#Features sind die Merkmalsträger, die dem Modell helfen, unbekannte Muster zu finden.
# Anschließend definieren wir das Modell, das bereits mit der Fit-Methode die Daten trainiert,
# um eine Beziehung zwischen den Einflussvariablen (Determinanten) und dem Target herzustellen (Listing 5).

#Listing 5

# Once you have input and output prepared, define your classification model.
model= LogisticRegression(solver='liblinear', random_state=0)
model.fit(X, y)
print(model)
#Nachdem das Modell aufgebaut ist, können wir mit predict() e
#ine erste Klassifikation mit einem Score versuchen und gleich die Konfusionsmatrix erstellen (Listing 6).



#Listing 6

print(model.predict(X))
print(model.score(X, y))
#/ One false positive prediction: The fourth observation is a zero that was wrongly predicted as one.
print(confusion_matrix(y, model.predict(X)))



#Real: [0 0 0 0 1 1 1 1 1 1]
#Predict: [0 0 0 1 1 1 1 1 1 1]
Score: 0.9
#Confusion Matrix:
#0: [[3 1] :4
#1: [0 6]] :6


#Und siehe da: Ein False Positive (Fehlalarm) hat sich eingeschlichen.
# Das Modell hat eine 0 irrtümlich als 1 klassifiziert, vergleichbar mit einem System,
# das fälschlicherweise eine ruhige Situation als Brandalarm bewertet.
#Die Konfusionsmatrix zeigt das als Fehlalarm an. Idealerweise zeigt die Matrix
# bei einem 100 Prozent Score folgendes Bild:

1
2
#0: [[3 1] :4
#1: [0 6]] :6
#DAS DATENSET WIRD ZUM BILD
#Im nächsten Schritt erfolgt die visuelle Aufbereitung der Matrix,
#um eine optische Beziehung zwischen den realen und den vorausgesagten Daten herzustellen (Listing 7).



#Listing 7

plt.rcParams.update({'font.size': 16})
fig, ax = plt.subplots(figsize=(6, 6))
ax.imshow(X)
ax.grid(False)
ax.xaxis.set(ticks=(0, 1), ticklabels=('Predicted 0s', 'Predicted 1s'))
ax.yaxis.set(ticks=(1, 1), ticklabels=('Actual 0s', 'Actual 1s'))
ax.set_ylim(0.5, -0.5)
for i in range(2):
for j in range(2):
ax.text(j, i, [i, j], ha='center', va='center', color='red')

plt.show()


#Abb. 1: Konfusionsmatrix mit Pyplot


#Die Grafik in Abbildung 1 lässt sich auch einfacher und moderner
#mit einer zusätzlichen Bibliothek erzeugen.
#Wir benötigen dafür die Python Library seaborn (Abb. 2),
#die sich am besten über die integrierte Command Line Shell
#direkt in VS Code mit Pip Install installieren lässt (Listing 8).



#Listing 8

import seaborn as sns
#// get the instance of confusion_matrix:
cm = confusion_matrix(y, model.predict(X))
sns.heatmap(cm, annot=True)
plt.title('heatmap confusion matrix')
plt.show()



#Abb. #2: Konfusionsmatrix mit Seaborn


#Die Klasse 0 hat also drei richtige Fälle (True Negatives),
# die Klasse 1 sechs richtige Fälle (True Positives) erkannt.
# Die Nutzergenauigkeit zeigt ebenfalls ein einziges falsches positives Ergebnis.
# Die Nutzergenauigkeit (Consumer Risk versus Producer Risk)
#wird auch als Überlassungsfehler oder Fehler vom Typ 1 bezeichnet.
#Fehler vom Typ 2 sind dann False Negatives.

#Mit der Funktion .heatmap() aus der Bibliothek seaborn wird der Diagrammtyp definiert.
# Die folgenden Argumente parametrisieren das Aussehen des Diagramms.
# Werfen wir einen Blick in die Analyse des Fehlers,
# der durch den voreingestellten Schwellenwert der Wahrscheinlichkeit bei 0.5 definiert ist.
# Die Diskriminierung zwischen 0 und 1 hat zu früh stattgefunden,
# sodass unser Modell eine 0 zu früh als 1 klassifiziert hat.
# Natürlich lassen sich diese sogenannten Hyperparameter optimieren,
# um eine gerechtere Verteilung der Klassifikation zu finden.
# Dazu muss man sagen, dass die Wirkung auf diskrete, dichotome Variablen [0,1]
# sich nicht mit dem Verfahren der klassischen linearen Regressionsanalyse erklären
# und verifizieren lässt.

#HYPERPARAMETER
#Die momentane Verteilung mit der zugehörigen Klassifikation sieht wie in Abb. 3 gezeigt aus.




#Abb. 3: Die ersten drei Samples werden als 0, die restlichen als 1 gewertet


#Listing 9

sns.set(style = 'whitegrid')
sns.regplot(X, model.predict_proba(X)[:,1], logistic=True,
scatter_kws={"color": "red"}, line_kws={"color": "red"})
label= model.predict(X)
plt.title('Logistic Probability Plot')
plt.show()


#In Listing 9 ist in der Funktion regplot die geschätzte Wahrscheinlichkeit als Target enthalten.
#Nicht jeder Klassifizierer bietet die internen Wahrscheinlichkeiten an.
#Auch der Naive-Bayes-Klassifikator ist probabilistisch
#(Kasten: „Naive-Bayes-Klassifikator“). Die entsprechende Entscheidungsgrenze
##(Decision Boundary) ist für die Analyse optisch erkennbar und hilft,
#das Ergebnis zu interpretieren oder einen besseren Solver zu finden (Abb. 4).



#Naive-Bayes-Klassifikator

#Der Naive-Bayes-Klassifikator ist nach dem englischen Mathematiker Thomas Bayes benannt und leitet sich aus dem Bayes-Theorem ab. Die grundlegende Annahme besteht darin, von einer strengen Unabhängigkeit der verwendeten Merkmale auszugehen (deshalb „Naive“).




#Abb. 4: Decision Boundary mit dem False Positive (blauer Punkt auf weißer Fläche)


## T precision recall f1-score support CM
#0 1.00 0.75 0.86 4 [[3 1
#1 0.86 1.00 0.92 6 [0 6]]
#Tabelle 1: Classification Report

#Der Tabelle 1 können wir entnehmen, dass es einen Fall von Falsch-Positiv und keinen Fall von Falsch-Negativ gibt. Das bedeutet, dass nur in 86 Prozent aller Fälle ein positives Ergebnis auch einer Erkrankung entspricht. Die Precision errechnet sich dabei so:

1
2
#Truepositiv / (Truepositiv + Falsepositiv) =(6+1) = 0.8571 = <strong>0.86</strong>

#Es ist also entscheidend, in die Genauigkeit der Tests (Screening)
#auch die Falsch-Positiv-Fälle mit einzubinden.
# Ähnliche Beispiele zur bedingten Wahrscheinlichkeit befinden sich übrigens
# auf der Webseite „Lügen mit Statistik“.
# Auch hier habe ich einmal einen Fall nachgerechnet und visualisiert
# (aus dem Gebiet der Mammografie).
# Wie in Abbildung 5 gezeigt, sehen die Falsch-Positiv-Werte schon komplexer aus.




#Abb. 5: Nichtlineare Analyse von Falsch-Positiv in einem Hyperplane (Support Vector Machine)


#OPTIMIEREN DER OPTIK
#Nun wollen wir die erwähnten Hyperparameter ins Spiel bringen, von denen es einige gibt
#und die einen Teil der Modellevaluation ausmachen.

#C ist eine positive Gleitkommazahl (standardmäßig 1,0),
# die die relative Stärke der Regularisierung definiert.
# Kleinere Werte zeigen eine stärkere Regularisierung an.
#Solver ist eine Zeichenfolge (standardmäßig liblinear), die entscheidet, welchen Solver ich zum Anpassen des Modells verwende, und die Teil eines Kernels sein kann. Andere Optionen sind newton-cg, lbfgs, sag und saga.
#max_iter ist eine Ganzzahl (standardmäßig 100), die die maximale Anzahl von Iterationen durch den Solver während der Modellanpassung definiert.


#In Listing 10 erkennen wir die voreingestellten Modellparameter, die sich natürlich verändern lassen. Es ist allerdings nicht möglich, den besten Wert für einen Modellhyperparameter in Bezug auf ein bestimmtes Problem direkt zu ermitteln. Stattdessen kann man Erfahrungswerte nutzen, Werte kopieren, die bei anderen Problemen verwendet wurden, oder durch Ausprobieren nach dem besten Wert suchen. Ich benutze vor allem den Wert C (Regulator), um den Kernel oder den Solver zu optimieren.

#Listing 10
model = LogisticRegression(solver='liblinear', C=1, random_state=0).fit(X, y)
#/ show more model details
print(model)

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='warn',
n_jobs=None, penalty='l2', random_state=0, solver='liblinear',
tol=0.0001, verbose=0, warm_start=False)
#Die eigentliche Anpassung besteht darin, schlicht und ergreifend
# einen anderen Solver einzusetzen:


model = LogisticRegression(solver='liblinear', C=1, random_state=0).fit(X,y)

print(classification_report(y, model.predict(X)))
OSWALD
User
Beiträge: 351
Registriert: Freitag 18. März 2022, 17:32

Da ist etwas schief gelaufen ??
Deshalb der Code ohne Kommentare
:roll:

Code: Alles auswählen

 
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
 # get the modules we need
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
1
2
X=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y=[0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
 

 
 
##// arrays for the input (X) and output (y) values:
X = np.arange(10).reshape(-1, 1)
y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
 
 
 
# Once you have input and output prepared, define your classification model.
model= LogisticRegression(solver='liblinear', random_state=0)
model.fit(X, y)
print(model)
#Nachdem das Modell aufgebaut ist, können wir mit predict() e
#ine erste Klassifikation mit einem Score versuchen und gleich die Konfusionsmatrix erstellen (Listing 6).

 

 
 
print(model.predict(X))
print(model.score(X, y))
#/ One false positive prediction: The fourth observation is a zero that was wrongly predicted as one.
print(confusion_matrix(y, model.predict(X)))
 

 
#Real:    [0 0 0 0 1 1 1 1 1 1]
#Predict: [0 0 0 1 1 1 1 1 1 1]
Score: 0.9
#Confusion Matrix:
#0: [[3 1]  :4
#1:  [0 6]] :6
 
 

1
2
#0: [[3 1]  :4
#1:  [0 6]] :6
 
 

 
  
plt.rcParams.update({'font.size': 16})
fig, ax = plt.subplots(figsize=(6, 6))
ax.imshow(X)
ax.grid(False)
ax.xaxis.set(ticks=(0, 1), ticklabels=('Predicted 0s', 'Predicted 1s'))
ax.yaxis.set(ticks=(1, 1), ticklabels=('Actual 0s', 'Actual 1s'))
ax.set_ylim(0.5, -0.5)
for i in range(2):
  for j in range(2):
    ax.text(j, i, [i, j], ha='center', va='center', color='red')           
            
    plt.show() 

 
 

#Listing 8
 
import seaborn as sns
#// get the instance of confusion_matrix:
cm = confusion_matrix(y, model.predict(X))
sns.heatmap(cm,  annot=True)
plt.title('heatmap confusion matrix')
plt.show()
 
 
sns.set(style = 'whitegrid')
sns.regplot(X, model.predict_proba(X)[:,1], logistic=True,
                     scatter_kws={"color": "red"}, line_kws={"color": "red"})
label= model.predict(X)
plt.title('Logistic Probability Plot')
plt.show()
 
 

#Listing 10
model = LogisticRegression(solver='liblinear', C=1, random_state=0).fit(X, y)
 #/ show more model details
print(model) 
 
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
  intercept_scaling=1, max_iter=100, multi_class='warn',
  n_jobs=None, penalty='l2', random_state=0, solver='liblinear',
  tol=0.0001, verbose=0, warm_start=False)
 
 
model = LogisticRegression(solver='liblinear', C=1, random_state=0).fit(X,y)
 
print(classification_report(y, model.predict(X)))


1
2
X=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y=[0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
 

 
 
##// arrays for the input (X) and output (y) values:
X = np.arange(10).reshape(-1, 1)
y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1])
 
 
 
# Once you have input and output prepared, define your classification model.
model= LogisticRegression(solver='liblinear', random_state=0)
model.fit(X, y)
print(model)
#Nachdem das Modell aufgebaut ist, können wir mit predict() e
#ine erste Klassifikation mit einem Score versuchen und gleich die Konfusionsmatrix erstellen (Listing 6).

 

 
 
print(model.predict(X))
print(model.score(X, y))
#/ One false positive prediction: The fourth observation is a zero that was wrongly predicted as one.
print(confusion_matrix(y, model.predict(X)))
 

 
#Real:    [0 0 0 0 1 1 1 1 1 1]
#Predict: [0 0 0 1 1 1 1 1 1 1]
Score: 0.9
#Confusion Matrix:
#0: [[3 1]  :4
#1:  [0 6]] :6
 
 

1
2
#0: [[3 1]  :4
#1:  [0 6]] :6
 
 

 
  
plt.rcParams.update({'font.size': 16})
fig, ax = plt.subplots(figsize=(6, 6))
ax.imshow(X)
ax.grid(False)
ax.xaxis.set(ticks=(0, 1), ticklabels=('Predicted 0s', 'Predicted 1s'))
ax.yaxis.set(ticks=(1, 1), ticklabels=('Actual 0s', 'Actual 1s'))
ax.set_ylim(0.5, -0.5)
for i in range(2):
  for j in range(2):
    ax.text(j, i, [i, j], ha='center', va='center', color='red')           
            
    plt.show() 

 
 
import seaborn as sns
#// get the instance of confusion_matrix:
cm = confusion_matrix(y, model.predict(X))
sns.heatmap(cm,  annot=True)
plt.title('heatmap confusion matrix')
plt.show()
 
 
 
sns.set(style = 'whitegrid')
sns.regplot(X, model.predict_proba(X)[:,1], logistic=True,
                     scatter_kws={"color": "red"}, line_kws={"color": "red"})
label= model.predict(X)
plt.title('Logistic Probability Plot')
plt.show()
 
 

 
model = LogisticRegression(solver='liblinear', C=1, random_state=0).fit(X, y)
 #/ show more model details
print(model) 
 
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
  intercept_scaling=1, max_iter=100, multi_class='warn',
  n_jobs=None, penalty='l2', random_state=0, solver='liblinear',
  tol=0.0001, verbose=0, warm_start=False)
 
 
model = LogisticRegression(solver='liblinear', C=1, random_state=0).fit(X,y)
 
print(classification_report(y, model.predict(X)))
 

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

18.5.2023
Bei der Blackbox angelangt, bin ich zwangsläufig auf Bootstrrap
gestossen.
Was haben Baron von Münchhausen und Bootstrap gemeinsam ?
Beide versuchen suchen am eigenen Schopf aus dem Sumpf
(der Komplexität) zu ziehen..
Im folgenden Beispiel versuche Durchblick zu gewinnen, indem ich
die Quelle der Daten einmal aus einer Normalverteilung und dann
aus einer Binomialverteilung zu gewinnen. Viel Unterschied erkenne
ich bis jetzt nicht.
Gute Zeit OSWALD

Code: Alles auswählen

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

mean = 50
std = 1
population_n = 10000
population = mean + np.random.randn(population_n)*std
#opulation =  mean + np.random.binomial(population_n,std)
 
sns.distplot(population, kde=True, label='Population')
plt.title('Population Distribution', fontsize=18)
plt.ylabel('Frequency', fontsize=10)
plt.show()
print(f'Population Mean: {np.mean(population):.3}')
print(f'Population Std: {np.std(population):.3}')
 



sample_n = 20
sample = np.random.choice(population, size=sample_n, replace=False)

sns.distplot(sample, kde=True, label='Single Sample')
plt.axvline(x=np.mean(sample), ymin=0, ymax=1, linestyle='-')
plt.title(f'Sample Distribution: n={sample_n}', fontsize=18)
plt.ylabel('Frequency', fontsize=16)
      
print(f'Sample Mean: {np.mean(sample):.3}')
print(f'Sample Std: {np.std(sample):.3}')
plt.show()



n_bootstrap = 50
bootstrap_means = []
for b in range(n_bootstrap):
    bootstrap_means.append(np.mean(np.random.choice(sample, size=sample_n, replace=True)))
bootstrap_means = np.array(bootstrap_means)

sns.distplot(bootstrap_means, kde=True, label='Bootstrap')
plt.axvline(x=np.mean(bootstrap_means), ymin=0, ymax=1, linestyle='-')
plt.title('Distribution of Bootstrapped Means', fontsize=18)
plt.ylabel('Frequency', fontsize=16)

print(f'Bootstrapped Mean: {np.mean(bootstrap_means):.3}')
print(f'Bootstrapped Std: {np.std(bootstrap_means):.3}')
 
plt.show()

n_samples = 10000

sample_means = []
for b in range(n_samples):
    sample_means.append(np.mean(np.random.choice(population, size=sample_n, replace=False)))
sample_means = np.array(sample_means)

sns.distplot(sample_means, kde=True, label='Random Samples')
plt.axvline(x=np.mean(sample_means), ymin=0, ymax=1, linestyle='-')
plt.title('Distribution of Random Sample Means', fontsize=18)
plt.ylabel('Frequency', fontsize=16)

lower_bound = np.percentile(sample_means, 2.5)
upper_bound = np.percentile(sample_means, 97.5)

plt.axvline(x=lower_bound, ymin=0, ymax=1, color='red', linestyle='-')
plt.axvline(x=upper_bound, ymin=0, ymax=1, color='red', linestyle='-')
  
print(f'Bootstrapped Mean: {np.mean(sample_means):.3}')
print(f'95% Confidence Intervals: [{lower_bound:.3}, {upper_bound:.3}]')
 

sns.distplot(bootstrap_means, kde=True, label='Bootstrap')
sns.distplot(sample_means, kde=True, label='Random Samples')
plt.title('Bootstrapped vs Randomly Sampled Precision Estimates', fontsize=18)
plt.ylabel('Frequency', fontsize=16)
plt.legend(['Bootstrap', 'Random Samples'])
plt.show() 

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

8..5.20231
Nach Überabreitung wurde festegstellt,
dass die Binomial-Verteilung als Datenquelle
ungeeignet ist.
Ausserdem wurden überholte Funktionen ersetzt.
Nun sieht der Code schon echt nach Bootstrap aus.

Code: Alles auswählen


from seaborn import displot
import seaborn as sns

 
import matplotlib.pyplot as plt
import pandas as pd

mean = 50
std = 20
population_n = 10000
population = mean + np.random.randn(population_n)*std
 
                                        
 
sns.histplot(population, kde=True, label='Population')
plt.title('Population Distribution', fontsize=18)
plt.ylabel('Frequency', fontsize=10)
plt.show()
print(f'Population Mean: {np.mean(population):.3}')
print(f'Population Std: {np.std(population):.3}')
 



sample_n = 20
sample = np.random.choice(population, size=sample_n, replace=False)

sns.displot(sample, kde=True, label='Single Sample')
plt.axvline(x=np.mean(sample), ymin=0, ymax=1, linestyle='-')
plt.title(f'Sample Distribution: n={sample_n}', fontsize=18)
plt.ylabel('Frequency', fontsize=16)
      
print(f'Sample Mean: {np.mean(sample):.3}')
print(f'Sample Std: {np.std(sample):.3}')
plt.show()



n_bootstrap = 500
bootstrap_means = []
for b in range(n_bootstrap):
    bootstrap_means.append(np.mean(np.random.choice(sample, size=sample_n, replace=True)))
bootstrap_means = np.array(bootstrap_means)

sns.distplot(bootstrap_means, kde=True, label='Bootstrap')
plt.axvline(x=np.mean(bootstrap_means), ymin=0, ymax=1, linestyle='-')
plt.title('Distribution of Bootstrapped Means', fontsize=18)
plt.ylabel('Frequency', fontsize=16)

print(f'Bootstrapped Mean: {np.mean(bootstrap_means):.3}')
print(f'Bootstrapped Std: {np.std(bootstrap_means):.3}')
 
plt.show()

n_samples = 10000

sample_means = []
for b in range(n_samples):
    sample_means.append(np.mean(np.random.choice(population, size=sample_n, replace=False)))
sample_means = np.array(sample_means)

sns.distplot(sample_means, kde=True, label='Random Samples')
plt.axvline(x=np.mean(sample_means), ymin=0, ymax=1, linestyle='-')
plt.title('Distribution of Random Sample Means', fontsize=18)
plt.ylabel('Frequency', fontsize=16)

lower_bound = np.percentile(sample_means, 2.5)
upper_bound = np.percentile(sample_means, 97.5)

plt.axvline(x=lower_bound, ymin=0, ymax=1, color='red', linestyle='-')
plt.axvline(x=upper_bound, ymin=0, ymax=1, color='red', linestyle='-')
  
print(f'Bootstrapped Mean: {np.mean(sample_means):.3}')
print(f'95% Confidence Intervals: [{lower_bound:.3}, {upper_bound:.3}]')
 

sns.displot(bootstrap_means, kde=True, label='Bootstrap')
sns.displot(sample_means, kde=True, label='Random Samples')
plt.title('Bootstrapped vs Randomly Sampled Precision Estimates', fontsize=18)
plt.ylabel('Frequency', fontsize=16)
plt.legend(['Bootstrap', 'Random Samples'])
plt.show() 



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

Die immer noch vorhandenen Fehler in diesem Code
habe ich beseitigt und weitere Verbesserungen vorgenommen.
Weiter werde ich mich mit diesem Thema nicht beschäftigen.
Der Herr Baron M. hat Bootstrap offenbar von ' open source''
zur reinen Geschäftsidee verwandelt.
Gute Zeit OSWALD

Code: Alles auswählen


#Das Ziel  von Bootstrap ist bessere und robustere Schätzungen für 
#die Streuung der Parameter 
#Und damit zuverlässige Signifikanztests 
#und bessere Konfidenzintervalle  zu bekommen. 

import numpy as np
from seaborn import displot
import seaborn as sns

 
import matplotlib.pyplot as plt
import pandas as pd

mean = 50
std = 20
population_n = 1000
population = mean + np.random.randn(population_n)*std
 
                                        
 
sns.histplot(population, kde=True, label='Population')
plt.title('Population Distribution', fontsize=10)
plt.ylabel('Frequency', fontsize=10)
plt.show()
print(f'Population Mean: {np.mean(population):.3}')
print(f'Population Std: {np.std(population):.3}')
 
sample_n = 20
sample = np.random.choice(population, size=sample_n, replace=False)

sns.displot(sample, kde=True, label='Single Sample')
plt.axvline(x=np.mean(sample), ymin=0, ymax=1, linestyle='-')
plt.title(f'Sample Distribution: n={sample_n}', fontsize=18)
plt.ylabel('Frequency', fontsize=16)
      
print(f'Sample Mean: {np.mean(sample):.3}')
print(f'Sample Std: {np.std(sample):.3}')
plt.show()



n_bootstrap = 10000
bootstrap_means = []
for b in range(n_bootstrap):
    bootstrap_means.append(np.mean(np.random.choice(sample, size=sample_n, replace=True)))
bootstrap_means = np.array(bootstrap_means)

sns.displot(bootstrap_means, kde=True, label='Bootstrap')
plt.axvline(x=np.mean(bootstrap_means), ymin=0, ymax=1, linestyle='-')
plt.title('Distribution of Bootstrapped Means', fontsize=18)
plt.ylabel('Frequency', fontsize=16)

print(f'Bootstrapped Mean: {np.mean(bootstrap_means):.3}')
print(f'Bootstrapped Std: {np.std(bootstrap_means):.3}')
 
plt.show()

n_samples = 1000

sample_means = []
for b in range(n_samples):
    sample_means.append(np.mean(np.random.choice(population, size=sample_n, replace=False)))
sample_means = np.array(sample_means)

sns.displot(sample_means, kde=True, label='Random Samples')
plt.axvline(x=np.mean(sample_means), ymin=0, ymax=1, linestyle='-')
plt.title('Distribution of Random Sample Means', fontsize=18)
plt.ylabel('Frequency', fontsize=16)

lower_bound = np.percentile(sample_means, 2.5)
upper_bound = np.percentile(sample_means, 97.5)

plt.axvline(x=lower_bound, ymin=0, ymax=1, color='red', linestyle='-')
plt.axvline(x=upper_bound, ymin=0, ymax=1, color='red', linestyle='-')
  
print(f'Bootstrapped Mean: {np.mean(sample_means):.3}')
print(f'95% Confidence Intervals: [{lower_bound:.3}, {upper_bound:.3}]')
 

sns.displot(bootstrap_means, kde=True, label='Bootstrap')
sns.displot(sample_means, kde=True, label='Random Samples')
plt.title('Bootstrapped vs Randomly Sampled Precision Estimates', fontsize=18)
plt.ylabel('Frequency', fontsize=16)
plt.legend(['Bootstrap', 'Random Samples'])
plt.show() 


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

Letzter Beitrag imForum verschwunden ?
Ich finde ihn jedenfalls nicht mehr.
Deshalb noch einmal
Ein Vergleich zwischen Bootstrap und Jackknife.
OSWALD

Code: Alles auswählen

import numpy as np
from astropy.stats import jackknife_resampling
from astropy.stats import jackknife_stats
#data = np.array([1.5,2.3,3.1,4.7,5.3,6.4,7.5,8.1,9.3 ])   
data =np.array([1,2,3,4,5,6,7,8,9 ])          
resamples = jackknife_resampling(data)
 
#Die Funktion shape 'liefert die Größe bzw. und Gestalt eines Arrays
 
  
print("Ausgangs-Daten  beliebig gestalten (shape) :")  
print("einfach probieren")
print(resamples)
 
#Jackknife-Schätzung für Mittelwert, Bias, Standardfehler ,95 %-Konfidenzintervall:
 
test_statistic = np.mean
estimate, bias, stderr, conf_interval = jackknife_stats(
    data, test_statistic, 0.95)
print("Mittelwert geschätzt", estimate)
print("Systemischer Fehler ? ", bias)
print("Standardfehler =",stderr) 
print("Konfidentintervall=",conf_interval)
print()
print() 


#Beispiel für zwei Schätzungen
print("Ergebnisse nch zwei Schätzungen.") 
test_statistic = lambda x: (np.mean(x), np.var(x))
estimate, bias, stderr, conf_interval = jackknife_stats(
    data, test_statistic, 0.95)
print("Mittelwert geschätzt =",estimate)
print("Kein systemischer Fehler", bias)
print("Standardfehler =",stderr) 
print("Konfidentintervalle=",conf_interval)




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

nach Problemen mit dem Eintrag
stelle ich jetzt ein Experiment mit
der Funktion - MATCH&CASE - huer ein.
Einfach probieren.


Gute Zeit OSWALD

Code: Alles auswählen


 Erstes Experiment mit dem neuen PYTHON-feature  MATCH  & CASE
# Parameter der  Funktion   'versuch(3,8) ' , versuch(1,2)  usw  durchprobieren : Ergebnisse 

import subprocess
from subprocess import *
from math import *
 
def versuch(n):
    match   n :
         
        case  1 : subprocess.call(["C:/windows/system32/mspaint.exe"])
          
        case 2:   subprocess.call(["C:/Program Files/Internet Explorer/iexplore.exe"])
             
        case 3:
            return pi
        case 4:
            return (n+1)*sin(3) 
        case 5:
            return   n**3 +n**2   
        case 6:
            return    n*30  + n **2   
        case _:
            return  exp(1) 
for  i  in  range(1 ,8):
    print( versuch(i))


Benutzeravatar
__blackjack__
User
Beiträge: 13072
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OSWALD: IMHO kein wirklich sinnvoller Einsatz von ``match``/``case``. Das kann man problemlos auch mit ``if``/``elif``/``else`` ausdrücken:

Code: Alles auswählen

#!/usr/bin/env python3
import subprocess
from math import exp, pi, sin


def versuch(n):
    if n == 1:
        return subprocess.run(["C:/windows/system32/mspaint.exe"], check=True)
    elif n == 2:
        return subprocess.run(
            ["C:/Program Files/Internet Explorer/iexplore.exe"], check=True
        )
    elif n == 3:
        return pi
    elif n == 4:
        return (n + 1) * sin(3)
    elif n == 5:
        return n**3 + n**2
    elif n == 6:
        return n * 30 + n**2
    else:
        return exp(1)


def main():
    for i in range(1, 8):
        print(versuch(i))


if __name__ == "__main__":
    main()
Man beachte auch das `run()` statt `call()` verwendet wurde. Siehe Dokumentation zu `subprocess`.

Oder die klassiche Implementierung mit einer Abbildung von Wert auf Funktion:

Code: Alles auswählen

def versuch(n):
    return {
        1: partial(
            subprocess.run, ["C:/windows/system32/mspaint.exe"], check=True
        ),
        2: partial(
            subprocess.run,
            ["C:/Program Files/Internet Explorer/iexplore.exe"],
            check=True,
        ),
        3: lambda: pi,
        4: lambda: (n + 1) * sin(3),
        5: lambda: n**3 + n**2,
        6: lambda: n * 30 + n**2,
    }.get(n, lambda: exp(1))()
``match``/``case`` ist für „structural pattern matching“, wenn die Muster nur aus einzelnen literalen Werten bestehen, dann ist das dafür das falsche Werkzeug, weil es das Syntaxkonstrukt gar nicht wirklich verwendet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 351
Registriert: Freitag 18. März 2022, 17:32

27.05.23
Es tut mir leid.
Aber in meinem Beitrag hier , lese ich an der monierten Stelle 'call' und nicht 'run.'
Das ' zitierte run' stammt nicht von mir.
Ich weiß auch, dass amn es nicht mehr verwenden soll.
Gute Zeit OSWALD
Benutzeravatar
__blackjack__
User
Beiträge: 13072
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OSWALD Ja, ich lese da auch `call()`, darum schrob ich ja das das nicht sein sollte. Und wenn Du das weisst, warum machst Du es dann‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 351
Registriert: Freitag 18. März 2022, 17:32

27.05.2023
Das mit dem MATCH&CASE war wieder einmal
eine Glatteis-Partie, vor allem dass ich dabei
subprocess 'missbraucht 'habe.

Ich habe natürlich gleichzeitig meinem Hobby gefrohnt
und mit näher mit - tlinter- versucht und sogar angefreundet.
Immer die Frage im Hintergrund,
wie kann ich aus eInem Menue Funktionen etcaufrufen .
Zur Ralisierung diente immer wieder der subprocess.
Anbei eines von mehreren Beispielen, die ich mir erarbeitet habe.

Code: Alles auswählen


import sys
from tkinter import *
import subprocess
from subprocess import  *
from tkinter.filedialog import askopenfilename

def code1():
    subprocess.call(["C:/windows/system32/mspaint.exe"])
         
        #subprocess.call(["C:/Program Files/Internet Explorer/iexplore.exe"])

def code2():
     subprocess.call(["C:/windows/system32/calc.exe"])

def code3():
     subprocess.call(["C:/Program Files/Internet Explorer/iexplore.exe"])

def code4():
    subprocess.call( [ "C:\Program Files\Google\Chrome\Application\chrome.exe" ])                                                                   

 
 

 


def OpenFile(name):
     name= askopenfilename
     print(askopenfilename)

def About():
    print("          " )
 
####################

window = Tk()
window.title("Transfer von Objekten auf eine Subebene") 
window.geometry("500x550")
 
       
menu = Menu(window)
window.config(menu=menu)
filemenu = Menu(menu) 


menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="P a i n t", command=code1)
filemenu.add_command(label= "C a l c  ", command=code2)
filemenu.add_command(label= "E x p l o r e " ,command  =code3)
filemenu.add_command(label= "G o o g l e" , command = code4)
 
   
filemenu.add_separator()
filemenu.add_command(label="Exit", command=window.quit)
filemenu.add_separator()

helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=About)

mainloop()













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

1.6.2023
Mit dem 'regulären Ausdruck (Regex ) fing es ganz harmlos an.
Und jetzt bin ich mitten drin in der 'Hexenküche' , oder besser ,
an ihrer Oberfläche . Beginn mit einigen Funktionen aus dem Paket 're'.
und ganz nebenbei taucht ein 'Walross-Operator auf, den ich auch
mal ausprogiert habe. Jedenfalls schwer zu verstehen.
Soll ich mit das alles antun??
Gute Zeit OSWALD


Code: Alles auswählen

# Nr1
import re
print  ( "Das Paket  'Re' und diverse Funktionen.")
print("                              Funktion:   findall()")
print()
print("gibt eine Liste mit allen Übereinstimmungen zurück.")

txt = "Die Maus geht immer mit einer Maus  aus ihrem Haus"
x = re.findall("Maus", txt)
print(x)
 
print("Ohne Übereinstimmungen  folgt  l e e r e Liste")
txt = "Bayern ist kein Königreich" 
x = re.findall("GB schon", txt)
print(x)
 
print("                                 Funktion search()")
print()
print("Die search()Funktion durchsucht die Zeichenfolge nach einer Übereinstimmung ")
print("und gibt ein Match-Objekt zurück , wenn eine Übereinstimmung vorliegt,")
print(" dann stets  nur das erste Vorkommen.")
print()
 

print("Zwei weitere   Funktionen   :             sub()     und split()    ") 
ziel_str = "   Die Maus geht nie alleine aus dem Haus ."
 
res_str = re.sub(r"\s+", "", ziel_str)
print("jetzt sind alle Leerzeichen entfernt     :  ",              res_str)

res_str= re.split("\s",ziel_str)
print("und jetzt werden sie wieder getrennt    :"   ,           ziel_str)
print()
print("      Noch einmal                       Funktion  sub() ")
print()
print("Die sub()-Funktion ersetzt die Leerzeichen durch den Text Ihrer Wahl:")
print("hier durch  $    oder durch ---   ")
 
 
txt = "Die Maus geht aus ihrem Haus heraus"
x = re.sub("\s", " ---", txt)
print(x)
print("Sie können die Anzahl der Ersetzungen steuern")
 

txt = "Die Maus geht aus ihrem Haus heraus"
x = re.sub("\s", "-@-", txt, 1)      #    5= count-Parameter
print(x)

#Nr 2

from math import *
 
 

#Nützliche Anwendungen der Zuweisungsausdrücke
#Listen-Abstraktion (list comprehension)
#Im Folgenden benutzen wir den Walross-Operator in einer Listenabstraktion:

def f(x):
    return exp(x)  

numbers = [1,2,3,4,5]

odd_numbers = [result for x in numbers if (result := f(x)) % 2]
print(odd_numbers)
 
 
###Die obige Implementierung ist effizienter als eine Listenabstraktion
#o h n e   den Zuweisungsausdruck, da wir die Funktion nämlich zweimal aufrufen müssen:

 
def f(x):
    return exp(x) 
numbers = [1,2,3,4,5]

odd_numbers = [f(x) for x in numbers if  f(x) % 2]
print(odd_numbers)




Benutzeravatar
__blackjack__
User
Beiträge: 13072
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OSWALD: Den Walross-Operator kann man in dem Beispiel ganz einfach vermeiden in dem man erst `f` auf die Zahlen anwendet:

Code: Alles auswählen

odd_numbers = [x for x in map(f, numbers) if x % 2]
Wobei die Filterbedingung in den Beispielen gar nichts filtert, denn da kommt keine einzige ungerade Zahl heraus. Da kommt nicht einmal eine einzige ganze Zahl bei heraus.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 351
Registriert: Freitag 18. März 2022, 17:32

2.6.23
Hallo __blackjack__ pardon. es war das 'falsche' Objekt, aber jetzt könnt's passen ?
Keine Spur vom Walross-Operator ?
Nix für ungut .
Gute Zeit OSWALD

Code: Alles auswählen


#Nützliche Anwendungen der Zuweisungsausdrücke
#Listen-Abstraktion (list comprehension)
#Im Folgenden benutzen wir den Walross-Operator in einer Listenabstraktion:

def f(x):
    return    x

numbers = [1,2,3,4,5,7,8,10,13]

odd_numbers = [result for x in numbers if (result := f(x)) % 2]
print(odd_numbers)
 
 
###Die obige Implementierung ist effizienter als eine Listenabstraktion
#o h n e   den Zuweisungsausdruck, da wir die Funktion nämlich zweimal aufrufen müssen:

 
def f(x):
    return  x
numbers = [1,2,3,4,5,7,8,10,13]

odd_numbers = [f(x) for x in numbers if  f(x) % 2]
print(odd_numbers)



Benutzeravatar
__blackjack__
User
Beiträge: 13072
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ändert nichts daran das ``[x for x in map(f, numbers) if x % 2]`` lesbarer ist als die Variante mit dem Walross-Operator und die Funktion auch nur einmal für jeden Wert in `numbers` aufgerufen wird.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
OSWALD
User
Beiträge: 351
Registriert: Freitag 18. März 2022, 17:32

6.6.20o23
Im Prinzip glaube ich jetzt 'REGEX' verstanden zu haben.
Anbei ein Textauszug aus ''Der Sshatzgräber von Goethe ', der mit der Funktion findall
und verschiedenen Pattern ausgelesen wird.
Es braucht jetzt nur noch Fleiß .,Phantasie und viel
Übung.
Gute Zeit OSWALD
(Wer immer strebend sich bemüht, den können erlösen - Goethe )

Code: Alles auswählen


text ='''Der Schatzgräber :Arm am Beutel, krank am Herzen Schleppt ich meine langen Tage
Armut ist die größte Plage Reichtum ist das höchste Gut! nd zu enden meine Schmerzen
Ging ich einen Schatz zu graben Meine Seele sollst du haben!Schrieb ich hin mit eignem Blut.
Und so zog ich Kreis um Kreise, Stellte wunderbare Flammen,Kraut und Knochenwerk zusammen:
Die Beschwörung war vollbracht.Und auf die gelernte Weise Grub ich nach dem alten Schatze
Auf dem angezeigten Platze; Schwarz und stürmisch war die Nacht  usw usw
(Gedicht von  J.W.Goethe  , geboren am         28. August 1749                                                    '''

#'Hier enige Beispiele  von findall-Funktionen  
#Lesen aus einem  Gedicht von Goethe


import re
#pattern = r'.'
#pattern = '\w+'
#pattern = r'\d'
#pattern = r'^\w+'
#pattern = r'\b[aeiou]\w+' 
#pattern = r'\b[^aeiou0-9 ]\w+'


pattern_regex = re.compile(pattern)
result = pattern_regex.findall(text)
print(result)



Benutzeravatar
__blackjack__
User
Beiträge: 13072
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nächster Schritt: Das `regex`-Modul. Und danach dann `pyparsing` oder `funcparserlib` oder etwas in der Richtung. Oder NLTK. 🙂
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten