33from utils import (
44 removeall , unique , product , mode , argmax , argmax_random_tie , isclose , gaussian ,
55 dotproduct , vector_add , scalar_vector_product , weighted_sample_with_replacement ,
6- weighted_sampler , num_or_str , normalize , clip , sigmoid , print_table , DataFile
6+ weighted_sampler , num_or_str , normalize , clip , sigmoid , print_table ,
7+ DataFile , sigmoid_derivative
78)
89
910import copy
@@ -567,13 +568,17 @@ def predict(example):
567568 return predict
568569
569570
571+ def random_weights (min_value , max_value , num_weights ):
572+ return [random .uniform (min_value , max_value ) for i in range (num_weights )]
573+
574+
570575def BackPropagationLearner (dataset , net , learning_rate , epochs ):
571576 """[Figure 18.23] The back-propagation algorithm for multilayer network"""
572577 # Initialise weights
573578 for layer in net :
574579 for node in layer :
575- node .weights = [ random . uniform ( - 0.5 , 0.5 )
576- for i in range ( len (node .weights ))]
580+ node .weights = random_weights ( min_value = - 0.5 , max_value = 0.5 ,
581+ num_weights = len (node .weights ))
577582
578583 examples = dataset .examples
579584 '''
@@ -611,10 +616,11 @@ def BackPropagationLearner(dataset, net, learning_rate, epochs):
611616 delta = [[] for i in range (n_layers )]
612617
613618 # Compute outer layer delta
614- err = [t_val [i ] - o_nodes [i ].value
615- for i in range (o_units )]
616- delta [- 1 ] = [(o_nodes [i ].value ) * (1 - o_nodes [i ].value ) *
617- (err [i ]) for i in range (o_units )]
619+
620+ # Error for the MSE cost function
621+ err = [t_val [i ] - o_nodes [i ].value for i in range (o_units )]
622+ # The activation function used is the sigmoid function
623+ delta [- 1 ] = [sigmoid_derivative (o_nodes [i ].value ) * err [i ] for i in range (o_units )]
618624
619625 # Backward pass
620626 h_layers = n_layers - 2
@@ -623,11 +629,9 @@ def BackPropagationLearner(dataset, net, learning_rate, epochs):
623629 h_units = len (layer )
624630 nx_layer = net [i + 1 ]
625631 # weights from each ith layer node to each i + 1th layer node
626- w = [[node .weights [k ] for node in nx_layer ]
627- for k in range (h_units )]
632+ w = [[node .weights [k ] for node in nx_layer ] for k in range (h_units )]
628633
629- delta [i ] = [(layer [j ].value ) * (1 - layer [j ].value ) *
630- dotproduct (w [j ], delta [i + 1 ])
634+ delta [i ] = [sigmoid_derivative (layer [j ].value ) * dotproduct (w [j ], delta [i + 1 ])
631635 for j in range (h_units )]
632636
633637 # Update weights
@@ -744,7 +748,8 @@ def LinearLearner(dataset, learning_rate=0.01, epochs=100):
744748 X_col = [ones ] + X_col
745749
746750 # Initialize random weigts
747- w = [random .uniform (- 0.5 , 0.5 ) for _ in range (len (idx_i ) + 1 )]
751+ num_weights = len (idx_i ) + 1
752+ w = random_weights (min_value = - 0.5 , max_value = 0.5 , num_weights = num_weights )
748753
749754 for epoch in range (epochs ):
750755 err = []
0 commit comments