Nichtlineare Regression/Cramer'sche Regel
Verfasst: Samstag 20. Februar 2016, 19:48
Hallo Zusammen
Ich habe mich von pydeal's Idee inspirieren lassen und möchte mal mein kleines Wochenendergebnis hinsichtlich des Codes sowie hinsichtlich des Ergebnisses zur Diskussion stellen. Mich jedenfalls haut ein Standardfehler von 16.25 % nicht gerade vom Hocker.
Ich freue mich auf Eure Beiträge.

Ich habe mich von pydeal's Idee inspirieren lassen und möchte mal mein kleines Wochenendergebnis hinsichtlich des Codes sowie hinsichtlich des Ergebnisses zur Diskussion stellen. Mich jedenfalls haut ein Standardfehler von 16.25 % nicht gerade vom Hocker.
Code: Alles auswählen
from matplotlib import pyplot as plt
def determinante(matrix = []):
summe = 0
zeilen = len(matrix)
for liste in matrix:
if len(liste) != zeilen:
print("Keine quadratische Matrix!")
return
if zeilen == 2:
return matrix[0][0]*matrix[1][1]-matrix[1][0]*matrix[0][1]
elif zeilen < 2:
print("Benötigt werden mindestens 2 Zeilen und 2 Spalten.")
return
else:
index = 0
vorzeichen = 1
for zahl in matrix[0]:
if vorzeichen:
summe += zahl*determinante(bildeSubmatrix(matrix,index))
vorzeichen = 0
else:
summe -= zahl*determinante(bildeSubmatrix(matrix,index))
vorzeichen = 1
index += 1
return summe
def bildeSubmatrix(matrix = [], index = 0):
submatrix = []
for i in range(1, len(matrix)):
zeile = []
for j in range(len(matrix[i])):
if j != index:
zeile.append(matrix[i][j])
submatrix.append(zeile)
return submatrix
def cramerscheRegel(koeffizientenmatrix = [], loesungsvektor = []):
zeilen = len(koeffizientenmatrix)
for liste in koeffizientenmatrix:
if len(liste) != zeilen:
print("Keine quadratische Matrix!")
return
nenner = determinante(koeffizientenmatrix)
if nenner == 0.0:
print("Gleichungssystem nicht eindeutig loesbar!")
return
loesung = []
for i in range(len(koeffizientenmatrix[0])):
tmpMatrix = [item*1 for item in koeffizientenmatrix]
j = 0
for zeile in tmpMatrix:
zeile[i] = loesungsvektor[j]
j += 1
loesung.append(determinante(tmpMatrix)/nenner)
return loesung
if __name__ == "__main__":
Dax = [0.0956,0.0265,0.2548,0.2906,-0.1469,
0.1606,0.2385,-0.4037,0.2229,0.2198,
0.2707,0.0734,0.3708,-0.4394,-0.1979]
Gold = [-0.1211,0.0012,-0.2733,0.0826,0.0893,
0.2924,0.2504,0.0432,0.3192,0.2320,
0.1777,0.0465,0.1989,0.2557,0.0141]
Jahre = []
jahr = 2015
while jahr > 2001:
Jahre.append(jahr)
jahr -= 1
Jahre.append(jahr)
xWerteProzente = [item*100 for item in Dax]
yWerteProzente = [item*100 for item in Gold]
summex = sum(xWerteProzente)
summey = sum(yWerteProzente)
summexy = 0
summex2 = 0
summex3 = 0
summex4 = 0
summex2y = 0
for i in range(len(xWerteProzente)):
summexy += xWerteProzente[i]*yWerteProzente[i]
summex2 += xWerteProzente[i]**2
summex3 += xWerteProzente[i]**3
summex4 += xWerteProzente[i]**4
summex2y += (xWerteProzente[i]**2)*yWerteProzente[i]
koeffMatrix = [[len(xWerteProzente),summex,summex2],
[summex,summex2,summex3],
[summex2,summex3,summex4]]
lVektor = [summey,summexy,summex2y]
funktionswerte = cramerscheRegel(koeffMatrix,lVektor)
xWerteFunktion = [item for item in xWerteProzente]
yWerteFunktion = []
xWerteFunktion.sort()
for item in xWerteFunktion:
y = funktionswerte[0]+(funktionswerte[1]*item)+(funktionswerte[2]*(item**2))
yWerteFunktion.append(y)
quadrResiduum = 0
for i in range(len(xWerteProzente)):
quadrResiduum += ((yWerteProzente[i])
-(funktionswerte[0]
+(funktionswerte[1]*xWerteProzente[i])
+(funktionswerte[2]*(xWerteProzente[i]**2))))**2
standarderror = (quadrResiduum/(len(yWerteProzente)-2))**0.5
yWerteFunktionStdErrUp = []
yWerteFunktionStdErrDwn = []
for item in yWerteFunktion:
yWerteFunktionStdErrUp.append(item+standarderror)
yWerteFunktionStdErrDwn.append(item-standarderror)
stringTitelOben = "Regression Dax/Gold [2001-2015] annual performance\n"
stringTitelUnten = "".join(["(",str(round(funktionswerte[0],2)),
"+",str(round(funktionswerte[1],2)),
"x+",str(round(funktionswerte[2],2)),
"x^2) +/- standard error (",
str(round(standarderror,2)),")"])
plt.grid(color='grey', linestyle='-', linewidth=0.25)
plt.plot(xWerteFunktion,yWerteFunktion,"r",
xWerteFunktion,yWerteFunktionStdErrUp,"r--",
xWerteFunktion,yWerteFunktionStdErrDwn,"r--",
xWerteProzente,yWerteProzente,"go")
text = []
for i in range(len(Jahre)):
plt.text(xWerteProzente[i],yWerteProzente[i],str(Jahre[i]))
plt.title(stringTitelOben+stringTitelUnten)
plt.xlabel("Dax")
plt.ylabel("Gold")
plt.show()