感知器算法经常被用到监督式学习,这是一个机器学习任务,它的优势是训练有素的带安全标签的数据。这与无监督学习,它以未标记的数据为训练对象。具体来说,感知器算法关注的是二元分类数据,一个类或另一个类的成员的对象。此外,它允许在线学习,这意味着它每次处理训练数据集中的一个元素(这对于大型数据集很有用)。
此外,感知器算法是一类线性分类器,它通过使用变量的线性组合对数据点进行分类。如上图所示,线性分类器使用线 如。 ,或 对数据点进行分类——线一侧的任何对象都是一类的一部分,线另一侧的任何对象都是另一类的一部分。在这个例子中,一个成功的线性分类器可以使用 或 区别这两个阶级,然而 将会是一个穷人决定边界.
感知器特性的一个有趣的结果是它无法学习异或函数!正如我们上面看到的,OR和and函数是线性可分的,这意味着存在一条线,可以将一个类的所有数据点与另一个类的所有数据点分开。然而,异或函数不是线性可分的,因此感知器算法(线性分类器)不能成功地学习这个概念。这就是为什么感知器算法本身不用于复杂的机器学习任务,而是用来构建神经网络,处理线性不可分分类的主要原因。
感知器是一种用来产生二进制分类器的算法。也就是说,该算法将二进制分类输入数据,连同它们的类成员,并输出一条线,试图将一个类的数据与另一个类的数据分开:线一边的数据点属于一个类,另一边的数据点属于另一个类。
具体来说,给定一个输入 变量 ,一条线是这些变量的线性组合: ,在那里 和 是常数。注意,这也可以写成 ,在那里 是点积两者之间的向量 和 .
感知器算法返回值 和 这样,线一边的数据点属于一类,线另一边的数据点属于另一类。在数学上,值 和 被二进制分类器以以下方式使用:如果 ,分类器返回1;否则,返回0。注意,1表示一个类的成员关系,0表示另一个类的成员关系。使用AND操作符可以更清楚地看到这一点,为方便起见,下面复制了该操作符。
那么 和 代表什么? 的权重 变量。简单地说,一个变量的权重决定了这条线相对于该变量的陡度。每个变量都需要一个权重;否则,这条线将相对于该变量是平的,这可能会阻止这条线成功地对数据进行分类。此外, 代表了偏见的数据。本质上,这防止了行依赖于起源 点(0,0) -偏差将直线向上或向下移动,以便更好地对数据进行分类。
感知器算法通过随时间改变权重和偏差来学习分离数据,其中时间表示为算法运行的次数。因此, 表示权重在时刻的值 和 表示某一时刻的偏差值 .
此外, 代表了学习速率,即算法对变化做出反应的速度。这个值有界限 . 不能是0,因为这意味着没有学习发生。如果 是一个大的值,算法有倾向性振荡围绕解决方案,如下所示。
为了更好地说明这些概念,下面详细介绍感知器算法的正式步骤。在下面, 表示输入的正确输出值 ;给定一个类 如果 是那个班级的成员吗 否则。
一个例子如下:
假设我们试图学习下列输入类对的AND运算符 和 让我们用一个学习速率 然后运行算法直到我们能正确地对这四个点进行分类。
W (0) = [0,0], b(0) = 0
1 W (0) = [0,0], b(0) = 0 Y = [0,0,0,0] W (1) = [0.5, 0.5], b(1) = 0.5 2 W (1) = [0.5, 0.5], b(1) = 0.5 Y = [1,1,1,1] W (2) = [0,0];(2) = 1 3. W (2) = [0,0], b(2) = -1 Y = [0,0,0,0] W (3) = [0.5, 0.5], b(3) = -0.5 4 W (3) = [0.5, 0.5], b(3) = -0.5 Y = [0,0,0,1] 成功!
在之前的例子中,感知器算法终止到正确的值。发生这种情况的一个原因是精心选择的学习率( ).与一个较小的 ,算法将需要更多的迭代来完成,而更大的 可能会导致算法永远振荡。
感知器算法的实现如下(Python版本):
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|