Skip to content

Instantly share code, notes, and snippets.

@demacdolincoln
Created January 20, 2016 18:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save demacdolincoln/1a26216bad38dd7c0f75 to your computer and use it in GitHub Desktop.
Save demacdolincoln/1a26216bad38dd7c0f75 to your computer and use it in GitHub Desktop.
import numpy as np
class Perceptron(object):
'''
Implementacao do perceptron
'''
def __init__(self, dimensoes):
'''
:dimensoes: list com o nome das variaveis de entrada
'''
for dim in dimensoes:
self.__setattr__(dim, np.random.rand())
self.bias = np.random.rand() # comente aqui
self.fitness = 0
def run(self, valores):
'''
:valores: dict com os valores de entrada
'''
# somatorio da entrada
s = 0
for v in valores.keys():
if v != 'resultado':
s += self.__getattribute__(v) * valores[v]
s+= self.bias * -1 # comente aqui
# funcao sinal:
if s > 0:
return 1
else:
return 0
def atualiza_pesos(self, amostra, result):
'''
:amostras: dict {variaveis:valores, resultado: 0 ou 1}
:result: resultado de run()
'''
for k in amostra.keys():
if k != 'resultado':
new_w = self.__getattribute__(k) + 0.5 * (amostra['resultado'] - result) * amostra[k]
self.__setattr__(k, new_w)
self.bias = self.bias + 0.5 * (amostra['resultado'] - result) * -1 # comente aqui
def treinamento(self, amostras, testes):
'''
:amostras: list com dicts {variaveis:valores, resultado: 0 ou 1}
:testes: int com a quantidade de testes a serem feitos (epoch)
'''
tmp = 0
fitness = 0 # percentual de acertos
for i in range(testes):
acertos = 0
for a in amostras:
result = self.run(a)
if a['resultado'] != result:
self.atualiza_pesos(a, result)
else:
acertos += 1
fitness = acertos / len(amostras)
#if fitness == 1: break
tmp += 1
if tmp % 100 == 0:
print('|', tmp, self.fitness*100, end='|')
self.fitness = fitness
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment