In [1]:
import numpy as np
#线性可分数据
#AND data
AND_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
AND_outputs = [0, 0, 0, 1]
#OR data
OR_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
OR_outputs = [0, 1, 1, 1]
#NOT data
NOT_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
NOT_outputs = [1, 0, 1, 0]
#NOT2 data
NOT2_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
NOT2_outputs = [0, 1, 0, 1]
#线性不可分数据
#XOR data
XOR_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
XOR_outputs = [0, 1, 1, 0]
#NOT XOR data
XOR2_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
XOR2_outputs = [1, 0, 0,1]
In [2]:
class NeuralNetwork:
def __init__(self):
#np.random.seed(1)
self.w1=np.random.random(1)
self.w2=np.random.random(1)
self.b=np.random.random(1)
def predict(self,inputs):
linear_combination = self.w1 * inputs[0] + self.w2 * inputs[1] + self.b
return int(linear_combination >= 0)
def train(self,train_set_input,train_set_outputs,train_num=10000,train_lr=0.1):
for i in range(train_num):
num = i%4
output = self.predict(train_set_input[num])
error = output - train_set_outputs[num]
self.w1 -= train_lr * (train_set_input[num][0]) * error
self.w2 -= train_lr * (train_set_input[num][1]) * error
self.b -= train_lr * error
def test(self,train_set_input,train_set_outputs):
right = 0
for i in range(len(train_set_input)):
#print('in1:{},in2:{},{}=={}'.format(train_set_input[i][0],train_set_input[i][1],self.predict(train_set_input[i]),train_set_outputs[i]))
if(self.predict(train_set_input[i])==train_set_outputs[i]):
right += 1
return right/float(len(train_set_input))*100
def print_w_b(self):
print('w1:{},w2:{},b:{}'.format(self.w1,self.w2,self.b))
In [3]:
NN = NeuralNetwork()
print('before train')
NN.print_w_b()
print(NN.test(XOR_inputs,XOR_outputs))
NN.train(NOT_inputs,NOT_outputs)
print('after train')
NN.print_w_b()
print(NN.test(XOR_inputs,XOR_outputs))
In [4]:
AND_NN = NeuralNetwork()
AND_NN.train(AND_inputs,AND_outputs)
print(AND_NN.test(AND_inputs,AND_outputs))
OR_NN = NeuralNetwork()
OR_NN.train(OR_inputs,OR_outputs)
print(OR_NN.test(OR_inputs,OR_outputs))
NOT_NN = NeuralNetwork()
NOT_NN.train(NOT_inputs,NOT_outputs)
print(NOT_NN.test(NOT_inputs,NOT_outputs))
NOT2_NN = NeuralNetwork()
NOT2_NN.train(NOT2_inputs,NOT2_outputs)
print(NOT2_NN.test(NOT2_inputs,NOT2_outputs))
print('不可线性分割所以训练不到100')
XOR_NN = NeuralNetwork()
XOR_NN.train(XOR_inputs,XOR_outputs)
print(XOR_NN.test(XOR_inputs,XOR_outputs))
XOR2_NN = NeuralNetwork()
XOR2_NN.train(XOR2_inputs,XOR2_outputs)
print(XOR2_NN.test(XOR2_inputs,XOR2_outputs))