# -*- coding: utf-8 -*-
"""
Created on Thu Apr 12 18:01:30 2018
@author: SS
"""
'''
and 感知器的实现
用到的函数 包括:
初始化: __init__
打印:__str__
预测:predict (输入向量 生成结果)
训练:train
每一次的训练:_one_iteration
更新权重:_update_weight
'''
import numpy as np
class And_Perceptron(object):
def __init__(self,input_num,activator):
self.input_num=input_num
self.weight=np.zeros(self.input_num)
self.activator=activator
self.bias=0
def __str__(self):
return 'weights\t:%s\nbias\t:%f\n' % (self.weight, self.bias)
def predict(self,input_vec):
input_vec_np=np.array(input_vec)
# 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...] =[x1*w1,x2*w2...]
vec_weight=np.multiply(input_vec_np,self.weight)
sum_vec_weight=np.sum(vec_weight) #sum=x1*w1+x2*w2+...
output=self.activator(sum_vec_weight+self.bias)
return output
def _update_weight(self,input_vec,label,output,rate):
#更新权重
input_vec_np=np.array(input_vec)
delta=label-output
self.weight+=delta*rate*input_vec_np
self.bias+=rate*delta
def _one_iteration(self,input_vecs,labels,rate):
samples=zip(input_vecs,labels)
#[[0,0],[0,1],[1,0],[1,1]] [0,0,0,1]
for (input_vec,label) in samples:
output=self.predict(input_vec)
self._update_weight(input_vec,label,output,rate)
def train(self,input_vecs,labels,iterations,rate):
for i in range(iterations):
self._one_iteration(input_vecs,labels,rate)
def f(x):
if x>0:
return 1
else:
return 0
def get_train_dataset():
input_vecs=[[1,1],[0,0],[0,1],[1,0]]
labels=[1,0,0,0]
return input_vecs,labels
def train_and_perceptron():
p=And_Perceptron(2,f)
input_vecs, labels = get_train_dataset()
p.train(input_vecs, labels, 10, 0.1)
#返回训练好的感知器
return p
if __name__ == '__main__':
# 训练and感知器
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])
深度学习1--感知器
最新推荐文章于 2024-07-27 15:04:07 发布