感知器
最近突然想要整理一下学习的内容。如有错误,欢迎指教。——4.19.2019
简介
感知器神经网络的重要组成部分。它相当于神经网络中的神经元,一个感知器可以从多种输入得到对应的输出。
输入为向量,代表样本的特征,输出为一个值,代表样本的预测结果。
数学表示
其中,
为样本经过感知器判断后的预测值;
为参数,是一组向量;
是一个样本的特征维;
是偏置参数;
参数学习
现假设有样本集,其中每个样本对应有标签,经过感知器分类后的结果为,则:
w <- w + w*(y_hat-y)*learn_rate
b <- b + (y_hat-y)*learn_rate
其中learn_rate
是学习速率
代码实现
import numpy as np
np.random.seed(20)
#sigmod函数的实现,用于01分类
def stepFunction(t):
if t >= 0:
return 1
return 0
#现有感知器预测样本
def prediction(X, W, b):
return stepFunction((np.matmul(X,W)+b)[0])
#参数学习
def perceptronStep(X, y, W, b, learn_rate = 0.01):
for i in range(len(X)):
y_hat=prediction(X[i],W,b)
W[0]+=X[i][0]*learn_rate*(y[i]-y_hat)
W[1]+=X[i][1]*learn_rate*(y[i]-y_hat)
b+=learn_rate*(y[i]-y_hat)
return W, b
#训练参数
def trainPerceptronAlgorithm(X, y, learn_rate = 0.01, num_epochs = 70):
W = np.array(np.random.rand(2,1))
b = np.random.rand(1)[0]
# boundary_lines = []
for i in range(num_epochs):
W, b = perceptronStep(X, y, W, b, learn_rate)
# boundary_lines.append((-W[0]/W[1], -b/W[1])) #可用于画图
return boundary_lines