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]:
[<matplotlib.lines.Line2D at 0x7324f70>]

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]:
[2.731811154965702, 0.40768806780005595]

In [42]:
apprGaussList = [gaussian(omega, theta[0], theta[1]) for omega in omegaList]
plt.plot(omegaList, apprGaussList)


Out[42]:
[<matplotlib.lines.Line2D at 0x73f0ab0>]

In [43]:
error = []
for i in range(len(omegaList)):
    error.append(gaussList[i] - apprGaussList[i])
plt.plot(omegaList, error)


Out[43]:
[<matplotlib.lines.Line2D at 0x7453910>]

In [ ]:


In [ ]: