O seguinte código utiliza o recurso gradiente descendente para descobrir dois parâmetros, theta e theta1, que irão descrever uma equação de primeiro grau no tipo y = theta + theta*x.
Utilização: substitua os dados de experiência no código abaixo no formato [ (x,y),(x1,y1)...(xn,yn)]. também é necessário substituir o valor da variável "m", que corresponde ao quantidade dos dados de experiência. O parâmetro alfa é a velocidade com que o algorítimo converge para a solução, um valor de alfa muito alto poderá divergir, em um fenômeno chamado de "overshooting", não chegando assim a uma solução. Ao rodar o código abaixo, será impresso os valores de theta e theta1.
#coloque aqui os dados de experiência
experiencia = [
(1, 0.5),
(2, 1),
(4, 2),
(0, 0)
]
m = 4
#-- parametros inicias
theta = 0
theta1 = 0
#x = 0
m = 4
#-- velocidade de aprendizado
alfa = 0.001
#-- funcão de representação dos dados, nesse caso primeiro grau
#h = theta + theta1 * x
#gradient descent - algoritimo de amortização do custo
#faz a diferença entre a função custo e representação, diminuir
def aprender(theta, theta1):
while (True):
#print (dataset(0,theta, theta1))
p_theta = theta - (alfa * (1/m) * dataset(0, theta, theta1))
#print (str(dataset(1,theta, theta1)) + " t1")
theta1 = theta1 - (alfa * (1/m) * dataset(1, theta, theta1))
theta = p_theta
#condição de saida: derivada menor que |0.1|
if ((dataset(1,theta, theta1) <= 0.1) and (dataset(1,theta, theta1) >= -0.1) and (dataset(0,theta, theta1) <= 0.1) and (dataset(0,theta, theta1) >= -0.1)): break
print (theta)
print (theta1)
def dataset( opcao, theta, theta1 ):
somatorio = 0
for x,y in experiencia:
h = theta + theta1 * x
if opcao == 0: somatorio = somatorio + (h - y)
else: somatorio = somatorio + ((h - y) * x)
return somatorio
aprender(theta, theta1)
Nenhum comentário:
Postar um comentário