概述
文章目录
- 1 结构
- 2 学习规则
- 3 学习率
- 4 收敛条件
- 5 案例
1 结构
如下图所示,其实质就是一种映射关系。
2 学习规则
实质是更新权值,具体过程见如下公式。
-
y = f ( ∑ i = 1 n x i ⋅ w i ) y=fleft(sum_{i=1}^{n} x_{i} cdot w_{i}right) y=f(∑i=1nxi⋅wi)
其中,i=0,1,2,…; y是网络输出;f是sign函数 -
Δ w i = η ( t − y ) x i Delta w_{i}=eta(t-y) x_{i} Δwi=η(t−y)xi
其中, η eta η 是学习率;t是正确标签,取值也是{1,-1} -
w i = w i + Δ w i w_{i}=w_{i}+Delta w_{i} wi=wi+Δwi
3 学习率
如上节所示,学习率对权值更新速度影响极大。取值在0~1。
学习率太大,容易造成权值调整不稳定;
学习率太小,权值调整太慢,迭代次数太多。
4 收敛条件
一般有以下几种情形:
- 误差小于某个预先设定的较小的值
- 两次迭代之间的权值变化已经很小
- 设定最大迭代次数,当迭代超过最大次数就停止
5 案例
假设我们有4个2维的数据,数据的特征分别(3,3),(4,3),(1,1),(2,1)。(3,3),(4,3)这两个数据的标签为1,(1,1),(2,1)这两个数据的标签为-1,构建神经网络来进行分类。
import numpy as np
import matplotlib.pyplot as plt
# 定义输入数据:2维数据为2个输入节点,加一个偏置值,此处设为1
X = np.array([[1,3,3],
[1,4,3],
[1,1,1],
[1,2,1]])
# 定义标签
T = np.array([[1],
[1],
[-1],
[-1]])
# 权值初始化(3行:输入个数,1列:输出个数),0~1的随机数
W = np.random.random([3,1])
# 学习率设置
lr = 0.1
# 神经网络输出
Y = 0
# 更新权值函数
def train():
global X,Y,W,lr,T
# 同时计算4个数据的预测值,Y(4,1)
Y = np.sign(np.dot(X,W))
# T-Y得到4个标签值与预测值的误差E(4,1)
E = T - Y
# 计算权值的变化(求均值)
delta_W = lr * (X.T.dot(E)) / X.shape[0]
# 更新权值
W = W + delta_W
# 训练模型
for i in range(100):
# 更新权值
train()
# 打印当前训练次数
print('epoch:',i+1)
# 当前的权值
print('weights:',W)
# 计算当前输出
Y = np.sign(np.dot(X,W))
# all()表示Y中的所有值跟T中的所有值都对应相等,才为真
if (Y == T).all():
print('Finished')
# 跳出循环
break
# 可视化
# 正样本的xy坐标
x1 = [3,4]
y1 = [3,3]
# 负样本xy坐标
x2 = [1,2]
y2 = [1,1]
# 定义分类边界线的斜率和截距(边界线是W0+W1X1+W2X2=0)
k = -W[1]/W[2]
d = -W[0]/W[2]
# 设定两个点
xdata = (0,5)
# 通过两点来确定一条直线,用红色的线来画出分界线
plt.plot(xdata,xdata*k+d,'r')
# 用蓝色的点画正样本
plt.scatter(x1,y1,c='b')
# 用黄色的点画负样本
plt.scatter(x2,y2,c='y')
plt.show()
最后
以上就是激情冥王星为你收集整理的一文搞懂单层感知机的全部内容,希望文章能够帮你解决一文搞懂单层感知机所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复