深度学习4. 单层感知机概念及Python实现

Posted 编程圈子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习4. 单层感知机概念及Python实现相关的知识,希望对你有一定的参考价值。

深度学习4. 单层感知机概念及Python实现

一、概念

感知机(Perceptron)是神经网络中的一个概念,在1958年由Frank Rosenblatt第一次引入。
单层感知机可以用来区分线性可分的数据,并且一定可以在有限的迭代次数中收敛。

感知机作为一种基本的神经网络模型,它模拟了人脑神经元的工作原理。感知机接受多个输入信号,将它们加权求和并加上偏置值,然后通过一个激活函数将结果转化为输出信号。

感知机可以用于分类问题,将输入信号分为不同的类别。

感知机是神经网络的基本组成单元,通过多个感知机的组合可以构建更加复杂的神经网络模型,如多层感知机(MLP)和卷积神经网络(CNN)等。

感知机是用数学方式模拟人体神经网络结构。

人体神经网络

单层感知机 模拟人体神经网络:
单层感知机(Single Layer Perceptron)是最简单的神经网络。它包含输入层和输出层,而输入层和输出层是直接相连的。

上图中 x1, x2, ……, xn是输入层,将x1与权重w1相乘, x2与权重w2相乘, x3与权重w3相乘……,加上偏置,把结果相加,再经过一个激活函数,输出结果。

二、数学表达

1. 数学公式

感知机的基本原理可以用以下公式表示:

y = f ( w 1 x 1 + w 2 x 2 + . . . + w n ∗ x n + b ) y = f(w1x1 + w2x2 + ... + wn*xn + b) y=f(w1x1+w2x2+...+wnxn+b)

其中,x1, x2, …, xn是输入信号,w1, w2, …, wn是对应的权重,b是偏置值,f是激活函数,y是输出信号。

感知机的学习过程可以通过不断调整权重和偏置值来完成。一般采用梯度下降算法,通过最小化损失函数来优化权重和偏置值。常用的损失函数包括均方误差和交叉熵等。

2. 单层感知机示例

把偏置当做特殊可能权值:

这时把x0固定为1,取消权值,以减化运算。

三、单层感知机Python实现关键知识点

1. 生成样本特征矩阵

X = np.random.randn(100, 2)

生成一个100行2列的随机数矩阵,其中每个元素都是从标准正态分布(均值为0,方差为1)中随机采样得到的。也可以理解为在二维空间中随机生成100个点,这些点的横坐标和纵坐标都是从标准正态分布中随机生成的。这是用于训练单层感知机的样本特征矩阵,每行代表一个样本的特征,每列代表一种特征。

2. 生成标签y

y = np.array([1 if x1 + x2 >= 0 else -1 for x1, x2 in X])

根据输入数据 X 生成对应的标签 y。其中 x1 和 x2 分别表示样本的两个特征,这里的目的是为了生成一个二分类任务的标签,使得单层感知机可以通过学习来对样本进行分类。

最终得到的 y 是一个包含100个元素的一维数组,其中每个元素是1或-1,表示对应样本的标签。

3. 训练迭代

将要定义一个训练函数 perceptron,使用变量n_iter表示迭代次数。每迭代一次,感知机会用当前的权重对样本进行预测,并计算预测值与真实标签之间的误差。然后根据误差值来调整权重,以期望能够使预测结果更加接近真实标签。
n_iter 值越大,训练时间越长,可能会使得感知机的性能提高,但也会增加过拟合的风险。在实际应用中,我们需要根据具体情况来调整 n_iter 的值。

def perceptron(X, y, lr=0.1, n_iter=100):

4. 学习率

学习率控制了每次参数更新的步长,即每次参数更新时改变的大小。
在单层感知机中,学习率决定了每次更新权重和偏置的步长。

  • 如果学习率过大,每次更新的步长就会很大,可能会导致权重和偏置跳过了最优解,导致模型无法收敛。
  • 如果学习率过小,每次更新的步长就会很小,可能会导致模型收敛速度过慢,需要更多的迭代次数才能收敛到最优解。

在单层感知机中,选择合适的学习率是非常重要的。通常可以使用网格搜索或随机搜索等方法来搜索最优的学习率。另外,还可以使用自适应学习率的方法,如 Adagrad、Adadelta、Adam 等,自动调整学习率大小,以提高模型的训练效果。

5. 计算预测值

这里会使用 np.dot(weights, X[i]) 将权重 weights 和第 i 个样本 X[i] 做向量内积,即将权重矩阵和样本特征向量相乘。
weights 是一个包含两个元素的一维数组,每个元素对应着一个特征的权重,X[i] 是一个包含两个元素的一维数组,每个元素对应着样本的一个特征。内积操作相当于将两个向量的对应元素相乘,再将乘积相加得到一个标量值。

