Implementierung des Least Mean Squares Algorithmus
Verfasst: Dienstag 12. November 2019, 19:43
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.
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.
Anschließend wollte ich Gradient einfach in der LMS Implementierung aufrufen:
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.
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
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
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
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.