你好,我对Python和自然语言处理都比较新。我需要实现一个感知器分类器。我在一些网站上搜索了一下,但没有找到足够的信息。目前,我有一些文件,按类别分组(体育、娱乐等)。我还有一个包含这些文档中最常用单词及其频率的列表。在一个特定的网站上,它指出我必须有某种接受参数x和w的决策函数。x显然是某种向量(我不知道w是什么)。但我不知道如何利用我拥有的信息来构建感知器算法,并如何使用它来对我的文档进行分类。你有任何想法吗?谢谢 :)
你好,我对Python和自然语言处理都比较新。我需要实现一个感知器分类器。我在一些网站上搜索了一下,但没有找到足够的信息。目前,我有一些文件,按类别分组(体育、娱乐等)。我还有一个包含这些文档中最常用单词及其频率的列表。在一个特定的网站上,它指出我必须有某种接受参数x和w的决策函数。x显然是某种向量(我不知道w是什么)。但我不知道如何利用我拥有的信息来构建感知器算法,并如何使用它来对我的文档进行分类。你有任何想法吗?谢谢 :)
从外部看,感知器是一个函数,它接受 n
个参数(即一个 n
维向量),并产生 m
个输出(即一个 m
维向量)。
从内部看,感知器由多层 神经元 组成,每一层神经元都从前一层神经元接收输入,并使用该输入计算出一个单独的输出。第一层由 n
个神经元组成,其接收输入。最后一层由 m
个神经元组成,在处理完输入后保留输出。
从神经元 i
到神经元 j
的每个连接都有一个权重 w(i,j)
(我稍后会解释它们的来源)。第二层神经元 p
的总输入
是所有来自第一层神经元加权输出的总和。因此,
total_input(p) = Σ(output(k) * w(k,p))
其中k
遍历第一层的所有神经元。神经元的激活值通过应用一个激活函数从神经元的总输入中计算得出。常用的激活函数是费米函数,因此
activation(p) = 1/(1-exp(-total_input(p))).
神经元的输出是通过应用一个输出函数
计算出来的。常用的输出函数是恒等函数f(x) = x
(一些作者认为输出函数是激活函数的一部分)。在这里,我将假设
output(p) = activation(p)
在计算第二层所有神经元的输出后,使用该输出计算第三层的输出。迭代直到达到输出层。
一开始,权重是随机选择的。然后选择一些示例(从中您知道所需的输出)。将每个示例馈送到感知器中,计算误差,即实际输出与期望输出相差多少。使用该误差来更新权重。最快的计算新权重的算法之一是弹性反向传播。
您需要解决一些问题:
n
维向量?n
个神经元的隐藏层开始。第一和第二点对分类器的质量非常关键。感知器可能会正确地对示例进行分类,但在新文档上失败。您可能需要进行实验。为了确定分类器的质量,请选择两组示例;一组用于训练,一组用于验证。不幸的是,由于缺乏实际经验,我无法给您更详细的回答这些问题的提示。
我认为如果你对自然语言处理和神经网络都不熟悉,尝试用神经网络解决NLP问题可能有些困难。使用新语言只是你的最小问题。
我会给你提供我所在大学教授的神经计算模块幻灯片链接。你需要下载第2周的第1和第2次课程幻灯片。页面底部有一个链接,可以了解如何在C语言中实现神经网络。稍加修改后,应该可以移植到Python。请注意,它详细介绍了如何实现多层感知器,而你只需要实现单层感知器,因此忽略任何关于隐藏层的内容。
一个关于x
和 w
的简要解释。x 和 w 都是向量。x 是输入向量。x
包含每个你所关心的单词的标准化频率。w
包含你所关心的每个单词的权重。感知器通过将每个单词的输入频率乘以其相应的权重并将它们加起来来工作。它将结果传递给一个函数(通常是一个 sigmoid 函数),将结果转换为介于 0 和 1 之间的值。1 表示感知器确信输入是它所代表的类别的实例,而 0 则表示它确信输入真的不是它所代表的类别的一个例子。无论如何,我希望这能为您的项目提供更好的起点。如果您仍然卡在某个特定部分,请再问一次,我会尽力帮助。
前几天我尝试着实现了类似的东西。我编写了一些代码来识别英文文本和非英文文本。我已经多年没有做过人工智能或统计了,所以这只是一个试手的尝试。
我的代码在这里(不想让帖子变得臃肿):http://cnippit.com/content/perceptron-statistically-recognizing-english
输入:
尽管我真的不知道自己在做什么,但它似乎工作得相当不错。成功很大程度上取决于训练数据。我之前的结果很差,直到我在更多的法语/西班牙语/德语文本上进行了训练。
这只是一个非常小的示例,其中有很多“幸运猜测”的值(例如初始权重,偏差,阈值等)。
多个类: 如果您有多个要区分的类(即不像“是A还是非A”那么简单),则一种方法是为每个类使用一个感知器。例如,一个用于体育,一个用于新闻等。
将体育感知器训练为以体育或非体育分组的数据。新闻或非新闻等类似。
在对新数据进行分类时,将输入传递给所有感知器,然后返回真(或“触发”)的感知器就是该数据所属的类别。
我曾经在大学时使用过这种方法,用一组感知器识别手写字符。它很简单,效果相当好(如果我没记错的话,准确率超过98%)。