预测(prediction)
监督学习(supervised learning)——已知对应与一些样本的正确结果,所以可以把这写已知正确结果的样本提供给学习器;
符号(glyph)
——从数据中学习、从经验中学习;
动物学习:记忆(remembering)、适应(adapting)、泛化(generalizing)
智能:推理(reasoning)、逻辑演绎(logical deduction)——基础:学习和适应
人工智能(Artificial Intelligence)——符号处理(symbolic processing):计算机操作的是能反映环境的符号;
机器学习——亚符号(subsymbolic):不包含符号或是符号的操作;
使计算机改进(modify)或适应(adapt)他们的行为,从而使这些行为变得更加准确,这里的准确性是通过测量这些行为在多大程度上反映了正确的行为而得到的。
神经网络(neural network)——统计性的学习器;
数据挖掘(data-mining)——高效的算法;
计算复杂度(computational complexity)——算法(algorithm):训练的复杂度,训练好的算法的复杂度
学习——通过训练从而在某项工作上做得更好(不精确)——计算机如何知道它表现得更好,亦或是更差,以及它如何知道怎样才能有所提高?
提供给算法部分正确的答案,自动地发现问题的所有正确答案(泛化);或者告知算法某一个答案是否正确,但不告知如何去寻找正确的答案(搜索search);
分类:
监督学习(supervised learning):提供一个包含正确回答(目标target)的样本组成的训练集(training set),并且以这个训练集为基础,算法进行泛化,直到对所有可能的输入都给出正确的回答、这也称为从范例(exemplar)中学习;
无监督学习(unsupervised learning):没有提供正确的回答,取而代之的是算法试图鉴别出输入之间的相似之处,从而使有着共同点的输入被归类为(categorized)同一类。非监督学习的统计学方法称为密度估计(density estimation);
强化学习(reinforcement learning):强化学习介于监督学习和非监督学习之间。当答案不正确时,算法会被告知,但如何去改正则不得而知。它需要去探索,实验不同的可能情况,直到得到正确的答案。强化学习有时被称为伴随评论家(critic)的学习,因为它只对答案评分,而不提出改进的建议。
进化学习(evolutiionary learning):可以将生物学的进化看成一个学习的过程,即生物有机体改变自身,以提高在所处环境下的存活率和拥有后代的概率。我们将研究如何在计算机中对这一过程建模。在此使用适应度(fitness)的概念,相当于是对当前解答方案好坏程度的评分。
训练数据:输入数据 +目标数据 ;
机器学习的优越之处在于泛化:算法对于未曾碰到过的输入也应该给出合理的输出;——算法能够处理噪声(noise)——数据中小的不精确性;
标量(scalar)
预测——回归(regression)问题:拟合出描绘一条曲线的数学函数,使得曲线尽可能贴近所有的数据点——函数估计(function approximation)&插值(interpolation)
分类(classification)——把样本归为不同的类别;
所要解决的实际问题,绝大多数情况下都能被归结为分类或者是回归问题
分类问题——离散的——每一个样本明确属于某一类,并且类别的集合覆盖了整个可能输出的空间;
模糊(fuzzy)分类器——样本可能部分地属于两个类别;
异常检测(novelty detection)——不属于任一类别;
编码(encoding)——元素对应于相应特征的测量值(输入向量的特征)——过多的输入导致维度灾难(curse of dimensionality)
由于很多算法是随机的,结果无论如何都不可能重复。可以通过设置随机数种子来暂时避免这个问题,使随机数生成器每次都遵循相同的模式生成随机数;——伪随机数(pseudo-random number)
import numpy as np
np.random.seed(4)
np.random.rand(10)
np.random.rand(10)
np.random.seed(4)
np.random.rand(10)
介绍机器学习的一些重要概念,了解机器学习中数据处理和统计的一些基本思想。
神经网络的参数是将神经元连接到输入的一组权重的值——将神经元的权重视为一组坐标,即权重空间(weight space);
可用于讨论神经元和输入的紧密程度(不适用偏置节点——否则有一个额外的纬度),每个神经元的位置为其权重多对应的位置,将神经元和输入定位在同一空间中,两个空间具有同样的纬度——通过改变权重从而改变权重空间中神经元的位置——通过欧氏距离来测量输入和神经元之间的距离——神经元是否激活。
输入向量可以使我们获得所有的信息,让算法解决所需要的东西——巨大成本。
随着维度的增加,单位超球面(unit hypersphere)的体积不随之增加 v n = ( 2 π / n ) v n − 2 {{v}_{n}}=(2\pi /n){{v}_{n-2}} vn=(2π/n)vn−2——维度的数量趋于无穷大,超球面的体积趋于零—— n > 2 π n>2\pi n>2π时,体积开始缩小;
学习的目的是为了更好地预测输出,无论类标记还是连续回归值。
了解算法学习成功程度——将预测与一致目标进行比较——监督学习(查看算法在训练集上产生的错误)。
将算法推广到训练集中没有看到的示例——测试集——(输入,输出)对——将预测输出与目标进行比较,但不修改它们的权重或其他参数:决定算法学习的程度——但减少了可用于训练的数据量;
算法在学习时的泛化情况——过度训练:学习了数据中的噪声和不准确性(可变度的数量过大);
希望算法在过拟合之前停止学习过程——需要知道其在每个时间步长的泛化程度(训练数据无法检测过拟合,测试数据要最终保留)——验证集(validation set)——用于验证学习。
类似于统计学中的交叉验证(cross validation),属于模型选择(model selection)的一部分:为模型选择正确的参数,以便尽可能地泛化。
训练集:实际训练算法;
验证集:跟踪其学习效果;
测试集:最终产生结果;
对于监督学习必须附加目标值(甚至对于无监督学习,验证集合测试集也需要目标,以便于有比较的对象),而获得准确的标记并不容易(同样也是了解数据的目的)——半监督学习:满足对过多数据量的标记数据需求;
合理的数据量的选择——通常为:50:25:25、60:20:20
数据划分:
适用于分类的方法——混淆矩阵(confusion matrix):(i,j)处的矩阵元素——多少输入模式放入类i中,而算法归类为类j中;主对角线元素——正确答案;
精度:主对角线上的元素之和除以矩阵中所有元素的总和——不是唯一标准。
类的可能输出:真正类(true positive)——正确放入类1;假正例(false positive)——错误放入类1;反例放入类0(包括真/假);
上图中,主对角线上的元素是正确的,其余元素是错误的(基于二分类)。
精度:真正例与真反例的数量除以示例总数(“#”代表“数量”)——没有得到所有信息(四个数字变为一个数字)
A c c u r a c y = # T P + # T N # T P + # T N + # F P + # F N Accuracy=\frac{\#TP+\#TN}{\#TP+\#TN+\#FP+\#FN} Accuracy=#TP+#TN+#FP+#FN#TP+#TN
其他两对互补的度量:
敏感率(sensitivity):也称为真正例率(true positive rate),是正确的正例数量与被分类为正例的数量的比率;
特异率(specificity):对于反例而言;
s e n s i t i v i t y = # T P # T P + # F P sensitivity=\frac{\#TP}{\#TP+\#FP} sensitivity=#TP+#FP#TP ; s p e c i f i c i t y = # T N # T N + # F N specificity=\frac{\#TN}{\#TN+\#FN} specificity=#TN+#FN#TN
查准率(precision): 正确的正例数量与实际正例的数量之比;
查全率(recall):正确的正例数量与被归类为正例的数量之比(与敏感率相同);
p r e c i s i o n = # T P # T P + # F N precision=\frac{\#TP}{\#TP+\#FN} precision=#TP+#FN#TP ; r e c a l l = # T P # T P + # F P recall=\frac{\#TP}{\#TP+\#FP} recall=#TP+#FP#TP
F1度量:
F 1 = 2 p r e c i s i o n × r e c a l l p r e c i s i o n + r e c a l l = # T P # T P + ( # F P + # F N ) / 2 F1=2\frac{precision\times recall}{precision+recall}=\frac{\#TP}{\#TP+(\#FP+\#FN)/2} F1=2precision+recallprecision×recall=#TP+(#FP+#FN)/2#TP
度量——评估特定的分类器、比较具有不同学习参数的相同分类器或完全不同的分类器。
受试者工作特性(Receiver Operator Characteristic)曲线(ROC曲线)——完美的分类器(0,1);反分类器(anti-classifier)获得错误结果(1,0)——分类器结果越靠近左上角,性能越好;——y=x:浪费时间,等同于掷硬币;
计算离“对角线-随机猜测线”最远的点——比较分类器或同一分类器的参数设置选择——计算曲线下面积(Area Under the Curve,AUC)
交叉验证——获得曲线而不是ROC曲线上的点;n折交叉验证=n个分类器+n个不同的测试集(含有“真值”标记——用于生成不同交叉验证训练结果的排序列表,指定ROC曲线是哪个与该分类器结果相对应的n个数据点的曲线);通过为每个分类器生成 ROC曲线,可以比较他们的结果。
上述的精度隐含假设数据集中存在相同数量的正、负示例(平衡数据集);对于不平衡数据集,平衡精度计算为敏感率和特异率之和除2——更精确的度量:Matthew相关系数(Matthew’s Correlation Coefficient)——分母中任何括号为0,则整个分母设置为1:
如果有两个以上的类,并且区分不同类型的误差是有用的,那么计算会更加复杂。
精度(precision)——将机器学习算法视为度量系统:如果输入一组类似的输入,那么希望得到类似的输出。这种算法可变性的度量也称为精度——可重复性——将精度视为概率分布的方差——在平均值上下浮动的多少。
算法的精确不等同于准确——真实度(trueness),可以被定义为正确输出和预测之间的平均距离
先验概率: P ( C i ) P({{C}_{i}}) P(Ci) ——(类似于不平衡数据集);
给定特征值(度量值)x下的Ci的条件概率(conditional probability): ——如果x的值是X,则该类是Ci的可能性(不能直接得出);
为了得到条件概率,首先需要量化特征值x——在离散的值{X}中——计算 P ( C i , X j ) P({{C}_{i}},{{X}_{j}}) P(Ci,Xj) ——联合概率(joint probability):用过查看Xj,计算其中Ci类的样例数量,并除以样例的总数(任何类的);
P ( X ∣ C i ) P(X\text{ }\!\!|\!\!\text{ }{{C}_{i}}) P(X ∣ Ci) :样例是Ci类的情况下,度量值是Xj出现的次数(可直接得出);
从训练数据中得到的结果:联合概率 P ( C i , X j ) P({{C}_{i}},{{X}_{j}}) P(Ci,Xj) 、条件概率 P ( X ∣ C i ) P(X\text{ }\!\!|\!\!\text{ }{{C}_{i}}) P(X ∣ Ci) ——贝叶斯法则(Bayes’ rule):联合概率与条件概率的关系——将后验概率 P ( C i ∣ X j ) P({{C}_{i}}|{{X}_{j}}) P(Ci∣Xj)与先验概率 P ( C i ) P({{C}_{i}}) P(Ci) 和类条件概率 P ( X ∣ C i ) P(X\text{ }\!\!|\!\!\text{ }{{C}_{i}}) P(X ∣ Ci) 联系起来(分母用于形式化所有事物,概率总和为1)。
P ( C i ∣ X j ) = P ( X j ∣ C i ) P ( C i ) P ( X j ) P({{C}_{i}}|{{X}_{j}})=\frac{P({{X}_{j}}|{{C}_{i}})P({{C}_{i}})}{P({{X}_{j}})} P(Ci∣Xj)=P(Xj)P(Xj∣Ci)P(Ci)
对于任何对象Xk必须属于某个类Ci—— P ( X k ) = ∑ P ( X k ∣ C i ) P ( C i ) P({{X}_{k}})=\sum{P({{X}_{k}}|{{C}_{i}})P({{C}_{i}})} P(Xk)=∑P(Xk∣Ci)P(Ci);
P ( C i ∣ x ) > P ( C j ∣ x ) P({{C}_{i}}|x)>P({{C}_{j}}|x) P(Ci∣x)>P(Cj∣x) ∀ i ≠ j \forall i\ne j ∀i=j
通过计算更容易计算的实物来获得后验概率——通过后验概率选择Ci类(最大后验maximum a posterior,MAP):
MAP——给出训练数据中最可能的类——贝叶斯最优分类(Bayes’ Optimal Classification):将所有类的最终结果考虑在内——最大限度地减少了错误分类的可能性,而不是最大化后后验概率;
基于最小化误分类——考虑误分类中涉及的风险——损失矩阵:指定类Ci的示例被分为类Cj所涉及的风险——通过将每个案例乘以相关的损失数来使分类器最小化风险;
解决维度灾难: P ( X j ∣ C i ) = P ( X j 1 , X j 2 , . . . , X j n ∣ C i ) P({{X}_{j}}\text{ }\!\!|\!\!\text{ }{{C}_{i}})=P(X_{_{j}}^{1}\text{,}X_{_{j}}^{2},...,X_{_{j}}^{n}\text{ }\!\!|\!\!\text{ }{{C}_{i}}) P(Xj ∣ Ci)=P(Xj1,Xj2,...,Xjn ∣ Ci) ——不同特征的值不会相互影响(朴素性)——特征相互独立: ∏ P ( X j k = a k ∣ C i ) = P ( X j 1 = a 1 , X j 2 = a 2 , . . . , X j n = a n ∣ C i ) \prod{P(X_{_{j}}^{k}\text{=}{{a}_{k}}\text{ }\!\!|\!\!\text{ }{{C}_{i}})}=P(X_{_{j}}^{1}\text{=}{{a}_{1}}\text{,}X_{_{j}}^{2}={{a}_{2}},...,X_{_{j}}^{n}\text{=}{{a}_{n}}\text{ }\!\!|\!\!\text{ }{{C}_{i}}) ∏P(Xjk=ak ∣ Ci)=P(Xj1=a1,Xj2=a2,...,Xjn=an ∣ Ci);
最大值的类Ci: P ( C i ) ∏ P ( X j k = a k ∣ C i ) P({{C}_{i}})\prod{P(X_{_{j}}^{k}\text{=}{{a}_{k}}\text{ }\!\!|\!\!\text{ }{{C}_{i}})} P(Ci)∏P(Xjk=ak ∣ Ci)——对全概率评估的简化;
在简化为真的情况下,使得特征在条件上彼此独立,朴素贝叶斯分类器恰好产生MAP分类——缺点:在大量概率相乘的情况下数字会变得非常小;
均值:数据的平均值(average);
中位数(median)——随机算法(randomised algorithm):用于计算中位数;
众数(mode);
期望(expectation): 将每种可能性的收益与该可能性发生的概率相乘,然后累加;
方差:度量数据的分布,观察变量相对于平均值的变化:计算集合中每个元素与集合的期望值(平均值,μ)之间的平方距离总和来计算:
其中,方差的平方根 σ \sigma σ 称为标准差(standard deviation);
协方差(covariance): 度量两个变量的依赖程度(统计学意义上),查看一组数据中所有变量对之间的相关性:
其中,v是几何{yi}的均值;
如果两个变量独立则协方差为0;如果同时增加/减少,则协方差为正;如果一个增加的同时另一个减少,则协方差为负;
协方差矩阵(covariance matrix): 说明了数据在每个数据维度的变化情况
其中:xi是描述第i个变量元素的列向量,μi为他们的均值;
协方差矩阵为对称方阵,主对角元为方差;
高维形式:
其中变量X的均值为E(X);
马氏距离(Mahalanobis distance):
其中:x为数据的列向量,μ为均值的列向量, 为协方差矩阵的逆(NumPy—> np.cov(x), np.linalg.inv(x))
若协方差矩阵设置为单位阵,则马氏距离退化为欧式距离;
概率分布: 在可能的特征值范围内发生某事物的概率;
高斯(Gaussian)分布或正态分布(normal distribution),一维方程:
其中:μ为均值, σ \sigma σ 为标准差
中心极限定理——许多小的随机数加起来为高斯,高维方程:
其中:Σ为协方差矩阵
算法具有的自由度越大,拟合的模型就越复杂——更复杂的模型:过拟合——不一定能产生更好的结果——偏差-方差困境(bias-variance dilemma)
模型的问题:
①不准确:与数据不匹配;——偏差
②不精确,结果具有很多不确定性;——统计方差;
更复杂的模型倾向与改善偏差,同时导致方差的增大;而减少方差使模型更具体则将增加偏差;——海森堡不确定性原理(Heisenberg Uncertainty Principle):无法兼得;
例如:多项式可以精确通过数据点;直线拟合没有方差但偏差很大——通常不适合拟合数据;样条曲线可以任意精度拟合训练数据,但方程会增大;
平方和误差函数(sum-of-squares error function):计算目标和预测输出之间的误差——计算两者之间差异的平方和
逼近函数 y = f ( x ) + ε y=f(x)+\varepsilon y=f(x)+ε ,其中: ε \varepsilon ε 为噪声,均值为0,方差为 σ 2 {{\sigma }^{2}} σ2的高斯分布;机器学习算法拟合数据 h ( x ) = w T x + b h(x)={{w}^{T}}x+b h(x)=wTx+b ,其中w为权重向量,目标为最小化平方和误差: ∑ i ( y i − h ( x i ) ) 2 \sum\limits_{i}{{{({{y}_{i}}-h({{x}_{i}}))}^{2}}} i∑(yi−h(xi))2 ;
利用上式,在独立数据上,计算新的数据点的平方和误差的期望(其中 E [ x ] = x ˉ E[x]=\bar{x} E[x]=xˉ为均值)
噪声:无法控制,是不可约的误差(irreducible error),是测试数据的方差;
方差:所使用特定训练集x的变化程度;
偏差:h(x)的平均误差;
低偏差——当前的平均输出;高方差——答案在各处浮动;
权衡偏差与方差
大脑的处理单元:神经元(neuron)——具有鲁棒性;
通过大脑流质里面的化学递质来升高或降低神经元内部的电位。如果这一跨膜电位(membrane pontential)达到某个阈值,神经元就会放电(spike)或激活(fire),并且一个固定强度和持续时间的脉冲会向下传递到轴突(axon)。轴突分散形成树枝状,与许多其他神经元连接,其中的每一个连接都是在一个突触(synapse)中。在激活之后,神经元在下一次激活之前需要一段时间来恢复能量(不应期refractory period)。
每个神经元可看成是一个独立的处理器——决定是否激活。
强AI(strong AI):对于大脑来说所有的内容都能在计算机中进行模拟,从而在计算机中实现动物或是人类的智能。
进行学习——可塑性(plasticity):改变神经元间突触连接的强度(strength),或是建立新的连接。
突触连接强度的变化与两个相连神经元激活的相关性成比例;如果两个神经元始终同时激活,那么它们之间连接的强度会变大;反之,如果两个神经元从来不同时激活,那么它们之间的连接会小时——如果两个神经元都会对某件事做出反应,那么它们应该相连——经典条件反射(classical conditioning,巴普洛夫)
长时程增强效应(long-term potentiation)、神经可塑性(neural plasticity):当神经元同时激活,它们之间会形成突触连接并且能变得更强,从而形成神经元集合;
①一组输入加权wi:相当于突触;
②一个加法器:把输入信号相加(与收集电荷的细胞膜等价);
③一个激活函数:(最初是一个阈值函数——0代表没有激活,1代表激活)决定细胞对于当前的输入是否激活(放电);
所有其他神经元的激活状态都通过一个突触传递到神经元,并且这些突触都是有强度的——权重(weight),突触的强度会影响信号的强弱:
对于一个真实的神经元而言,他的跨膜电位是否大于某个阈值(θ)来决定。
输入xi与权重wi相乘,而神经元对其进行求和,如果该总和大于阈值θ,则神经元会输出,否则不输出
McCulloch和Pitts神经元使用的是二元阈值函数,可以把上述神经元工作原理的第二部分,即决定是否激活,称为激活函数(activation function):
实际上使用的激活函数会略作变化——选择正确的权重。
①输入不一定是线性相加的,可能存在非线性的相加形式;
②现实中的神经元不会给出单一的输出相应,而是给出一个电位序列(spike train),即一个脉冲序列——对信息进行编码——神经元以一种连续的方式给出分等级的输出——激活的阈值随时间改变;
③神经元不会根据电脑的时钟脉冲去顺序地更新,而是随机地(异步asynchronously)更新(存在异步的神经网络模型)——实际应用采用时钟脉冲更新的算法;
④权重wi可正可负,这等价于兴奋性(excitatory)的连接与抑制性(inhibitory)的连接——使神经元更可能激活和更不可能激活——突触连接不存在一种到另一种的转换;
⑤现实的神经元在反馈环节中存在一个连接到其自身的突触——在神经网络中通常不会出现;
McCulloch和Pitts神经元模型可以记忆图像,学会表示函数和分类数据——模拟了神经元最重要的功能——决定是否激活,而忽略了令人讨厌的生物学问题;
模型只有在学习时才能用它来理解发生了什么,或者使用模型来解决某种问题时才有用——试图理解的学习将是机器学习(machine learning)而不是动物学习。
单一的神经元无法学习——把一系列的神经元放置在一起——神经网络(neural network)
监督学习——每一个数据点都有一个正确的输出值与之对应;学习——泛化(generalisation):假设数据中存在某一种模式,通过给神经网络一些已知的样例,我们希望它能够发现这种模式,并且正确地预测其他样例——模式识别(pattern recognition)
神经元:输入、权重、阈值——只能改变权重与阈值——如何改变神经元的权重和阈值模使网络能够更频繁地得到正确的结果?
感知器(perceptron,1985)——第一个神经网络
神经元组成的集合:包含一组输入和一些把输入和神经元连接在一起的权重——输入节点(左侧浅灰色):输入值的个数等于输入向量的维度+神经元(右侧黑色);
神经元彼此之间是完全独立的,每一个神经元的权重也是彼此独立的;
一般地,有m个输入和n个神经元。权重 w i j {{w}_{ij}} wij(i为1至m为输入的数量,j为1至n为神经元的数量)——困难:不清楚权重本来的大小
误差函数(error function): y k − t k {{y}_{k}}-{{t}_{k}} yk−tk;其中,tk为神经元的目标,表示它应该得到的结果;yk为神经元的输出,表示它已经得到的结果——调整权重: Δ w i k = − ( y k − t k ) × x i \Delta {{w}_{ik}}=-({{y}_{k}}-{{t}_{k}})\times {{x}_{i}} Δwik=−(yk−tk)×xi ——将其与旧权重相加得到新的权重
阈值的改变——防止特殊输入0的存在;
学习规则——每个权重改变多少——学习速率(learning rate) η \eta η ——决定了网络学习的快慢——权重更新的最终规则: w i j ← w i j − η ( y j − t j ) x i {{w}_{ij}}\leftarrow {{w}_{ij}}-\eta ({{y}_{j}}-{{t}_{j}}){{x}_{i}} wij←wij−η(yj−tj)xi
预定义最大的循环次数为T。
参数 η \eta η 控制权重调整的幅度:若为1,则每当出现一个错误的结果,权重将会进行大幅度的调整,导致网络不稳定(unstable),使权重的改变永远都不能停止;如果设置的过小,需要更多次地提供输入,网络花费更多时间去学习,但结果更稳定,对数据中的噪声和不精确的成分有更好的抵抗力;
通常: 0.1 < η < 0.4 0.1<\eta <0.4 0.1<η<0.4
解决0输入问题——改变阈值函数,需要为一个额外的参数编写代码——给神经元增加一个额外的输入权重,并且使得对应与该权重的输入为一定值(可以为正或负,本书为-1)。在更新算法中也包含这个权重,已有的算法则不需要别的改进。
这个额外输入被称为偏置(bias)节点,通常以0为下标,与第j个神经元相连的权重就记为 w 0 j {{w}_{0j}} w0j 。
该算法分为两个部分:训练(training)阶段和再现(recall)阶段;
复杂度:再现阶段循环了所有的神经元,并且对于每一个神经元,都要在所有输入上循环,因此它的复杂度为O(mn);悬链部分做了同样的工作,但是循环了T次,因此复杂度为O(Tmn)。
以OR(或运算)为例:两个输入节点+输入偏置+输出节点;
设w0=-0.05,w1=-0.02,w2=0.02——考虑0:(0,0),再现输出为1,实际为0(其中 =0.25),进行训练:
提供1:(0,1),再现输出为0,实际为1,再次训练:
1:(1,0),1:(1,1)再现满足要求——需要再次检查所有的输入,直到权重趋于稳定,不在发生变化,才意味着算法已经结束。
关注能起作用的值,而不关心真正的值,只要网络能够泛化到其他的输入。
四个数组:输入、权重、输出、目标——输入向量(input vector)
for data in range(nData): # loop over the input vectors
for n in range(N): # loop over the neurons
# Compute sum of weights times inputs for each neuron
# Set the activation to 0 to start
activation[data][n] = 0
# Loop over the input nodes (+1 for the bias node)
for m in range(M+1):
activation[data][n] += weight[m][n] * inputs[data][m]
# Now decide whether the neuron fifires or not
if activation[data][n] > 0:
activation[data][n] = 1
else
activation[data][n] = 0
减少代码量——矩阵:m+1行(输入节点的个数加上偏置节点的个数1)、n列(神经元的个数)——np.array;
矩阵相乘——内维(inner dimension)相等——np.dot()
>>> import numpy as np
>>> a = np.array([[3,4,5],[2,3,4]])
>>> b = np.array([[1,3],[2,4],[3,5]])
>>> np.dot(a,b)
array([[26, 50],
[20, 38]])
输入向量:N×m,N为输入向量的个数、m为每个向量的维度;权重数组的大小为m×n。两者相乘得到N×n的矩阵——计算激活状态——where(condition, x, y)(condition为逻辑上的调价,x和y为具体的数值),返回一个矩阵,对于矩阵中的每一个元素,当condition为真时,值为x,反之为y。
>>> np.where(a>3,1,0)
array([[0, 1, 1],
[0, 0, 1]])
则再现阶段的代码:
#Compute activations
activations = np.dot(inputs,self.weights)
# Threshold the activations
return np.where(activations>0,1,0)
训练算法的第一部分与再现阶段的计算是一样的——两者使用同一个函数(命名为pcndwd——前向(forward)传播来得到输出的过程);
权重矩阵:m×n,目标激活矩阵:N×m,输入矩阵:N×m——计算:np.dot(inputs, targets_activations)——将输入矩阵进行转置——np.transpose():
>>> np.transpose(a)
array([[3, 2],
[4, 3],
[5, 4]])
权重为(eta代表学习速率η):
self.weights -= eta*np.dot(np.transpose(inputs),self.activations-targets)
若上述矩阵的维度是正确的(np.shape()得到数组每一维度的长度),则需在输入向量中为偏置节点额外添加-1(np.concatenate(),可以定义一个一维数组,使里面的元素都为-1,然后添加到输入数组上),然后决定每一个权重的初始值;
inputs = np.concatenate((inputs,-np.ones((self.nData,1))),axis=1)
最后需要对每个权重赋初值(可以全为0,但一般设为小的随机数——np.rand——其中nIn与nout分别对应m与n):
weights = np.random.rand(nIn+1,nOut)*0.1-0.05
完整程序在pcn.py中(待调试),提供的为批量(batch)版本:所有的输入批量写入算法,计算误差并更新权重,而下面的算法采用顺序(sequential)版本——以OR为例:
>>> import numpy as np
>>> inputs = np.array([[0,0],[0,1],[1,0],[1,1]])
>>> targets = np.array([[0],[1],[1],[1]])
>>> import pcn_logic_eg
>>>
>>> p = pcn_logic_eg.pcn(inputs,targets)
>>> p.pcntrain(inputs,targets,0.25,6)
Iteration:
0
[[-0.03755646]
[ 0.01484562]
[ 0.21173977]]
Final outputs are:
[[0]
[0]
[0]
[0]]
Iteration:
1
[[ 0.46244354]
[ 0.51484562]
[-0.53826023]]
Final outputs are:
[[1]
[1]
[1]
[1]]
Iteration:
2
[[ 0.46244354]
[ 0.51484562]
[-0.28826023]]
Final outputs are:
[[1]
[1]
[1]
[1]]
Iteration:
3
[[ 0.46244354]
[ 0.51484562]
[-0.03826023]]
Final outputs are:
[[1]
[1]
[1]
[1]]
Iteration: 4
[[ 0.46244354]
[ 0.51484562]
[ 0.21173977]]
Final outputs are:
[[0]
[1]
[1]
[1]]
Iteration:
5
[[ 0.46244354]
[ 0.51484562]
[ 0.21173977]]
Final outputs are:
[[0]
[1]
[1]
[1]]
下图给出了决策边界(decision boundary):
目前对于数据集的学习达到了神经网络在1969年的水平,随后Minsky与Papert出版了《感知器》一书,通过讨论感知器的学习能力刺激神经网络的研究,并展示网络能够学习和不能学习的内容,不幸的是,这本书有效的遏制了神经网络大约20年的研究进展——需要了解感知器不同的学习方式。
感知器所做的:(二维空间是一条直线、三维空间是一个平面plane、更高维度的空间中是一个超平面hyperplane)一端的神经元都激活,而另一端的神经元都不激活——界限称为决策边界或判别函数(discriminant function):x·wT≥0,其中w是权重矩阵W的某一行,它是连接输入与某个特定神经元的权重;
内积——Numpy中np.inner()函数实现
在感知器中,所谓的边界就是找到一个输入向量x1,满足x1·wT=0。假设找到另一个输入向量x2,满足x2·wT=0,则:
即两个向量间的夹角为直角——当给定一些数据对应目标输出时,感知器寻找一条直线来区分,如果直线存在,则该情况称为线性可分(linearly separable)的情况,如何不是线性可分,则构造一个函数;
当存在多于一个输出神经元时——得到多条直线:
给定一个线性可分的数据集,感知器将在有限次数迭代后收敛于某种分类(Rosenblatt,1962),迭代次数以1/γ2为界,其中γ是分离超平面与最接近的数据点之间的距离 。
证明:
假设每个输入向量的长度||x||≤1,且受到某些常数的显示(并非严格必要),已知存在权重向量w*(|| w*||=1)可以分隔数据,假设其为线性可分——寻找与w尽量平行或接近的向量w,使得每次权重更新时w·w增加且没有增加太多——检查w*·w的值和w的长度;
假设在算法的第t次迭代中,网络中出现y·w(t−1)·x < 0——权重更新:w= w(t−1) + y·x(此时假设η=1)——w*·w:
则每次权重更新,内积至少增加γ,则t次权重更新后:w*·w(t)≥tγ,根据柯西不等式(Cauchy-Schwartz inequality)可取得|| w(t)||下限:w*·w(t)≤||w*||·||w(t)||,即||w(t)|| ≥tγ,第t步迭代时有:
其中:y2=1,||x||2≤1,y·w(t−1)·x < 0,即t步迭代后,||w(t)|| 2≤t。
合并不等式可得:(t)1/2≥||w(t)|| ≥tγ,可得:t≤1/γ2
得证。
根据上述证明可知:若权重是线性可分的,则算法必将收敛,且迭代次数是分离超平面和最近的数据点之间的距离的函数(γ)——称之为间隔(margin)。
感知器会在获得所有训练数据后立即停止学习,因此无法保证只要有线性分界就要会找到最大间隔
注:该小节证明笔者有误、译者误上加误,且为简化证明,完整定理(novikoff定理)证明可看:
链接: novikoff定理证明.
XOR函数不是线性可分的——无法用一条直线将其分开——将网络变得更复杂:增加更多的神经元,同时使其连接变得更复杂——网络的训练变得更加困难。
XOR函数在三维空间中重新表述,那么完全可以找到一个能够把两个类别分开的平面(直线的二维等价物)——只要把数据映射(project)到正确的维度的空间中,那么总是可以用一个线性函数来把两个类别区分开——核分类器(kernel classifier):支持向量机(Support Vector Machine,SVM)的基础。
在我们使用计算机解决困难的运算问题之前,统计学在很长一段时间内被用来解决分类和回归的问题,并且直线的方法在统计学里活跃了很多年。它给出了一种理解学习过程的不同(且有用)的方法,并且通过使用统计学和计算机科学的方法,能够对整个领域有很好的理解——线性回归(linear regression)
(待整理)
将目标缩放到0-1之间——有助于防止权重变得太大,缩放输入可以起到同样的效果;缩放输入数据最常用的方法是独立处理每个数据维度,使每个维度具有零均值和单位方差(不允许异常值占主导地位),或者只是进行缩放以使最大值为1且最小值为-1——数据归一化(normalisation)、标准化(standardisation)
Numpy可以通过np.mean()和np.var()进行归一化:
归一化需要在数据集分类之前,否则训练集与测试集两个集合的均值和方差很可能不一样——可以在不了解数据的情况下进行归一化,但需要进行预处理。
特征选择(feature selection)——去掉某一个特征能够使结果有所改进,就彻底去掉它,然后再尝试能否去掉其他特征——测试输出与每一个特征的相关性(correlation)(过于简单)——考虑维度简约(dimensionality reduction):用更少的维度来表示数据,同时不会损失相关信息。
回归问题:用一条线去拟合数据;分类问题:找一条线把数据分开——通常会把分类问题转化为回归问题:① 引入指示变量(indicator variable):表示每一个数据点所属的类别——用数据去预测(predict)指示变量;② 重复的回归:每一次对其中一个类别,指示值1代表样本属于该类别,0代表属于其他类别。
感知器与更多基于统计学的方法之间的区别在于:提出问题的方法不同。
界定一条直线(平面或超平面),使之能够更好地拟合(fit)数据——尽量最小化一个测量所有点到直线距离的和的误差函数——忽略平方根,仅最小化误差的平方和——最小二乘优化(least-squares optimisaton):选择参数,使之能够最小化在所有点上预测值与实际值的差的平方和:
矩阵的形式为:
其中,t为目标值,X是输入值的矩阵(包含偏置输入)——计算其最小值: β T X T t = t T X β {{\beta }^{T}}{{X}^{T}}t={{t}^{T}}X\beta βTXTt=tTXβ对β求导—— X T ( t − X β ) = 0 {{X}^{T}}(t-X\beta )=0 XT(t−Xβ)=0,解得: β = ( X T X ) − 1 X T t \beta ={{({{X}^{T}}X)}^{-1}}{{X}^{T}}t β=(XTX)−1XTt ,即给定输入向量z其预测值为zβ。
(待补充)