感知器
import numpy as np
class Perceptron(object):
def __init__(self,input_num,activate):
self.activate = activate
self.weights = np.random.rand(input_num)
self.bias = np.random.random()
def predict(self,input_vecs):
return self.activate(np.dot(input_vecs,self.weights)+self.bias)
def _updata_weight(self,input_vec,output,label,rate):
delta = label - output
self.weights += np.dot(input_vec,rate * delta)
self.bias += rate * delta
def _one_iteration(self,input_vecs,labels,rate):
"""
一次迭代,把所有的训练数据过一遍
"""
samples = zip(input_vecs,labels)
for (input_vec,label) in samples:
output = self.predict(input_vec)
self._updata_weight(input_vec,output,label,rate)
def train(self,input_vecs,labels,iteration,rate):
for i in range(iteration):
self._one_iteration(input_vecs,labels,rate)
def __str__(self):
"""
打印学习到的权重、偏置项
"""
return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)
def sign(x):
return 1 if x > 0 else 0
def get_training_dataset():
input_vecs = [[1, 1], [0, 0], [1, 0], [0, 1]]
labels = [1, 0, 0, 0]
return input_vecs, labels
def train_and_perceptron():
p = Perceptron(2, sign)
input_vecs, labels = get_training_dataset()
p.train(input_vecs, labels, 10, 0.1)
return p
if __name__ == '__main__':
and_perception = train_and_perceptron()
print(and_perception)
print('1 and 1 = %d' % and_perception.predict([1, 1]))
print('0 and 0 = %d' % and_perception.predict([0, 0]))
print('1 and 0 = %d' % and_perception.predict([1, 0]))
print('0 and 1 = %d' % and_perception.predict([0, 1]))