Implementierung des Least Mean Squares Algorithmus

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
gamma
User
Beiträge: 15
Registriert: Dienstag 30. April 2019, 09:32

Ich möchte den LMS Algorithmus implementieren. Dazu generiere ich zunächst inputs im Intervall [0,5] mit 51 Einträgen. Eine Funktion y liefert mir die Outputs. Die target values berechne ich aus der Funktion y, indem ich eine zufällige Zahl dazu addiere.

Code: Alles auswählen

import mnist
import numpy as np
from PIL import Image
from matplotlib import pyplot as plt
from skimage import data, io, filters, measure
from skimage.measure import regionprops
import random
import time
######################################   initialize Values   ######################################
x = np.linspace(0,5,51)
def basis_function(value,G):
    f_x = 2*value*value - G*value + 1
    return f_x


k = 0
N = 7
training_set = np.empty([N,2],dtype=np.float64)
t = np.empty(51,dtype=np.float64)
y = np.empty(51,dtype=np.float64)

for i in range(x.size):
    y[i] = basis_function(x[i],5)

for i in range(x.size):
    t[i] = y[i]+ np.random.normal(0,4)


for i in range(0,51,8):
    training_set[k] = x[i],t[i]
    k+=1


d = 2
psi = np.empty(d+1,dtype=np.float64)
psi[0] = 1
Psi soll eine Transformation darstellen der Form (1,x,x^d)

Um den Gradienten zu berechnen bin ich nach diesem Skript https://svivek.com/teaching/machine-lea ... ession.pdf vorgegangen. Ich setze grad = w damit dieser vektor die selbe Form hat wie w.

Code: Alles auswählen

w = np.empty(d+1,dtype=np.float64)
w.fill(random.uniform(0,5))
grad = w
def gradient(target,weight,training,inputvector,N):
    
    for j in range(d):
        for i in range(N):
            k = 1
            psi[k] = x[i]
            psi[k+1] = x[i]*x[i]
            element = t[i]- np.dot(weight,psi)
            element = -training[i][j]*element
            grad[j] += element
    return grad
Anschließend wollte ich Gradient einfach in der LMS Implementierung aufrufen:

Code: Alles auswählen


def LMS(target,training,inputvector,N,weight):
    learning_rate = 0.01
    condition = True
   
    while condition:
        dE_dw = gradient(target,weight,training,inputvector,N)
        
        weight = weight - learning_rate * dE_dw
        if(dE_dw[0]<1 and dE_dw[0]>0.1):
            if(dE_dw[1] <1 and dE_dw[1]>0.1):
               condition = False

    return weight
Wenn ich die Funktion nun aufrufe bekomme ich zwar keine Fehlermeldung, der Algorithmus determiniert allerdings auch nicht.
Ich denke das etwas mit meiner Gradienten Funktion nicht funktioniert, wobei diese mir zumindest Werte liefert, wenn ich sie alleine aufrufe.
Ich hoffe meine Code ist halbwegs verständlich und mir kann jemand weiter helfen.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Ohne in die Materie eizusteigen:
Funktionen sollten alles was sie brauchen als Parameter bekommen. In gradient tauchen magisch psi, x und t auf. k ist dort im 1, es gibt aber auch ein k, das auf Modulebene definiert wurde.
So ist das unnötig schwer zu debuggen.
Lass die globalen Variablen weg (es sei denn, es sind Konstanten, dann schreibe sie in GROSSBUCHSTABEN) und schreib saubere Funktionen und nimm aussagekräftige Variablennamen. Dann kann man auch versuchen das zu debuggen.
Antworten