## Implementation of Perceptron in Python

```
# -*- coding: utf-8 -*-
# @Author: Sijan
# @Date: 2018-04-03 12:46:52
# @Last Modified time: 2018-04-09 15:21:41
from random import randint
def step_function(result):
"""
Simple linear function which will be activated if the value is greater than 0.
"""
if result > 0:
return 1
return 0
class Perceptron:
"""
Perceptron class defines a neuron with attributes : weights, bias and learning rate.
"""
def __init__(self, input_size):
self.learning_rate = 0.5
self.bias = randint(0, 1)
self.weights = [randint(0, 1) for _ in range(input_size)]
def feedforward(perceptron, node_input):
"""
Implements product between input and weights
"""
node_sum = 0
node_sum += perceptron.bias
for index, item in enumerate(node_input):
# print('input node is', item)
node_sum += item * perceptron.weights[index]
return step_function(node_sum)
def adjust_weight(perceptron, node_input, error):
"""
Adjust weightage based on error. It simply scales input values towards right direction.
"""
for index, item in enumerate(node_input):
perceptron.weights[index] += item * error * perceptron.learning_rate
perceptron.bias += error * perceptron.learning_rate
def train(perceptron, inputs, outputs):
"""
Trains perceptron for given inputs.
"""
for training_input, training_output in zip(inputs, outputs):
actual_output = feedforward(perceptron, training_input)
desired_output = training_output
error = desired_output - actual_output
adjust_weight(perceptron, training_input, error)
print('weight after adjustment', perceptron.weights)
print('bias after adjustment', perceptron.bias)
def predict(perceptron, test_input, test_output):
"""
Predicts new inputs.
"""
prediction = feedforward(perceptron, test_input)
# if test_input[1] == test_output:
print('input :%s gives output :%s' % (test_input, prediction))
print('input :%s has true output :%s' % (test_input, test_output))
if __name__ == '__main__':
train_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
train_outputs = [0, 0, 0, 1]
# train perceptron
perceptron = Perceptron(2)
epochs = 10
for _ in range(epochs):
train(perceptron, train_inputs, train_outputs)
# test perceptron
test_input = (1,1)
test_output = 1
predict(perceptron, test_input, test_output)
```