Inversenberechnung _ Arrayübergabe
Verfasst: Montag 20. April 2020, 16:09
Liebes Forum,
Ich sitze seit einer ganzen Weile an der Erstellung eines Programms für statistische Auswertung.
Der Vergleichsdatensatz geht über 10k Zeilen und 7 Spalten, Ziel ist ein Array von 7 Werten, bestehend aus den Mahalanobis-Distanzen zum Mittelwert.
Im Großen und Ganzen funktionieren sämtliche Zwischenschritte, aber ein ärgerliches Problem habe ich derzeit noch und das Gefühl, als Anfänger in Python da einfach was ganz arg blödes zu übersehen:
Für Testzwecke, habe ich das Ganze einfach mal mit einem kleinen 3x3 Datensatz ausprobiert, den ich per Hand und per Excel berechnet habe, um das Programm zu testen.
Ich berechne die Kovarianz-Varianzmatrix, diese stimmt überein, aber irgendetwas scheint beim Einschreiben in das Array nicht zu funktionieren, weil die Folgeberechnungen nicht stimmen.
Allerdings gehen die Folgeberechnungen auf, sobald ich die Kovarianz-Matrix händisch in ein Array einschreibe und damit weiterrechne (Aus meiner Sicht mit gleicher Syntax - die Werte sind gleich).
Folgende Varianten habe ich probiert:
- Die Zwischenspeicherung in ein csv.file, um es auszulesen und damit weiterzurechnen
[Die händisch eingeschriebene Kovarianzmatrix wirft das Gleiche csv. aus, habe ich schon getestet.]
- verschiedene Umformatierungen der Kovarianzmatrix (pd.dataframe, np.matrix, np.asarray, ...)
- Aufrufen sämtlicher Zwischenschritte als print-Ausgaben, um zu testen, ob die Kovarianzmatrix auch indizierbar ist - passt alles, die Berechnungen stimmen leider dennoch nicht.
Ein letzter Hinweis - beim Vergleich der Printausgaben der berechneten und der eingeschrieben Matrix fällt mir auf, dass das händisch eingeschriebene Array die erste eckige Klammer extra vorrückt, sodass die Zahlenwerte untereinander strukturiert stehen - bei der ausgegebenen Matrix (sowie allen anderen in der Berechnung), stehen die Klammern sortiert untereinander - ich weiß nicht mal, warum das eine Rolle spielen sollte, wenn die Elemente alle sauber per Index aufrufbar sind
Habt ihr einen Hinweis, oder eine Idee?
Viele Grüße,
Arne
Ich sitze seit einer ganzen Weile an der Erstellung eines Programms für statistische Auswertung.
Der Vergleichsdatensatz geht über 10k Zeilen und 7 Spalten, Ziel ist ein Array von 7 Werten, bestehend aus den Mahalanobis-Distanzen zum Mittelwert.
Im Großen und Ganzen funktionieren sämtliche Zwischenschritte, aber ein ärgerliches Problem habe ich derzeit noch und das Gefühl, als Anfänger in Python da einfach was ganz arg blödes zu übersehen:
Für Testzwecke, habe ich das Ganze einfach mal mit einem kleinen 3x3 Datensatz ausprobiert, den ich per Hand und per Excel berechnet habe, um das Programm zu testen.
Ich berechne die Kovarianz-Varianzmatrix, diese stimmt überein, aber irgendetwas scheint beim Einschreiben in das Array nicht zu funktionieren, weil die Folgeberechnungen nicht stimmen.
Code: Alles auswählen
'''------------------------------------------------------------
Berechnung Zeilendurchschnitt [Zeitreihendurchschnitt]
------------------------------------------------------------'''
TimeArr = []
for CalcRow in range(len(mtx)):
TimeArr.append(0)
for Col in range(SPALTENANZ):
for CalcRow in range(len(mtx)):
TimeArr[CalcRow] += mtx[CalcRow][Col]
for CalcRow in range(len(mtx)):
TimeArr[CalcRow] = TimeArr[CalcRow] / SPALTENANZ
#print ('Zeilendurchschnitt :', [CalcRow], '=', TimeArr[CalcRow])
print ('Zeilendurchschnittsarray :', TimeArr)
'''------------------------------------------------------------
CovarianceVarianceMatrix
------------------------------------------------------------'''
CovVarMtx =[]
StdDev =[]
CovRow =[]
for CalcRow in range(len(mtx)):
for ComRow in range(len(mtx)):
StdDev = ((mtx[CalcRow] - TimeArr[CalcRow]) * (mtx[ComRow]-TimeArr[ComRow]))
CovVarEle = sum(StdDev[0:len(StdDev)])/(SPALTENANZ)#-1)
CovRow.append(CovVarEle)
CovVarMtx.append(CovRow)
CovRow = []
D = np.array(CovVarMtx)
#print (CovVarMtx)
#Umformatierung des Arrays
#------------------------------------------------------------
df = pd.DataFrame(CovVarMtx, dtype=float)
Cmtx = 0
Cmtx = np.array(df)
print ('Cmtx', '\n', Cmtx)
SPALTENANZ_CMtx = 0
SPALTENANZ_CMtx = len(df.columns)
ZEILENANZ_CMtx = 0
ZEILENANZ_CMtx = anzRows
print ('Rows/Cols :', ZEILENANZ_CMtx, SPALTENANZ_CMtx)
Folgende Varianten habe ich probiert:
- Die Zwischenspeicherung in ein csv.file, um es auszulesen und damit weiterzurechnen
Code: Alles auswählen
[/i]
#Zwischenspeicherung der Covariance-Variance-Matrix
#------------------------------------------------------------
np.savetxt("Covariance.csv", Cmtx, delimiter= ',')
print ('CVMtx: ','\n', Cmtx)
'''------------------------------------------------------------
Teilberechnungen Mahalanobis
------------------------------------------------------------'''
#Auslesen des für die Berechnungen notwendigen Zwischenfiles
#------------------------------------------------------------
file = open( "Covariance.csv")
rowArr = []
start = 0
for line in file.readlines():
spFullArr = [value for value in line.split(',')]
spFilterArr = []
for i in range(len(spFullArr)):
spFilterArr.append(spFullArr[i])
rowArr.append(spFilterArr)
start += 1
file.close()
Code: Alles auswählen
#Alternative - Inverse und Determinante, Zwischenchecks
#------------------------------------------------------------
A = np.array([[4173.25415838,4168.991966,4153.1742671],[4168.991966,4164.73419886,4148.93308044],[4153.1742671,4148.93308044,4133.19442491]])
np.savetxt("Covariance2.csv", A, delimiter= ',')
print (A)
print (A[0][0])
a = np.linalg.det(A)
print ('DET:', '\n', a)
print ('INV:', '\n', np.linalg.inv(A))
print ('EIN:', '\n', A.dot(np.linalg.inv(A)))
Z = np.linalg.inv(A)
print ('RÜCK:', '\n', np.linalg.inv(Z))
Code: Alles auswählen
#Umformatierung des Arrays
#------------------------------------------------------------
df = pd.DataFrame(CovVarMtx, dtype=float)
Cmtx = 0
Cmtx = np.array(df)
print ('Cmtx', '\n', Cmtx)
SPALTENANZ_CMtx = 0
SPALTENANZ_CMtx = len(df.columns)
ZEILENANZ_CMtx = 0
ZEILENANZ_CMtx = anzRows
print ('Rows/Cols :', ZEILENANZ_CMtx, SPALTENANZ_CMtx)
- Aufrufen sämtlicher Zwischenschritte als print-Ausgaben, um zu testen, ob die Kovarianzmatrix auch indizierbar ist - passt alles, die Berechnungen stimmen leider dennoch nicht.
Ein letzter Hinweis - beim Vergleich der Printausgaben der berechneten und der eingeschrieben Matrix fällt mir auf, dass das händisch eingeschriebene Array die erste eckige Klammer extra vorrückt, sodass die Zahlenwerte untereinander strukturiert stehen - bei der ausgegebenen Matrix (sowie allen anderen in der Berechnung), stehen die Klammern sortiert untereinander - ich weiß nicht mal, warum das eine Rolle spielen sollte, wenn die Elemente alle sauber per Index aufrufbar sind

Habt ihr einen Hinweis, oder eine Idee?
Viele Grüße,
Arne