一文搞懂单层感知机

1 结构

如下图所示,其实质就是一种映射关系。
在这里插入图片描述

2 学习规则

实质是更新权值,具体过程见如下公式。

  • y=f(i=1nxiwi)y=f\left(\sum_{i=1}^{n} x_{i} \cdot w_{i}\right)
    其中,i=0,1,2,…; y是网络输出;f是sign函数

  • Δwi=η(ty)xi\Delta w_{i}=\eta(t-y) x_{i}
    其中,η\eta 是学习率;t是正确标签,取值也是{1,-1}

  • wi=wi+Δwiw_{i}=w_{i}+\Delta w_{i}

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()

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章