├── Enhanced Neural Network ├── Expanded_NN.m ├── delta_activation.m ├── iris.csv ├── mnistTrn.mat ├── perfmance.m ├── project2.m └── xor.csv ├── Logistic Regression and Neural Network.ipynb ├── README.md ├── SGD Neural Network ├── NN.m ├── iris.csv ├── mnistTrn.mat ├── project1.m └── xor.csv └── Tensorflow.ipynb /Enhanced Neural Network/Expanded_NN.m: -------------------------------------------------------------------------------- 1 | 2 | function [weights, biases] = Expanded_NN(input,target,split,nodeLayers,numEpochs,batchSize,eta,trans,cost,lambda,mu) 3 | 4 | % divide dataset into train,validation and test sets 5 | [index_train,index_valid,index_test] = dividerand(length(input),split(1),split(2),split(3)); 6 | train = input(:,index_train); 7 | validation = input(:,index_valid); 8 | test = input(:,index_test); 9 | 10 | train_label = target(:,index_train); 11 | validation_label = target(:,index_valid); 12 | test_label = target(:,index_test); 13 | 14 | % initiate lists for performance plotting 15 | epoch_list = []; 16 | train_cost_list = []; 17 | valid_cost_list = []; 18 | test_cost_list = []; 19 | 20 | % placeholder for weights between different layers 21 | % the first elem is w between first and second layers 22 | % there will be length(nodeLayers)-1 columns 23 | weights = cell(1,length(nodeLayers)-1); 24 | 25 | % placeholder for biases between different layers 26 | biases = cell(1,length(nodeLayers)-1); 27 | 28 | % placeholder for velocities of all weights and biases, will be used for momentum parameter updates 29 | velocity_w = cell(1,length(nodeLayers)-1); 30 | velocity_b = cell(1,length(nodeLayers)-1); 31 | 32 | % placeholder for weighted sum 33 | % the first elem is weighted sum of input nodes and first layer weights 34 | z = cell(1,length(nodeLayers)-1); 35 | 36 | % placeholder for activation nodes 37 | % the first elem is the input layer 38 | a = cell(1,length(nodeLayers)); 39 | 40 | % placeholder for gradient of loss w.r.t. activation function for all 41 | % layers except first layer 42 | % so if we have 4-layered network, it then contains 3 elements 43 | delta_layers = cell(1,length(nodeLayers)-1); 44 | 45 | % placeholder for gradient of loss w.r.t. weights/biases, for all connects between 46 | % layers 47 | delta_weights = cell(1,length(nodeLayers)-1); 48 | delta_biases = cell(1,length(nodeLayers)-1); 49 | 50 | % initialize weights and biases between layers, and momentum velocity for 51 | % each w and b 52 | for i=1:length(nodeLayers)-1 % for each layer starting from the second layer 53 | if isequal(trans, 'sigmoid') | isequal(trans, 'tanh') | isequal(trans, 'softmax') 54 | weights{i} = randn(nodeLayers(i+1),nodeLayers(i))/sqrt(nodeLayers(i+1)); 55 | biases{i} = randn(nodeLayers(i+1),batchSize); 56 | elseif isequal(trans, 'relu') 57 | weights{i} = randn(nodeLayers(i+1),nodeLayers(i))/sqrt(nodeLayers(i+1)/2); 58 | biases{i} = randn(nodeLayers(i+1),batchSize); 59 | end 60 | 61 | velocity_w{i} = zeros(size(weights{i})); 62 | velocity_b{i} = zeros(size(biases{i})); 63 | end 64 | 65 | fprintf(' | TRAIN || VALIDATION || TEST \n'); 66 | fprintf('-----------------------------------------------------------------------------------------\n'); 67 | fprintf('Ep | Cost | Corr | Acc || Cost | Corr | Acc || Cost | Corr | Acc \n'); 68 | fprintf('-----------------------------------------------------------------------------------------\n'); 69 | 70 | % loop through epochs 71 | for epoch=1:numEpochs 72 | % shuffle data 73 | cat_data = cat(1,train,train_label); 74 | rand_order = randperm(size(cat_data,2)); 75 | cat_data = cat_data(:,rand_order); 76 | 77 | % divide data by batchSize and loop through each mini-batch 78 | for index = 1:batchSize:size(cat_data,2) 79 | minibatch = cat_data(:,index:index+batchSize-1); 80 | mini_train = minibatch(1:nodeLayers(1),:); 81 | mini_label = minibatch(nodeLayers(1)+1:end,:); 82 | 83 | % the first elem of a is input nodes, which are mini-batch training examples 84 | a{1} = mini_train; 85 | 86 | % feed-forward 87 | for conn=1:length(nodeLayers)-1 % for each connections between layers 88 | z{conn} = weights{conn}*a{conn} + biases{conn}; % weighted sum of nodes from previous layer and weights 89 | 90 | % calculate activations of the next layer 91 | if isequal(trans, 'sigmoid') 92 | a{conn+1} = logsig(z{conn}); % sigmoid transformation of z 93 | elseif isequal(trans, 'tanh') 94 | if conn == length(nodeLayers)-1 95 | a{conn+1} = softmax(z{conn}); % use softmax on the output layer 96 | else 97 | a{conn+1} = tanh(z{conn}); % use tanh for layers before output 98 | end 99 | elseif isequal(trans, 'relu') 100 | if conn == length(nodeLayers)-1 101 | a{conn+1} = softmax(z{conn}); % use softmax on the output layer 102 | else 103 | a{conn+1} = z{conn}; 104 | a{conn+1}(a{conn+1}<=0) = 0; % use relu for layers before output layer 105 | end 106 | elseif isequal(trans, 'softmax') 107 | if conn == length(nodeLayers)-1 108 | a{conn+1} = softmax(z{conn}); % use softmax on the output layer 109 | else 110 | a{conn+1} = logsig(z{conn}); % use sigmoid for layers before output layer 111 | end 112 | end 113 | end 114 | 115 | % back-propagation 116 | % gradient of loss (delta) w.r.t. activation function in layers except the first layer. 117 | % If we have 3-layered network, then we compute delta for last two layers 118 | if isequal(cost, 'quadratic') 119 | delta_layers{length(nodeLayers)} = (a{end}-mini_label) .* delta_activation(trans, a{end}, 'is_output_layer'); % delta for output nodes 120 | for layer=length(nodeLayers)-1:-1:2 % going backwards 121 | delta_layers{layer} = (weights{layer}' * delta_layers{layer+1}) .* delta_activation(trans, a{layer}, 'not_output_layer'); 122 | end 123 | elseif isequal(cost, 'cross-entropy') 124 | delta_layers{length(nodeLayers)} = a{end}-mini_label; % delta for output layer 125 | for layer=length(nodeLayers)-1:-1:2 % going backwards 126 | delta_layers{layer} = (weights{layer}' * delta_layers{layer+1}) .* delta_activation(trans, a{layer}, 'not_output_layer'); 127 | end 128 | elseif isequal(cost, 'log') 129 | delta_layers{length(nodeLayers)} = a{end}-mini_label; % delta for output layer 130 | for layer=length(nodeLayers)-1:-1:2 % going backwards 131 | delta_layers{layer} = (weights{layer}' * delta_layers{layer+1}) .* delta_activation(trans, a{layer}, 'not_output_layer'); 132 | end 133 | end 134 | 135 | % compute gradient of loss w.r.t. parameters, including L2 regularization 136 | for layer=length(nodeLayers)-1:-1:1 137 | delta_weights{layer} = delta_layers{layer+1} * a{layer}' + lambda * weights{layer}; 138 | temp_b = sum(delta_layers{layer+1},2); 139 | delta_biases{layer} = repmat(temp_b,1,batchSize); 140 | end 141 | 142 | % update weights and biases using momentum 143 | for layer=length(nodeLayers)-1:-1:1 144 | velocity_w{layer} = mu * velocity_w{layer} - ((eta/size(mini_train,2)) .* delta_weights{layer}); 145 | weights{layer} = weights{layer} + velocity_w{layer}; 146 | 147 | velocity_b{layer} = mu * velocity_b{layer} - ((eta/size(mini_train,2)) .* delta_biases{layer}); 148 | biases{layer} = biases{layer} + velocity_b{layer}; 149 | end 150 | end 151 | 152 | % get performance on training, validation and test sets 153 | [train_cost,train_num_correct,train_accu] = perfmance(train,train_label,nodeLayers,weights,biases,trans,cost,lambda); 154 | [valid_cost,valid_num_correct,valid_accu] = perfmance(validation,validation_label,nodeLayers,weights,biases,trans,cost,lambda); 155 | [test_cost,test_num_correct,test_accu] = perfmance(test,test_label,nodeLayers,weights,biases,trans,cost,lambda); 156 | 157 | % report learning status for each epoch 158 | epoch_list = [epoch_list, epoch]; % append epoch 159 | train_cost_list = [train_cost_list,train_cost]; 160 | valid_cost_list = [valid_cost_list,valid_cost]; 161 | test_cost_list = [test_cost_list,test_cost]; 162 | 163 | if mod(epoch,1) == 0 164 | fprintf('%d | %.3f | %d/%d | %.3f || %.3f | %d/%d | %.3f || %.3f | %d/%d | %.3f \n', ... 165 | epoch,train_cost,train_num_correct,size(train,2),train_accu, ... 166 | valid_cost,valid_num_correct,size(validation,2),valid_accu, ... 167 | test_cost,test_num_correct,size(test,2),test_accu); 168 | end 169 | 170 | % early stopping criterion 171 | if valid_accu > 0.99 172 | break; 173 | end 174 | end 175 | 176 | % plot prediction cost for training, validation and testing sets 177 | figure, 178 | plot(epoch_list,train_cost_list,'DisplayName','Train') 179 | hold on 180 | plot(epoch_list,valid_cost_list,'DisplayName','Validation') 181 | hold on 182 | plot(epoch_list,test_cost_list,'DisplayName','Test') 183 | legend('show'); 184 | end 185 | 186 | -------------------------------------------------------------------------------- /Enhanced Neural Network/delta_activation.m: -------------------------------------------------------------------------------- 1 | % calculate partial derivative of the output of the transformation function, a 2 | % trans is a string variable indicates which transformation function it is 3 | % a is the activation output 4 | % is_output_layer is a boolean variable used for softmax function only 5 | function a_delta = delta_activation(trans, a, is_output_layer) 6 | if isequal(trans, 'sigmoid') 7 | a_delta = (1 - a) .* a; 8 | elseif isequal(trans, 'tanh') 9 | a_delta = 1 - a.^2; 10 | elseif isequal(trans, 'relu') 11 | a_delta = a; 12 | a_delta(a_delta>0) = 1; 13 | elseif isequal(trans, 'softmax') 14 | if isequal(is_output_layer, 'is_output_layer') 15 | a_delta = ones(size(a)); 16 | else 17 | a_delta = (1 - a) .* a; % return the derivative of sigmoid if not the last layer 18 | end 19 | end 20 | end -------------------------------------------------------------------------------- /Enhanced Neural Network/iris.csv: -------------------------------------------------------------------------------- 1 | 5.1,3.5,1.4,0.2,1,0,0 2 | 4.9,3.0,1.4,0.2,1,0,0 3 | 4.7,3.2,1.3,0.2,1,0,0 4 | 4.6,3.1,1.5,0.2,1,0,0 5 | 5.0,3.6,1.4,0.2,1,0,0 6 | 5.4,3.9,1.7,0.4,1,0,0 7 | 4.6,3.4,1.4,0.3,1,0,0 8 | 5.0,3.4,1.5,0.2,1,0,0 9 | 4.4,2.9,1.4,0.2,1,0,0 10 | 4.9,3.1,1.5,0.1,1,0,0 11 | 5.4,3.7,1.5,0.2,1,0,0 12 | 4.8,3.4,1.6,0.2,1,0,0 13 | 4.8,3.0,1.4,0.1,1,0,0 14 | 4.3,3.0,1.1,0.1,1,0,0 15 | 5.8,4.0,1.2,0.2,1,0,0 16 | 5.7,4.4,1.5,0.4,1,0,0 17 | 5.4,3.9,1.3,0.4,1,0,0 18 | 5.1,3.5,1.4,0.3,1,0,0 19 | 5.7,3.8,1.7,0.3,1,0,0 20 | 5.1,3.8,1.5,0.3,1,0,0 21 | 5.4,3.4,1.7,0.2,1,0,0 22 | 5.1,3.7,1.5,0.4,1,0,0 23 | 4.6,3.6,1.0,0.2,1,0,0 24 | 5.1,3.3,1.7,0.5,1,0,0 25 | 4.8,3.4,1.9,0.2,1,0,0 26 | 5.0,3.0,1.6,0.2,1,0,0 27 | 5.0,3.4,1.6,0.4,1,0,0 28 | 5.2,3.5,1.5,0.2,1,0,0 29 | 5.2,3.4,1.4,0.2,1,0,0 30 | 4.7,3.2,1.6,0.2,1,0,0 31 | 4.8,3.1,1.6,0.2,1,0,0 32 | 5.4,3.4,1.5,0.4,1,0,0 33 | 5.2,4.1,1.5,0.1,1,0,0 34 | 5.5,4.2,1.4,0.2,1,0,0 35 | 4.9,3.1,1.5,0.1,1,0,0 36 | 5.0,3.2,1.2,0.2,1,0,0 37 | 5.5,3.5,1.3,0.2,1,0,0 38 | 4.9,3.1,1.5,0.1,1,0,0 39 | 4.4,3.0,1.3,0.2,1,0,0 40 | 5.1,3.4,1.5,0.2,1,0,0 41 | 5.0,3.5,1.3,0.3,1,0,0 42 | 4.5,2.3,1.3,0.3,1,0,0 43 | 4.4,3.2,1.3,0.2,1,0,0 44 | 5.0,3.5,1.6,0.6,1,0,0 45 | 5.1,3.8,1.9,0.4,1,0,0 46 | 4.8,3.0,1.4,0.3,1,0,0 47 | 5.1,3.8,1.6,0.2,1,0,0 48 | 4.6,3.2,1.4,0.2,1,0,0 49 | 5.3,3.7,1.5,0.2,1,0,0 50 | 5.0,3.3,1.4,0.2,1,0,0 51 | 7.0,3.2,4.7,1.4,0,1,0 52 | 6.4,3.2,4.5,1.5,0,1,0 53 | 6.9,3.1,4.9,1.5,0,1,0 54 | 5.5,2.3,4.0,1.3,0,1,0 55 | 6.5,2.8,4.6,1.5,0,1,0 56 | 5.7,2.8,4.5,1.3,0,1,0 57 | 6.3,3.3,4.7,1.6,0,1,0 58 | 4.9,2.4,3.3,1.0,0,1,0 59 | 6.6,2.9,4.6,1.3,0,1,0 60 | 5.2,2.7,3.9,1.4,0,1,0 61 | 5.0,2.0,3.5,1.0,0,1,0 62 | 5.9,3.0,4.2,1.5,0,1,0 63 | 6.0,2.2,4.0,1.0,0,1,0 64 | 6.1,2.9,4.7,1.4,0,1,0 65 | 5.6,2.9,3.6,1.3,0,1,0 66 | 6.7,3.1,4.4,1.4,0,1,0 67 | 5.6,3.0,4.5,1.5,0,1,0 68 | 5.8,2.7,4.1,1.0,0,1,0 69 | 6.2,2.2,4.5,1.5,0,1,0 70 | 5.6,2.5,3.9,1.1,0,1,0 71 | 5.9,3.2,4.8,1.8,0,1,0 72 | 6.1,2.8,4.0,1.3,0,1,0 73 | 6.3,2.5,4.9,1.5,0,1,0 74 | 6.1,2.8,4.7,1.2,0,1,0 75 | 6.4,2.9,4.3,1.3,0,1,0 76 | 6.6,3.0,4.4,1.4,0,1,0 77 | 6.8,2.8,4.8,1.4,0,1,0 78 | 6.7,3.0,5.0,1.7,0,1,0 79 | 6.0,2.9,4.5,1.5,0,1,0 80 | 5.7,2.6,3.5,1.0,0,1,0 81 | 5.5,2.4,3.8,1.1,0,1,0 82 | 5.5,2.4,3.7,1.0,0,1,0 83 | 5.8,2.7,3.9,1.2,0,1,0 84 | 6.0,2.7,5.1,1.6,0,1,0 85 | 5.4,3.0,4.5,1.5,0,1,0 86 | 6.0,3.4,4.5,1.6,0,1,0 87 | 6.7,3.1,4.7,1.5,0,1,0 88 | 6.3,2.3,4.4,1.3,0,1,0 89 | 5.6,3.0,4.1,1.3,0,1,0 90 | 5.5,2.5,4.0,1.3,0,1,0 91 | 5.5,2.6,4.4,1.2,0,1,0 92 | 6.1,3.0,4.6,1.4,0,1,0 93 | 5.8,2.6,4.0,1.2,0,1,0 94 | 5.0,2.3,3.3,1.0,0,1,0 95 | 5.6,2.7,4.2,1.3,0,1,0 96 | 5.7,3.0,4.2,1.2,0,1,0 97 | 5.7,2.9,4.2,1.3,0,1,0 98 | 6.2,2.9,4.3,1.3,0,1,0 99 | 5.1,2.5,3.0,1.1,0,1,0 100 | 5.7,2.8,4.1,1.3,0,1,0 101 | 6.3,3.3,6.0,2.5,0,0,1 102 | 5.8,2.7,5.1,1.9,0,0,1 103 | 7.1,3.0,5.9,2.1,0,0,1 104 | 6.3,2.9,5.6,1.8,0,0,1 105 | 6.5,3.0,5.8,2.2,0,0,1 106 | 7.6,3.0,6.6,2.1,0,0,1 107 | 4.9,2.5,4.5,1.7,0,0,1 108 | 7.3,2.9,6.3,1.8,0,0,1 109 | 6.7,2.5,5.8,1.8,0,0,1 110 | 7.2,3.6,6.1,2.5,0,0,1 111 | 6.5,3.2,5.1,2.0,0,0,1 112 | 6.4,2.7,5.3,1.9,0,0,1 113 | 6.8,3.0,5.5,2.1,0,0,1 114 | 5.7,2.5,5.0,2.0,0,0,1 115 | 5.8,2.8,5.1,2.4,0,0,1 116 | 6.4,3.2,5.3,2.3,0,0,1 117 | 6.5,3.0,5.5,1.8,0,0,1 118 | 7.7,3.8,6.7,2.2,0,0,1 119 | 7.7,2.6,6.9,2.3,0,0,1 120 | 6.0,2.2,5.0,1.5,0,0,1 121 | 6.9,3.2,5.7,2.3,0,0,1 122 | 5.6,2.8,4.9,2.0,0,0,1 123 | 7.7,2.8,6.7,2.0,0,0,1 124 | 6.3,2.7,4.9,1.8,0,0,1 125 | 6.7,3.3,5.7,2.1,0,0,1 126 | 7.2,3.2,6.0,1.8,0,0,1 127 | 6.2,2.8,4.8,1.8,0,0,1 128 | 6.1,3.0,4.9,1.8,0,0,1 129 | 6.4,2.8,5.6,2.1,0,0,1 130 | 7.2,3.0,5.8,1.6,0,0,1 131 | 7.4,2.8,6.1,1.9,0,0,1 132 | 7.9,3.8,6.4,2.0,0,0,1 133 | 6.4,2.8,5.6,2.2,0,0,1 134 | 6.3,2.8,5.1,1.5,0,0,1 135 | 6.1,2.6,5.6,1.4,0,0,1 136 | 7.7,3.0,6.1,2.3,0,0,1 137 | 6.3,3.4,5.6,2.4,0,0,1 138 | 6.4,3.1,5.5,1.8,0,0,1 139 | 6.0,3.0,4.8,1.8,0,0,1 140 | 6.9,3.1,5.4,2.1,0,0,1 141 | 6.7,3.1,5.6,2.4,0,0,1 142 | 6.9,3.1,5.1,2.3,0,0,1 143 | 5.8,2.7,5.1,1.9,0,0,1 144 | 6.8,3.2,5.9,2.3,0,0,1 145 | 6.7,3.3,5.7,2.5,0,0,1 146 | 6.7,3.0,5.2,2.3,0,0,1 147 | 6.3,2.5,5.0,1.9,0,0,1 148 | 6.5,3.0,5.2,2.0,0,0,1 149 | 6.2,3.4,5.4,2.3,0,0,1 150 | 5.9,3.0,5.1,1.8,0,0,1 151 | 152 | -------------------------------------------------------------------------------- /Enhanced Neural Network/mnistTrn.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timzhang642/neural_network_deep_learning/3c74dee406378b04236a4dd5532763776e9f72c9/Enhanced Neural Network/mnistTrn.mat -------------------------------------------------------------------------------- /Enhanced Neural Network/perfmance.m: -------------------------------------------------------------------------------- 1 | % return prediction performance 2 | function [epoch_cost,epoch_num_correct,epoch_accu] = perfmance(train,label,nodeLayers,weights,biases,trans,cost,lambda) 3 | z_perf = cell(1,length(nodeLayers)-1); % for performance use 4 | a_perf = cell(1,length(nodeLayers)); % for performance use 5 | 6 | % get prediction performance for all training data in this epoch using updated parameters 7 | a_perf{1} = train; 8 | 9 | % set biases matrix that corresponds to the size of the training set 10 | epoch_biases = {}; 11 | for elem=1:length(biases) 12 | epoch_biases{elem} = repmat(biases{elem}(:,1),1,size(train,2)); 13 | end 14 | 15 | % feed-forward 16 | for conn=1:length(nodeLayers)-1 % for each connections between layers 17 | z_perf{conn} = weights{conn}*a_perf{conn} + epoch_biases{conn}; % weighted sum 18 | if isequal(trans, 'sigmoid') 19 | a_perf{conn+1} = logsig(z_perf{conn}); % sigmoid transformation of z 20 | elseif isequal(trans, 'tanh') 21 | if conn == length(nodeLayers)-1 22 | a_perf{conn+1} = softmax(z_perf{conn}); % use softmax on the output layer 23 | else 24 | a_perf{conn+1} = tanh(z_perf{conn}); % use tanh for layers before output 25 | end 26 | elseif isequal(trans, 'relu') 27 | if conn == length(nodeLayers)-1 28 | a_perf{conn+1} = softmax(z_perf{conn}); % use softmax on the output layer 29 | else 30 | a_perf{conn+1} = z_perf{conn}; 31 | a_perf{conn+1}(a_perf{conn+1}<=0) = 0; % use relu for layers before output layer 32 | end 33 | elseif isequal(trans, 'softmax') 34 | if conn == length(nodeLayers)-1 35 | a_perf{conn+1} = softmax(z_perf{conn}); % use softmax on the output layer 36 | else 37 | a_perf{conn+1} = logsig(z_perf{conn}); % use sigmoid for layers before output layer 38 | end 39 | end 40 | end 41 | 42 | % calculate cost 43 | % L2 regularization cost 44 | parameters_squared = 0; 45 | for i=1:length(weights) 46 | parameters_squared = parameters_squared + sum(sum(weights{i}.^2)) + sum(biases{i}(:,1).^2); % sum of squared weights and biases 47 | end 48 | reg_loss = 0.5 * lambda * parameters_squared/size(label,2); % L2 cost 49 | % prediction cost 50 | if isequal(cost, 'quadratic') 51 | epoch_cost = immse(a_perf{end},label) + reg_loss; % MSE cost 52 | elseif isequal(cost, 'cross-entropy') 53 | epoch_cost = (-sum(sum(label .* log(a_perf{end}) + (1-label) .* log(1-a_perf{end}))))/size(label,2) + reg_loss; % cross-entropy for binary class 54 | elseif isequal(cost, 'log') 55 | epoch_cost = (sum(sum(label .* -log(a_perf{end}))))/size(label,2) + reg_loss; % cross-entropy for multiclass 56 | end 57 | 58 | % percentage correct and accuracy for this mini-batch 59 | [~,pred_indices] = max(a_perf{end}); % indice for predicted class for each example 60 | [~,true_indices] = max(label); % indice for true class for each example 61 | perf = pred_indices == true_indices; % performance, 1 if correct, 0 if not 62 | epoch_num_correct = sum(perf); % number of correct predictions 63 | epoch_accu = epoch_num_correct/size(train,2); 64 | end -------------------------------------------------------------------------------- /Enhanced Neural Network/project2.m: -------------------------------------------------------------------------------- 1 | % Date: Oct 22, 2016 2 | % Author: Yuxuan Zhang 3 | 4 | % for xor.csv 5 | %{ 6 | data = csvread('xor.csv'); 7 | input = data(:,1:size(data,2)-1)'; % each row is a feature, each column is an instance 8 | target = data(:,end)'; % assume the last column is label 9 | target = cat(1,1-target,target); % one-hot coding for label, each row is a class, each column is an instance 10 | %} 11 | 12 | % for iris.csv 13 | %{ 14 | data = csvread('iris.csv'); 15 | input = data(:,1:size(data,2)-3)'; 16 | target = data(:,end-2:end)'; 17 | %} 18 | 19 | % for ministTrn 20 | 21 | load('mnistTrn.mat'); 22 | input = trn; 23 | target = trnAns; 24 | 25 | 26 | % number of nodes in input/output layers 27 | input_size = size(input,1); 28 | output_size = size(target,1); 29 | split = [80,10,10]; % 80% train, 10% validation, 10% test 30 | nodeLayers = [input_size,30,output_size]; 31 | numEpochs = 30; 32 | batchSize = 10; 33 | eta = 3; 34 | 35 | trans = 'sigmoid'; 36 | %trans = 'tanh'; 37 | %trans = 'relu'; 38 | %trans = 'softmax'; 39 | 40 | cost = 'quadratic'; 41 | %cost = 'cross-entropy'; 42 | %cost = 'log'; % negative log likelihood loss for multiclass problem 43 | 44 | mu = 0.3; % friction term used in momentum update 45 | lambda = 5; % used for L2 regularization 46 | %rng(10); % set random seed 47 | 48 | [weights, biases] = Expanded_NN(input,target,split,nodeLayers,numEpochs,batchSize,eta,trans,cost,lambda,mu) 49 | -------------------------------------------------------------------------------- /Enhanced Neural Network/xor.csv: -------------------------------------------------------------------------------- 1 | 0.0,0.0,0 2 | 0.0,1.0,1 3 | 1.0,0.0,1 4 | 1.0,1.0,0 5 | -------------------------------------------------------------------------------- /Logistic Regression and Neural Network.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Handed Coded Logistic Regression and Neural Network\n", 8 | "\n", 9 | "#### Part of the code is borrowed from http://cs231n.github.io/neural-networks-case-study/ and http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/, based on which I have made some modifications for ease of use and extra functionalities" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 2, 15 | "metadata": { 16 | "collapsed": true 17 | }, 18 | "outputs": [], 19 | "source": [ 20 | "import time\n", 21 | "import numpy as np\n", 22 | "import matplotlib.pyplot as plt\n", 23 | "import matplotlib\n", 24 | "import sklearn.datasets\n", 25 | "import sklearn.linear_model\n", 26 | "%matplotlib inline" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## Generate a dataset with binary classes" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 3, 39 | "metadata": { 40 | "collapsed": false 41 | }, 42 | "outputs": [ 43 | { 44 | "data": { 45 | "text/plain": [ 46 | "" 47 | ] 48 | }, 49 | "execution_count": 3, 50 | "metadata": {}, 51 | "output_type": "execute_result" 52 | }, 53 | { 54 | "data": { 55 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAEACAYAAABVtcpZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXVcldcbwL+HbpAWRUVFxRa7u3PG7IU5Y/7cjE2dsU1n\nLZ3O1umMzU3dLDadit0diCKNdEhcuFzuPb8/dMy7a4AiGO/38+HzgXNPPO8LvM97nvOEkFKioKCg\noPB6YlTUAigoKCgoFB2KElBQUFB4jVGUgIKCgsJrjKIEFBQUFF5jFCWgoKCg8BqjKAEFBQWF15gC\nUQJCiNVCiFghxOVHfN5cCJEihDh//+uTglhXQUFBQeHZMCmgedYC3wPrH9PnsJSyWwGtp6CgoKBQ\nABTITkBKeRRIfkI3URBrKSgoKCgUHIV5JtBQCHFRCLFbCFG5ENdVUFBQUHgEBWUOehLngFJSSpUQ\noiPwO1ChkNZWUFBQUHgEhaIEpJTpD3zvJ4T4QQjhKKVM+m9fIYSSzEhBQUEhn0gpn8rkXpDmIMEj\n7P5CCLcHvq8HiIcpgH+QUr5QXzNnzixyGRSZXh2ZXlS5FJleXpmehQLZCQghNgEtACchRDgwEzAD\npJRyBdBbCDEK0ACZQN+CWFdBQUFB4dkoECUgpRzwhM+XAEsKYi0FBQUFhYJDiRjOAy1atChqEQxQ\nZMobL6JM8GLKpciUN15EmZ4F8az2pIJGCCFfNJkUFBQUXmSEEMgX4GBYQUFBQeElo7DiBBQUHkta\nWhpnz57F1taW2rVrI4QSYK6gUBgoOwGFIufbr7+mpFtxxr4xiDdadqCSV3muXLlS1GIpKLwWKGcC\nCkXKrl27GNnvLcZlVMJVWCKl5LiIZY9jPLcjwrC0tCw0WdRqNb///jsBAQF4e3vTq1cvLCwsCm19\nBYWn5VnOBBQloFCktGncnHLHE2gg3PXav7e5yaTlC+jfv3+hyBEWFkaLRk2xS9NROs2USNsc4i21\nHDh6CG9v70KRQUHhaXkWJaCcCSgUKeHh4TTH1aDdPdOU8PDwQpNj2OB3qB1rQWed572493T4OyOS\nt/oO4MT5M4Umh4JCYaOcCSgUKb51a3PdSD8LeZLM4iQxzP10Nq4OjowaNoKEhITnJkNiYiInTp2k\nrdZDr72FzoMbATcKVRkpKBQ2ihJQKFKmzJzOXxYxnJQx5EgdMVLFLM5QN8eZaZnVmHC3IkHr99K4\nbn1UKhWhoaFMnjCJLm3aM3nCJEJDQ59ZBpVKhZmxCab/+XcwEUZYmZiSkZHxzGsoKLyoKGcCCkXO\n0aNHmfT+eM5evogRUF24MFqnX3JisVUgbccOYuWSpdTPdsYr24oQMxUnTePZ+ZcfjRs3fur1pZRU\nKOVFt0gHqgqn3PYgeZd1zpGExURhbGz81PMrKDxvlINhhVcCtVpN787dKbk/knr/Jp4FwF9Gscc6\nhjczPKkj/j1DOCvjOFhWzbWgwGeKLfDz82NQ7760y3KnvM6eUJGGn2U0y9evoVevXk89r4JCYaBE\nDCu8Epibm+NRqiQJRmqDzxJNssnMysIXF712X1yIjY4hLCzsmdbu2LEjew8fhO41+KN8OpldfNi1\n/y9FASi88ijeQQovFCPGjKL9L79SW+WMm7ACIFKmc8wkDiOdMWgNx+ikxMjo2d9nateuzeZtvz7z\nPAoKLxPKTkDhhaJ27drM+WoBX1hcZqlNEIttb/Gl5TUWr1xGuXJlOSFi9fqfELGU8SpDqVKlikZg\nBYWXHOVMQOGFJDk5mX379mFkZET79u2xtbXlwoULtGvRimoaB0pnWhBmmcVlkxT2+u/H19e3qEVW\nUCgylINhhdeGuLg41qxazbVLl6lSozpDhg3F1dUw2Ox5c/v2bcLCwvDx8aF48eKFvr6CwoMoSuA1\nQq1WExwcjLOzMy4uLk8eUMDEx8fz49q1BAUEUr2OL4MHD8bOzq7Q5SgqkpOT6f9Gb06fPk1JM3tC\ns5J5s++bLF21AlNT0+e2rk6nIy0tDRsbG8VdVcEAxTvoNeGbr77Cw9mNdvWbUs6zDD07dyMpKanQ\n1j9z5gw+5Sqwe9YPZPx4lA0fLcCnnDdBQUGFJkNRM7BPX3QngpmXWYcPUisyV12Hc7/tZfrUac9t\nzRXLV1DavQQeLm64ODgy9aOPycnJeW7rKbxeKDuBl4R1P/7I9LETeC/Dm+LCmiyZw3azcLJ9S+B/\n4uhzX19KiY9XeVqGWer58O8VkcQ1dGf/0UPPXYaiJjQ0lFo+1ZifVQdT8e/7U7zMZK71VeJTkjAx\nKViHuxXLV/D5h1N4V1UWL2FHnFSxySqMhv06s2z1ygJdS+HlRdkJvAbM+3Q2/TJKU1xYA2AhTOib\n7cWNy1e5dOnSc18/ICCAuwnJ1P1PsreWuuKcOH2Ku3fvPncZiprIyEiKm9vpKQAAZyzIzs4mPT29\nQNeTUjJ7xqxcBQDgKqwYrirPpk2biIuLK9D1FF5PFCXwkhASGU5Z9G3vRkLgZVKMmzdvPvf1NRoN\nJsLIICrXCIEQ4rUwT/j4+BCpTiFdavTaQ0jDqZhjgZ+NpKWlkZCclKsA/sFamOJpXozAwMACXU/h\n9URRAi8J5Ut7EYT+27ZW6ridk0ylSpWe+/pVq1ZFWpoQKPUzfp4mjioVK+Hk5PSIkXlHSomfnx/v\nDBjEoDf7MXPmTN4fNYZJH07gwoULzzz/P6hUKr768kvqV/elQY3afPPNN2RmZj5xnJOTE++88w7L\nrW4RLTOQUhIk77LaMoguvXqwY8cOvd1AQEAAXdt1xMLUDHsrG0YOGZavMxxra2sszM2JlSq9do3U\nckedgqenZ94vWkHhEShnAi8JGzdu5KMR7zNC5Y2nsEElNWw1D8eoXhn+PuxfKDLs2bOHQX360SLb\nlVI51twyTeekeQJ++/dRr169Z5pbSsm7g97i4B9+NMooxmniSCWb5nigMYbj5gmM+fB/zPr8s2da\nR61W06JhEzSB0TRXOQNw0Coe6yql2H/0EGZmZo8dr9Vqmf3pZyz+7nvSVOnYWtmgylRR0dIViSQ4\nJ4VlK5fTuEkTalerQZs0F5rI4mSRg59ZFPFe1py9cjHPnkSfTJnKjkVrGa7yxkaYopFatpiHYdbE\nmz1/732me6Hw6qC4iL4m/LBkCZ9+MgOh0ZGeo6Zr584sW7MKe3v7QpPh2rVrfP/NdwQF3KBGHV/G\njv8fXl5ezzzv33//zZAe/ZiaUZXzxHOASCbjm2t/T5XZfG55iQMnj1K9evWnXmfdunV8OWYK4zMq\nYXTftKWTkq9tAvhkxdd5rmSm0+k4ffo0nVu340NVZTzun9VEynS+sbxO1549iN9ynD45ZXLHSCn5\n0iaAz39cnOecRDk5OYwbNYYNGzZQ0tyBaPVdGjdpwoZff8bBwSF/F6/wyqIogdcIjUZDREQEjo6O\nr9RD4L2hw0le608HSrFIXqY+btT/TybRbUYhVJvYly/mzX3qdfp0ewPbnTdoKvQLyPjLKHJ612Tj\nrz/nea4xI98jevV+uur0U1ZsNw7jvH0aAxNLUEkU0/tslwyl7IdvsPCrL/Mld3x8PIGBgXh6elK6\ndOl8jVV49VG8g14jTE1NKVu27CulAP5LDjqDAi8ApjpBdnb2M81tY2dLpjDMQpdppMXG1uahY06d\nOkXHVm1xtXekurcPK1euREpJdHgULlpD85FzjilmJqbECJXBZ/GWWjxKlsi33C4uLjRp0kRRAAoF\njqIEFNBqtQQHB5OYmFhkMvTu35cTVsmopZYSWPM3ETy4I1RLLaetkunR841nWuftYUM4ZJWg5+GT\nKrM5bJnAW0PfNeh/+PBhOrZqi9vBCD5K9aF9kAULPpjGRxMm0qRNC65aGbqFXrXOoGvfXvxlGUO8\n/PfAOUAmccUoiUGDBj3TNSgoFCQFYg4SQqwGugCxUsqHGmyFEIuAjkAG8I6U8uIj+inmoEJk08aN\nTB4/AU1mFqqcbJo1acrqDetwd3cvVDmklLwzcDAH//AjSZWKA+YUw5xmeKBGix/hOHp7cjnw+jMV\njwH4eNJkVi1ZRh3NPY+m06YJjBk/js+/mGPQt3HtelQ9n0ED8e/9SJPZTDM/x7nLF2nbvBVV481o\nrfVAIvmTcI4bx7F526+EBofwyZSplDdzIpMckoyy+Xnbr7Rs2fKZ5FdQ+C9FfiYghGgCpAPrH6YE\nhBAdgbFSys5CiPrAd1LKBo+YS1EChcS+ffsY2KMPI1TlKSfsUUstu00jCPMy52LA1QLJ0Z8fpJR8\n8cUXrPh0IVM1NTlGDJdIwBQjKuDAPrt44u8mP3miPHDt2jW2bdtGQkICjRo1onv37lhYWBjIY2pi\nwg+6ZgYBYottbzFrwxIqVKhAveq1yM7OxgSBLy5Uohi/WkWwaesWli9awp69f2IkjOjetRtfff8t\nJUrk3xykoPA4ivxMQEp5FHjcf2d3YP39vqcAeyH+c+qnUOjMnfkZPVQlKCfueReZC2Pe0JRGFZ3I\ngQMH8j3fyZMnadesFQ7Wtnh7evHNV1+j1T6kCswjEELg4+ODq6U9ZsKYlqIE40UNxohqNMadjDz4\n8ucVY2Njtm76hc2r1jFtxP8o4erOyhX6aRiEEDjY2JFEll67lJJEXSZOTk4cPnyYSqbO/CCas0g0\n4x3hQwPhTuMsF/r26IXYG8CX2obMy6lHxs7zNK7bgLS0tAK7DgWFZ6WwXvVKABEP/Bx1v02hCLl5\n8ybl0XcvFULglWOd72jU48eP06l1O0oeieZTVU36RjqxasYCRg0dnq95mjRpwg11PHelfonJEyKW\nFk2b5WuuR6FWq2nbvCU1ArXMVfkyLa0KH6RVZPoHk9i3b59e3yHDhrHNIoIcqcttOypiMHO0pUGD\nBgRcvUbpDMPD4VRdFpWybemqK42NMMVOmNFTWwb3VMG6deueKOPdu3fZsWMHfn5+ZGVlPbG/gsLT\nohwMv8Z4e3sTTKpem5SSUJMMvL298zXXJxM/ooeqBE2FB3bCjHLCnjGqivzyyy+EhobmeR5XV1c+\nnDiBb6xvcFbGES7T2GUUjp91DHO/XpgvmR7F77//jlOmMS3wyI0VKCFs6KLy4Ks58/T6fjbnc9yb\nVecTqwustwxmoW0Af7ve5Y8/d2NkZIRP1SqEWRt6LIWRhq90NmivnGHNCf8jj5Vv2dJleBYvwczB\nY5jUbxgl3YqzZ8+eZ7hiBYVHU1g1hqOAB2PcS95veyizZs3K/b5Fixa0aNHiecn1WvPRzE94u1c/\n3FSWlBF2ZEstfiaRmLsVo02bNvma69T5s/Skrl6bpTChsqkLJ0+epEyZMnmea9bnn1GtZg0WL/yG\n/THRNGjSmOMzPqFixYr5kulRhISEUCLT8O29FLYcCQ7Ra7OwsGDHX3u4ePEiZ86cwcPDg/bt2+dm\nC+3Xrx8zp0zjoCqKprI4xgiukUSCsZoYskCnv0asaTZVvR5dCvPEiRPMmPgxUzOr4ZZ1r8ZykLxL\nzy7dmTprOtOmTVPqCSjg7++Pv79/gcxVYMFiQogywE4pZbWHfNYJGHP/YLgB8K1yMPxisG7dOj76\nYCLGGh3pmizq16/Pj5s34OHh8eTBD1DKzYMhcSUpLWz12r+wucq8tT/QrVu351p0JT/s3r2bD/sP\n5aO0ynqeRn8TiaZrFbb8sS1f8924cYN3+g/ixo0bmBkZY1fMgUnTpzLlw0mMV/ngKe7FH4TIVL63\nvMGZyxcoX778Q+ca3Lc/Ob+eox36eYHWyxtcN7lL+97dWb95Yz6vWOFV50XwDtoEtACcgFhgJmAG\nSCnlivt9FgMduOci+q6U8vwj5lKUQCGTk5PD7du3cXBwwM3t6c7r53w+my3zljBaVREzce9N9SjR\nbOIW5mZmGJmaMHbc+8z87NMif5PVarXUqlyNEiFZdNGUxAITLpHABqtQ9h0+SO3atQ3GXLx4ke3b\n7imHnr16UaNGDYM+UVFRZGVlUbZsWYQQbN60iVEj3sPT2A6J5I4undXrf+SNNx4d69C6UTOqnrhL\nTaFvStonI4gmg8uWaRw+c4IqVao8411QeJUociVQkChK4OUkJyeHdwYMYs+u3VQ2diZKc5fY7DSG\nSx9qChfipIr11qF0GTmQ+flMmVDQSClZu3YtMyZNITYpAWMjI7xKleb7lcsMzGBSSiZ98CHrV66h\nrtoRgNPmSbw7cjgLvn7ydahUKg4dOoSRkRHNmzc3cEP9L9OnTuPk15sYkF1WT4avuUhD3LltmUmf\nryYzatSop7hyhVcVRQkoFBqHDh3i67kLuH0riOq1ajD5k6nUrFkz9/ObN29y9OhR/jfmfaZmVcdd\n3LNrSym5RhLLzQP57fftbPpxPdGRd2jSugWjx44p1HrJH0+cxOZla+mY4Y4dZlwwSeSyTTonzp2h\nbNmyen0PHjzIoK69mJJRFWtxz5yVLjXMtb7Kpl3bCvy8KiYmhpqVq9Io2Z6WlCD7fqDcDZKZQR2W\n2d5m8oqF9OvXr0DXVXi5UZSAAgCxsbEsXfIDp44co3RZL0aNG5trtsjOzkan0z3xTfRxrF+/nomj\n3qdTpgelpQ03je7yl0UMv+38nVatWuX2Cw0NpUHVWsxV+QIQLFNZxXV0SCSSVDTUwQVfXLhikcpN\nm0yOnz1dKHlxIiIiqFrBh9lZvtiIf88odhiFYdu7Put/1re3Dxn8NpkbTxjY6PfIMFJalGLQO2/T\nrFmzAsmk+g+3b9/mze49uXztCmYYUw9X3qAsEaSzxjaEiJg7WFlZFdh6Ci8/RR4splD03Lx5kxo+\nVTiycD3l/GOJX+dPy4ZNWbp0Kb279sDexhY7G1ua1WvI+fMPPY55LNnZ2Ux4fzxjVBVpjgdlhB3t\npCeDVGX438gxenl+XFxcUOk03JVq0qWGRVyiJ2WZSwPmi0ZMohZXSMIRC95Sl6Nusi1TJ04uyNvx\nSPbv3081Y2c9BQDQUOvKn3/+adBflZ6BhdQ/w7glU/AjjNCjF1k5dia1Kldj7MhRPOzlJTU1lYUL\nFtC6UTPe6NSVnTt3PrTfg5QrV47Tl87T982+WFlZYWRpxnrbUNbYhrBt5x+KAlAoUBQl8Irwwej3\naX7XkUHqstQWrnTRlWJcZiXGj3mfTL9LfKlpwGJtE8qdSaFt85YEBwc/dJ7ExETGjR6Lh5MrxZ1c\nGD1iJHFxcVy5cgUbaUKp/3j/1MCZ0PAwveRz1tbWvPP22/xkFYo/UVTBiTrCNdcTp6ywoz2eHCQS\ngGZad3YVkh+8tbU1mUY6g3YVOVg/5OHarU9PTtukoLv/4FZLLYu5wkiqMFVbi6EZ5ZiTVZu9G7ex\nZs0avbHJycnUq+HLtlmLqXIiBQe/IMb2f5cJ48Y/UU5jY2M2/LKZg6eO0evLSUxYvoDw6CiaN28O\nwM8//0y9arVwd3SmXfNWHDny+NgDBYVHoSiBVwCdTsde//200BXXay8tbHGTllTWOmAlTDAVRjQT\nHjRSO/Ptl18bzKNSqWhStwHXVu9ibFJZxiWVJ+jHvTSqUw8hBBna7NyH4T+o0aKVhmamL7/7Bt8+\n7fAzjqAUhimaPbEh/n46hhx0mBqbsGbNGmpUqIyznQNtmjTn8OHDz3prDOjUqRPBuhSC5L+lOnVS\n4md5h8FD3jHo37t3b5yrlGWxVSAXZQLbCaYkNlQV/5bTtBImdMkozrJvFumN/WrBQtyjNYzI8qaW\ncKGZ8GByRmXWrV5LQEBAnuStWrUqo0ePpn///lhb3ytcM/+LuUweNoaGV3VMTK5IycPR9OjQ+aE7\nGQWFJ6EogVcEI2GEFkMzg0RijL6psJLGjvMnTxv03bBhA1ZxmQzMLktxYY27sKJ/TlmcE3UcOXIE\nj1IlOSKi9cb4mUTSrnUbbGz0H/RmZmas/HENc79ayE1Lw7z6N0jBExuklOw1u0PZsl7MHvcRbW+Z\nMy2tKmWOxfNGxy7s3VuwJRStra3Z9OsvLLEKZK3FbbYTwmybK1jV9GLKtKkG/c3MzPjLfz9D50/h\nfG1LAkuAq5G1QT8nLIhP0E/F/cevW2ms1j/wthKm1NY6sXv37qeSPy0tjS9mz+H9jIrUFM44CQua\nCg8GqbyY9P4HTzWnwuuNogReAYyMjOjeqQt/G+sHYQfKZBJRU+4/+YEijTIoU17fCwbA/6+/qZ5h\na5CqubrKlkN//s3mbb+yzymJxdY32UYwX9oEcMtTsHTNSoO5/mH48OEk2gt2GoWTJXPIkTqOyWgO\nEoUFxiyyCSSyhCnXb9zg/YyKVBGOOAhzGoviDFCV4ePxE57hzjycjh07cis0mDcXTKTmJ4NYuX0z\nB44dxtLS8qH9LSwsGDt2LCs3/EhaaiqXdHF6uYQALhon0rS5fm4jU1MzNBgm0NMYySfWMn4Y/v7+\n9OzaHftsY5yFvqzVceJW6G29QvcKCnmhsNJGKDxnvl6yiManGxCddouKGVbEmmdzyigOY8y4nJlI\nLemMEIJwmcY+y1h2TzB8a3T1cCfU+JxBqoMk42xcPdzx8fEhKDyUrVu3EhISwpCqVenSpctjI4Gt\nrKw4cuo4Y4aN4MODB0FAlQqVGNTwHYRW0rtlc5ycnPh4wAgcss31xtbEmaWBh8nOzn6qh+bjcHFx\nYezYsfkaM/KdoXRMd+cGSXzPFXpILxww5yQxHLCM59inM/T6Dxz6NhtnfkNFVbHcHEXxMpPzxPNT\nz575WnvenC/49ouF1FbZk0YWOmTunABpaDAxNiE2Npbbt29TqVIlzM3NHzOjgsI9FBfRF5CkpCTW\nr19P4NXrVK5RjbfeeitPxeTT09PZsGEDp48ex9OrDEOHDyMqKor+vfog09WYCxOSZBbf/fA9Ax9S\n3crf359uHTrzgboyZYQdAHEyk4VW1/jr8IGHRtLmB5VKRU5ODnZ2dnrtFy9epFOTVnyeUVPvwZYo\ns/jM8iIp6WmFXtvgH27evMknkz5m7/6/ycjIYAnNEMBfhHOUGDLRII2N+GnrL3Tv3l1vrFqtplOb\ndoRdvIFvui0ZppITJnHMXjiP0WPG5Gl9KSU7duzgzV596KgtSTOKs5grNMCdtuKe26pOStabBRFs\nl016ejr2plakkc3nc+fkeR2FlxslTuAV4tKlS7Rt3oqKGls8VWaEWqsJMVdx8NgRKlWq9FRz6nQ6\nzp07h1qtpm7dugZviKmpqQwZ+Bb7/t6HvTAnJvMubqa2eJjbcz0ngc+/mI2llRV7d+zGwcmRISOH\n07hx44K4XODeg66mT1Wq3dLSWt7LMK6VOtZYBFF3SHe+W7K4wNbKDyEhIdSr6UuLdGeq6xyZwzm+\npylqtASTiiUmeGHLLJvL+B33p1o1g7RZaLVa/Pz8+GuPH/YODgx6a3Cef485OTm82aMnx/72x1dd\njHQ0XCCebnhxgCgsMaY41oRZq8nIUdM0x41u2tKYCCOiZAZLrW+yZMMaevToUcB3RuFFQ1ECrxC1\nKlfD94aWJvzr6XOAKEJ87Tl69tRzWbNb+06kHrpGX3UZLIQJKVLND+Y3KNfUl8bNmrJm6QqKpUpq\nZ9iRapTDIYt4xn08ganTPykwGYKCgujQqg1GKVl46Ky4IZOoWb8u23YVnV/86OEjifxxP29o7wWx\nfSHPUQwzrpFMaWxJJZsstJg62hIVH1Pgu5XFixez7KM5jFNVyq1sFinTmc95PqM+54hjC0FgZISr\nsOJzbR2985zzMp5zNc05fuFMgcql8OKhKIFXhJCQEOpUqcGCzDp6ZpEcqWOC+SmCwkNxdXV96Nis\nrCyEEPm2A4eGhlLLpyrzs+pgKv4NioqSGXzOWTyMbXDRmvMeVXIfMClSzSyLi1wKuJqvFNFPQqvV\nsn//fiIiIvD19aVWrVoFNvfTUK18JXrctqXsfdOYnwxjP5FMpTaOwgIpJSeJZZttFJFxMc8Ujf0w\n6lSpTovrxlQRjnrtK+Q1vLEnkBScsMAGU6LIYJiorNcvSWaxwOEGscn6XksKrx5KxPArQnZ2NqZG\n/3XoBCMExsKI7GzD4iVXr16ldeNm2NvYYm9jS9d2HfNVxCUkJISS5g56CgCghLAGJNlaDe3w1HvD\ndBDm1BYu7Ny5Mx9X92SMjY1p164dQ4cOLXIFAPcK3CTwb0nLqyTRD28cxb2HvRCChsIdT2z5448/\nCnz99PQMrB/iu2GJCXsII54sulCGctgTQqpBJPJNUqhcyafA5VJ4tVCUwAuEt7c31g62XCNJr/0C\n8ZQs6WlQoDwqKoqWjZtS4kQc32sb801OQ8wOBNG0fqM817GtWLEi4epkMmWOXnuITMUWMwTiIdEH\n9xyIiuqwtrAY9eE49ljHkCrvKd8k1BTHMEbATW1KZGRkga/fqXsXTpol6LVlyRxOE0ctnJmCL5bC\nBG/sscaUn7iJSmqQUhIok9luFcnUz2YWuFwKrxav9n/xS4aRkRHL1q5mrVUwO4zDuSwT+d0kjE3W\nYfywZoWB//4P3y/GV12MlpTAVBhjIUzooitFiQwTfvrppzyt6eHhQffuPVhreZvk+3V9I2U6q7lO\nJ0pTF1f+JkLvLTNJZnFBxtGtWzd0Oh06nWEahpeJ9PR0IiIiyMnRV4S9evVi0JjhzLA4z0qb22hN\n4Ar6phWdlASYpVKnTp0Cl2vy1Clcd1CzyTSYWzKFczKeb6xv4OTqjBf2mNw/JxBCMI7qXDNOYaLJ\nKSZYnOGX4vEsXrOCtm3bFrhcCq8WihJ4wWjbti3Hzp7C/e2WXKxvQ6mh7Tl14RxNmzY16Hv2+Ckq\nqg1TMlTIsOTcCcOI4Eexct0aGr3Tg1mWF5lgcZr5ppcojjUt8KAtniSQxUIucEhGsdMojHlWVxnz\nv3GMem8s5mbmWFhY8kaP3oSHhz/TtRc26enpvDvwLYq7uOFbqSqebsVZtnRp7udCCObMn0vA7VuM\nWTqHT778gr1WMRyT0eRIHUkyi3XmQXhWKk+zZs0es9LT4e7uztnLF/Ad15s9FbK4XNeaT35YyA9r\nVrLT6g5x8l4ktpSSKyIRIztLQiPDuXY7kNuRYbzZt2+By1TQJCcnM+79/+Hm5oGzkxtDhwznzp07\nRS3Wa4XHXPOnAAAgAElEQVRyMPwS896wEcT9eJCuOv2atRvNg2k5dSjT8um9k5WVRXJyMnFxcbRq\n0ow2Kjdq65yJRcVmsxBs3Zxo26kDb/TpxYABg/F0aUaF0q2QSAJD9hKbcobrAVfyFNPwItCiUVNu\nnbqIiQ6csaQqjuy3imPe8kUMekgcBdyrATx53AccP3caK3NL3ho8mHlfLcTW1vah/Z8X33+3iOlT\np+FhakeaVo2Vkz2/7thO9erVC1WOZ0GtVuPrWxed2pmKpdtjZGRCUMRBktKucPnKBRwdHZ88iQKg\neAe9tly5coXmDRozRlUx14PlqkxkrXUwV2/eyHed4Ae5du0an06bztEjR3F0KMaIcaMZM3YsxsbG\nzJk9h03r9lOnyrt6Y05eWcaY//Vl3Lhxz3RdhcHPP//M2/0H0YXSVMaRSNLZSQh1cCWsjDkBIbce\nO16n0yGEMDDRFSbp6emcOXMGOzs7fH19i1SWp+Gnn35ixrSvaFrrQz3ZT11ZydvDOjFlysdFKN3j\niYuLY+GChezYsQcrKyveHTKYUaNGFVkdbUUJvMZs3bqV0cNGYKczJUfqyLE04adfNhV4xasH6dyp\nO2nxJfEq0UCv/VbYIUpVzOTnn1/8Qug+XuVpGmpOQ+Ge23ZHZvAF59CgpVG9htSoU4txH35AuXLl\nnqssaWlp/Prrr9y5c4e6devStm3bV/7QHWDIu8O4dk5DpbL6JT3D7pzB1O4W+/72KyLJHk9CQgK+\ntepga+FNGY/GZGsyuRXuR9UaZdi5648iUcaKi+hrTK9evYiMi2Gd3zZ++XsXoXci8qQANm/ejK9P\nNZxsHWhat0G+snWW8SpFuiraoD0jMwavMs+/Olh+CQ0NZdWqVWzatInU1FQyMzO5HRFGXfRjLjyE\nNfaYUQ83fE9nELLyT+rWqMWpU88nSA/g1KlTlC1ZmuX/m8XJmWsY3XswDX3rkpqa+lzWU6vVbNmy\nhblz57Jjxw6Dw/DCxM3NlSxNkkF7RmYi7u4Pj4cpLHQ6HQcOHGDZsmX4+/vrOUZ8++13WJuXpU6V\nt3AuVg4P16o08f2AM6cvPpf0588bZSfwEpGZmcn8ufPYsOZHstRqOnbuxIzPP8XT0/PJgx9g4bz5\nfD97Ab0zPCmFLYEk85tVBMvWr6FXr15PHH/t2jUaNWxKk1r/w7nYvWykcYk3OX5pCRcunjWo01tU\nSCn5aMIkli9dSg0jVzKNtdzUJrNm/Y8M6j+QBZp6ehXGpJR8zAlGU43S94vnnJQxnK9qypkrFwtc\nPq1WS+niJekZ70ItcS/ltE5KfjK/TZW3O7Jk+bICXS8oKIhWTZpTTCXwVJkRbJWFdLbmwLHDFC9e\n/MkTFDBBQUH4+talRZ3JFLMrCUC6KoGDZ+axa/d2GjVqVOgywb06z21atycpMR1Hey8SUm7j5laM\nv/f/hYuLC7616uFi1Rp3F/3gvIs3ttG1VxVmz5ld6DIr5qDXAJ1OR6vGzVBdDKVDVnEsMeGYSSwX\nHDI4d+US7u7uT54EyMjIoISrO1NU1XB9IB1xgExiW8lkboWH5Gk7+9tvvzF82EhsbdyQUocqK4n1\n69fSuXPnp77Ggmbbtm18+NYIJmRUzn3Yh8hUvrMMoHWr1mTsvUxfjVfu9Z6QMewilNnUz23TScn/\nzE4QdicSJyenR671NBw6dIhh3foyNa2KXnuizGK21WVSMvIW65FX6tXwxftqBm1kydy27cZh0Loi\nO/58uvoGz8rGjZt4b+Qo3F0qYmRkTGTMVWbP/pwPPnhy9bXnRdu2HYiPtKB6hZ7/PFy5FLgFz3LG\n7Nr9By2at0GqKlGmRH29cWevr+ed4e2YNGlSocusmINeA/bu3UvE1ZuMzKqAl7DDXVjRS+tF5TQr\nvvv6mzzPc/XqVVxMbPQUAEAlihEbF0dSkuH2/GH07t2b6Jgofly/mJ82LiM6OvKFUgAAy79dTPsM\nN723fS9hRy3pjG+DukSVNmehbQDbZDCLzK6zjhuMoLKeEsxBh0RiYlLwWdfT09OxwfAg0QZTMrIy\nn1iLOD8EBwdz+1YQLXX6zgIdc0qw/+D+52Z+ehIDBw4gMiqcOfMnMuOzsYSGBhepAoiNjeXE8RNU\nKd819+9ACEGV8t05cHA/SUlJjBg5hFsRf6HR/BtNnpIWRXj0Gfr161dUoj81Sj2Bl4RDB/2pnm6j\nl1MIoJa6GPv3/EXGzBm55Qcfh4uLC0maDHKkLjfYCO7lo5dC5mmOf7CwsKBVq1Z5v4jnjFqtJjMz\nE3t7e4QQJCYmUAvDXEr2WUZkZWZyMeAqu3bt4sKFC5xetgKzJCticjIpzb+prg8Y3aFR/YbPxe21\nUaNG3M5OIklm5aaiADhBDC0bNyvQA8a0tDRsTMwxFvrvfeYYYyKMUalUBim+Cwt7e3vefPPNIln7\nvyQnJ2NlaYuJsX79ClMTCyzMrbl79y79+/fnwIFDbP1tGiXd6pCjzSQi5jw//LA436bZFwFlJ/CC\ncvfuXTZs2MDy5csJDg7G0dmJuxb6b4aZMofdhHLx+lWcHIpRzdvniXVmy5YtS+UqlfnTJDL3TVMn\nJdvNw+ndq3eBJ0ErDFJSUhg08C2KOThS3L0ElSpWYc+ePbRo15YLZil6fXVSctkmneYtWmBiYkKP\nHj1o2rQppkY2NGs0kZ9MQlluFMg+GcG34hq7jMJZtnbVc5G7WLFifDJjOt9Y3+CkjCFUprLLKJxd\nNtHM/+6rAl3Lx8eHTCMtYVLfxHSFJNzd3XFzcyvQ9V5WypUrhySHpLtheu0JybcxNzehVKlSCCFY\ntWo5h48c4K1hrRj7QR+Cgm7y1ltvFZHUz4ZyJvACsmPHDgb3H0hF42JYao25pIun34D+bN60mQ+y\nKlNa2CKlZD4XcMCc/pTHFjMuk8gGqxB+/3P3QyOM/yEyMpIOLdugik2ilM6GmyRTrkolJkz5CBcX\nFxo0aICxsfEjxz9Ieno6mzZt4sqFS3j7VGTw4MEUK1asoG7FE5FSUr9eIzJSbKjq/QbmptbcibvC\n2etrWfvjKsYMH0mdFFsaaV1RkYOfZTS2tcry9xH/XDfMZcuWsfib36jt8zZZ2WkEhx9DlR6DmaUj\n4XGHSEyMe67XsHPnTr5f+DVRkZHUa9SQj6dPo2LFik811927d/ls5iy2bPoZTY6G7j16MGvO5xQv\nXpyf1q9nwqj36aLyoDS23BKp7LG8w8bffqFjx44FfFUvL6tXr2byxGlU8+6Dc7FyxCXd4mrQb3y3\n6CsGD354EGFRoxwMv0LExsZSsWx5xqkq4XU/ACxDavjKOoBe773NyqXLqWTsiDo7m1B1El/RWM9E\ndETeIbJZcfYeOvDYdXQ6HYcOHSIkJISbN26wdPEPlDJzQKXToLEyYcvvW2nQoMFj5wgODqZ5w8Z4\nZJjilWFOpFU2gSZp7PXfX2hZQA8fPsybvQfTruFniAdMHbfCDmHtFMmq1cv5fPpM/Pb4YWlhyVvD\n3mXyxx/p7XiOHDlCn16DaNfwcz0TTHDkcYRVIIcPP/5eFjY6nY5Lly6h0+moWbNmrsJWq9XUr1kb\n+5BU2qqLY4IRh01iueaczYVrl3F0dOTgwYN8OWcet2/dokr1anw0fRr16tUr4it68di1axezZ8/j\ndtAtvCtUZPr0KS+0olSUwCvEokWL2Pbx17ydpR+gdFrGEtTYmd92/8GuXbvw8/PjzrZjDM7Sd8dM\nlFl8WSyQmCT97JOP4sCBAwzo2pPxKh/cxL3iLRdkPJtsI7gdEfpYW3jrJs1xPhFNB/mvHfQEMRwr\nm8PVWzcKJWhmyZIlLF30B7V9Buu1p2XEc+LK10THPDm7p5SSOrXrk53hSNXyb2BqYklcYiCnrq7g\n198206ZNmyfOUVj4+/vzdv+ByAw1Rgg05sas/ulHOnTowMaNG5n/3iTGp1fSu/drLILoPP09Pp4y\nJc/raLVatFptgdd2Vng+KN5BLwg6nY4tW7bQrV1H2jdvxdKlS8nMzHzywAdITEzENsvwd1kMcxIS\nErC3t2fgwIEMHDiQOyZZBv0iSMfTo6RB+6P4bsFXdFC55yoAgFrChQpaOzZv3vzIcSkpKZw8fYrW\n//E2qS/diI+O5ebNm3rtd+7cYevWrRw4cACtVptn+Z5EmTJlSE2PMGhPuhtKqVJ5C1wTQrB3nx8V\nqtrxx8EJ/H5gPNfDNrFi5Q8vlAKIiIigZ5du9IxxYVZadWamV2dgggf9e73JrVu3OLRvP9XSbQyU\nb81Mew767cvTGnFxcQzo/SY2llZYW1rRvH4jzp079zwu55UgOzubzZs3M3LEKGbOmElISEhRi5Rv\nCkQJCCE6CCFuCCFuCiE+esjnzYUQKUKI8/e/Cq4u4QuClJLB/QYwbcj7uO4Lo/zheFZMnE3LRk3z\npQiaN2/OFet0tFI/PfN5s2RadWiX+3O7du3Q2JuxT0Shu79zSpCZbLeO5MNpBr+CRxIRFo4H1kTL\nDI7LaK7LJHRS4qoyJjLC8OH6DxqNBiNhhPF//oSMhMDcyAS1+l5aaiklE8aNp1JZb+YP+ZCRPQbg\nVaIUFy8+PvgqJSWFjRs3snbt2sdmlWzfvj3GptncCP4T3f17lpoey7Xb2/jo4wl5vQ04OTmxdesW\nYmOjuRF4ldCw2/Tp0yfP4x/FuXPnGNinL7UrV2fQm/24cOHCU8+1cvkK6uY4U1045T7ofUQxmmhc\nWPr9ElyKu5NsahgBnCjUuBZ/8sFvdnY2zRs0JmXHWRZo6rNE15Ryp5Np16IVQUFBTy33q0pKSgq1\na9djyuQvOH8ile1bzlCjui9btmwpatHyxTMrAXHPELsYaA9UAfoLIR5WSfuwlNL3/lfhh9Q9Z44c\nOcLhPfuYmOFDY1GcOsKV91UVyb4Zzdq1a/M8T8uWLfGuVZWllje5Le8SLTPYbhTKZdt0JkyemNvP\n2NiYvf4HCKhoyjTrCyy0u8HnlpcZPWUC/fv3z/N6tevXZaO4xQIucIUkfuU20zjJFes0aj8mR76L\niwvly5blLPqHpoEyGWlpQpUq9wKg1qxZw441m5ijrs2otPJMTa9Cp9hidGrT7qGV0gA2bdpMyZKl\n+XT698yfs4YK3pX4Ys7ch/Y1MTFh/4F9aExusevQJA6cmc2B03OY+slEevbsmef78A+2trZ4eHgU\nSO6e3bt307ZZS7TbLtAhwAzN1vO0adL8iR5cj+L2jZuUUBu6vJbUWBIceJN3hrzLCZN4omR67mdJ\nMov9lrGMGDv6ifP//vvvmCSo6K0pg40wxVQY0VR40CTLha/mLXgqmV8Vrl+/zsABgynrVYHGjZvz\n22+/MWvWZ2hUDjTznUTlch2oVak/zetMZOiQ4UUWd/E0FEScQD3glpQyDEAI8TPQHbjxn34vV4rD\nfPLHtu3UVTlg9kCZRiEEjVRObN34M6NHP/mf8J8xO/f68eXChaxfuQZVZiYdO3fi5GezDLKClitX\njvPXLnPt2jWSkpKoWbNmvn29Tc3NsZYmTMM3t8TkfhnJ71mh5OTksGrVKpo2bfpQb5Ulq1fQpV0H\n7qiz8M6xJcw4nQPmsfy4emPuYeWSL7+le0YJvYCt+sKN49nJ7N69mzfeeENvzuDgYN4bOZpW9T7O\nTSVQrXwKX389l/oN6tG6dWsDOcqWLcv586cJDAwkOTmZ6tWrF1lx+n/Q6XSMHf4ew1Tl8BGOIKC8\ntKekyor3h7/HzTxGZj9Irfp12OF3iqb/2VgGWahoXL8u3t7eLFm5jPeGj6SSiRMmUnA1J56Zs2Y9\n1lvsH86dPYt3moWBXD45dhw4eZrExEQSExMpU6bMa3VWcP78eVq1bEt5zzZU9XqH1PRoxoyaQGZW\nKi3rfaR3vxztS+HmUoE///zzhYl9eBIFYQ4qATxoN4i83/ZfGgohLgohdgvxn4rYrwCmZmbkPORu\natBibpa/4u8WFhZ8Mn06N8NDiIyPYeWPayhVqtRD+wohqFq1Ks2aNXuqYJ+tW7YwkAp6NYZLY0OO\nVsun74xjw/g5NKpVh7cHDDKw5Tdq1IhTF87hOaQtp2ubYzegMQdPHKVr1665fWLiYnFFPzoZwCXH\njJiYGIP2dT+uo7RHw1wFAGBl4UD5km1ZtnTlY6+lYsWKNGjQoMgVANxTZqq7aVRC3122Co6kJCXn\nqw70PwwZOpRbFhnsJYJsqUUjdRyQkZzUxfDu0CEADBg4kIjoKD5YPo/3lnxGUFgIE/KYxqB0mTLE\nWhmak6KEirj4eMqU8KRl7YaUcHHj++8W5Vv+l5VJEz/Gx6s7Vcp3oZidJ6U96tGs9kQyM1UYGxkq\nQ2Mj00fucl9ECiti+BxQSkqpEkJ0BH4HKjyq86xZs3K/b9GixXNNi1xQ9BvQn7ZLltFa5YGduPeH\noZE6/K0TmDFsahFL92gS7iaTQCaxUoU3DphjxBKuMpIq1Mx0BkAtS7P4j/18v2gR4z/4QG+8t7c3\ni5cvfdjUANSvX4/Lf96iNf8+1HOkjmsimYX16xv0j42Lx8LMMM7AytKJuLhLT3uZhY6lpSVqXQ5a\nJCYPbIK1SNTanKdSVI6Ojnw+fy7jR4xmK7cRQGlsKSVsmTz+Q37ZvhW4F4GbH5PgPwwYMIAZH0/j\nnIzHF2eEENyRGfxhFIp3kgOTc+pimW1ClMxg/tRZFHNyfGTxnVeJw0f86dN+iV6blYUD1lbFCAo/\nSC2ff9/4MzITiYq5Srt27f47TYHi7++Pv79/gcz1zC6iQogGwCwpZYf7P38MSCnl/MeMCQFqSykN\nEtW8zC6iMz+ZztJvFtFQ7YypTnDGOoW6LZvyy/bf8hx8lV8iIyOZP2cuf/v9ib29PUPHjmLo0KF5\nsmkfPXqUdi1a46o1xxZTgkmlFs4kksVk4avX96ZM4Y8yqVx/SLEVKSVLly7lu/lfEhUbQ/XKVZg5\ndzbt27fnwoULtGrSnB6qEtTFlSTU/GEZiXuTauzca5gv/tdff2XCB7NoUVt/m3366moGvt2GT/JZ\nLa0oaVS7Hl4X7+olbNsrIrlT15lDJ4891Zz1a/hS57KGqjgiAUthgkZq+djyHKcuncfb2/uZZD51\n6hR93+iFSM/GUpgQpUmFHB1faxroxaNcl0n4lVNxNSjwmdZ7GXBwcKRV3WnYWuunt957YiY52gxc\nHCrj7lSTjKxEgsL3MmXaJCZOzLtTQkFQpHECQghjIBBoDUQDp4H+UsqAB/q4SSlj739fD9gipSzz\niPleWiUA9+yHmzdsRK1W073nG7Rq1apA/OWllLk1fP8JXY+IiKBeTV980+yoq3HiLmr8rGNp0L0t\nP258fKH55ORkypf24u20MlQT97JjJsks5nAOFyz5+D9KIEFm8qXDTWKTDeMPpk7+iF+XrKW3ypOS\nWHOdZH6xDGP15p/o3r07p0+fZsqHkzh++iT2NnYMHTGMGZ/Owtzc0Eym0WioX78RGSkWVCjdARNj\nU25HHCIp/SqXLp8v8Eyez5Nbt27RsnFT3DNNKZVuSpiNhjgrLf7Hjzx1oRpLM3O+0jTAUuhv4lfY\n3uaDlQue2g4dHBzMwi/mcdT/MK5urrTr1pn69esTERHB0rEzGJ6mH4+illo+MD1BZrb6qdZ7mRg3\nbjx/7TpH/WrDcgMSw++cJTBiGxcunmXF8hXs338Id3c3Ro8Z+VzqTT+JZ1ECz2wOklJqhRBjgb3c\nO2NYLaUMEEKMvPexXAH0FkKMAjRAJvDiV8B+Snx9ffH19X1yx/vcuXOHlctXEHD5ClVq1WD4iBEG\naaFPnTrF0EFvEx11B4mkpKcnqzesY83ylfim2tJbW+b+sbstFTOKMf33HVy5coVq1ao9ct1ffvmF\nSlr7XAUA4Cgs6CnL8rMIQi21mD9wTnBeJNC0SRODeZKSklj8/WI+y/LF/r4ZrA6umGcaM/XDSXTp\n0oUTx48TfecOdta2NG7UiH4DBzxUAQCYmppy6NAB5syZy8aNq9BkZ9O9ezdmzlr5UikAuGcquxka\nzJYtW7gZGEgPHx/69OmDpaXhGUlecXd25U50BuX4N4hPSskdXQYlS+Y9PuRBAgICaNagEQ1VjvTI\ncSTudiJLLi1ANX40Pfv05nZOMjop9XYCQdylXKkyT30dLzLBwcHMm7uAQ4eO4OLiwvAR73L2zDn2\nnpiJS7HKZGYnkHw3hD//2oObmxvTZ0xn+ozpRS32U6NEDBchp0+fpmPrtvhqHCmttiTEIpPLZin8\ndXB/riKJjIykhk8V3kz3pM79SlinieU3myjsbGx4N6YEnsJGb95NZsF0nvc/xo9/dEreGTNmcOnz\nDfQQXnrtQfIuq22Dcdaa01XlgSPmnBcJ7LWO5dCJY1StWlWv/8GDB3n/jcFMSNX3HtJJySjjI/Tt\n3YfzOw/QTVXi37msYjl4/MhLVRT9ReHbr79h2fR5jFFVxEaYopOSv4wjuVHOhEs3rj3VrrNn526Y\n+t2gA/9Gft+V2cywOM+t0GD69+yN0dkIemaXvmcikukstwpi3opFDBw4sCAvr8gJDAykYcMmlHZv\nQgnXWqSrEggM3cWgt3vTuXMnTp8+TfHixenZs2e+Mu4+b4p0J6DwdEgpeXfAYN5M96SecAMBjdVw\nTB3D8MHvcu7avUPQ5T8spY7G6V6f+zTAneCcTG5oVKRh6IWQbqJ7oqdQvXr1+Nl2Bd3TpN6D44pJ\nCj369KJiZR9WLP6BpJRkmjZpyqG52wwUAICrqyvxmnSDN8UksjA3NWPXHzuYm1Und1fRDk+ESjBr\nyids270jfzdNgXHj/0d4SCjTVq2irLkjsTnplChTil17dj612XH/wQN8KmvpOXHbCzMqmzrj7+/P\ntt07GfH2ED76609sTS3IMYYZn336yikAgKlTp1PWozVVyt+rjeHk4IWbcyWWLp3C//437qVwUskv\nyk6giAgODqZe1ZrMz6yj9/DUSckEi9N8vWQRu7b+zpkTp+iU7EwDoW8iOi6jOVfVlOzgWMapKuW6\neIbIVL6zukFoZPhjs3lqtVoa1KqDVWASXbJLYIUpx0UMf9nEcurCuXzZrOvV8KX0tXQ6aksihCBH\n6lhlGYRDg4pknb7NOyp9e3KSzGK+XQBxd/NWwEbBkLi4OC5evIi7uzvVqlXLkwKQUrJnzx42rvkR\ndZaaHv360LdvX0oXL8HYpHJ4CP03269tbzBv04rcYkFJSUm5cQKmpobFcF4Fijk40ab+DKwsHfXa\nT11dzrSZIxk8ePAjRhYtyk7gJUTKe2/gD/utaTQaZo6dSNtMN9yR3OQuDdBXAqEWWXTp0ZsbV64x\n8+8D1Mh2IN1MckWXwIafNz8xnbOxsTF/H/Fn6uSPmLNxE5nqLNo0b4n/t1vzfWj5287f6dymPWei\nr1BC2BCYk0iT5s0Y8O5bzD73oUH/JNQUc3DI1xoK+ri6uuq5IWZnZ7N9+3bOnztHGS8v+vfvj8MD\n91hKycghw9j76w6aZThihTHzD01m5eKl1GlQn2V/HaattgT1cMNcGBMgk4gVWXq5kxwdHXF01H84\nvmpYW9uQlZ1uoASyNenY2toWkVTPF2UnUERIKalSrgItQyyoI/51PTspY9gobrFQNsRCmJAks/iU\nMwygAnUfOBPYahvFlcAAihcvztmzZzlw4AAODg707t27SP5RpZQcO3aMiIgIatSoQeXKlVGr1ZQq\nXoJ+ySWoKe7FHGRLLYutAnln1gQmTJr4hFkV8kJMTAzNGzbGPDGL8mkWxFrlcNMkDb/9e6lzP/XH\nsWPH6NO+K9MzqmFx37MoSWYxU5yhhJk9FdU2BHGXcNLwtnQm1CiD7bt2vJLmj8fxybTp/LxxLw2r\nj8LI6N7uOib+OqevryA6OuqFLbqkpJJ+STl+/Dhd23eknsaJ0morQsxVHJPR1NI4MoR/0y/dlndZ\nxXXSRA5m5uaUKl2K1RvW5f6Dv8icOnWKbh06466zwFFrxmVdAh26dGLdpg3PpW5vYZKens6GDRs4\ncvg4JT1LMHz4UMqXL1/ocrzZvScqv0v0yimT23ZGxrG3ZBq37qenmPjBh9xe9AfdHvDMXiKv4I4V\nvcS/O79D3OGgayoXrl955d/6H0ZmZiadOnbl+rVbuDlWQ52TTGxCANt/30rLli2LWrxHoiiBl5jw\n8HCWLfmBgMtXqVqrBhlZmQR8/ztvavW9ds7JOM7WNGfLH9semULiWdBoNJw5cwYhBHXr1i3QB7Ra\nrWbPnj3Ex8fTpEkTKld+/llDNBoNiYmJODo6Ppc8N9HR0TRs0BhTIxdcHKqSkRVHSNRR1q5dRa9e\nvQp8vUeh0Wiws7ZhoaY+1g/kZ5JSMsvmMtv9/6J27dpMnjiJwG+20eO+EkiT2UzkOHNpoFffWCcl\nU63Oc+jcSSpVelgeyFcfKSWHDx/m2LFjuLq60qdPn+dSY7ogUZTAK0RAQABNatdnemZ17MU9X/oc\nqeNb6xt88O3nDBs2rMDX3LVrF8PeegcbrQlSSlSmknWbNxiEvkspOXPmDCEhIVStWjU3U+iLhE6n\nY86cuXzz9TdotTqEgDFjRvPZ558WaNT24MFvc+lMIrUq/RvykpgSwtGL3xIdHfVMsQD5ITMzE3tb\nu/+zd95xVVZ/HH8/7I1sZS9FUVyoOHCk4t5m7l1aaWZZZuXKlWZZmrs0TctMc29NERUHIAgIKjIE\n2XvDXc/vD/qhN1BRIcju+/Xy9fKee855zrnc+3yfc77f8/myQe6Nxt+SyK80jGDb8X14e3sTEBDA\ngG4+fF7kgS+JnCEBdQSkiHhhxWhcy4MLlhqG8/ufx/8VK00VZaiMQC2TmprK5o2bCLp6HWe3hrwz\nc8YL54gFWP7FUr5dtZqOEgt05AKBBnm4d2jNweNHqz0q4969e7Rv1YbpRQ1pJJQ5EiPFbH7Uu8/N\n26E4OjoCZXMc2KsvSdEPsFczJEqWTbuO7fn98IFaj5dOSEggIiICR0dH9uz5jR+37KFt0ykYGTQg\nvwzolXUAACAASURBVDCdwIifGDGyD9+sWV1t1zQwMKKv93L0dJQd3H43V7Nh80r69etXbdd6Fp08\n2+F8MxcFIkkUYYkuThiyXvsO9tY23I2Lxs6yAc6NGhJ09TrGMg1m4oGFoEueKGEXd9FBnamCOw/E\nfDYa3+dhWsorpxT6f7/VqZOn0DfQZ9SoUTg5OT274b8AlRGoRSIiIujW0RuPUmMaleiTqFnCZc00\ndu/77aVuBCEhIfzy8y6KCosYOHQwvXr1qhaN+7/z4azZ3N98jKEy5Sxcv2vG0fqDN1i+skzHv4d3\nV/RvJDJYao/aX2GgO3WiaTrKhy0/bav2cVWF0tJSJk9+k6NHjmBp7kJmdjwlJSX07DAXs3qPftxF\nJTmcvPw5ycmJ1Rbhoaenz8CuX6GjrXwe41LwN6zbsIwBAwZUy3Wqwu+//874kWPwwJTGmBBDLgGk\nYaypxyRpQ9yoRwIF/Kb3gCRJHvNkLbF5LBy0WJTxEf70xwFfvXS+3byecXU0FPJFkcvljHxjNBcv\n+mNt7olcUcKDpOt8s+Yrpk2b9tS2UqmU+Ph4TE1Nnxl1V1uojEAt0r1TF6yvptHjMfXsu2I2O00f\nkpCaVOedn0P7DMDqdBxegnLmqctiMkVDm7LnwD7i4uJo7e7BquI2SlsOuaKEBTpBpGdn1XjUhEwm\n49ixY4SHh+Ps7MywYcP4ZO6nHDt8GS+P6WhqaKNQyLgRtpuikmy6eymrnZ65upCzfx6t9MDbi/DG\nG6OJCi+leaNH+RBy8hI5H/AlycmJGBgYPKV1GdHR0SxZsIg/z57DyMCQKe9O4/3Zs597tde5bQcc\nbmbTQyz7DipEkTlcYQYeuAqP9rKzxVLmcZVv8Ubvb9pDC4UAnNp5sPyrlVXKPfBvY9u2bSxe8A1d\nPeegrl62wskvTOXs1WXcjgjF3t6+fLszKiqKxo0b4+npyebNW1gwfxEKhUBxSQG9e/Vm2/at6Ovr\nU1JSgpGR0T+SS/tZqM4J1BJFRUX437jGOrGj0mlLN8EEXelDgoKC8KpELrku4dnJi/N+t/H6W7ri\ne3pFDOlQNva0tDTMtQzQKFFeiRihiSCWRcnUpBFISUmhS5fXKClSw8TAhYLiA3z44cfk5+fR13sp\nmhplvhM1NQ3aNhvD/jOzKSjKwEDvLylsSQF5BRnY2FSW5uLFWL16Je3bd6IkPAtLk2bkF6US8/A8\n69d/XyUDEBsbSwfPtngXmDJT7kRuhoRdi9fgf/ESB45V/SR1RkYGwaEhTFC0L/8OFiFDigIXjJCJ\nCuLIRwCcMMIMHcLIwOuxcyfFoow8bTl7D+ynQYMGz/tR/CvY9uNOGtr1LjcAAIb6Vtg3aMvvv//O\npEmT6Nd3IHGxCZibOJOWdR8LS1NSUzLp1PI9TI3tkUiLCQn7DfcmzcnJzUIul6OjrUf3Hl357rtv\n/7VbSyoj8BL8/wlAUcl7CsQa2b6pbqZNn876b9dypjSBrn8ljT+vlkS0bhFT3pwKQJMmTUiV5JMl\nlihFktwnFzNTsxoPJZz21jvoqTekQ5sRFBRlUFScRVJ6OJkZJ9HXVRaVU1fXQlfbmNz8JAz0zJFI\niwiK/JkRr4+o1qW8g4MD4eG32Lr1By75XaGxnS3b3/2Tli1bVqn9l0uW0aHAhIEKBxDACj2cioxY\neOESAQEBtG3btkr9yOVy1AQ11B57CtFBHRG4TDIHiMEYLeSIlCCjUE3BGe1UXIqNMRd0KRCl/Kob\ny4D+A15ZAwBlD2yGhhVzOKir6VBQUMCE8ZMpyTOhT6e3EQQ1FKKCa7d+QltDxNS4LBpPU0OH7Nwk\n9PUc6frap2hrGZCYFsapk5vx+LMFFy9ewNPT85+e2ktT9+9SdRhdXV26durMBTXlROi3xSzkuhrP\npSZaW1haWnLx6hUyvW15X/0K72v4U9DNkUvXr5bfNA0NDZnz8Uds0L/HXTGbElFGiJjBNr1olq9e\nWaPGrqCggLPnzuBq1x3fG2s5fnERgbf3EBl9GgSBjOxopfrFJbkUlWTiH7KJI74fceDs+zRtXp9N\nmzc84QovjpmZGZ9+Oo8TJ4+yZeumKhsAgAtn/8RTbq5Upimo0UJmgp+fX5X7sbKywsXJiYDHcj1r\nCGo4YsBvRDETDxYL7VgqeDGJJgAMnDqG5XphLDS4xWfaQbi/3oMff95R5Wv+Gxk0uD/xKco5HGSy\nUhLTA/Hy8uKi30U8Gg4rl4pWE9Ro03Q0mTmxSKSFAKRnRVFckkunVm+ho22EIKhha9WCNs3GoK1h\nxox3Z/3j86oOVCuBl2TDj1vo7NWBpBIJDYt0SdQuJUAjg32/HqyxRDLVjZubG2cunqe0tEwbvjKZ\n5wWLF9HAxppvVqziQVIE7g0bsWX5DoYMGVKjYyspKUFNUON62M/o6dTj9V7foq6uRYkkn5N+X3Dp\n5gY6tpyOpWkjcvIfEnxnNz179uTixYtYmLigYaHL+fMX+eyz+axZ83Wd2L8FMDE1ITuxBDuUt45y\nNeXPvbLa9NOP9PfpzUNJMS4SAx5oFPJALKKH3A6Xx3wCTQVTvDVtMDExISk9lYSEBKysrJTkJV5V\nZs9+n192/8r1sB+wr98RibSQ+wln6N2nJw4ODhjo10NDQ/l7r6Wph4a6NqWSIrQ09cnOS8DSzK3c\nUPyf+uZNCIncT0hICvn5+f86eQnVSuAlcXV1JeL+PYYueY/S4c1pN2cMIRHhlSZEr+toa2s/Uedf\nEATemjaNO3HRFEtKCLodWu0GQBRFLl26xIYNGzh+/DgymQwzMzPqN2hAWuY92jYbW76nq6NlSI/2\nHyGTFXM34Td2H53MtbDvGTthMBf9/Oju9SkdWrxD26aT6Nd5BXt++YNDhw5VaRw7duykUcMmaGpq\n0ahhE3bs2Fmt8wSYNmsGx/VTKBYf5fS9J+Zwl2yGDRv2XH21b9+ewNAQGk0fSEQnE2yn+NDWsw0O\nVPRNWJdqExcVjZ6eHm5ubv8JAwBlukeBQTcYM6EnmcXnUWjfZsWqz9m9eycuLi5IpUXk5CcqtcnM\niUMmL0EqLQJAR9uIzJyYCn1n58ajr2uOCP+aB7/HUUUHqagT5OTk0Kd3f2JjHmJh6kZe4UPU1Ev4\n8/xZDh8+zNIvvmXQaysqtPv91NukpiWjq6uLhoYGq1atYvf283i6K4c4RidcwcA8gVOnjz91HGvX\nrmP50tW0dBuHpakr6Vn3Cb67m8/mf8Ts2e9X23wVCgXvvDmNfb/tpYVgTr66nGhFDr8f/AMfH5+X\n7n/h/AVc/Xo3YyTKCq4/6N1n1Io5zJr1aOsiLCyMu3fv4ubmVp6IKDo6mpiYGBo3boydnR2vOuvW\nfc+yJV/RvOEozE1cSM+KIuTeHnr36c7p02dQF7QoLMpFTU2dRo59cXfpg5qgRn5hGn9e/RozE0ca\nNTXj1KljtTJ+VYioin89E8ZPIvBaAm3cJ5Qvt+/EnqFUiOTMmRM4OrowqNtqtLUexbdnZMdw894P\nJCUllG/zfPzxXM4di6a5m/IqJSktnByJHwGBV584BolEQv36NnRuOYd6Ro8iiXLyE7kU/A0pKYnV\nfoDq7t27XLhwAWNjYwYOHFilyKKqkJycTIsmTemVZ0lnsT4KRM6rJ3HVNJ/bUXcxNjYmNzeXYf0H\nEhYciouGCdGybJp4uKOtrUNgQAB2WvWIK82if//+bN/9c50VT6su9uzZw/Llq4iNjcbVtRELF37G\n8OHDkUgkxMbGYmZmRn5+Pn37DCA29gF6OiYUFmdibGSJlraCK/5+5Ycr/2lURkDFvxqJREI9YxMG\ndlM+fKUQFRz3m8sVf1/WrFnLudPXadloHJk5MUTGnCa/MBVPz5bs2Lm9PMH66dOnmTzxXXq0W1Cu\nAgkQcHsHw0d1YunSJU8cR1RUFB3ad6V/51UV3jtxeR5X/C/QqFGj6pt4DRMREcGs6e9y6eoVBEHA\n57UerNuysTyU8Y3Bw8g4fZMxpU6oC2rIRQULhQBcBWPGKRqhKahRKsr5STeaNuP7s2HL5lqeUd3B\n39+fPb/uobiklHbt2jBmzJhqM+AvgsoIqPhXk5eXh6WFFW/02VzB6XYhYDm/7dtO27ZtmT9/IevW\nfY+Gmj6eTUdiqG/Jw9SbxCX7ceWKH+7u7igUCnp070V8TA6NHPqiqaFDbOJlsgsjCA4JxMLC4onj\nyMrKws7OgUHdvkFL85H2j0RazBHfOSQkPCh32kqlUtauXcePP/xEQUEBvXr1ZOGi+bX2JPg0SkpK\nEARByd+TlZWFg7Utq0rblietzxVL+ZzrfEMnpfzSOWIpi3RDSM1M/8c0kZ5GZmYm69dv4PSpc5ia\nmvD2O2/Rv3//OuP0rw1exgioHMMqah1DQ0OcnFxITA1VKs8vTCMnP4UWLVqgqanJrFkzUVdXp1+X\nRThYt8XU2IHmjYbiatubzz4tS/StpqbGyVPHePOd14lJPcCt6G107dWQgMBrTzUAUOY87NOnL6H3\nfkehkAOgUMgJvbePPn36lhsAURQZNmwE69fuwtFiMJ6N3+bmtQzatm1PQkJCDXxCL4eOjk4Fh39m\nZiaGmjrlBgAgBwlm6CgZAIB6gjaaqJGdnV1jYzx58iTt23tjYmJOq5Zt2bdvX6X1UlNTadXSk992\nnUcPL7KTLJk6eQaffPJpjY3tVUe1EqhBIiIi8Pf3x8LCgr59+z5xP1mhULB//35+2bYDSWkpQ0a/\nwcSJE1/5PdjHOXnyJKNHjcPdeSj1zd3JzovndvQffPLpB8yZU5ad7Ndff2XJwg14NXtbqW1xSQ6n\n/BeQl5fz0uPIzc1lyODh3LoVhrmpEylp97C0NOejjz9k7NixGBoacu3aNQb0H06fTstQV3t0Ew2+\nsxfv7o5s3Lj+pcdR00gkEmwsrHg/z61cR6hYlPEx/izFCxPhkdFIEAvYaBLDw7TkGpFB+fXXPcx8\n9308Go7EyqwRmTmx3Irai0+vbuTk5KGnq8vESeMYOHAgs2bN5sLpu3i6P8pvXCLJ5+Slzwm5FYSz\ns/NTrlTzyGQytm/fzo6fdlNaWsKw4UN4772Zz8z5/bKoVgJ1DJlMxtgRI+ncpj27Zy9n/vh3cWhg\nQ1BQUIW6oigybuRoPp/yHhZn4nC6mMamOUvo3qkLJSUllfT+atK3b1+OHT+MgXki/qHfUKi4waYt\n35UbAAAjIyNKJfkV2pZI8jHQf77Y7MLCQnJyKhoNY2NjLvie49yfJzE2EVFX10RXw5lvVv2EnZ0D\nfn5++Pr6Ym3eUskAANhZteXc2fPPNY7aQktLiwVfLGaLXhSRYhYSUU4c+WhpaLJeK4IEsQBRFMsS\nGundZ/7ihTViABQKBXM/noeXx3Qcbdqhq1MP2/qt8G45i/37/iA/tQFJMQZMe3MWb731NkePHMPJ\nRlnbSEfLELsGrTl58mS1j+95EEWRoUNfZ9kX69BReGKm252d207g5dWR/PyK39u6guqwWA2w5utv\nCDvhx4ri1mj9tbQOEtMY2LsvD5ITlQTCfH19uXTyHPMLPcrrehZa8P2dO+zYsYO333670mu8inh7\ne3Pm7JN/yD4+PuQXTiEpLRxryzIhOIVCTkTMESZPnkhsbCzr128gPCyCZh7uzJjxboUnw4SEBKZP\ne5fzF84BAu5NmrJh4zo6dOigVO/UyVNkpsno32Vl+c0+KS2coUOG88WSRUjkeRXGV1ySU2dVJitj\n1uz3qWdqwsrFS4lOuI2LnQPfLtxIemoq36z6mozcbGwt6zN/8Ze8Ne2tGhlDcnIy+fn5WJg2VCo3\nNrRGX88cE2MHTI3tcbLtwMEDCzEw0EMmL63Qj1xeWusr5/PnzxNwPYSe7ReVf2fqm7tzLXQTW7Zs\n5aOP5tTq+J6EaiVQA2xdv4lBRTblN3UAT8ESE6kmZ86cUap7+I+DeBWZKNVVEwQ6FZlx4Je9/9iY\n/w1oa2tz4OB+AiJ+4GroRoIjf+PM1YXYORrQo2d3Wrb05NzxO0hyGnLuxF1atWrD5cuXy9sXFxfj\n3akLKfFaDOu5jhG9NmKg3pY+ffpz9+5dpWtt3bqdJk6DlJ72rS2bYWxog5GREYmpoaRnPZKskEqL\nufvgOO+8WzM3y5piwoQJRMREUSqVEBETxaRJk/j4k09IzkyjsKiQ2KQEpk2fVmNOVyMjI6QyCVJZ\nkVK5XC6lpDQXba2yiBtNDR3srNrj4GjLvQenUIiPFLty8hN5mBrK4MGDa2SMVeX48RNYm7dV+s4I\ngoCdVQcOHTxaiyN7OqqVQA2QlZuNGbYVyk0VWmRkZCiVaWprIRVE+JsbRIoCLe1XK6lHddClSxfi\n4+PYv38/aWlpdOz4SVnKyiYetHIbh4N1mfCaPW0wNXRmypRp3L17G0EQ2LdvHxqCKR4NH50hcLLt\nQEFxCt98/S1bf3gUAplfkIeuTsWUgtpaxsjlcvbu3cOoUWOob94YLQ0DElKCGfHG60yYMKHmP4R/\ngL9HE9UUhoaG9O8/gNCQP/B0H4cgqCGKIqF3D2NWzwl93UcSGqIop0OHDlyRX+X8jWVYmbRCKs/j\nQdI1Nm5cj7m5+VOuVPPo6+sjUxRXKJdIi9A3rt3ES09DtRKoATp16EiQkK5UViLKCJdl4O3trVQ+\nasxorupkkC9Kysukohxf/QzGTp30xGvIZDJiYmLIysqqzqFXIDMzk4MHD3LmzBkkEsmzG/wDGBkZ\nMWXKFObNm0eXLl1ISEggOTkF+wbKCo52DVqTlppGXFwcACEht6hnUDERvIVJY4KDbymVdevWjQeJ\n15XKJNIiHibfomvXrvTr14+EhAcs+GIG77w/lOs3rvDjj1v+FcqxdY2tWzdhaFrEqSvzCYz4iROX\nPicq/gLtW0wur1NSmseDZH/Gjh3DRb/zbPnhW7r2smXE2E6EhoXUCeM7duwY4pL8KSh69KAnlZUS\nnXiOqVMn1uLIno5qJVADLFm1gh6du6IoAk/RnAxKOKKXyLDhw3FxcVGq6+npyVsz32XZ+k10LDFD\nUxS4YZCDV4+uvPHGG5X2v33bdj77+BNEiZRCmYTePX3YunM7ZmZmldZ/UVat+JJlS5fhpmVGITKy\n1SX8fugAXbp0qdbrvCzq6uooRAUiSmkdEAFRVJTrubi4OHOi5HqF9tl5D3Btqvx3Wb58CR06eCMX\npdhZeVJQlMGduKOMHz+u3M9gbGzM+FcsA1dtYGJiwtVrl7l+/Tq3b9/G0dGR1avXcDVkAzYWXsjl\npcQl+TFjxts0b94cgAEDBvyj2dsAwsPDiYiIwMXFhdatW1fYImvcuDFffLGQRQu/wL5BO9QELRLT\nAxk4qB8jRoxQqhsZGcnPP+8iJyeXfv360K9fv1rTHVKFiNYQISEhLP70c/z9r2Jmasrb789k5nvv\nPfEPHRQUxK+7fykLER0+jO7du1e6D3vo0CHeGTuZ6UUNcRAMKRZlHNZKIK+pGf5BN6pt7/b48eNM\nGzmeDwublOcQCBcz+ckgluj4uDrnAG3ZwhMDdU9c7B9FjsQkXCZPGsCt0JtAmT6Ri3ND3J1fx8mm\nA4IgkJEdw5WQ7zl77mQFDf979+6xbNkK/C5ewszMnClTJ2BlZYW6ujo9e/as82qRp0+f5of1m8jK\nyKRn/z68M+Pdavm73bhxg/2/70MURYaPeJ327dtXw2iVkcvlnDx5kkMHj6Cnp8u48WNp165dtV+n\nKuTn5zNs6AgCAoOob96QjOw4XF2dOHb8cKVbUNHR0ezbt4/i4mIGDBhQ4Xv1/ffrmf/5QhytvdHU\nMCA5MxDXRracPn3ihZ3btX5iWBCEPsB3lG0vbRNFscK5e0EQ1gF9gUJgkiiKIU/o65UwAjWFV/PW\neIXJaCU8OvikEEUWGdxi/9nj1faD7PtaT2x8k+gkKCca+UH3PhO++bTORS2FhITQo7sPVmYeGOs7\nklcUR3JGGH/+eYZWrVqV17t58yajRo4lKysXLU1dpLJC1m9Yy8iRI5/a/7Zt23j//Q+pb9EQRJHU\nzPts3ryJsWPH1PTUXoiFn89n29qN9Cy0pB7a3NTJ4aGpyPXgQCwtLV+oT1EU+WDmLH7bsQuvEjME\n4JpOFsPHjmT9lk2v7IndCeMnEeAfR5umE1FT00AUFYTc+Z0GDiJHjx1iyZJlbNm8lZycTDw927Hq\nqxV07dq10r7i4+Nxd/egd8dFGOiV/YYVooIrweuYMWsMc14wgqhWjYBQds7/HtADSAICgFGiKN55\nrE5fYKYoiv0FQfAC1oqiWOndSmUEno6JgRGLC1tgJCg7jXfoxzD5+0VMmjSpWq7T0q0p/e/pKuWo\nBTgoxtBywXiWLHmyBk9tkZ6ezrZt27kdHknTZk2YOnVKpaeERVHk9u3blJSUlJ9GfhISiYT3Zs5i\nx45d9O28CGPDMqOYnZfAxcCvuX7Dn8aNG9fYnF6EuLg4WjRpxpKSVkrfkz2aMbhPG8h33697oX4v\nXLjAuIHD+aywGXpC2WdWLMr4Uj+c7Qd/qxb107pGYWEhlhb1GdBtFTpaj1Z+MrmEI75z6Ny5M3fC\nk/BwHYGBvgUJyTe5dW8Px08cqeD/A1i7di1b1x+hTdNJSuXJ6bdJzT/LrdCKZ4mqQm0fFmsHRImi\n+EAURSnwG/D3WK3BwM8AoiheB4wF4W+ZzVVUCVdHZ2JQjlEXRZFY8qtV3KxD506EaSgfplKIIpGG\nRTWy/H9Z8vLyuHXrFq+91o2dP29n3rxPnigTIQgCzZo1o02bNuUGQCaTce7cOfbt20di4iNd+TGj\nx7P3t0O4u/QtNwAAJkZ2ONp0ZsSIUTR1b0mf3v0rhP8+D9Xx4BMbG8vs92bR77WeGEnVyEE5nr6z\nxJLD+w++cP+7f9pJ5yLzcgMAoCto0LnInN3bqz/nQk2TlZXF3bt3y5MpVUZOTg4aGlpKBgBAQ10L\nfd16XPK7RMcW71LPyAYNdS2cbNvTzPV1FsxfXGl/EokEQajoilVX16q1wIvqMAI2wOOCKQ//Knta\nncRK6qioAvO+WMB+vQQeigUAlIpy9mvGUd/ZvsKBp5fh48/m4a+bwVkeUihKSROL2al9H1NnW3r3\n7l1t16kO1qz5FhsbO96a8iGDB47E2bkhISGV7jZWys2bN7G3d2LyxBnMn7cGNzd3Zr//IREREZw7\n9yfGBnYY6lfcQtHXsSAlMR8H8yHkp1kzetRE1q6t+lN2VlYWb06dhr6+IVpaWvTy6UtYWFiV2z9O\nUFAQbZq35P7W4/SJM6Ct3II1hBAkPopSk6BAS+vJq55nISkpRUuseMvQFtUoKa4YGllXyc3NZcTr\no7Czc6Bzpx7Ut7Lm66/XVGqI69evj66eDhnZyslk8gvTyC/IxMaqmVLyegBbqxYEBQVWeu0BAwaQ\nkBJIqaRQqTwu0Y/XRwx9yZm9GHUyOmjx4sXl/+/WrRvdunWrtbHUNYYPH056WhoLP/0cTblAvrSY\nrl26cPyXXdW6J+vs7MzFq1eY98FHfOx7Hl1tHcaOG8fyVV/WqexJx44dY8Xy1fi0X4ShvgWiKBKX\ndA2fnr15EB+Lnl7F5OKPU1JSQp/e/XB3GoGDdZnjsdStgN/3riEvPwdry6bo69iSkBKMk62ykY1P\nCsDVvgsWpi5YmLpgZd6Y+fMXMGXK5Gc6jWUyGV27dEdRakE/7+VoauoSk3CZLl1e4+bNgHK556ry\n3ltvM7TApsyHI4AHZriLJmwknBaiGWoInNFJZsykN5+r38cZ/MZw5p+8QJeCBqj/pfaqEEWuGeSw\neHTlkWx1keHD3iApXlauFpubn8zqr9ZRr54Rb76p/Pmoq6uzYsVS5n40n5ZuY7A0a1ymbXTvV0aP\nGcWpExcr9J9bkIylZeUbHU2aNGHK1En8uvtLXGx7oq1lSGLaddDM4cMPP6jyHHx9ffH19X2eaT+R\n6vAJtAcWi6LY56/X8wDxceewIAibgQuiKO796/UdoKsoiqmV9KfyCVQBiURCTEwMpqamL+zoexV4\n7TUfZHmuONt1VCq/cmsdi5bMemYI5/79+5k7ZxmdWyk75BJTQ4lJOYRUoo53y9kc8y1TLm3s3BNR\nVBAedYKUjAj6d12C5mO5aS8Ff82mrV89c7V08OBB3n/vc7p5zlMy3rfu7qfja3bPJUKXl5eHlbkF\n66Qd0fibFPen4lU8MCPBQIqZmwNn/S480zA+CZlMRv+evUkMjKBLoTkC4KefiWWrhpw6f+6pvpW6\nQmRkJB07dGFAl69Qe+xkb2rmXe493EtMbFSl7fbt28cXi5cRdf8udraOzPv0YyZNmoirSyOsTbvh\nat8NQRCQSAu5HLyWufPe5b1Z71XalyiKnDhxgh9+2E5OTh6DB/XjzbfefKlos5fxCVTHSiAAcBUE\nwQFIBkYBo/9W5wgwA9j7l9HIqcwAqKg6Wlpadc4hWRskxCfQxL5iJIaeVn0ePnwIwOHDh1m+bBUx\nMdE0cnNj4cLP6NOnD1AmTaynU9F3YGRgRVFREZqamsQnB9Hb+zNu3TnIsQsLkCukIEBf74VKBgCg\nVFKIvv6zT4dev34DM8MmFVZv9c098L9yqsrzh7KnVVEEOaLSD1oURRRa6pgN6sA7o0cxaNCglxKB\n09DQ4NjZU+zatYvfduxCFEXen/g+EyZM+FcYACgL+7Uwc1YyAAAWJq6cvVIxf/D/GTFiRIVYf4DT\nZ07Sv98gYq9dwFDfgqS0u0yaOJEZM2c8sS9BEOjfvz/9+/d/8YlUIy9tBERRlAuCMBM4w6MQ0UhB\nEKaXvS1uFUXxhCAI/QRBuE9ZiOjkp/WpQkVVadvWk/u3wzE1digvE0WRjNxIWreeydatW/ls3mKa\nub5OtzYjScu6x5hRE/h+w3eMHTsGLy8vFqYvQ+EmU7oxPEwNoUPHDixfvoT+/QcRm3QeA30LNDTV\nmDLhTYqKiwm4cgFPo/HlN/L45CAENUmVfDN2drYUSy5XKM/NT8LOvqLkyP8pKioiNDQUExMTgGCN\nUAAAIABJREFU3NzcgDK5gu5dunLuYhz9FY/yAd8kHWMrc/b8vveltwpzc3M5f/486urqjBw5kilT\nprxUf7WFm5sbaRnRKBTKf+/07Ps4OLo8peWT+4u6fwd/f3/S09Np164d1tbW1TnkGkd1WEzFv5qw\nsDC8O3XFw3UEjrbtkUgKCI8+jI5BLv5XL2FjY0+nFrMxMXp0c0zPiiLk/k8kJMSVJanpO5C7ESk0\ndRmGno4JD5JuEBFzCL9LF2jRogUKhYLLly+Tnp6Ol5cXtra2ZGdn07VLd7IzizE1akyxJJWM7ChO\nnjqOl5fXM8edlZWFs5MrbdynYmNVdgo2vzCdi0Gr+X3fbnr06FGhzbp137Ng/kIMDSwoLMrBwdGe\nP/7Yi4uLC3FxcXTx6ohVkToNC3RJ1JUQrpHDibOnqzSep/HjDz/y4fuzaahpihyRB/Jcftz5E8OH\nD3+pfv9J7t+/z9atPxIfn8CtkGAUEnNaNxmDlqY+uflJXA3dyIqVi5g69cnGLSMjAzU1tfLkQnWJ\nl9kOQhTFOvWvbEgqVFSdq1evih3ae4tqauqijo6uOGnSVDE7O1sMDw8XLc3txAmDf67wz9jITHzw\n4IEoiqJYUlIifv7ZfNHKsoGoq6Mn9ujeWwwICHjmdWUymXjkyBFx4cKF4tatW8Xc3NznGrefn59o\nadlAtLVuJDo7tBT19Y3E775bW2ndtWvXivpa+qKjuYfo5TFBHNlvs+jVfJxob+coSiQSURRFMT8/\nX9yyZYv47rTp4terV4tpaWnPNZ7KCAgIEM30jMQVtBe3C93F7UJ3cRFtRWNdA/H+/fsV6mdlZYlf\nfbVaHDRomDhjxntiWFjYS11fJpOJaWlpYmlp6Qv3cejQIdHIsJ7YvPEAsUPLqaKrY3tRX99I1NHR\nE81MG4gmJubimjXfigqFotL2gYGBYutWbUVdXX1RV0df7NihsxgREfHC46kJ/rpvvtA9V7USUPHK\nIJPJUFNTKxdxS0pKwq1REwa/tkYpjE8qLebQhTkkJSVQr1692houUDbmy5cvU1RUhLe3d6UZqH78\n4Ufef/tdeoq2WIg6BKhnk6ClwKfrQq6Fb+L7DSsYNGhQjYzvzQmTyP3lCv1Ee6XyfZpxtPpwJMu/\nXFFeFh8fT4f23hjqOWJRrymFxalEP7zI5s0bGD161HNdVxRF1q5dx/JlX1JcUoyamsD06dNZsWLZ\nc/kfSkpKaFDfho4tZmFu8ii3xK17f+DcWJOvvvoSe3v7SrP+RUZG8vHHn3D61Bm8mk/AybYjIiL3\n432JTjzN3bsRdWZVUNuOYRUq6gR/d3paW1vTrp0Xt6OP4dFw6P9/KITdP0Qvn161bgCgbMxPC4HO\nysriw1nvs0DhiZWgBwJ0UjTg59IowiMPYKRnS2xsbI2NL+lhIk4KHWVlPsBcoklSvHI+5Tlz5mJZ\nrw3NGz2Kd7ex9GT69LcZPHjQc0UlrV27jpUrvqND81mYGNlRUJTO/r27yM3NZevWzc/u4C/8/Pww\nNmygZAAA3Bx6cfj4HP744/dK/SV37tyhY8fO6GrWx9Whi5ImlZtjT3IL4vhp+08vLPNQl1Dp3qp4\npdn9y04kRHPu+hcERe7ktP985GoJrF23praHViVOnz5NE03zMgPwGL0UNsQnBZCRc7dcWbMm8O7e\njXDdiqkRb+sX4t29m1LZ0aNHaOTQU6nM1Nges3r2T41pv337Nm9Pfxefnn359NPPiY+PZ8XylbRt\n+ma5L8dAzwKvZtP45ZdfKuTkeBqiKFZ6kxcENcS/J/F4jEWLluBi0xMNdR2szCpG4dUzcCE4OLTK\n46jLqIyAileaBg0aEBYewpYfvkNTL5u8/AyyMvNp1qw5Cxcsqha5htpAAORyCdY2FtV2mFIikZCX\nl6f0mUx/522iDUo5rBZHjlhKpljCbxox5JtrMnq0ciR42b22ss+z7EZcUFBQQRrh8OHDdOzQmYDL\nacjy3Th24CbNm7eioKAAU2PlLShtLQPMTWyJiqo8lr8yOnfuTFbuQ7Jy45XK7z34k/79Bj4xauqi\n70XsG7TBUN+SzJy4Cu/nFyXQuHHDig3/haiMgIpXHjU1NTZu2EJpvjFDe3xH745L6dVhMdt+2MOa\nNd/W9vCeSu/evYmUZpAqKqdfPEU89o72nD136qXDP7Ozsxk3dgL1jE2wtLCiqXvzch0kMzMz/AOv\nYzCsLYt1Q1iuH4b9mNe4fONahe2dwYOGcDfurFJZZk4caZmxzJ37Gaam5hgb12PsmPFkZWUhlUqZ\nOnUanVrOpFnDwdg38KR1kzE0dhiATC4jv1D5KJFUVkpWThL29srG4Wno6emxefMm/ILWEBZ1iNiH\n17gRvo2kTH/WfLv6ie3qmZhQWJxNI8fXiHrgS1JaWLkj9UFSAA/TbjL1zalVHkddRuUYVvHKEx0d\nTetWbRnY9WvU1R85FTNz4gi8s5nk5Id1WgZ565atfPbhR3QptcRUrkWoXj5ZZupcDQp4okheVRFF\nkbZt2lOcZ0gz12Foa+nzMCWEoDs/c+rUsefSo0pMTKS9Vyf0tKwxr9eMwuIUouIvIKBGm6YTsGvQ\nBom0kNv3D6Ohm8HGTd8zYvgEenotUupHLpey9+Q7WNd3o73H2+hoGyKVlRJ8ZzduTc04dPiP555n\nWFgYmzZtIf7BQ7w7d+Ctt958ahKmdWvX8fVXW+jc6gPSsqK4HroDhUKBXF5KA2srfvn152rV6npZ\nVI5hFSqeQnR0NOamDkoGAMDU2IH09FSkUmml0SHVSU5ODvv27SM1NZUOHTo8MWlQZUybPo12Xu34\ncdMWUpOSmdjHh4kTJ2JgYPDS4/L19SXxYRo+7WeUj8euQWuKS3NYunQFJ05UPUG6jY0NtyNC2bFj\nB5cu+WNv3wjLMCk5Keblukw6Woa0bjKWP28sJSgoCIm0lJsR+0jLuoe2pj6u9l2wMm+CIEDfAZ3Z\nvXseJsYNyMlNxcfHh50/b3+heXp4eDyXFMeMmTO4cSOQY8fmYWPVHHNTazJzY9m0ZQPjxo2r0w8N\nz4tqJaDilefBgwc0a9qCQd2+RuMxmYf0rGhCo38i4WFcjf6oL168yOBBQ7Eyb4K2hinpOeE4u9px\n5szJKklM1CRr167lx40nad1krFJ5XkEKNyLXk5j44KX6d3JqiIfTFEyMlE9BB0f+Rr+hHqxZsxYn\nmw44WHtRVJxFeNRR9HRNad7KgVOnj5OVlUVUVBR2dna1chI3IiKCS5cuYWpqyoABA9DV1f3Hx1AV\nVCsBFSqegoODA7169yLg5nZaNh6LrrYROXmJBEXu4Iuln9aoASgtLWX4sBG0bfoW1pbNAFCIr3M9\ndCuLFi3m66+fvC/9T+Do6Eh+UWKF8uy8eBzsHSpp8Xw4ODiQnRdfwQgUlCQRcENCY6eetGrySIHU\nxqoFB85+yPwFZWGgpqamL33i+WVwd3fH3d291q7/T6ByDKv4T7B790669PDghN+nHPWdw+Vba5j3\n2WymT59OcXExmZmZVY4UksvlFBYWVqn+uXPnMNCzKjcAAGqCGk2cB7Lr590vPJ/HycvL49q1a8TF\nxT132379+qEgn7ux5xBFRVl/Bancjj7IJ/NePgZ+7twPiYw5TF5BMgCiqCAq/iJFpWncjojA2baz\nUn0dbUNcHb24c+dOZd29MAEBASxatIjly5c/V3TRfwGVEVDxn0BXV5cff9xCaloyIaGBpKQkMnHi\nBEaOHIOpqTl2dg40atiEEydOPLGPoqIi3n1nJsbGJpiYmNHYrSlHjhx56nULCgrQ1qq45aOtZUhB\nYcWQyedBFEUWzF+ItbUtI4ZPpEXz1nTr1pPU1KoL9GpqavLn+bMUKUI5fukTLgQs588by/hs/kcM\nHvz3BIHPT79+/Vj0xWf8eWMFFwJWcOLyp2QXXeP8+bPo6ugilVVMRiNXlFbbtosoikye/CZ9eg/i\n4N5gftt5Cc/W7fj662+qpf9XAZVPQMV/ElEU8WzdDkmhKc1ch6KlqUdSWhiBEds5dvxwpflh+/Tu\nT8y9HJo3egM9nXokpYUTGPET+/bveWJ+3ZSUFFxdGtGv8wp0dcryNWflPuBS0GbyC1PQUNegT59+\nbNi4DlvbJ6uHVsaGDRtYvvQ7OraYib6uKXKFjLCog2gbpHMj4Opzfx6RkZFkZ2fTsmXLavdVFBYW\nEhwcjJGRER4eHgiCwKJFi/ll5yk6tHgHtb/yIGTmxHEx6GsePozH2Nj4Gb0+m/379zNr5jy6tfkE\nTQ2dsrEUZ3H22hKuXr30ymz11Gqi+epGZQRU/BNcuHCBMaOn4uO1WMknEPXAF0OLZE6fUV4RhIaG\n0q2rD/07r1SSII5LvE6pegjXrlWUhf4/CxYsZOvmnbg5DkBDTYvLwVvxdH8DF7vOyBVS7sSeJqsg\nmMg7t59LWsHRwRV3hzFYmD46tCSKCk5e/ozTZ4/SunVrpfrBwcEEBwdjZ2dH9+7daz1DXHFxMT49\n+xATnYiVSQskslwSUgLZsXM7w4YNe2pbqVTK0aNHuXEjADs7W8aMGYOJiUmFev36DiQv1RoXe2Wj\nHnJnH/2HebBixfJqnVNtoXIMq1DxnISGhmJer5GSAcgvTCW/MIPbMddISEjAzu6R/PStW7eob964\nQjKS+hbunPDb9dRrLVnyBa1bt2LtdxsIDQ+jkUNXGjl2B0BdXZPmjYZyJSSevXv3MnmycqqN4uJi\n4uPjqV+/foUn48SkeDo1V3beCoIaBvqWfPbZfDIzsnFxdebdd6ezbOmXBAUGU9+iCbkFiWjriJw9\ndxpnZ2VNnX8SXV1d/C5d4PTp0/he8MXcwpyxY39+ZhRQZmYmXbq8RkGuHFPDxhRLLjP/84UcO36E\nTp06KdUtKCxES7OiYdVQ16GgoLBC+X8RlU9AxX8KmUzGypWrWL5sJYnJEeXlt+4c5ITfEkpKc7Go\n506TJs349tvvyt//f5TL31epObkJ2Ng8fRtHEASGDh2K78VzuLk1pr5F0wp1TAwaERh4s/y1QqFg\n4YJFWFk1oLN3D6yt7Zg8aSrFjyV0d2vUhNSMSKV+0jLv8TApkpQHWphqdyMmQqB3r/5E38uhX+eV\ntHGfQo92CzA3bM+QwcNrXTZDTU2Nvn37suqrVXz88cdVCgOdM+djBGkDunp+QnO3IXh5TKN1k8m8\n/vpI5HK5Ut2hQwaSkHq1fJ55BcmERx0nKv5P2rdvVyNz+rehMgIq/lOMHzeRzet/xbPJW0hlpdy+\nf5KktHCiE64wuPuXdGw1lU6tptO742K+WLyMW7duAeDt7Y1xPT0iYo6j+CuKpqg4m9D7vzPno6on\nCHd2diQ3/2GF8sLSZJydHMtfr1z5Fdt/3ItP+0X07fQlA7qu5PLFCKZMeau8zpKliwi+s5u0zHuI\nokhRSQ6Xbm7Cq/lEWrgNp76FO42dfJDLZbRqPAo1tUfbP26OPUlKTCEsLOw5P8HaRRRF9u79DXdn\nZd0fW6sWqKPLlStXlOq/Ne0ttPSLuBq6Gb/AjRy/+AW5+clYmrozfdq7rFv3/T89hTqHygio+M8Q\nGRnJyZOn6dRqFpamDfHpOJf45ED8AtbT2NkHHe1HWv4GeuY423Thp592AmVPrGfOngStOI77zeVi\n0CpOXpnPm2+N5c3n0JB5f/Z7RMWfLRclE0WRhJRgktNDmTBxAlAWgvrNN2vwdJ+EgZ45UHbStq37\nZI4ePUpKSgoAw4YNY+33XxMeu4s/zs7ghN9nlJTm4mTbvvx6CoUcuVyKro6ybLYgqGFoYPFcipx1\nAVEUkUgkSGUlPEgKIDXjTnloq6aWHkVFyhpLBgYGnD9/Fg3tXOKTAwGRtKw7NLBoRq+Oi1iwYDHh\n4eG1MJO6g8onoOI/g7+/P9ZWHmj8lWDGUN+Svp0XcPryl+hqV4xE0dQwJCc7p/y1vb09gUHXiYiI\nIC0tjZYtWz53ToI2bdqwcdP3zJzxHvp6ZkilpWhqiRw7fqRcBygvL4/i4mLqGdooj0dTFzMTG2Ji\nYqhfvz4A48aNY+zYsWRlZaGhoYGlZX1kcilaf/ku1NU1MTG2JzElBLsGjxzFRSU5pGfF0apVq+ca\nf03j6+vLsqVfEhEZiYuzCx99PBupVEpsbCweHh74+Phga2PP8YsLsDJvQmFRBjK5hLbNxpGRFVfB\nJwAwdeo0igv0GOazBl1tY9Ky7nE5aAttmo3GybozO3f+zOrVX9XCbOsGKiOg4j+DhYUFRcUVn3xN\nje2JTvDD0carfItBFBUkZwbyQd8FFeq/7CnSMWNGM3z4MAICAtDW1sbT07M8GxpAUFAQUomEnLxE\n6hk9MgRSaTGZ2YkVnLmCIJSLofXu1Yc70aeUErtYWzbj8s0ttGs+gQYWTcnJe0h49H4+mD270oia\n2uLAgQNMmTydpi5D8XL3ITMnllEjJ6CvZ4S1RXOy8n9ApBiFTJthPmvQ1jJAFEWi4y9zKWgDq79e\nhaGhoVKfd+7c4fKlKwzouhr1vwyjlZkbXi0mcuvOQZxtO5CdnVsb060zqIyAiv8Mffr0oVjyNg+S\nAnCwbguAVFZCXtEDRLUCrof/iItNNxQKOfcTztHAxrjGkqlra2tXehahtLSUUSPH4GTbCf/gH+jS\ndgYGehaUlOZzPXQ7gwYNKl8FVMamzevp1LEzFwOjMTNuQlZuPCkZt2ntPpKYhCvcCN2Jubk5K1Yu\nYdKkSZX2UVhYyPz58/nzT1+sLC1YumwJ7du3r7RudaFQKPjwg4/x8niL+uZNADAysKKeoTXnrq6m\nudvrqAnq/HFmNt6e49HWKhPPEwQBV4fOxCb50rCha4V+w8PDsTJvWG4A/k99s8b45sWTnKnJvH4r\nKrT7L6HyCdQxRFHkhx9+oJmrG6aGxnTv1AU/P7/aHtYrgZaWFidOHCXywX58g1YScPtHjl2ci0/v\njoSFhzBidFdiUg+QkHWMKdOHcMH33HPls60Ozp8/j4GeFe1bTMTGqjlHL8znjzMfcPDcR6Rl32Pb\ntq1PbW9jY8OduxF4tLQnIeUmlqauDO6+Cjen7vh0nEuXNjOxs7Nn8uTJlWomxcbGYmlpza4dR1CX\nunIvIgdv767MnTu3pqYMQHJyMllZ2RWyeJkY26OlqUdefhKCICCRFWOkb1WhvY6WGcnJyRXKnZyc\nyMqJL/cb/J+svHi0NHWxc7SosfzM/xZUK4E6xueffMrejdsZVmiDDR6E+2cwtO8Afjv0xxNPpaqo\nOp6enjx8+IAzZ86QkZFBp06dcHUte4Jctmwpy5YtrdXxFf4V1/4gKZCoB37oaBshlRZjZGBFYXFq\nleQUdHR0aNu2LXFRcho7K39npLJi9PSffCBtyODh2Ft50dbjkVxyQvJNvl2zjpkzZz5XQpfnwcDA\nAJlMgkxWgqbmoznKFTJKJQVoauohkRYhIPAw9RaNHF9TqpOYGlZpeGnr1q1xdLIj9N4fNGs4FHU1\nDQqLs7gaso3efXqwZ8+vFXJT/9dQnRiuQ2RmZuJka8+SktYYC4/07YPEdK66Q9DtVyOn6X8RURS5\ndu0aaWlptGnTBhsbm0rrpaenY2fngBpadGv3PhamrigUcu7FnSf8/iEyMqtmCO7du0cbTy98Oiws\njzCSySVcDFrNl6s+Z/z48RXaKBQKNDW1eL3XOnS0lffWD577mE6dW3Hy5MkXmH3VGDxoGLH3JLR0\ne6PcAIXeO0JKegS9Os2jqCSHQ+c+Rl1dizZNR2Nv3ZbCogxuRuwlKy8W/6sXadGiRYV+U1NTGfnG\nGG7eDMbYyILs3BQ+/GA2XyxZ/MrkBVCdGH5FCAoKwknbFONS5QQnrTBnU6QvMpnsP//U8m/k/v37\n9O83iJycQowNrEhKu8uE8eNZv2GdkkMYypzXri4N0VdvgYVp2QpFTU2dxs4+pOeE88cffzBu3Lhn\nXtPa2prWnq04cuEzXOw6oaWpT2J6AD17dmXs2LGVtlEoFIgKBZqP5Vz4P5oaOty6VbNnCn7ctoUe\n3Xtx7voXmBm7kp51n+zcZJq7DSUn7yEpmZGoqanRrOEAohMuc/XWT2hrGWBj2QJdXe0nOuutrKzw\nvfgnsbGxpKam4u7ujpGRUaV1/4uo7ih1CAsLCzJkZRLFjz+hZFGCoa5+rWu9qHh+FAoFvXv3w8Kw\nA15NepTta0sLOXp4HQ0breODD2ZXbCOKmJtUlHMw1LPn/v37VbpmL5++ZKZCt7bvkZJxh4zsGCSS\nApYtX1LB8PwfDQ0N6tUzIzrhitJ2S25+Ern5STR1aFZpu+rCwsKCkFtBnD9/ntDQUIKDrThz+hyh\n9w5yN+4kbdp6suqrFSxatJTGjgNo22wMGTmxRMYeYe26b57pv3FycsLJyanaxpuenk5aWhouLi7o\n6OhUW7//NCrHcB2iZcuWmNnU57zaoyQfMlHBHzoJTJ5SuSNPRd3Gz8+PkiIFjRx6lP/9tDT18XB9\nnbXfVZ7u0MOjGelZFTXv84piqxSaev78eWJjEvHyeBNrSw9au4/Ap+NcGtr3ZNXKpyexWbb8CwLC\nfyHo9l5SM+5wJ+Ycpy4tQ0fbkIkTnr0CeVnU1NTo2bMnFy74cfliOG2aTGdgty9xc+xDcHAwffv2\n5cyZEzRwLCAifheGFkkcOLiXCRMqbm/VFDk5OQwZPBwnRxd6vNaP+lbWrFz5Va1LcLwoqpVAHUIQ\nBA4cP0Kf7j25kXObBgpdIsVs2nbwYsVXq2p7eCpegKSkJAz161cw4EYG1qSnp1Ta5pNPPqL7az4Y\nGjTAxrI5crmEO7GnQK2AIUOGPPOa169fx8KkGYKg/IzXwKIF5849XezunXfe4dSps5w5fZbohMuo\nq2lgoF8PW3tLpr89/ZnX/juiKHLixAl++mkXhQWFDB7Sn4kTJz7VrxEYGIj/lev09V5RHtrp7tIX\nhShjyRfL+OXXXS+UbL66GDrkddISBQa99g2aGjrkFaTy3ZoNmJgYM336839Gtc1LrQQEQTARBOGM\nIAh3BUE4LQhCpQLggiDECYJwSxCEYEEQbrzMNV91XF1duRsbzYY/djHp+4WcueLL8XOn62xuUxVP\np02bNiSnRSCTKyePSUy9RatWnpW2ad26Nb/v20N8+jEOnn+fg3/OxtS6AL9LvmhpaVXa5nGsrKwo\nlVQ8FJdfmEZqamq5HlJlCILA4cMH2PPbLnx8XqN9hzYsWf4p/lcvPTXHgFQq5c6dOxUS2sycOYsp\nk94l8b4uhRn2fLXiBzp17EJh4ZMVPC9fvoy1RfMKsf22Vq25dOnJkt3/BLdv3yYkJJTWTcaW5ycw\nMrCilds4vvyydlOFvigvFR0kCMIqIFMUxa8EQfgEMBFFcV4l9WIAT1EUs6vQ5382OkjFq8kbb4wm\n8No9PFxHYKhvSULKTULu7uHI0QN07dr1ie1EUSQ5ORldXd3nOtmbm5uLra09Xh7TsLFsDkBxSQ5n\nrnyJuakLrdvZ8vu+PS89r/+zbds25n3yOaKoRmFRLs2bt+DAgX2kpaXRo3sfendcUi7nLIoi/rc2\n8PbMN/joo8rTV/7yyy8snr+Wji3eUypPTL1FZvFFgkMCqm3sz8uhQ4eYO+dLOnjMVCpXKGT8euxN\n5Ar5E1rWLC8THfSyPoHBwM6//r8TeNJaVaiGa6lQ8a9k9+6djJ3QH//Q79hzYhpFYiAHD+17ogEo\nLS0lMjKS9PR0rK2tn1vawdjYmLFjR3MpcCMnLy3l/PVvOXx+Hk62HWni3IebN4OrY1oAHD16lLkf\nfY6LTV9KS6RoaRgTEX4fF5dGfPvtt9hYtAWE8v1yQRBwtO7C3r37n9jnkCFDyMiJJjHtUUi0RFpE\nZNxRZr73drWN/UVo3LgxaRnRyBUypfK0rCicnBo+oVXd5mVXAlmiKJo+6fVj5TFADiAHtoqi+MNT\n+lStBFT8Z/n++/UsWrgYTQ1dCoty6dq1Gzt/3o65uflz9fPrr7+y4NNvcLLpjkxWipWZGzraRsQk\n+KNhdJ8LF85Wy3jbe3kjFrtw6+5BOnu+g7VlWQRRYmooFwPXIaCOKCrQ1jLEo9FAGjp0IzE1hGIh\nEP+rTz4Jf/nyZQYPGoqxoTXaWsY8TA5l/PhxbNj4fa0HSPTp3Z8H9wtp4TYSbS0DsvMSuBq6idVf\nL2PSpIm1MqYaPScgCMJZ4PFz2gIgAvMrqf6ku3cnURSTBUGwAM4KghApiuITN/cWL15c/v9u3brR\nrVu3Zw1ThYp/PXv27GHJFyvp3Ooj6hnZIJWVEhZ1gP79BnHt+pXnuvkNHTqUD2bPobQ0DyfbTgiC\nQF5BKpFxR/h51xOfwZ6b6OgozIx0cbH3LjcAAElpYZgY2tOp9VsYGTQgIzuGKze3oFDISc0OYe6n\nT3egent7k5T8kFOnTpGdnU3Xrl2rNbzzZdi3/zfefnsGhw7ORVtbHzV1kUWLFvyjBsDX1xdfX99q\n6etlVwKRQDdRFFMFQagPXBBFsckz2iwC8kVRXPOE91UrARX/SZo1a0l9I5//tXfncVXW+QLHP19U\nVAJRUBBBRQ1JyzSztLSkch8dc8bUlteYd+Y6c29OzeZSzqgt05hmy9Q0M697KyvrWt2uWZqOkkta\nI2mQgALhhrKIuLCIbHJ+9w/OGCjLOZzlAc/3/Xrx8pzn/Hie7/ly5MvzPL/l0nV8qJnNdF38b/jw\no3eZMGGCU/tLSUlh2r3TKS6+QECHTpwpzOaZZ57msccevdQmLy+PgoICYmJimtX54Pbb7uBwZgH9\ne99F3563A1BeWcK6rfOZNmZlnZHHZwqPsuWr5YwaNZLNmzc6dJO7JSsuLubs2bNERkZ6fY6py1l5\nT+AT4GH749nA+ssbiEiAiATaH18DjAN8exUHpepx9OhhunXpV2ebiB9dgvvws5/NxWazNfCd9Rs0\naBCZh9LZ/I/1rH7nL+Tl5VwqAKdPn2bihMn0j7mO8WOnEtE9khUrnne6r/sfljxBSWm+28e1AAAR\nGElEQVQuJ09/v1Rn8fmTBAdFXDH1RGjnPrTxE95//71WXwAAOnXqRHR0tOUFwFWuFoHngLEikgHc\nAywHEJEIEdlgbxMO7BaRJGAP8KkxZouLx1XKIcYYqqqqrA7DIf36xnDqbN0RwTZj42xRFhVlNrZt\n2+b0PkWEoUOHEhcXR2BgzfTLxhgm/2AqOUdt/DBuFeNue4q7bnmCVStfYfXqt5rYY10TJ05kxcpn\nOZabQPqRLVRXV9LBP4iikrwrusWWlBbg397f6YV4lGe5VASMMWeNMWOMMbHGmHHGmEL79jxjzGT7\n46PGmCHGmJuMMYOMMcvdEbhSjamoqGD+/IV07hxChw4duX7gjWzYsKHpb7TQkqVP8M9vX7+09GRl\n1QW+Tn6boIAwune9nrS0tMZ34KDExEQOHTrKkOtm0tY+T1CnwHCG9H+A5X9yfoWtefPmkZi4F9Ph\nMB9umcemXUvo3LkTiWnvUW0vBJVVpSSlr2Hu3Lmt/i/nq43OIqquSvdNn0ni3iMM7j+TwIBu5JxK\n4ZuDq1n7/hqnr617U/+Y6zh+PJe2bfyprLpAZPhght84m91JL/D66lcYP368y8d4//33Wbr4zwy/\noW53y6qL5fzf1kcpryhr9r5LSkqAmvmLZs18kC+//JLQLlEUnMli5syZ/O3vr2kR8ABX7gloEVBX\nnczMTIbdPJwpo1fSps33156zcvdyvjqBfd8kWBhd4zZv3sz9s2ZzU+wDhIXG0rZNOw4e+YzzVQdJ\nS0t1yySCycnJxI0eyw/ueA4/v+/3l5OfzMniLaQeaHhEsbOOHTvG8ePHiY2NJTz8ysVg3GXfvn3s\n2bOH8PBwpkyZ0qondGsOLQJK1fLBBx+w5ImXGH7Df9TZ7o6/dL3hzTffZMH8xxFpS1lZCTcPu4V3\n332rwTUImuPuu8aSd6Kawf3vo71/IGcKj7En+a+89reXmDFjhtP7KywsZP/+/XTr1s2l9ZedVVFR\nwbRp00nYs4+IboMoKz9NcWkOmzZvZNiwYV6Lw2q6noBStURFRXGuOOeKKbkLi3MID4+wMDLHzJkz\nh4ceeohDhw4RHBxc74pZrvp4/Uf84hePsP7jBbRr14EOHdqxfMVTThcAYwzLlj3JqlUv0LVLT4rP\nnya6T2/WrfuQ3r17uz3uyz391DNkHMhn0qhn8bPPNXQ8dx+TJ08lOztL199wgJ4JqKuOMYYbrh9M\nxzYDGNh3EiJ+lFeW8GXSn/ntgl/UO4e/ryopKaGwsJAePXo061LTG2+8weJFzzDqpscI6BiCzdhI\nP7KZoopvSU8/0ODaBe7SvXsktw6cR5dOUXW2b9/7LP/95suMGzfOo8dvKawcJ6BUiyMibNq8geo2\nh/ls1yJ2fbuKjTsXMX3GpDoDpRQEBQXRs2fPZt9rWLnyRQbFzCCgY81sMX7ix4C+EzlfXMkXXzQ8\nLYS7lBQXEdDh+y6nlVUXOHEyCZtNOHXqlMePfzXQcyV1VerVqxeJSXtJSUnh5MmTDBkyhLCwMKvD\nalJ2djYrnlvJ59t20jU0lP98ZC4zZsywfL6chuTknODG6J51tokInYN6kpWV5fHj3z5yFMdyEugf\nfTcHDn1GSuandA3uQ3nleX75y8cICwvzmbOB5tLLQUpZJDc3l+efX0X81u2EhIZw333TWLr0KXqE\nDiMq/GZKy87xXdZGZj04jRdfXOXWY+/bt48F8x9n95dfEBQUzJw5s3n66aecnjri9tvvpG3lIPpE\njbi0zWarZuOuhWzfsaXehd/dKTExkTvuGE31RcEYG5PuXEanwJpeSPmn0/ln8mukZxwkIqLl3wty\nhfYOUqqVOX78OLfcMoKwzoOJDLuZC2XnSMlch3+7ICaM+n5uxorKUjZ+sYjklCS3TaCWnJzMHaPi\nuL7fNKJ7DKesoojUw+voGX0Nn2/b4tRZR3x8PNN/fD/DBs6mR9ggysoLSc78kF59A9kav9kt8TZm\n79693H33OII6RhIVfhMD+tX9q3/fgbf4yU/HsnDRQo/HYiW9J6BUK/PksqeJCLmFoQMeIDw0lj5R\nIxg/cglFxbmUlBZcatfe/xp6RgwhPj7ebcd+6sk/Ett7IjG942jXriOdArszYtBcUlLS2LNnj1P7\nGjNmDO+seYMTZz5j7aaf89nu33PX2Bu9tvzjn55dwcC+UzDG0Cmo+xWvd2zfjezsnHq+U/2LFgGl\nLLBp02aie4yss629/zVEhg8mr6Du/IpVF0svzfvjDgkJCfQIq3uZxs+vDd1DbyAhwfmBdFOmTCE9\n4wBnz56mqOgcf/v7a40uRelOqakHCAvpT9cu/cjJT67zmjGGM8UHuX3kbV6JpbXSIqCUBQICAqis\nunDF9vKKokv93QEKzh4m/0wmkydPdtuxw8O7U1x65SL3F8pPNfvauYgQGBjo9X75117bjzOFR7mu\nzz1k5XxNauZGKipLKS07y77Ud2gfcJEf/ehHXo2ptdEioJQF5sz5CRlZG7HVWpP29LkjFJzLJPP4\nZpLSPiQh9b/YnfQSa9e+R1BQUCN7c86vfj2Pg0fWUVZRfGlbVu7XlFzIZerUqW47jjcsXPQ70o5+\nwoXyQsaPepzT547w4T9+ycefz+fWUT3ZvXsn7du3tzrMFk1vDCtlgfLyciZNmsLB1EzCQ4ZQdbGI\nE/mJvP32ajp37syuXbsIDQ1l5syZTi8t2RRjDI8/vphXX3mViPBYysqLMJTz6YaPGTp0qFuP5Q1r\n1rzLr3/1W/z8/CkvLyUm5lr+Z+0aYmJa55q/zaG9g5RqhYwxbNu2jZ07dxIaGsqsWbM8Osna5fLz\n8/nqq6/w9/enW7duREVFeWSKCm+oqqoiLS2NoKCgFrMMpTdpEVBKOc0Yw5I/LOWll18mOCiMouJT\n3HnnaN5Zs5qQkBCrw1NO0CKglHLaiy++zPPP/YXbBj/CNR1DuFhdyf6MD+jWo5rtO9zXJVV5nhYB\npZTTInv0YkjMT+nape+lbTbbRTZ8sYCv/vkFAwYMsDA65QwdLKaUcorNZiM37wShnaPrbPfza0vX\nkGiOHDliTWDK67QIKOWD/Pz86NMnhvwz39XZfrG6kvyCQ3oW4EO0CCjlo5YsWUxi+luXFrYvKy/k\n69TXuWfMPfTt27fxb1ZXDZ1KWikf9fDDsykvL2fZ0ie5cKEcm+0iDz70IC+99ILVoSkv0hvDSvm4\n6upqCgoKCA4OdnoqadUyaO8gpVSrY4whPz+fjh07EhwcbHU4rZr2DlJKtSrx8fHExl7PtdfGEtE9\nkgnjf0B2drbVYfkkPRNQSnlVUlIScaPvYdjAh4kMH8zF6irSj26i8MJ+0jMO4u/vb3WIrY6eCSil\nWo3nlj9P/94TiOp+EyJ+tGvbnkEx92KqA1i/fr3V4fkcLQJKKa9KTkkhLKT/Fds7BfTlwIEDFkTk\n21wqAiIyXURSRaRaRBqcg1ZEJohIuoh8JyJX92KfSqlGxcTEcKbo2BXbS8uz6devn/cD8nGungmk\nANOAnQ01EBE/4FVgPHA9cL+IXOficZVSrdSCBb8h/dhGTp87DIDN2Mg49jmlFSeZPn26xdH5HpcG\nixljMgBEpLEbErcCmcaYLHvbtcBUIN2VYyulWqeRI0fy17++wmOP/ho/8ae8opToPtFs3x6v4xQs\n4I0Rw5HAiVrPs6kpDEopH3X//bOYPv3HHDx4kMDAQL0MZKEmi4CIbAVqL3ckgAEWG2M+9VRgSqmr\nW7t27Rg8eLDVYfi8JouAMWasi8fIAXrVeh5l39agZcuWXXocFxdHXFyciyEopdTVY8eOHezYscMt\n+3LLYDER2Q78zhjzTT2vtQEygHuAPOBr4H5jTFoD+9LBYkop5QTLBouJyL0icgIYAWwQkU327REi\nsgHAGFMNzAO2AAeAtQ0VAKWUUt6l00YopVQrp9NGKKWUahYtAkop5cO0CCillA/TIqCUUj5Mi4BS\nSvkwLQJKKeXDtAgopZQP0yKglFI+TIuAUkr5MC0CSinlw7QIKKWUD9MioJRSPkyLgFJK+TAtAkop\n5cO0CCillA/TIqCUUj5Mi4BSSvkwLQJKKeXDtAgopZQP0yKglFI+TIuAUkr5MC0CSinlw7QIKKWU\nD9MioJRSPkyLgFJK+TAtAkop5cO0CCillA/TIqCUUj7MpSIgItNFJFVEqkVkaCPtjonIfhFJEpGv\nXTmmUkop93H1TCAFmAbsbKKdDYgzxtxkjLnVxWN63Y4dO6wO4Qoak2NaYkzQMuPSmBzTEmNyhUtF\nwBiTYYzJBKSJpuLqsazUEn/oGpNjWmJM0DLj0pgc0xJjcoW3fjEbYKuI7BWRf/fSMZVSSjWhbVMN\nRGQrEF57EzW/1BcbYz518DgjjTF5ItKNmmKQZozZ7Xy4Siml3EmMMa7vRGQ78FtjTKIDbZcCJcaY\nFxp43fWAlFLKxxhjmrosX68mzwScUG8AIhIA+BljzovINcA44MmGdtLcN6KUUsp5rnYRvVdETgAj\ngA0issm+PUJENtibhQO7RSQJ2AN8aozZ4spxlVJKuYdbLgcppZRqnSzttikiK0QkTUS+FZGPRKRT\nA+0miEi6iHwnIgu9EFeLGwTnRExey5WIdBGRLSKSISL/EJHgBtp5PE+OvG8R+bOIZNo/b0M8EYcz\nMYnIaBEpFJFE+9fvvRDT6yKSLyLJjbTxdp4ajcmiPEWJyDYROSAiKSLyaAPtvJYrR2JqVq6MMZZ9\nAWOouV8AsBz4Uz1t/IBDQG+gHfAtcJ2H44oFYoBtwNBG2h0BungpV03G5O1cAc8BC+yPFwLLrciT\nI+8bmAhstD8eDuzx8M/LkZhGA5944/NT65ijgCFAcgOvezVPDsZkRZ66A0PsjwOBjBbwmXIkJqdz\nZemZgDEm3hhjsz/dA0TV0+xWINMYk2WMqQLWAlM9HFeLGwTnYEzeztVU4C3747eAexto5+k8OfK+\npwJvAxhjEoBgEQnHcxz9WXi1I4Sp6Zp9rpEm3s6TIzGB9/N00hjzrf3xeSANiLysmVdz5WBM4GSu\nWtIo3n8DNtWzPRI4Uet5NvW/cSu0tEFw3s5VmDEmH2o+oEBYA+08nSdH3vflbXLqaePtmABus19K\n2CgiAz0Yj6O8nSdHWZYnEYmm5kwl4bKXLMtVIzGBk7lyZxfRejky2ExEFgNVxpj3PB2PM3E5wK2D\n4NwUk1s1ElN91xob6mWggwXr9w3QyxhzQUQmAh8D/S2OqSWyLE8iEgj8L/CY/a9vyzURk9O58ngR\nMMaMbex1EXkYmATc3UCTHKBXredR9m0ejcvBfeTZ/y0QkXXUXAJo9i83N8Tk9lw1FpP9Zl64MSZf\nRLoDpxrYh1vzVA9H3ncO0LOJNu7UZEy1/wMbYzaJyGsiEmKMOevBuJri7Tw1yao8iUhban7ZvmOM\nWV9PE6/nqqmYmpMrq3sHTQDmAz80xlQ00GwvcK2I9BYRf2AW8Im3YqSRQXD2iox8Pwgu1cqY8H6u\nPgEetj+eDVzxofRSnhx5358AP7HHMQIo/NelLA9pMqba149F5FZqumx7owAIDX+GvJ2nJmOyME9v\nAAeNMS838LoVuWo0pmblypN3sx24250JZAGJ9q/X7NsjgA212k2g5k54JrDIC3HdS821vjIgD9h0\neVxAH2p6fCRRM6W2R+NyJCZv5woIAeLtx9sCdLYqT/W9b+DnwNxabV6lpsfOfhrp9eWtmIBHqCmI\nScBXwHAvxPQekAtUAMeBOS0gT43GZFGeRgLVtT67ifafp2W5ciSm5uRKB4sppZQPa0m9g5RSSnmZ\nFgGllPJhWgSUUsqHaRFQSikfpkVAKaV8mBYBpZTyYVoElFLKh2kRUEopH/b/+B+nJSnuxQEAAAAA\nSUVORK5CYII=\n", 56 | "text/plain": [ 57 | "" 58 | ] 59 | }, 60 | "metadata": {}, 61 | "output_type": "display_data" 62 | } 63 | ], 64 | "source": [ 65 | "np.random.seed(0)\n", 66 | "data, label = sklearn.datasets.make_moons(200, noise=0.20) # create 2-dimentional data belong to two categories, in size (200,2)\n", 67 | "plt.scatter(data[:,0], data[:,1], s=40, c=label, cmap=plt.cm.Spectral)" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 8, 73 | "metadata": { 74 | "collapsed": true 75 | }, 76 | "outputs": [], 77 | "source": [ 78 | "def plot_decision_boundary(model,X,y):\n", 79 | " # Set min and max values and give it some padding\n", 80 | " x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5\n", 81 | " y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5\n", 82 | " h = 0.01\n", 83 | " # Generate a grid of points with distance h between them\n", 84 | " xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n", 85 | " # Predict the function value for the whole gid\n", 86 | " Z = model.predict(np.c_[xx.ravel(), yy.ravel()])\n", 87 | " Z = Z.reshape(xx.shape)\n", 88 | " # Plot the contour and training examples\n", 89 | " plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)\n", 90 | " plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "## Logistic Regression - Scikit Learn" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 56, 103 | "metadata": { 104 | "collapsed": false 105 | }, 106 | "outputs": [ 107 | { 108 | "data": { 109 | "text/plain": [ 110 | "LogisticRegressionCV(Cs=10, class_weight=None, cv=None, dual=False,\n", 111 | " fit_intercept=True, intercept_scaling=1.0, max_iter=100,\n", 112 | " multi_class='ovr', n_jobs=1, penalty='l2', random_state=None,\n", 113 | " refit=True, scoring=None, solver='lbfgs', tol=0.0001, verbose=0)" 114 | ] 115 | }, 116 | "execution_count": 56, 117 | "metadata": {}, 118 | "output_type": "execute_result" 119 | } 120 | ], 121 | "source": [ 122 | "logistic = sklearn.linear_model.LogisticRegressionCV()\n", 123 | "logistic.fit(data, label)" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 103, 129 | "metadata": { 130 | "collapsed": false 131 | }, 132 | "outputs": [ 133 | { 134 | "data": { 135 | "text/plain": [ 136 | "" 137 | ] 138 | }, 139 | "execution_count": 103, 140 | "metadata": {}, 141 | "output_type": "execute_result" 142 | }, 143 | { 144 | "data": { 145 | "image/png": "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\n2P8HBFn6Xfhwg64AAAAASUVORK5CYII=\n", 146 | "text/plain": [ 147 | "" 148 | ] 149 | }, 150 | "metadata": {}, 151 | "output_type": "display_data" 152 | } 153 | ], 154 | "source": [ 155 | "# Plot the decision boundary\n", 156 | "plot_decision_boundary(logistic,data,label)\n", 157 | "plt.title(\"Logistic Regression\")" 158 | ] 159 | }, 160 | { 161 | "cell_type": "markdown", 162 | "metadata": {}, 163 | "source": [ 164 | "## Logistic Regression - Handed coded" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 4, 170 | "metadata": { 171 | "collapsed": true 172 | }, 173 | "outputs": [], 174 | "source": [ 175 | "def sigmoid(x):\n", 176 | " return 1.0 / (1 + np.exp(-x))" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 365, 182 | "metadata": { 183 | "collapsed": false 184 | }, 185 | "outputs": [], 186 | "source": [ 187 | "class Logistic_hand(object):\n", 188 | " def __init__(self, data, label):\n", 189 | " self.data = data\n", 190 | " self.label = label\n", 191 | "\n", 192 | " self.data_num, n = data.shape\n", 193 | " self.weights = np.ones(n)\n", 194 | " self.b = 1 # beta0/weight for the intercept\n", 195 | "\n", 196 | " # stochastic gradient descent\n", 197 | " def train(self, num_iteration,alpha,reg_lambda,batch_size):\n", 198 | " '''\n", 199 | " num_iteration: number of iterations for stochastic gradient descent\n", 200 | " alpha: learning rate\n", 201 | " reg_lambda: regularization factor, the higher the smaller the weights, the simpler the model\n", 202 | " batch_size: number of data instances to sample from each iteration, to calculate gradient. \n", 203 | " The larger the more precise for weights, the slower it will take\n", 204 | " '''\n", 205 | " for j in xrange(num_iteration):\n", 206 | " data_index = range(self.data_num) # indices of all data rows\n", 207 | " for i in xrange(batch_size): # in each iteration, randomly select n (batch_size) rows to do gradient descent\n", 208 | " rand_index = int(np.random.uniform(0, len(data_index))) # randomly select a row index of data\n", 209 | " error = self.label[rand_index] - sigmoid(sum(self.data[rand_index] * self.weights + self.b)) # cost function\n", 210 | " '''gradient descent w/o regularization'''\n", 211 | " #self.weights += alpha * error * self.data[rand_index] # batch update for all weights, gradient=error*self.data[rand_index]\n", 212 | " '''gradient descent w/ regularization'''\n", 213 | " self.weights = self.weights*(1-alpha*reg_lambda) + alpha * error * self.data[rand_index] # batch update for all weights, gradient=error*self.data[rand_index]\n", 214 | " self.b += alpha * error # update beta0 \n", 215 | " del(data_index[rand_index]) # delete this row index so it won't be selected again\n", 216 | "\n", 217 | " # return predicted class label\n", 218 | " def predict(self, predict_data):\n", 219 | " result = map(lambda x: 1 if sum(self.weights * x + self.b) > 0 else 0,predict_data)\n", 220 | " return np.array(result)\n", 221 | " \n", 222 | " # return predicted probability\n", 223 | " def predict_prob(self, predict_data):\n", 224 | " result = map(lambda x: sigmoid(sum(self.weights * x + self.b)),predict_data)\n", 225 | " return np.array(result)" 226 | ] 227 | }, 228 | { 229 | "cell_type": "markdown", 230 | "metadata": {}, 231 | "source": [ 232 | "### Train the logistic model" 233 | ] 234 | }, 235 | { 236 | "cell_type": "code", 237 | "execution_count": 377, 238 | "metadata": { 239 | "collapsed": false, 240 | "scrolled": true 241 | }, 242 | "outputs": [ 243 | { 244 | "name": "stdout", 245 | "output_type": "stream", 246 | "text": [ 247 | "time spent: 0.747846126556\n" 248 | ] 249 | }, 250 | { 251 | "data": { 252 | "image/png": "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\n", 253 | "text/plain": [ 254 | "" 255 | ] 256 | }, 257 | "metadata": {}, 258 | "output_type": "display_data" 259 | } 260 | ], 261 | "source": [ 262 | "if __name__ == '__main__':\n", 263 | " start = time.time()\n", 264 | " logistic_hand = Logistic_hand(data, label)\n", 265 | " logistic_hand.train(num_iteration=100,alpha=0.1,reg_lambda=0.01,batch_size=50)\n", 266 | " plot_decision_boundary(logistic_hand, data, label)\n", 267 | " print \"time spent: \",time.time()-start" 268 | ] 269 | }, 270 | { 271 | "cell_type": "markdown", 272 | "metadata": {}, 273 | "source": [ 274 | "### Make predictions" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": 244, 280 | "metadata": { 281 | "collapsed": false 282 | }, 283 | "outputs": [ 284 | { 285 | "name": "stdout", 286 | "output_type": "stream", 287 | "text": [ 288 | "category predictions for the first five rows: [0 1 0 1 1]\n", 289 | "probability predictions for the first five rows: [ 0.33951036 0.99622121 0.32944178 0.788252 0.98041746]\n" 290 | ] 291 | } 292 | ], 293 | "source": [ 294 | "print 'category predictions for the first five rows: ',logistic_hand.predict(data[:5,])\n", 295 | "print 'probability predictions for the first five rows: ',logistic_hand.predict_prob(data[:5,])" 296 | ] 297 | }, 298 | { 299 | "cell_type": "markdown", 300 | "metadata": {}, 301 | "source": [ 302 | "## 3-Layer Neural Network" 303 | ] 304 | }, 305 | { 306 | "cell_type": "code", 307 | "execution_count": 75, 308 | "metadata": { 309 | "collapsed": false 310 | }, 311 | "outputs": [], 312 | "source": [ 313 | "class NN(object):\n", 314 | " def __init__(self, data, label, num_hidden_nodes):\n", 315 | " self.data = data\n", 316 | " self.label = label\n", 317 | " self.num_hidden_nodes = num_hidden_nodes\n", 318 | "\n", 319 | " self.num_examples, self.nn_input_dim = np.shape(data)\n", 320 | " self.nn_output_dim = 2 # number of output nodes\n", 321 | "\n", 322 | " # initialize weights with small random values, which we are going to be learned during training\n", 323 | " np.random.seed(0)\n", 324 | " self.W1 = np.random.randn(self.nn_input_dim, self.num_hidden_nodes) / np.sqrt(self.nn_input_dim) # weights between layer1 and 2\n", 325 | " self.b1 = np.zeros((1, self.num_hidden_nodes)) # weight for intercept at layer1\n", 326 | " self.W2 = np.random.randn(num_hidden_nodes, self.nn_output_dim) / np.sqrt(num_hidden_nodes) # weights between layer2 and 3\n", 327 | " self.b2 = np.zeros((1, self.nn_output_dim)) # weight for intercept at layer2\n", 328 | "\n", 329 | " def batch_gradient_descent(self, num_iteration, alpha, reg_lambda, print_loss):\n", 330 | " for i in xrange(num_iteration):\n", 331 | " \n", 332 | " # Forward propagation\n", 333 | " z1 = self.data.dot(self.W1) + self.b1\n", 334 | " a1 = np.tanh(z1) # used tanh as the activation function\n", 335 | " # calculate output probabilities for all classes using softmax function\n", 336 | " z2 = a1.dot(self.W2) + self.b2\n", 337 | " # turn log probabilities of each class to unnormalized probabilities\n", 338 | " exp_scores = np.exp(z2) \n", 339 | " # normalized predicted probabilities of all classes for each instance\n", 340 | " probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) \n", 341 | " # We now have an array probs of size [num of examples x num of classes], where each row now contains the \n", 342 | " # class probabilities. In particular, since we’ve normalized them every row now sums to one.\n", 343 | " \n", 344 | " # compute the loss: average cross-entropy loss + regularization\n", 345 | " if print_loss == True:\n", 346 | " # calculate cross-entropy loss\n", 347 | " # negative log of the predicted probability of the true class\n", 348 | " # we only compute the loss of the true class in each example\n", 349 | " # This is 1D array of the predicted prob of the true class for each example.\n", 350 | " corect_logprobs = -np.log(probs[range(self.num_examples),self.label])\n", 351 | " # average loss for this batch\n", 352 | " data_loss = np.sum(corect_logprobs)/self.num_examples \n", 353 | " # L2 regularization pentalty\n", 354 | " # 0.5 is for the convenience of weights updates with regularization\n", 355 | " reg_loss = 0.5*reg_lambda*(np.sum(self.W1*self.W1) + np.sum(self.W2*self.W2)) \n", 356 | " # full loss is the average of the log probabilities and the regularization loss\n", 357 | " loss = data_loss + reg_loss \n", 358 | " if i % 50 == 0:\n", 359 | " print \"iteration %d: loss %f\" % (i, loss)\n", 360 | " \n", 361 | " # Backpropagation\n", 362 | " delta3 = probs\n", 363 | " '''\n", 364 | " Explanation of the next line of code:\n", 365 | " Suppose the probabilities we computed were probs = [0.2, 0.3, 0.5], and the correct class was the middle one \n", 366 | " (with probability 0.3). According to this derivation, the gradient on the scores would be delta3 = [0.2, -0.7, 0.5]. \n", 367 | " We see that this result is highly intuitive: increasing the first or last element of the score vector probs \n", 368 | " (the scores of the incorrect classes) leads to an increased loss (due to the positive signs +0.2 and +0.5), which \n", 369 | " is bad. However, increasing the score of the correct class has negative influence on the loss. The gradient of -0.7 \n", 370 | " is telling us that increasing the correct class score would lead to a decrease of the loss, which makes sense.\n", 371 | " '''\n", 372 | " delta3[range(self.num_examples), self.label] -= 1 # the gradient of loss w.r.t. z2 for each instance\n", 373 | " delta3 /= self.num_examples\n", 374 | " dW2 = (a1.T).dot(delta3) # delta for W2\n", 375 | " db2 = np.sum(delta3, axis=0, keepdims=True) # delta for b2\n", 376 | " delta2 = delta3.dot(self.W2.T) * (1 - np.power(a1, 2)) # the gradient of error at the second layer, the latter part is the derivative for tanh\n", 377 | " dW1 = np.dot(self.data.T, delta2) # delta for W1\n", 378 | " db1 = np.sum(delta2, axis=0) # delta for b1\n", 379 | "\n", 380 | " # Add regularization terms for weights\n", 381 | " dW2 += reg_lambda * self.W2\n", 382 | " dW1 += reg_lambda * self.W1\n", 383 | "\n", 384 | " # Gradient descent parameter update\n", 385 | " self.W1 += -alpha * dW1\n", 386 | " self.b1 += -alpha * db1\n", 387 | " self.W2 += -alpha * dW2\n", 388 | " self.b2 += -alpha * db2\n", 389 | "\n", 390 | " def stochastic_gradient_descent(self, num_iteration, alpha, reg_lambda, batch_size):\n", 391 | " '''\n", 392 | " num_iteration: number of iterations for stochastic gradient descent\n", 393 | " alpha: learning rate\n", 394 | " reg_lambda: regularization factor, the higher the smaller the weights, the simpler the model\n", 395 | " batch_size: number of data instances to sample from each iteration, to calculate gradient. \n", 396 | " The larger the more precise for weights, the slower it will take. The slower the size, the more bias in the training\n", 397 | " '''\n", 398 | " for i in xrange(num_iteration):\n", 399 | " data_index = range(self.num_examples) # indices of all data rows\n", 400 | " \n", 401 | " # in each iteration, randomly select n (batch_size) rows to do gradient descent\n", 402 | " # here it loops through it example in the batch, it is slower than doing batch-level matrix operation\n", 403 | " for j in xrange(batch_size): \n", 404 | " rand_index = int(np.random.uniform(0, len(data_index))) # randomly select a row index of data\n", 405 | " x = np.mat(self.data[rand_index])\n", 406 | " y = self.label[rand_index]\n", 407 | " \n", 408 | " # Forward propagation of single example\n", 409 | " z1 = x.dot(self.W1) + self.b1\n", 410 | " a1 = np.tanh(z1) # here I used tanh as the activation function\n", 411 | " z2 = a1.dot(self.W2) + self.b2\n", 412 | " # calculate output probabilities for all classes using softmax function\n", 413 | " exp_scores = np.exp(z2) # turn log probabilities of each class to unnormalized probabilities\n", 414 | " probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) # normalized predicted probabilities of all classes for each instance\n", 415 | " \n", 416 | " \n", 417 | " # Backpropagation of single example\n", 418 | " delta3 = probs \n", 419 | " if y:\n", 420 | " delta3[0, 0] -= 1\n", 421 | " else:\n", 422 | " delta3[0, 1] -= 1\n", 423 | " dW2 = (a1.T).dot(delta3)\n", 424 | " db2 = np.sum(delta3, axis=0, keepdims=True)\n", 425 | " va = delta3.dot(self.W2.T)\n", 426 | " vb = 1 - np.power(a1, 2)\n", 427 | " delta2 = np.mat(np.array(va) * np.array(vb))\n", 428 | " dW1 = x.T.dot(delta2)\n", 429 | " db1 = np.sum(delta2, axis=0)\n", 430 | "\n", 431 | " # Add regularization terms (b1 and b2 don't have regularization terms)\n", 432 | " dW2 += reg_lambda * self.W2\n", 433 | " dW1 += reg_lambda * self.W1\n", 434 | "\n", 435 | " # Gradient descent parameter update\n", 436 | " self.W1 += -alpha * dW1\n", 437 | " self.b1 += -alpha * db1\n", 438 | " self.W2 += -alpha * dW2\n", 439 | " self.b2 += -alpha * db2\n", 440 | "\n", 441 | " del(data_index[rand_index])\n", 442 | " \n", 443 | " # return predicted labels\n", 444 | " def predict(self, x):\n", 445 | " # Forward propagation\n", 446 | " z1 = x.dot(self.W1) + self.b1\n", 447 | " a1 = np.tanh(z1)\n", 448 | " z2 = a1.dot(self.W2) + self.b2\n", 449 | " exp_scores = np.exp(z2)\n", 450 | " probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)\n", 451 | " return np.argmax(probs, axis=1)\n", 452 | " \n", 453 | " # return predicted probabilities\n", 454 | " def predict_prob(self, x):\n", 455 | " # Forward propagation\n", 456 | " z1 = x.dot(self.W1) + self.b1\n", 457 | " a1 = np.tanh(z1)\n", 458 | " z2 = a1.dot(self.W2) + self.b2\n", 459 | " exp_scores = np.exp(z2)\n", 460 | " probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)\n", 461 | " return probs\n", 462 | " \n", 463 | " # print training accuracy\n", 464 | " def train_accuracy(self, x):\n", 465 | " # Forward propagation\n", 466 | " z1 = x.dot(self.W1) + self.b1\n", 467 | " a1 = np.tanh(z1)\n", 468 | " z2 = a1.dot(self.W2) + self.b2\n", 469 | " exp_scores = np.exp(z2)\n", 470 | " probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)\n", 471 | " predicted_class = np.argmax(probs, axis=1)\n", 472 | " print 'training accuracy: %.2f' % (np.mean(predicted_class == self.label))" 473 | ] 474 | }, 475 | { 476 | "cell_type": "markdown", 477 | "metadata": {}, 478 | "source": [ 479 | "### Train the neural network" 480 | ] 481 | }, 482 | { 483 | "cell_type": "code", 484 | "execution_count": 80, 485 | "metadata": { 486 | "collapsed": false 487 | }, 488 | "outputs": [ 489 | { 490 | "name": "stdout", 491 | "output_type": "stream", 492 | "text": [ 493 | "iteration 0: loss 0.623379\n", 494 | "time spent: 0.227497816086\n" 495 | ] 496 | }, 497 | { 498 | "data": { 499 | "image/png": "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\nDPt/ym0pRDsoLWsAAAAASUVORK5CYII=\n", 500 | "text/plain": [ 501 | "" 502 | ] 503 | }, 504 | "metadata": {}, 505 | "output_type": "display_data" 506 | } 507 | ], 508 | "source": [ 509 | "if __name__ == '__main__':\n", 510 | " start = time.time()\n", 511 | " nn = NN(data, label, num_hidden_nodes=3)\n", 512 | " nn.batch_gradient_descent(num_iteration = 50, alpha=0.01, reg_lambda=0.01, print_loss=True)\n", 513 | " #nn.stochastic_gradient_descent(num_iteration = 250, alpha=0.01, reg_lambda=0.01, batch_size=190)\n", 514 | " plot_decision_boundary(nn, data, label)\n", 515 | " print \"time spent: \",time.time()-start" 516 | ] 517 | }, 518 | { 519 | "cell_type": "markdown", 520 | "metadata": {}, 521 | "source": [ 522 | "### Make predictions" 523 | ] 524 | }, 525 | { 526 | "cell_type": "code", 527 | "execution_count": 486, 528 | "metadata": { 529 | "collapsed": false 530 | }, 531 | "outputs": [ 532 | { 533 | "name": "stdout", 534 | "output_type": "stream", 535 | "text": [ 536 | "category predictions for the first five rows: [0 1 1 0 1]\n", 537 | "probability predictions for the first five rows: \n", 538 | "[[ 9.99654115e-01 3.45885335e-04]\n", 539 | " [ 2.61898675e-04 9.99738101e-01]\n", 540 | " [ 3.03122841e-02 9.69687716e-01]\n", 541 | " [ 9.88577268e-01 1.14227317e-02]\n", 542 | " [ 9.34912113e-04 9.99065088e-01]]\n", 543 | "training accuracy: 0.97\n" 544 | ] 545 | } 546 | ], 547 | "source": [ 548 | "print 'category predictions for the first five rows: ',nn.predict(data[:5,])\n", 549 | "print 'probability predictions for the first five rows: \\n',nn.predict_prob(data[:5,])\n", 550 | "nn.train_accuracy(data)" 551 | ] 552 | } 553 | ], 554 | "metadata": { 555 | "kernelspec": { 556 | "display_name": "Python 2", 557 | "language": "python", 558 | "name": "python2" 559 | }, 560 | "language_info": { 561 | "codemirror_mode": { 562 | "name": "ipython", 563 | "version": 2 564 | }, 565 | "file_extension": ".py", 566 | "mimetype": "text/x-python", 567 | "name": "python", 568 | "nbconvert_exporter": "python", 569 | "pygments_lexer": "ipython2", 570 | "version": "2.7.5" 571 | } 572 | }, 573 | "nbformat": 4, 574 | "nbformat_minor": 0 575 | } 576 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Neural Network and Deep Learning 2 | This repository contains projects, practices for Neural Network and Deep Learning 3 | 4 | ## Project1: SGD Neural Network 5 | In this practice I built a vanilla neural network using Mini-batch Stochastic Gradient Descent. The network was designed with configurable settings such as network structure, number of training Epochs, mini-batch size and learning rate. Finally, the network was trained on XOR, Iris and MNIST datasets. 6 | 7 | ## Project2: Enhanced Neural Network 8 | This project is meant to enhance and expand on what was achieved from project 1. Building upon the vanilla neural network, I have added more features to allow me explore the performance of NN with more flexibility: 9 | * Early Stopping Criterion 10 | * Activation Funcitons 11 | * Sigmoid 12 | * Tanh 13 | * ReLU 14 | * Softmax 15 | * Cost Functions 16 | * Quadratic 17 | * Cross-Entropy 18 | * Negative Log Likelihood 19 | * L2 Regularization 20 | * Momentum Parameter Updates 21 | * Returning Cost and Accuracy for Plotting 22 | * Returning Learned Network 23 | -------------------------------------------------------------------------------- /SGD Neural Network/NN.m: -------------------------------------------------------------------------------- 1 | 2 | % Date: Oct 9, 2016 3 | % Author: Yuxuan Zhang 4 | 5 | function NN(train,label,nodeLayers,numEpochs,batchSize,eta) 6 | 7 | % placeholder for weights between different layers 8 | % the first elem is w between first and second layers, so there 9 | % will be length(nodeLayers)-1 columns 10 | weights = cell(1,length(nodeLayers)-1); 11 | 12 | % placeholder for biases between different layers 13 | biases = cell(1,length(nodeLayers)-1); 14 | 15 | % placeholder for weighted sum 16 | % the first elem is weighted sum between layer 1 and 2 17 | z = cell(1,length(nodeLayers)-1); 18 | 19 | % placeholder for activation nodes 20 | % the second elem are hidden nodes in second layer 21 | a = cell(1,length(nodeLayers)); 22 | 23 | % placeholder for gradient of loss w.r.t. activation function for all 24 | % layers except first layer 25 | % so if we have 4-layered network, it then contains 3 elements 26 | delta_layers = cell(1,length(nodeLayers)-1); 27 | 28 | % placeholder for gradient of loss w.r.t. weights/biases, for all connects between 29 | % layers 30 | delta_weights = cell(1,length(nodeLayers)-1); 31 | delta_biases = cell(1,length(nodeLayers)-1); 32 | 33 | % initialize weights and biases between layers 34 | for i=1:length(nodeLayers)-1 % for each layer starting from the second layer 35 | weights{i} = randn(nodeLayers(i+1),nodeLayers(i)); % sampling from normal distribution 36 | biases{i} = zeros(nodeLayers(i+1),batchSize); 37 | end 38 | 39 | % loop through epochs 40 | for epoch=1:numEpochs 41 | % shuffle data 42 | cat_data = cat(1,train,label); 43 | rand_order = randperm(size(cat_data,2)); 44 | cat_data = cat_data(:,rand_order); 45 | 46 | % divide data by batchSize and loop through each mini-batch 47 | for index = 1:batchSize:size(cat_data,2) 48 | minibatch = cat_data(:,index:index+batchSize-1); 49 | mini_train = minibatch(1:nodeLayers(1),:); 50 | mini_label = minibatch(nodeLayers(1)+1:end,:); 51 | 52 | % the first elem are input nodes 53 | a{1} = mini_train; 54 | 55 | % feed-forward 56 | for conn=1:length(nodeLayers)-1 % for each connections between layers 57 | z{conn} = weights{conn}*a{conn} + biases{conn}; % weighted sum 58 | a{conn+1} = logsig(z{conn}); % sigmoid transformation of z 59 | end 60 | 61 | % back-propagation 62 | 63 | % gradient of loss (delat) w.r.t. activation function in layers 64 | % except the first layer. 65 | % If we have 3-layered network, then we compute delta for layer2 and 66 | % output layer 67 | delta_layers{length(nodeLayers)} = (a{end}-mini_label) .* ((1-a{end}).* a{end}); % for output layer 68 | for layer=length(nodeLayers)-1:-1:2 % going backwards 69 | delta_layers{layer} = (weights{layer}' * delta_layers{layer+1}) .* (1-a{layer}.*a{layer}); 70 | end 71 | 72 | % compute gradient of loss w.r.t. parameters 73 | for layer=length(nodeLayers)-1:-1:1 74 | delta_weights{layer} = delta_layers{layer+1} * a{layer}'; 75 | temp_b = sum(delta_layers{layer+1},2); 76 | delta_biases{layer} = repmat(temp_b,1,batchSize); 77 | end 78 | 79 | % update weights and biases 80 | for layer=length(nodeLayers)-1:-1:1 81 | weights{layer} = weights{layer} - (eta/size(mini_train,2)) .* delta_weights{layer}; 82 | biases{layer} = biases{layer} - (eta/size(mini_train,2)) .* delta_biases{layer}; 83 | end 84 | end 85 | 86 | % get prediction MSE/Accuracy for all training data in this epoch using updated parameters 87 | a{1} = train; 88 | 89 | % set biases based on number of columns in training set 90 | epoch_biases = {}; 91 | for elem=1:length(biases) 92 | epoch_biases{elem} = repmat(biases{elem}(:,1),1,size(train,2)); 93 | end 94 | 95 | % feed-forward 96 | for conn=1:length(nodeLayers)-1 % for each connections between layers 97 | z{conn} = weights{conn}*a{conn} + epoch_biases{conn}; % weighted sum 98 | a{conn+1} = logsig(z{conn}); % sigmoid transformation of z 99 | end 100 | epoch_mse = immse(a{end},label); 101 | 102 | % percentage correct and accuracy for this mini-batch 103 | [~,pred_indices] = max(a{end}); % indice for predicted class for each example 104 | [~,true_indices] = max(label); % indice for true class for each example 105 | perf = pred_indices == true_indices; % performance, 1 if correct, 0 if not 106 | epoch_num_correct = sum(perf); % number of correct predictions 107 | epoch_accu = epoch_num_correct/size(train,2); 108 | % report learning status for each epoch 109 | if mod(epoch,1) == 0 110 | fprintf('Epoch: %d, MSE: %d, Correct: %d/%d, Acc: %d\n',epoch,epoch_mse,epoch_num_correct,size(train,2),epoch_accu); 111 | end 112 | 113 | % terminate when accuracy is higher than 99% 114 | if epoch_accu > 0.99 115 | break; 116 | end 117 | end 118 | end 119 | 120 | -------------------------------------------------------------------------------- /SGD Neural Network/iris.csv: -------------------------------------------------------------------------------- 1 | 5.1,3.5,1.4,0.2,1,0,0 2 | 4.9,3.0,1.4,0.2,1,0,0 3 | 4.7,3.2,1.3,0.2,1,0,0 4 | 4.6,3.1,1.5,0.2,1,0,0 5 | 5.0,3.6,1.4,0.2,1,0,0 6 | 5.4,3.9,1.7,0.4,1,0,0 7 | 4.6,3.4,1.4,0.3,1,0,0 8 | 5.0,3.4,1.5,0.2,1,0,0 9 | 4.4,2.9,1.4,0.2,1,0,0 10 | 4.9,3.1,1.5,0.1,1,0,0 11 | 5.4,3.7,1.5,0.2,1,0,0 12 | 4.8,3.4,1.6,0.2,1,0,0 13 | 4.8,3.0,1.4,0.1,1,0,0 14 | 4.3,3.0,1.1,0.1,1,0,0 15 | 5.8,4.0,1.2,0.2,1,0,0 16 | 5.7,4.4,1.5,0.4,1,0,0 17 | 5.4,3.9,1.3,0.4,1,0,0 18 | 5.1,3.5,1.4,0.3,1,0,0 19 | 5.7,3.8,1.7,0.3,1,0,0 20 | 5.1,3.8,1.5,0.3,1,0,0 21 | 5.4,3.4,1.7,0.2,1,0,0 22 | 5.1,3.7,1.5,0.4,1,0,0 23 | 4.6,3.6,1.0,0.2,1,0,0 24 | 5.1,3.3,1.7,0.5,1,0,0 25 | 4.8,3.4,1.9,0.2,1,0,0 26 | 5.0,3.0,1.6,0.2,1,0,0 27 | 5.0,3.4,1.6,0.4,1,0,0 28 | 5.2,3.5,1.5,0.2,1,0,0 29 | 5.2,3.4,1.4,0.2,1,0,0 30 | 4.7,3.2,1.6,0.2,1,0,0 31 | 4.8,3.1,1.6,0.2,1,0,0 32 | 5.4,3.4,1.5,0.4,1,0,0 33 | 5.2,4.1,1.5,0.1,1,0,0 34 | 5.5,4.2,1.4,0.2,1,0,0 35 | 4.9,3.1,1.5,0.1,1,0,0 36 | 5.0,3.2,1.2,0.2,1,0,0 37 | 5.5,3.5,1.3,0.2,1,0,0 38 | 4.9,3.1,1.5,0.1,1,0,0 39 | 4.4,3.0,1.3,0.2,1,0,0 40 | 5.1,3.4,1.5,0.2,1,0,0 41 | 5.0,3.5,1.3,0.3,1,0,0 42 | 4.5,2.3,1.3,0.3,1,0,0 43 | 4.4,3.2,1.3,0.2,1,0,0 44 | 5.0,3.5,1.6,0.6,1,0,0 45 | 5.1,3.8,1.9,0.4,1,0,0 46 | 4.8,3.0,1.4,0.3,1,0,0 47 | 5.1,3.8,1.6,0.2,1,0,0 48 | 4.6,3.2,1.4,0.2,1,0,0 49 | 5.3,3.7,1.5,0.2,1,0,0 50 | 5.0,3.3,1.4,0.2,1,0,0 51 | 7.0,3.2,4.7,1.4,0,1,0 52 | 6.4,3.2,4.5,1.5,0,1,0 53 | 6.9,3.1,4.9,1.5,0,1,0 54 | 5.5,2.3,4.0,1.3,0,1,0 55 | 6.5,2.8,4.6,1.5,0,1,0 56 | 5.7,2.8,4.5,1.3,0,1,0 57 | 6.3,3.3,4.7,1.6,0,1,0 58 | 4.9,2.4,3.3,1.0,0,1,0 59 | 6.6,2.9,4.6,1.3,0,1,0 60 | 5.2,2.7,3.9,1.4,0,1,0 61 | 5.0,2.0,3.5,1.0,0,1,0 62 | 5.9,3.0,4.2,1.5,0,1,0 63 | 6.0,2.2,4.0,1.0,0,1,0 64 | 6.1,2.9,4.7,1.4,0,1,0 65 | 5.6,2.9,3.6,1.3,0,1,0 66 | 6.7,3.1,4.4,1.4,0,1,0 67 | 5.6,3.0,4.5,1.5,0,1,0 68 | 5.8,2.7,4.1,1.0,0,1,0 69 | 6.2,2.2,4.5,1.5,0,1,0 70 | 5.6,2.5,3.9,1.1,0,1,0 71 | 5.9,3.2,4.8,1.8,0,1,0 72 | 6.1,2.8,4.0,1.3,0,1,0 73 | 6.3,2.5,4.9,1.5,0,1,0 74 | 6.1,2.8,4.7,1.2,0,1,0 75 | 6.4,2.9,4.3,1.3,0,1,0 76 | 6.6,3.0,4.4,1.4,0,1,0 77 | 6.8,2.8,4.8,1.4,0,1,0 78 | 6.7,3.0,5.0,1.7,0,1,0 79 | 6.0,2.9,4.5,1.5,0,1,0 80 | 5.7,2.6,3.5,1.0,0,1,0 81 | 5.5,2.4,3.8,1.1,0,1,0 82 | 5.5,2.4,3.7,1.0,0,1,0 83 | 5.8,2.7,3.9,1.2,0,1,0 84 | 6.0,2.7,5.1,1.6,0,1,0 85 | 5.4,3.0,4.5,1.5,0,1,0 86 | 6.0,3.4,4.5,1.6,0,1,0 87 | 6.7,3.1,4.7,1.5,0,1,0 88 | 6.3,2.3,4.4,1.3,0,1,0 89 | 5.6,3.0,4.1,1.3,0,1,0 90 | 5.5,2.5,4.0,1.3,0,1,0 91 | 5.5,2.6,4.4,1.2,0,1,0 92 | 6.1,3.0,4.6,1.4,0,1,0 93 | 5.8,2.6,4.0,1.2,0,1,0 94 | 5.0,2.3,3.3,1.0,0,1,0 95 | 5.6,2.7,4.2,1.3,0,1,0 96 | 5.7,3.0,4.2,1.2,0,1,0 97 | 5.7,2.9,4.2,1.3,0,1,0 98 | 6.2,2.9,4.3,1.3,0,1,0 99 | 5.1,2.5,3.0,1.1,0,1,0 100 | 5.7,2.8,4.1,1.3,0,1,0 101 | 6.3,3.3,6.0,2.5,0,0,1 102 | 5.8,2.7,5.1,1.9,0,0,1 103 | 7.1,3.0,5.9,2.1,0,0,1 104 | 6.3,2.9,5.6,1.8,0,0,1 105 | 6.5,3.0,5.8,2.2,0,0,1 106 | 7.6,3.0,6.6,2.1,0,0,1 107 | 4.9,2.5,4.5,1.7,0,0,1 108 | 7.3,2.9,6.3,1.8,0,0,1 109 | 6.7,2.5,5.8,1.8,0,0,1 110 | 7.2,3.6,6.1,2.5,0,0,1 111 | 6.5,3.2,5.1,2.0,0,0,1 112 | 6.4,2.7,5.3,1.9,0,0,1 113 | 6.8,3.0,5.5,2.1,0,0,1 114 | 5.7,2.5,5.0,2.0,0,0,1 115 | 5.8,2.8,5.1,2.4,0,0,1 116 | 6.4,3.2,5.3,2.3,0,0,1 117 | 6.5,3.0,5.5,1.8,0,0,1 118 | 7.7,3.8,6.7,2.2,0,0,1 119 | 7.7,2.6,6.9,2.3,0,0,1 120 | 6.0,2.2,5.0,1.5,0,0,1 121 | 6.9,3.2,5.7,2.3,0,0,1 122 | 5.6,2.8,4.9,2.0,0,0,1 123 | 7.7,2.8,6.7,2.0,0,0,1 124 | 6.3,2.7,4.9,1.8,0,0,1 125 | 6.7,3.3,5.7,2.1,0,0,1 126 | 7.2,3.2,6.0,1.8,0,0,1 127 | 6.2,2.8,4.8,1.8,0,0,1 128 | 6.1,3.0,4.9,1.8,0,0,1 129 | 6.4,2.8,5.6,2.1,0,0,1 130 | 7.2,3.0,5.8,1.6,0,0,1 131 | 7.4,2.8,6.1,1.9,0,0,1 132 | 7.9,3.8,6.4,2.0,0,0,1 133 | 6.4,2.8,5.6,2.2,0,0,1 134 | 6.3,2.8,5.1,1.5,0,0,1 135 | 6.1,2.6,5.6,1.4,0,0,1 136 | 7.7,3.0,6.1,2.3,0,0,1 137 | 6.3,3.4,5.6,2.4,0,0,1 138 | 6.4,3.1,5.5,1.8,0,0,1 139 | 6.0,3.0,4.8,1.8,0,0,1 140 | 6.9,3.1,5.4,2.1,0,0,1 141 | 6.7,3.1,5.6,2.4,0,0,1 142 | 6.9,3.1,5.1,2.3,0,0,1 143 | 5.8,2.7,5.1,1.9,0,0,1 144 | 6.8,3.2,5.9,2.3,0,0,1 145 | 6.7,3.3,5.7,2.5,0,0,1 146 | 6.7,3.0,5.2,2.3,0,0,1 147 | 6.3,2.5,5.0,1.9,0,0,1 148 | 6.5,3.0,5.2,2.0,0,0,1 149 | 6.2,3.4,5.4,2.3,0,0,1 150 | 5.9,3.0,5.1,1.8,0,0,1 151 | 152 | -------------------------------------------------------------------------------- /SGD Neural Network/mnistTrn.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timzhang642/neural_network_deep_learning/3c74dee406378b04236a4dd5532763776e9f72c9/SGD Neural Network/mnistTrn.mat -------------------------------------------------------------------------------- /SGD Neural Network/project1.m: -------------------------------------------------------------------------------- 1 | % Date: Oct 9, 2016 2 | % Author: Yuxuan Zhang 3 | 4 | % for xor.csv 5 | data = csvread('xor.csv'); 6 | train = data(:,1:size(data,2)-1)'; 7 | label = data(:,end)'; % assume the last column is label 8 | label = cat(1,1-label,label); % one-hot coding for label 9 | 10 | 11 | % for iris.csv 12 | %{ 13 | data = csvread('iris.csv'); 14 | train = data(:,1:size(data,2)-3)'; 15 | label = data(:,end-2:end)'; 16 | %} 17 | 18 | % for ministTrn 19 | %{ 20 | load('mnistTrn.mat'); 21 | train = trn; 22 | label = trnAns; 23 | %} 24 | 25 | % number of nodes in input/output layers 26 | input_size = size(train,1); 27 | output_size = size(label,1); 28 | 29 | nodeLayers = [input_size,30,output_size]; 30 | numEpochs = 30; 31 | batchSize = 10; 32 | eta = 3; 33 | 34 | NN(train, label,nodeLayers,numEpochs,batchSize,eta) 35 | 36 | 37 | -------------------------------------------------------------------------------- /SGD Neural Network/xor.csv: -------------------------------------------------------------------------------- 1 | 0.0,0.0,0 2 | 0.0,1.0,1 3 | 1.0,0.0,1 4 | 1.0,1.0,0 5 | --------------------------------------------------------------------------------