Créditos: Neil Schemenauer <nas@arctrix.com>
Código:
# Back-Propagation Neural Networks
#
# Written in Python. See http://www.python.org/
# Placed in the public domain.
# Neil Schemenauer <nas@arctrix.com>
import math
import random
import string
random.seed(0)
# calculate a random number where: a <= rand < b
def rand(a, b):
return (b-a)*random.random() + a
# Make a matrix (we could use NumPy to speed this up)
def makeMatrix(I, J, fill=0.0):
m = []
for i in range(I):
m.append([fill]*J)
return m
# our sigmoid function, tanh is a little nicer than the standard 1/(1+e^-x)
def sigmoid(x):
return math.tanh(x)
# derivative of our sigmoid function, in terms of the output (i.e. y)
def dsigmoid(y):
return 1.0 - y**2
class NN:
def __init__(self, ni, nh, no):
# number of input, hidden, and output nodes
self.ni = ni + 1 # +1 for bias node
self.nh = nh
self.no = no
# activations for nodes
self.ai = [1.0]*self.ni
self.ah = [1.0]*self.nh
self.ao = [1.0]*self.no
# create weights
self.wi = makeMatrix(self.ni, self.nh)
self.wo = makeMatrix(self.nh, self.no)
# set them to random vaules
for i in range(self.ni):
for j in range(self.nh):
self.wi[i][j] = rand(-0.2, 0.2)
for j in range(self.nh):
for k in range(self.no):
self.wo[j][k] = rand(-2.0, 2.0)
# last change in weights for momentum
self.ci = makeMatrix(self.ni, self.nh)
self.co = makeMatrix(self.nh, self.no)
def update(self, inputs):
if len(inputs) != self.ni-1:
raise ValueError('wrong number of inputs')
# input activations
for i in range(self.ni-1):
#self.ai[i] = sigmoid(inputs[i])
self.ai[i] = inputs[i]
# hidden activations
for j in range(self.nh):
sum = 0.0
for i in range(self.ni):
sum = sum + self.ai[i] * self.wi[i][j]
self.ah[j] = sigmoid(sum)
# output activations
for k in range(self.no):
sum = 0.0
for j in range(self.nh):
sum = sum + self.ah[j] * self.wo[j][k]
self.ao[k] = sigmoid(sum)
# Se agrega codigo al archivo original
# Codigo para aproximar la salida a numeros enteros
if(self.ao[k]>0.9 and self.ao[k] <1):
self.ao[k] = 1
elif(self.ao[k]>0 and self.ao[k]<0.1):
self.ao[k] = 0
#--------------------------------------------------
return self.ao[:]
def backPropagate(self, targets, N, M):
if len(targets) != self.no:
raise ValueError('wrong number of target values')
# calculate error terms for output
output_deltas = [0.0] * self.no
for k in range(self.no):
error = targets[k]-self.ao[k]
output_deltas[k] = dsigmoid(self.ao[k]) * error
# calculate error terms for hidden
hidden_deltas = [0.0] * self.nh
for j in range(self.nh):
error = 0.0
for k in range(self.no):
error = error + output_deltas[k]*self.wo[j][k]
hidden_deltas[j] = dsigmoid(self.ah[j]) * error
# update output weights
for j in range(self.nh):
for k in range(self.no):
change = output_deltas[k]*self.ah[j]
# Se agrega codigo al archivo original
# Codigo para aproximar la salida de los pesos numeros enteros, se consigue mejor aproximacion en la actualizacion pero se aumentan las iteraciones
# No es significante el aumento de iteraciones
if(change>0.9 and change <1):
change = 1
elif(change>0 and change<0.1):
change = 0
self.wo[j][k] = self.wo[j][k] + N*change + M*self.co[j][k]
self.co[j][k] = change
#print N*change, M*self.co[j][k]
# update input weights
for i in range(self.ni):
for j in range(self.nh):
change = hidden_deltas[j]*self.ai[i]
self.wi[i][j] = self.wi[i][j] + N*change + M*self.ci[i][j]
self.ci[i][j] = change
# calculate error
error = 0.0
for k in range(len(targets)):
error = error + 0.5*(targets[k]-self.ao[k])**2
return error
def test(self, patterns):
for p in patterns:
print(p[0], '->', self.update(p[0]))
def weights(self):
print('Input weights:')
for i in range(self.ni):
print(self.wi[i])
print()
print('Output weights:')
for j in range(self.nh):
print(self.wo[j])
def train(self, patterns, iterations=30, N=0.5, M=0.1):
# N: learning rate
# M: momentum factor
for i in range(iterations):
error = 0.0
for p in patterns:
inputs = p[0]
targets = p[1]
self.update(inputs)
error = error + self.backPropagate(targets, N, M)
if i % 100 == 0:
print('error %-.5f' % error)
print "Number iteration: " + str(i) + "\n"
def pattner():
# Teach network
pat = [
[[1], [1]],
]
# create a network with two input, two hidden, and one output nodes
n = NN(1, 2, 1)
# train it with some patterns
n.train(pat)
# test it
n.test(pat)
if __name__ == '__main__':
pattner()
Archivo: Entrenamiento Perceptrón
Nosotros
Grupo de estudiantes aficionados a la informática, a las nuevas tecnologías y amantes de la programación.
Popular Posts
-
Resumen — La capacidad de las maquinas para responder a la interacción con el ser humano hacen que cualquiera caiga en el asombro. Hoy en d...
-
Créditos: Neil Schemenauer <nas@arctrix.com> Código: # Back-Propagation Neural Networks # # Written in Python. See http://...
-
El algoritmo Breadth-first Search(BFS) sirve para recorrer todos lo nodos o vértices de un árbol o de un grafo de manera sistemática. ...
-
Hola Mundo!, Aquí un curso muy interesante para empezar con el maravilloso mundo de la programación. En esta entrega les traemos un cu...
-
Hola, Este fue mi primer Tutorial... Lo pensé hacer por que era un problema muy frecuente en mi area. Mi Canal: https://www.youtube...
-
Hola Universo, Este Tutorial, Lo hice por que para mi era mas fácil designar la carpeta principal de mis proyectos, que copiar todos a la c...
-
¿Te gustaría saber cómo enviar y recibir información a través de formularios en HTML y PHP? Te advertimos que este post no preten...
-
Este algoritmo es un método de decisión para minimizar la pérdida máxima esperada en juegos con adversario y con información perfecta. ...
-
Diseñado por Freepik Desde hace mucho tiempo dentro del mundo de la Computación ha existido un debate sobre el progenitor de la Int...
-
Si ya sabes como crear formularios usando HTML5 y PHP pero sientes la necesidad de aplicar estilos visuales, entonces este es tu post...
Labels Cloud
Labels List Numbered
Algoritmo
(1)
anchura
(1)
árbol
(1)
Artificial
(2)
Bases
(1)
bases de datos
(1)
breadth
(1)
búsqueda
(1)
css
(1)
datos
(2)
Descargas
(2)
enviar
(1)
envío
(1)
first
(1)
formulario
(2)
formulario de registro
(2)
fundamentos
(1)
grafo
(1)
grafos
(1)
Herramientas
(4)
html
(2)
IA
(3)
IDE
(1)
información
(2)
Inteligencia artificial
(3)
lista
(1)
Marvin
(1)
método post
(1)
Mi Primer Post
(1)
Minsky
(1)
nodo
(1)
nodos. vértice
(1)
óptimización
(1)
php
(2)
post
(1)
Programacion
(4)
search
(1)
vértices
(1)
video2brain
(2)
XAMPP
(2)
Archivo del blog
Con la tecnología de Blogger.
No hay comentarios:
Publicar un comentario