Neural Networks 神经网络(是这么说吧)
nn可以用来做分类和数值型预测。nn有很多类型,PCI里面介绍的是一种多层认知网络,有一层输入神经元和若干层(这里是一层)隐藏神经元。每个神经元有自己的输出值,连接神经元的突触有各自的权重。
使用nn计算的方法叫feed forward,是通过对所有连接到这个节点上一层神经元的输出值与相应的突触权重的乘积求和再用tanh(PCI里面)计算得到的。最后一层的所有输出值可以用来帮助挑选结果。这个过程中对神经元输出的改变保留在nn中。
PCI里面用了一个通过记录搜索引擎用户点击结果的日志来训练的nn实例。搜索关键词或者关键词的组合作为样本中的输入数据,而用户最终的点击的搜索结果集中的链接作为样本中的输出数据。隐藏层的节点表示不同输入之间的组合。
nn可以使用随机值作为突触的权重,而且单个输入值和输出没有直接概率联系(因为网络是通过输入值的组合的集合来计算的,这和贝叶斯的概率矩阵不一样。当然如果所有的输入都是单个值的话那就和贝叶斯一样了),所以不能像贝叶斯那样直接把输入扔进去来修正网络中突触的权重。nn的一种训练方法是back propagate(叫反向传播?)。
bp的方法是先用现有网络计算输出,然后和给定的样本输出比较,计算得到误差,用误差来修正隐藏层突触的权重,再计算隐藏层的误差,来修正输入层。
优点:
支持增量训练
适应任何类型输入
缺点:
这是一个黑盒过程,中间的隐藏层很难解释出具体含义
对于训练频率和网络大小没有固定固定规律可循,多是通过实验得到
对于nn的黑盒特性倒是想说两句,nn本来就是仿生的方式解决问题,我们自己的神经系统也就这样。感应电流从神经末梢沿着神经线传入大脑以后谁知道是按照哪条固定线路走的啊,用科学家的话,那是刺激了大脑中的某个区域。但是具体是这个区域中的那个或者那几个细胞在起决定作用就说不清楚了。
其实对于面向某些领域的nn来说,生物的神经系统倒是可以更多的借鉴,可以对输入和输出做划分,毕竟手上传来的感觉对管脚丫子的大脑皮层区域影响微乎其微。
Support-Vector Machines 支持向量机 (感谢好同学的解释)
这是PCI里面最复杂的分类算法。svm可以计算数值数据集应该属于的分类。它在目标平面(空间)里计算出分割线(面)来把数据集划分成属于不同类型的区域,以使表示数据的点到分割线(平面)的距离最大。有时候需要对数据集进行变换使同一类数据相对集中,不同类别相对分的清一点。这叫Kernel trick或者Kernel method。
问题的关键是找到分割线(面)。这就要靠那些可能靠近分割线(面)的数据点了。这些点我们称为支持向量,这也是这个算法名称的由来。但是至于如何找这些点和通过这些点来找分割线(面)PCI就没有交代了,原因是太复杂(毕竟是应用型的书啊),只是用了一个现成的libsvm :-(
svm的训练只要是通过cross validation来迭代改进,这需要有大量样本数据才能得到很好的结果。所以svm也只适合于大数据量的分类。
优点:
很好很强大
速度快
可以处理不同类型数据(要转换成数值)
缺点:
好的核变换算法不好找,而且没有通用的方法来找
cross validation需要有大量数据做基础