In [38]:
import math
import numpy as np
from matplotlib import mlab
from matplotlib import pylab as plt
%matplotlib inline
# Построение графика гауссиана с заданными параметрами.
sigma = [3, 1.5]
omega_0 = [0, -1]
def gaussian(omg,sgm,omg0):
return (1.0/(sgm*math.sqrt(2*math.pi)))*math.exp(-(omg-omg0)**2/(2*sgm**2))
dOmega = 0.05
omegaMin = -20
omegaMax = 20
omegaList = mlab.frange (omegaMin, omegaMax, dOmega)
gaussList = [gaussian(omega, sigma[0], omega_0[0]) for omega in omegaList]
#gaussList2 =[gaussian(omega, sigma[1], omega_0[1]) for omega in omegaList]
plt.plot (omegaList, gaussList,'green')
#plt.plot (omegaList, gaussList2,'red')
Out[38]:
In [39]:
# выборка из "непрерывного" гауссиана с заданными параметрами тренировочного набора данных
dOmegaTrain = 0.5
omegaTrainList = mlab.frange(omegaMin, omegaMax, dOmegaTrain)
gaussTrainList = [gaussian(omega, sigma[0], omega_0[0]) for omega in omegaTrainList]
plt.plot (omegaTrainList, gaussTrainList,'x')
trainData = [[omega] for omega in omegaTrainList]
m = len(omegaTrainList)
for i in range(m):
trainData[i].append(gaussTrainList[i])
In [40]:
trainData[1][1]
def J(sgm, omg0): #Весовая функция, в виде суммы квадратов разности значений гипотезы и заданной функции в узлах. По всему набору
cost = 0
y = 0
m = len(omegaTrainList)
for i in range(m):
omg = trainData[i][0]
y = trainData[i][1]
cost = cost + (1/(2*m))*(gaussian(omg, sgm, omg0)-y)**2
return cost
def JSmg_Der(sgm, omg0): # Частная производная функции J по первому параметру
der = 0
m = len(omegaTrainList)
for i in range(m):
omg = trainData[i][0]
y = trainData[i][1]
der = der + (1/m)*(gaussian(omg, sgm, omg0)-y)*((-1/(math.sqrt(2*math.pi)*sgm**2))*math.exp(-(omg-omg0)**2/(2*sgm**2)) + gaussian(omg, sgm, omg0)*((omg-omg0)**2/sgm**3))
return der
def Jomg0_Der(sgm, omg0): # Частная производная функции J по второму параметру
der = 0
y = 0
m = len(omegaTrainList)
for i in range(m):
omg = trainData[i][0]
y = trainData[i][1]
der = der + (1/m)*(gaussian(omg, sgm, omg0)-y)*gaussian(omg, sgm, omg0)*(omg-omg0)*(1/(sgm**2))
return der
In [41]:
alpha = 0.5 #скорость обучения
theta = [1, 1] # 0й элемент соответсвует sigma, а первый-omega_0
for i in range(10000): # основной цикл реализации градиантного спуска
thetaTemp = [0, 0]
thetaTemp[0] = theta[0] - alpha * JSmg_Der(theta[0], theta[1])
thetaTemp[1] = theta[1] - alpha * Jomg0_Der(theta[0], theta[1])
theta = thetaTemp
theta
Out[41]:
In [42]:
apprGaussList = [gaussian(omega, theta[0], theta[1]) for omega in omegaList]
plt.plot(omegaList, apprGaussList)
Out[42]:
In [43]:
error = []
for i in range(len(omegaList)):
error.append(gaussList[i] - apprGaussList[i])
plt.plot(omegaList, error)
Out[43]:
In [ ]:
In [ ]: