codeye
2022/09/23阅读:85主题:默认主题
Python中感知器算法的完整指南
Python中感知器算法的完整指南 Python
2020年8月7日,星期五
7分钟阅读时间
感知器算法 Python
人工神经网络被高度用于解决机器学习中的问题。感知器算法是人工神经网络的最简单形式。机器学习程序员可以用它来创建一个单一的神经元模型来解决两类分类问题。这样一个模型也可以作为开发更大的人工神经网络的基础。在这篇文章中,我将向你展示如何创建一个感知器算法的Python例子。 图片来源:https://askabiologist.asu.edu/plosable/speed-human-brain 什么是感知器? 人工神经网络中感知器的概念是从神经元的工作原理中借来的,神经元是大脑的基本处理单元。
神经元是由三个主要部分组成的。
树突 细胞体 轴突 下图显示了一个神经元的结构。
神经元知觉器
树突的工作是携带输入信号。
信号的处理在细胞体中完成,而轴突则携带输出信号。
一旦细胞达到一个特定的阈值,神经元就会发射一个动作信号。
发射动作可以发生,也可以不发生,但不存在 "部分发射 "这种情况。
就像神经元一样,感知器是由许多输入(通常被称为特征)组成的。
这些输入被送入一个线性单元以产生一个二进制输出。
正因为如此,感知器被用来解决二进制分类问题,即把样本归入两个预定义的类别中的一个。
觉察器算法如何工作 感知器是由以下部分组成的。
我们看到,Watson的草被打湿的信念确实倾向于被打湿(0.21 vs 0.79)。因此,BN认为Watson的草是湿的,因为在雨节点上有一个连接,这个信念是通过这个节点传播的。
输入值/一个输入层 权重和偏置 净和 激活函数 这些都显示在下图中。
Perceptron python
感知器接收一个向量x作为输入,将其乘以相应的权重向量w,然后将其加入偏置b。
然后,结果通过激活函数。
你一定在问自己这个问题......
"权重、偏置和激活函数的目的是什么?"
让我告诉你...
权重是用来显示一个特定节点的强度。
偏置值将允许你将激活函数的曲线向上或向下移动。
激活函数将帮助你在所需的数值之间映射输入,例如,(-1,1)或(0,1)。
请注意,感知器可以有任何数量的输入,但它会产生一个二进制输出。
但是,你如何在许多输入中产生一个二进制输出?
首先,每个输入被分配一个权重,也就是输入对输出的影响程度。
为了确定感知器的激活,我们检查每个输入的加权和是否低于或高于一个特定的阈值,或偏置,b。
在我们的案例中,加权和是。
1.w¹ + x1.w² + x2w³
如果加权和等于或小于阈值或偏差b,则结果为0。
如果加权和大于阈值,或偏置,b,则输出结果变为1。
这个公式被称为海维塞德阶梯函数,它可以写成如下。
f(x) = { x<=b : 0 , x>b : 1 }
其中x是加权和,b是偏置。
感知器算法在哪里使用?
Perceptron
算法用于解决将数据分为两部分的问题。
正因为如此,它也被称为线性二进制分类器。
使用Perceptron算法时的常见错误/误区 尽管Perceptron算法很适合解决分类问题,但它也有一些局限性。
首先,它的输出值只能取两种可能的值,即0或1。
其次,Perceptron
只能用于分类线性可分离的向量集。根据感知器收敛定理,如果提供的数据集是线性可分离的,感知器学习规则保证在有限的步骤内找到一个解决方案。
如果输入向量可以用直线/平面分离成正确的类别,就可以说是线性可分离的。如果输入向量不是线性可分离的,它们将永远不会被正确分类。
接下来,你将学习如何创建一个感知器学习算法的Python例子。
实现感知器算法的Python实例 你现在知道Perceptron算法是如何工作的。
在本节中,我将帮助你知道如何在Python中实现感知器学习算法。
我们将使用Python和NumPy库来创建感知器Python实例。
感知器将接受两个输入,然后充当逻辑OR
函数。
让我们开始吧...
导入库 下面的代码将帮助你导入所需的库。
from numpy import array, random, dot
from random import choice
上面的第一行帮助我们从numpy库中导入三个函数,即array、random和dot。这三个函数将帮助我们生成数据值并对其进行操作。
第二行帮助我们从随机库中导入选择函数,帮助我们从列表中选择数据值。
创建一个阶梯函数 下一步应该是创建一个阶梯函数。
这将作为我们Perceptron
的激活函数。
记住,感知器将每个输入值归入两个类别中的一个,O或1。
所以,阶梯函数应该是这样的。
step_function = lambda x: 0 if x < 0 else 1
该函数被命名为step_function
如果传递给它的输入小于0,该函数将返回0,否则,它将返回1。
训练数据集 我们可以将我们的训练数据集加载到一个NumPy数组中。
如下图所示。
training_dataset = [
(array([0,0,1]), 0)。
(array([0,1,1]), 1),
(array([1,0,1]),1)。
(array([1,1,1]), 1)。
]
训练数据已被命名为training_dataset
每个元组中的前两个NumPy数组条目代表两个输入值。
每个元组的第二个元素代表预期结果。
数组的第三个元素是一个假输入(也被称为偏置),以帮助按照步骤函数的要求向上或向下移动阈值。
它的值总是为1,这样它对输出的影响就可以由权重来控制。
权重 现在我们有了输入,我们需要给它们分配权重。
我们将选择三个0到1之间的随机数作为初始权重。
我们将使用NumPy的随机函数。
weights = random.rand(3)
变量初始化 我们现在需要初始化一些变量,用于我们的Perceptron例子。
我们将创建一个名为error的列表来存储以后要绘制的误差值。
如果你对绘图不感兴趣,可以随意不加。
我们还将创建一个名为learning_rate的变量来控制学习率,另一个变量n来控制迭代次数。
如下图所示。
error = []
learning_rate = 0.2
n = 100
让我们把误差的大小减少到零,以便得到权重的理想值。
记住,我们总共使用了100次迭代,这对我们的数据集来说是不错的。
对于更大的和嘈杂的输入数据,请使用更大的迭代次数值。
模型训练
现在一切准备就绪,是时候训练我们的感知器学习算法Python模型了。
我们将首先从我们的训练数据中获得一些随机输入集。
接下来,我们将计算输入和权重向量的点积。
然后将结果与预期值进行比较。
如果预期值变大了,就应该增加权重,如果变小了,就应该降低权重。
这在下面的代码中显示。
for j in range(n):
x, expected = choice(training_dataset)
result = dot(weights, x)
err = expected – step_function(result)
error.append(err)
weights += learning_rate * err * x
上述代码的最后一行帮助我们计算校正因子,其中误差已经与学习率和输入矢量相乘。
这已被添加到权重向量中,以改善下一次迭代的结果。
这就是我们需要训练我们的Python感知器的内容。
它现在可以像逻辑OR
函数一样的作用。
模型评估
现在模型已经准备好了,我们需要评估它。
只要运行下面的代码,看看它是如何进行分类的。
for x, _ in training_dataset:
result = dot(x, weights)
print(“{}: {} -> {}”.format(x[:2], result, step_function(result)))
该代码应该返回以下输出?

感知器例子 从上面的输出中,你可以看出我们的Perceptron算法例子的作用类似于逻辑OR函数。
绘制错误图 将学习过程可视化的最好方法是绘制错误。
使用pylab库就可以做到这一点。
然后,matplotlib库的pyplot模块可以帮助我们将生成的图形可视化。
使用下面的代码。
from pylab import ylim, plot
from matplotlib import pyplot as plt
ylim([-1,1])
plot(error)
plt.show()
该代码将返回以下绘图。

python perceptron
从上面的图表中,你可以看出,在我们的python感知器算法例子的训练过程中,误差在第35次迭代左右开始稳定。
试着用不同的n值运行代码,并绘制误差图,看看有什么不同。
最后,这里是完整的感知器python代码。
from numpy import array, random, dot
from random import choice
from pylab import ylim, plot
from matplotlib import pyplot as plt
step_function = lambda x: 0 if x < 0 else 1
training_dataset = [
(array([0,0,1]), 0),
(array([0,1,1]), 1),
(array([1,0,1]), 1),
(array([1,1,1]), 1),
]
weights = random.rand(3)
error = []
learning_rate = 0.2
n = 100
for j in range(n):
x, expected = choice(training_dataset)
result = dot(weights, x)
err = expected – step_function(result)
error.append(err)
weights += learning_rate * err * x
for x, _ in training_dataset:
result = dot(x, weights)
print(“{}: {} -> {}”.format(x[:2], result, step_function(result)))
ylim([-1,1])
plot(error)
plt.show()
恭喜你!你的感知器算法
你的感知器算法Python模型现在已经准备好了。
总结。 这就是你在本文中学到的东西。
感知器算法是人工神经网络的最简单形式。 它可以用来创建一个单一的神经元模型来解决二元分类问题。 感知器的概念来自于神经元,也就是大脑的基本处理单元的工作方式。 感知器接收一个向量x作为输入,将其乘以相应的权重向量w,然后将其加入偏置b。 然后,输出通过一个激活函数,在所需的值之间映射输入。 在Python中实现感知器学习算法很容易。 为了继续获得更多这样的内容,现在就订阅我们的电子邮件通讯吧 并查看我们的数据科学家学习路径,获得你一直需要的改变职业的知识。
作者介绍