然后加上偏置值 bias,即得到 y_pred,表示感知机对第 i 个样本的预测结果。这里的 bias 是一个标量值,它用来调整感知机的阈值,即当 y_pred 大于等于0时,预测结果为1,否则为-1。

6. 更新权重

权重的更新公式: weights = weights + learning_rate * y[i] * X[i]
其中 :

  • weights 表示当前的权重值,

  • learning_rate 表示学习率,即每次更新的步长,

  • y[i] 表示第 i 个样本的真实标签,

  • X[i] 表示第 i 个样本的特征向量。

  • 当预测值和真实标签一致时,误差为0,权重值也就不需要进行更新。

  • 当预测值和真实标签不一致时,误差项的符号与 y[i] 相同,误差越大,更新的幅度就越大,这样就能使感知机的预测结果更加接近真实标签。

7. 更新偏置

bias 是单层感知机的一个重要参数,它对应着感知机的阈值。偏置值的调整方式是使用随机梯度下降法,根据误差进行权重和偏置的更新。

偏置的更新公式是: bias = bias + learning_rate * y[i]

  • learning_rate : 表示学习率,即每次更新的步长
  • y[i] : 表示第 i 个样本的真实标签

更新公式中的 y[i] 对应的是误差项的符号,其作用是根据误差的方向来调整偏置值。
当预测值和真实标签一致时,误差为0,偏置值也就不需要进行更新。

权重的更新公式和偏置的更新公式非常类似。

这里更新权重和偏置使用的公式,也有地方会表达为:

# error 是误差
error = y - y_pred
weights = weights + learning_rate * error * X
bias = bias + learning_rate * error

和前面的公式本质是一样的,都是通过调整权重来使模型的预测更准确。

8. 绘制决策边界

决策边界就是把训练结果用函数表达出来 。
根据感知机的分类公式:

w1 * x1 + w2 * x2 + b = 0
# 得到:
x2 = (-w1 * x1 - b) / w2

这里计算的x2指的纵坐标,这样针对x1每个点计算决策值,通过plt.plot绘制结果。

# x1是从-3到3,步长为0.1
x1 = np.arange(-3, 3, 0.1)
x2 = (-weights[0] * x1 - bias) / weights[1]
plt.plot(x1, x2, 'r', label='Decision Boundary')

四、Python完整实现

import numpy as np
import matplotlib.pyplot as plt

def perceptron(X, y, lr=0.1, n_iter=100):
    # 获取样本数量和特征数量
    n_samples, n_features = X.shape

    # 初始化权重和偏置为0
    weights = np.zeros(n_features)
    bias = 0.0

    # 记录误分类点以及迭代次数
    mis_points = []
    for _ in range(n_iter):
        # 标记是否有误分类点
        mis_flag = False

        for i in range(n_samples):
            # 计算预测值
            y_pred = np.dot(weights, X[i]) + bias

            # 根据预测值和真实值调整权重和偏置
            if y_pred * y[i] <= 0:
                # 根据误差进行权重和偏置的更新
                weights += lr * y[i] * X[i]
                bias += lr * y[i]

                # 标记有误分类点
                mis_flag = True
                mis_points.append((X[i, 0], X[i, 1], y[i]))

        # 如果没有误分类点,则提前结束迭代
        if not mis_flag:
            break

    # 返回训练好的权重和偏置以及误分类点
    return weights, bias, mis_points

# 生成数据集
np.random.seed(0)
X = np.random.randn(100, 2)
y = np.array([1 if x1 + x2 >= 0 else -1 for x1, x2 in X])

# 训练模型
weights, bias, mis_points = perceptron(X, y)

# 绘制决策边界和误分类点
x1 = np.arange(-3, 3, 0.1)
x2 = (-weights[0] * x1 - bias) / weights[1]
plt.plot(x1, x2, 'r', label='Decision Boundary')
for x, y, label in mis_points:
    if label == 1:
        plt.plot(x, y, 'bo')
    else:
        plt.plot(x, y, 'ro')

plt.legend()
plt.show()

以上是关于深度学习4. 单层感知机概念及Python实现的主要内容,如果未能解决你的问题,请参考以下文章

R语言入门——不掉包实现FNN(单层感知机)

深度学习课程笔记神经网络基础

单层感知器

单层感知器

单层感知器--matlab神经网络

一个简单的单层感知器实现,用于具有 sigmoid 激活函数的二进制分类