最近突然想要整理一下学习的内容。如有错误,欢迎指教。——4.19.2019
简介
感知器神经网络的重要组成部分。它相当于神经网络中的神经元,一个感知器可以从多种输入得到对应的输出。
输入为向量,代表样本的特征,输出为一个值,代表样本的预测结果。
数学表示
h
(
x
)
:
y
=
W
x
+
b
h(x):y=Wx+b
h(x):y=Wx+b
其中,
y
y
y为样本经过感知器判断后的预测值;
W
=
[
w
1
,
w
2
,
.
.
.
,
w
n
]
W=\left[w_1,w_2,...,w_n\right]
W=[w1,w2,...,wn]为参数,是一组向量;
x
=
[
x
1
x
2
.
.
.
x
n
]
x=\left[\begin{matrix}x_1\\x_2\\...\\x_n\\\end{matrix}\right]
x=⎣⎢⎢⎡x1x2...xn⎦⎥⎥⎤是一个样本的特征维;
b
b
b是偏置参数;
参数学习
现假设有样本集 X X X,其中每个样本对应有标签 y y y,经过感知器分类后的结果为 y _ h a t y\_hat y_hat,则:
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