神经网络(优化算法)

智能优化算法和神经网络,人工神经网络优化算法 群体智能优化算法是一类基于概率的随机搜索进化算法,各个算法之间存在结构、研究内容、计算方法等具有较大的相似性写作猫。因此,群体智能优化算法可以建立一个基本的理论框架模式:Step1:设置参数,初始化种群;Step2:生成一组解,计算其适应值;Step3:由个体最有适应着,通过比较得到群体最优适应值;Step4:判断终止条件示否满足?如果满足,结束迭代;否则,转向Step2; 阅读详情

文章转载自:http://www.52analysis.com/R/1627.html

神经网络(优化算法)

人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具,常用来对输入和输出间复杂的关系进行建模,或用来探索数据的模式。

人工神经网络从以下四个方面去模拟人的智能行为:

物理结构:人工神经元将模拟生物神经元的功能

计算模拟:人脑的神经元有局部计算和存储的功能,通过连接构成一个系统。人工神经网络中也有大量有局部处理能力的神经元,也能够将信息进行大规模并行处理

存储与操作:人脑和人工神经网络都是通过神经元的连接强度来实现记忆存储功能,同时为概括、类比、推广提供有力的支持

训练:同人脑一样,人工神经网络将根据自己的结构特性,使用不同的训练、学习过程,自动从实践中获得相关知识

神经网络是一种运算模型,由大量的节点(或称“神经元”,或“单元”)和之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。

R语言与机器学习学习笔记(分类算法)(5)神经网络


一、感知器

感知器相当于神经网络的一个单层,由一个线性组合器和一个二值阈值原件构成:

R语言与机器学习学习笔记(分类算法)(5)神经网络

构成ANN系统的单层感知器:

感知器以一个实数值向量作为输入,计算这些输入的线性组合,如果结果大于某个阈值,就输出1,否则输出‐1。

感知器函数可写为:sign(w*x)有时可加入偏置b,写为sign(w*x+b)

学习一个感知器意味着选择权w0,…,wn的值。所以感知器学习要考虑的候选假设空间H就是所有可能的实数值权向量的集合

算法训练步骤:

1、定义变量与参数x(输入向量),w(权值向量),b(偏置),y(实际输出),d(期望输出),a(学习率参数)

2、初始化,n=0,w=0

3、输入训练样本,对每个训练样本指定其期望输出:A类记为1,B类记为-1

4、计算实际输出y=sign(w*x+b)

5、更新权值向量w(n+1)=w(n)+a[d-y(n)]*x(n),0

6、判断,若满足收敛条件,算法结束,否则返回3

注意,其中学习率a为了权值的稳定性不应过大,为了体现误差对权值的修正不应过小,说到底,这是个经验问题。

从前面的叙述来看,感知器对于线性可分的例子是一定收敛的,对于不可分问题,它没法实现正确分类。这里与我们前面讲到的支持向量机的想法十分的相近,只是确定分类直线的办法有所不同。可以这么说,对于线性可分的例子,支持向量机找到了“最优的”那条分类直线,而单层感知器找到了一条可行的直线。

我们以鸢尾花数据集为例,由于单层感知器是一个二分类器,所以我们将鸢尾花数据也分为两类,“setosa”与“versicolor”(将后两类均看做第2类),那么数据按照特征:花瓣长度与宽度做分类。

运行下面的代码:

#感知器训练结果:

a<-0.2

w<-rep(0,3)

iris1<-t(as.matrix(iris[,3:4]))

d<-c(rep(0,50),rep(1,100))

e<-rep(0,150)

p<-rbind(rep(1,150),iris1)

max<-100000

eps<-rep(0,100000)

i<-0

repeat{

v<-w%*%p;

y<-ifelse(sign(v)>=0,1,0);

e<-d-y;

eps[i+1]<-sum(abs(e))/length(e)

if(eps[i+1]<0.01){

print("finish:");

print(w);

break;

}

w<-w+a*(d-y)%*%t(p);

i<-i+1;

if(i>max){

print("max time loop");

print(eps[i])

print(y);

break;

}

}

#绘图程序

plot(Petal.Length~Petal.Width,xlim=c(0,3),ylim=c(0,8),

data=iris[iris$Species=="virginica",])

data1<-iris[iris$Species=="versicolor",]

points(data1$Petal.Width,data1$Petal.Length,col=2)

data2<-iris[iris$Species=="setosa",]

points(data2$Petal.Width,data2$Petal.Length,col=3)

x<-seq(0,3,0.01)

y<-x*(-w[2]/w[3])-w[1]/w[3]

lines(x,y,col=4)

#绘制每次迭代的平均绝对误差

plot(1:i,eps[1:i],type="o")

分类结果如图:

R语言与机器学习学习笔记(分类算法)(5)神经网络

这是运行了7次得到的结果。与我们前面的支持向量机相比,显然神经网络的单层感知器分类不是那么的可信,有些弱。

我们可以尝试来做交叉验证,可以发现交叉验证结果并不理想。

二、线性神经网络

尽管当训练样例线性可分时,感知器法则可以成功地找到一个权向量,但如果样例不是线性可分时它将不能收敛。因此,人们设计了另一个训练法则来克服这个不足,称为delta法则。

如果训练样本不是线性可分的,那么delta法则会收敛到目标概念的最佳近似。

delta法则的关键思想是使用梯度下降来搜索可能权向量的假设空间,以找到最佳拟合训练样例的权向量。

我们将算法描述如下:

1、定义变量与参数。x(输入向量),w(权值向量),b(偏置),y(实际输出),d(期望输出),a(学习率参数)(为叙述简便,我们可以将偏置并入权值向量中)

2、初始化w=0

3、输入样本,计算实际输出与误差。e(n)=d-x*w(n)

4、调整权值向量w(n+1)=w(n)+a*x*e(n)

5、判断是否收敛,收敛结束,否则返回3

Hayjin证明,只要学习率a<2/maxeign, delta法则按方差收敛。其中maxeigen为x’x的最大特征值。故我们这里使用1/maxeign作为a的值。

我们还是以上面的鸢尾花数据为例来说这个问题。运行代码:

p<-rbind(rep(1,150),iris1)

d<-c(rep(0,50),rep(1,100))

w<-rep(0,3)

a<-1/max(eigen(t(p)%*%p)$values)

max<-1000

e<-rep(0,150)

eps<-rep(0,1000)

i<-0

for(i in 1:max){

v<-w%*%p;

y<-v;

e<-d-y;

eps[i+1]<-sum(e^2)/length(e)

w<-w+a*(d-y)%*%t(p);

if(i==max)

print(w)

}

 

得到分类直线:

R语言与机器学习学习笔记(分类算法)(5)神经网络

相比感知器分类而言已经好了太多了,究其原因不外乎传递函数由二值阈值函数变为了线性函数,这也就是我们前面提到的delta法则会收敛到目标概念的最佳近似。增量法则渐近收敛到最小误差假设,可能需要无限的时间,但无论训练样例是否线性可分都会收敛。

为了明了这一点我们考虑鸢尾花数据后两类花的分类(这里我们将前两类看做一类),使用感知器:

R语言与机器学习学习笔记(分类算法)(5)神经网络

使用线性分类器:

R语言与机器学习学习笔记(分类算法)(5)神经网络

但是要解释的一点是,收敛并不意味着分类效果更好,要解决线性不可分问题需要的是添加非线性输入或者增加神经元。我们以Minsky & Papert (1969)提出的异或例子为例说明这一点。

R语言与机器学习学习笔记(分类算法)(5)神经网络


使用线性神经网络,代码与上面完全相同,略。

第一个神经元输出:

权值: [,1] [,2] [,3]

[1,] 0.75 0.5 -0.5

测试: [,1] [,2] [,3] [,4]

[1,] 1 0 1 1

第二个神经元输出:

权值: [,1] [,2] [,3]

[1,] 0.75 -0.5 0.5

测试: [,1] [,2] [,3] [,4]

[1,] 1 1 0 1

求解异或逻辑(相同取0,不同取1)有结果:(代码xor(c(1,0,1,1),c(1,1,0,1)))

[1] FALSE TRUE TRUE FALSE

即0,1,1,0,分类正确。

最后再说一点,Delta规则只能训练单层网络,但这不会对其功能造成很大的影响。从理论上说,多层神经网络并不比单层神经网络更强大,他们具有同样的能力。

三、BP神经网络

1、sigmoid函数分类

回顾我们前面提到的感知器,它使用示性函数作为分类的办法。然而示性函数作为分类器它的跳点让人觉得很难处理,幸好sigmoid函数y=1/(1+e^-x)有类似的性质,且有着光滑性这一优良性质。我们通过下图可以看见sigmoid函数的图像:


R语言与机器学习学习笔记(分类算法)(5)神经网络

Sigmoid函数有着计算代价不高,易于理解与实现的优点但也有着欠拟合,分类精度不高的特性,我们在支持向量机一章中就可以看到sigmoid函数差劲的分类结果。

2、BP神经网络结构

BP (Back Propagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。由下图可知,BP神经网络是一个三层的网络:

R语言与机器学习学习笔记(分类算法)(5)神经网络

输入层(input layer):输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;

隐藏层(Hidden Layer):中间层是内部信息处理层,负责信息变换,根据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程;

输出层(Output Layer):顾名思义,输出层向外界输出信息处理结果;

当实际输出与期望输出不符时,进入误差的反向传播阶段。误差通过输出层,按误差梯度下降的方式修正各层权值,向隐藏层、输入层逐层反传。周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。

3、反向传播算法

反向传播这一算法把我们前面提到的delta规则的分析扩展到了带有隐藏节点的神经网络。为了理解这个问题,设想Bob给Alice讲了一个故事,然后Alice又讲给了Ted,Ted检查了这个事实真相,发现这个故事是错误的。现在 Ted 需要找出哪些错误是Bob造成的而哪些又归咎于Alice。当输出节点从隐藏节点获得输入,网络发现出现了误差,权系数的调整需要一个算法来找出整个误差是由多少不同的节点造成的,网络需要问,“是谁让我误入歧途?到怎样的程度?如何弥补?”这时,网络该怎么做呢?

同样源于梯度降落原理,在权系数调整分析中的唯一不同是涉及到t(p,n)与y(p,n)的差分。通常来说Wi的改变在于:

alpha * s'(a(p,n)) * d(n) *X(p,i,n)

其中d(n)是隐藏节点n的函数,让我们来看:

n 对任何给出的输出节点有多大影响;

输出节点本身对网络整体的误差有多少影响。

R语言与机器学习学习笔记(分类算法)(5)神经网络


一方面,n 影响一个输出节点越多,n 造成网络整体的误差也越多。另一方面,如果输出节点影响网络整体的误差越少,n 对输出节点的影响也相应减少。这里d(j)是对网络的整体误差的基值,W(n,j) 是 n 对 j 造成的影响,d(j) * W(n,j) 是这两种影响的总和。但是 n 几乎总是影响多个输出节点,也许会影响每一个输出结点,这样,d(n) 可以表示为:SUM(d(j)*W(n,j))

这里j是一个从n获得输入的输出节点,联系起来,我们就得到了一个培训规则。

第1部分:在隐藏节点n和输出节点j之间权系数改变,如下所示:

alpha *s'(a(p,n))*(t(p,n) - y(p,n)) * X(p,n,j)

第 2 部分:在输入节点i和输出节点n之间权系数改变,如下所示:

alpha *s'(a(p,n)) * sum(d(j) * W(n,j)) * X(p,i,n)

这里每个从n接收输入的输出节点j都不同。关于反向传播算法的基本情况大致如此。

通常把第 1部分称为正向传播,把第2部分称为反向传播。反向传播的名字由此而来。

4、最速下降法与其改进

最速下降法的基本思想是:要找到某函数的最小值,最好的办法是沿函数的梯度方向探寻,如果梯度记为d,那么迭代公式可写为w=w-alpha*d,其中alpha可理解为我们前面提到的学习速率。

最速下降法有着收敛速度慢(因为每次搜索与前一次均正交,收敛是锯齿形的),容易陷入局部最小值等缺点,所以他的改进办法也有不少,最常见的是增加动量项与学习率可变。

增加冲量项(Momentum)

修改权值更新法则,使第n次迭代时的权值的更新部分地依赖于发生在第n‐1次迭代时的更新

Delta(w)(n)=-alpha*(1-mc)*Delta(w)(n)+mc*Delta(w)(n-1)

右侧第一项就是权值更新法则,第二项被称为冲量项

梯度下降的搜索轨迹就像一个球沿误差曲面滚下,冲量使球从一次迭代到下一次迭代时以同样的方向滚动

冲量有时会使这个球滚过误差曲面的局部极小值或平坦区域

冲量也具有在梯度不变的区域逐渐增大搜索步长的效果,从而加快收敛。

改变学习率

当误差减小趋近目标时,说明修正方向是正确的,可以增加学习率;当误差增加超过一个范围时,说明修改不正确,需要降低学习率。

5、BP神经网络的实现

(1)数据读入,这里我们还是使用R的内置数据——鸢尾花数据,由于神经网络本质是2分类的,所以我们将鸢尾花数据也分为两类(将前两类均看做第2类),按照特征:花瓣长度与宽度做分类。

(2)划分训练数据与测试数据

(3)初始化BP网络,采用包含一个隐含层的神经网络,训练方法使用包含动量的最速下降法,传递函数使用sigmoid函数。

(4)输入样本,对样本进行归一化,计算误差,求解误差平方和

(5)判断是否收敛

(6)根据误差调整权值。权值根据以下公式进行调整:

Delta(w)= alpha *s'(a(p,n))*(t(p,n) - y(p,n)) * X(p,n,j)

其中,alpha为学习率,s'(a(p,n))*(t(p,n)- y(p,n))为局部梯度。此外,由于使用了有动量因子的最速下降法,除第一次外,后续改变量应为:

Delta(w)(n)=-alpha*(1-mc)*Delta(w)(n)+mc*Delta(w)(n-1)

(7)测试,输出分类正确率。

完整的R代码:

iris1<-as.matrix(iris[,3:4])

iris1<-cbind(iris1,c(rep(1,100),rep(0,50)))

set.seed(5)

n<-length(iris1[,1])

samp<-sample(1:n,n/5)

traind<-iris1[-samp,c(1,2)]

train1<-iris1[-samp,3]

testd<-iris1[samp,c(1,2)]

test1<-iris1[samp,3]

set.seed(1)

ntrainnum<-120

nsampdim<-2

net.nin<-2

net.nhidden<-3

net.nout<-1

w<-2*matrix(runif(net.nhidden*net.nin)-0.5,net.nhidden,net.nin)

b<-2*(runif(net.nhidden)-0.5)

net.w1<-cbind(w,b)

W<-2*matrix(runif(net.nhidden*net.nout)-0.5,net.nout,net.nhidden)

B<-2*(runif(net.nout)-0.5)

net.w2<-cbind(W,B)

traind_s<-traind

traind_s[,1]<-traind[,1]-mean(traind[,1])

traind_s[,2]<-traind[,2]-mean(traind[,2])

traind_s[,1]<-traind_s[,1]/sd(traind_s[,1])

traind_s[,2]<-traind_s[,2]/sd(traind_s[,2])

sampinex<-rbind(t(traind_s),rep(1,ntrainnum))

expectedout<-train1

eps<-0.01

a<-0.3

mc<-0.8

maxiter<-2000

iter<-0

errrec<-rep(0,maxiter)

outrec<-matrix(rep(0,ntrainnum*maxiter),ntrainnum,maxiter)

sigmoid<-function(x){

y<-1/(1+exp(-x))

return(y)

}

for(i in 1:maxiter){

hid_input<-net.w1%*%sampinex;

hid_out<-sigmoid(hid_input);

out_input1<-rbind(hid_out,rep(1,ntrainnum));

out_input2<-net.w2%*%out_input1;

out_out<-sigmoid(out_input2);

outrec[,i]<-t(out_out);

err<-expectedout-out_out;

sse<-sum(err^2);

errrec[i]<-sse;

iter<-iter+1;

if(sse<=eps)

break

Delta<-err*sigmoid(out_out)*(1-sigmoid(out_out))

delta<-(matrix(net.w2[,1:(length(net.w2[1,])-1)]))%*�lta*sigmoid(hid_out)*(1-sigmoid(hid_out));

dWex<-Delta%*%t(out_input1)

dwex<-delta%*%t(sampinex)

if(i==1){

net.w2<-net.w2+a*dWex;

net.w1<-net.w1+a*dwex;

}

else{

net.w2<-net.w2+(1-mc)*a*dWex+mc*dWexold;

net.w1<-net.w1+(1-mc)*a*dwex+mc*dwexold;

}

dWexold<-dWex;

dwexold<-dwex;

}

testd_s<-testd

testd_s[,1]<-testd[,1]-mean(testd[,1])

testd_s[,2]<-testd[,2]-mean(testd[,2])

testd_s[,1]<-testd_s[,1]/sd(testd_s[,1])

testd_s[,2]<-testd_s[,2]/sd(testd_s[,2])

inex<-rbind(t(testd_s),rep(1,150-ntrainnum))

hid_input<-net.w1%*%inex

hid_out<-sigmoid(hid_input)

out_input1<-rbind(hid_out,rep(1,150-ntrainnum))

out_input2<-net.w2%*%out_input1

out_out<-sigmoid(out_input2)

out_out1<-out_out

out_out1[out_out<0.5]<-0

out_out1[out_out>=0.5]<-1

rate<-sum(out_out1==test1)/length(test1)

分类正确率为:0.9333333,是一个不错的学习器。这里需要注意的是动量因子mc的选取,mc不能过小,否则容易陷入局部最小而出不去,在本例中,如果mc=0.5,分类正确率仅为:0.5333333,学习效果很不理想。

四、R中的神经网络函数

单层的前向神经网络模型在包nnet中的nnet函数,其调用格式为:

nnet(formula,data, weights, size, Wts, linout = F, entropy = F,

softmax = F, skip = F, rang = 0.7,decay = 0, maxit = 100,

trace = T)

参数说明:

size, 隐层结点数;

decay, 表明权值是递减的(可以防止过拟合);

linout, 线性输出单元开关;

skip,是否允许跳过隐层;

maxit, 最大迭代次数;

Hess, 是否输出Hessian值

适用于神经网络的方法有predict,print和summary等,nnetHess函数用来计算在考虑了权重参数下的Hessian矩阵,并且检验是否是局部最小。

我们使用nnet函数分析Vehicle数据。随机选择半数观测作为训练集,剩下的作为测试集,构建只有包含3个节点的一个隐藏层的神经网络。输入如下程序:

library(nnet); #安装nnet软件包

library(mlbench); #安装mlbench软件包

data(Vehicle); #调入数据

n=length(Vehicle[,1]); #样本量

set.seed(1); #设随机数种子

samp=sample(1:n,n/2); #随机选择半数观测作为训练集

b=class.ind(Vehicle$Class); #生成类别的示性函数

test.cl=function(true,pred){true<-max.col(true);cres=max.col(pred);table(true,cres)};

a=nnet(Vehicle[samp,-19],b[samp,],size=3,rang=0.1,decay=5e-4,maxit=200); #利用训练集中前18个变量作为输入变量,隐藏层有3个节点,初始随机权值在[-0.1,0.1],权值是逐渐衰减的。

test.cl(b[samp,],predict(a,Vehicle[samp,-19]))#给出训练集分类结果

test.cl(b[-samp,],predict(a,Vehicle[-samp,-19]));#给出测试集分类结果

#构建隐藏层包含15个节点的网络。接着上面的语句输入如下程序:

a=nnet(Vehicle[samp,-19],b[samp,],size=15,rang=0.1,decay=5e-4,maxit=10000);

test.cl(b[samp,],predict(a,Vehicle[samp,-19]));

test.cl(b[-samp,],predict(a,Vehicle[-samp,-19]));

再看手写数字案例

最后,我们回到最开始的那个手写数字的案例,我们试着利用支持向量机重做这个案例。(这个案例的描述与数据参见《R语言与机器学习学习笔记(分类算法)(1)》)

由于nnet包对输入的维数有一定限制(我也不知道为什么,可能在权值计算的时候出现了一些bug,反正将支持向量机那一节的代码平行的移过来是会报错的)。我们这里采用手写数字识别技术中常用的办法处理这个案例:计算数字的特征。选择数字特征的办法有许多种,你随便百度一篇论文都有叙述。我们这里采用结构特征与统计特征结合的办法计算图像的特征。

R语言与机器学习学习笔记(分类算法)(5)神经网络

我们这里采用的统计特征与上图有一点的不同(结构特征一致),我们是将图片分为16块(4*4),统计每个小方块中点的个数,这样我们就有25维的特征向量了。为了保证结果的可比性,我们也报告支持向量机的分类结果。

运行下列代码:

setwd("D:/R/data/digits/trainingDigits")

names<-list.files("D:/R/data/digits/trainingDigits")

data<-paste("train",1:1934,sep="")

for(i in 1:length(names))

assign(data[i],as.matrix(read.fwf(names[i],widths=rep(1,32))))

library(nnet)

label<-factor(rep(0:9,c(189,198,195,199,186,187,195,201,180,204)))

feature<-matrix(rep(0,length(names)*25),length(names),25)

for(i in 1:length(names)){

feature[i,1]<-sum(get(data[i])[,16])

feature[i,2]<-sum(get(data[i])[,8])

feature[i,3]<-sum(get(data[i])[,24])

feature[i,4]<-sum(get(data[i])[16,])

feature[i,5]<-sum(get(data[i])[11,])

feature[i,6]<-sum(get(data[i])[21,])

feature[i,7]<-sum(diag(get(data[i])))

feature[i,8]<-sum(diag(get(data[i])[,32:1]))

feature[i,9]<-sum((get(data[i])[17:32,17:32]))

feature[i,10]<-sum((get(data[i])[1:8,1:8]))

feature[i,11]<-sum((get(data[i])[9:16,1:8]))

feature[i,12]<-sum((get(data[i])[17:24,1:8]))

feature[i,13]<-sum((get(data[i])[25:32,1:8]))

feature[i,14]<-sum((get(data[i])[1:8,9:16]))

feature[i,15]<-sum((get(data[i])[9:16,9:16]))

feature[i,16]<-sum((get(data[i])[17:24,9:16]))

feature[i,17]<-sum((get(data[i])[25:32,9:16]))

feature[i,18]<-sum((get(data[i])[1:8,17:24]))

feature[i,19]<-sum((get(data[i])[9:16,17:24]))

feature[i,20]<-sum((get(data[i])[17:24,17:24]))

feature[i,21]<-sum((get(data[i])[25:32,17:24]))

feature[i,22]<-sum((get(data[i])[1:8,25:32]))

feature[i,23]<-sum((get(data[i])[9:16,25:32]))

feature[i,24]<-sum((get(data[i])[17:24,25:32]))

feature[i,25]<-sum((get(data[i])[25:32,25:32]))

}

data1 <- data.frame(feature,label)

m1<-nnet(label~.,data=data1,size=25,maxit = 2000,decay = 5e-6, rang = 0.1)

pred<-predict(m1,data1,type="class")

table(pred,label)

sum(diag(table(pred,label)))/length(names)

library("e1071")

m <- svm(feature,label,cross=10,type="C-classification")

m

summary(m)

pred<-fitted(m)

table(pred,label)

setwd("D:/R/data/digits/testDigits")

name<-list.files("D:/R/data/digits/testDigits")

data1<-paste("train",1:1934,sep="")

for(i in 1:length(name))

assign(data1[i],as.matrix(read.fwf(name[i],widths=rep(1,32))))

feature<-matrix(rep(0,length(name)*25),length(name),25)

for(i in 1:length(name)){

feature[i,1]<-sum(get(data1[i])[,16])

feature[i,2]<-sum(get(data1[i])[,8])

feature[i,3]<-sum(get(data1[i])[,24])

feature[i,4]<-sum(get(data1[i])[16,])

feature[i,5]<-sum(get(data1[i])[11,])

feature[i,6]<-sum(get(data1[i])[21,])

feature[i,7]<-sum(diag(get(data1[i])))

feature[i,8]<-sum(diag(get(data1[i])[,32:1]))

feature[i,9]<-sum((get(data1[i])[17:32,17:32]))

feature[i,10]<-sum((get(data1[i])[1:8,1:8]))

feature[i,11]<-sum((get(data1[i])[9:16,1:8]))

feature[i,12]<-sum((get(data1[i])[17:24,1:8]))

feature[i,13]<-sum((get(data1[i])[25:32,1:8]))

feature[i,14]<-sum((get(data1[i])[1:8,9:16]))

feature[i,15]<-sum((get(data1[i])[9:16,9:16]))

feature[i,16]<-sum((get(data1[i])[17:24,9:16]))

feature[i,17]<-sum((get(data1[i])[25:32,9:16]))

feature[i,18]<-sum((get(data1[i])[1:8,17:24]))

feature[i,19]<-sum((get(data1[i])[9:16,17:24]))

feature[i,20]<-sum((get(data1[i])[17:24,17:24]))

feature[i,21]<-sum((get(data1[i])[25:32,17:24]))

feature[i,22]<-sum((get(data1[i])[1:8,25:32]))

feature[i,23]<-sum((get(data1[i])[9:16,25:32]))

feature[i,24]<-sum((get(data1[i])[17:24,25:32]))

feature[i,25]<-sum((get(data1[i])[25:32,25:32]))

}

labeltest<-factor(rep(0:9,c(87,97,92,85,114,108,87,96,91,89)))

data2<-data.frame(feature,labeltest)

pred1<-predict(m1,data2,type="class")

table(pred1,labeltest)

sum(diag(table(pred1,labeltest)))/length(name)

pred<-predict(m,feature)

table(pred,labeltest)

sum(diag(table(pred,labeltest)))/length(name)

经整理,我们有如下输出结果:

R语言与机器学习学习笔记(分类算法)(5)神经网络


可以看到,神经网络与支持向量机还是有一定的可比性,但支持向量机的结果还是要优于神经网络的。

这里我们神经网络取25个节点(隐藏层)似乎出现了过拟合的现象(虽然还不算过于严重)我们应该减少节点个数得到更佳的预测结果。

关于节点的选择是个经验活,我们没有一定的规则。可以多试几次,结合训练集正确率与测试集正确率综合研判,但是构造神经网络的代价是高昂的,所以有一个不太坏的结果也就可以停止了。(其他参数的选择同样如此,但是不如size那么重要)

特征的选取对于识别问题来说相当的重要,也许主成分在选择特征时作用会比我们这样的选择更好,但是代价也更高,还有我们应该如何选择主成分,怎么选择(选择哪张图的主成分)都是需要考虑的。

五、神经网络还是支持向量机

从上面的叙述可以看出,神经网络与我们前面说的支持向量机有不少相似的地方,那么我们应该选择谁呢?下面是两种方法的一个简明对比:


– SVM的理论基础比NN更坚实,更像一门严谨的“科学”(三要素:问题的表示、问题的解决、证明)

– SVM ——严格的数学推理

–ANN ——强烈依赖于工程技巧

–推广能力取决于“经验风险值”和“置信范围值”,ANN不能控制两者中的任何一个。

–ANN设计者用高超的工程技巧弥补了数学上的缺陷——设计特殊的结构,利用启发式算法,有时能得到出人意料的好结果。

正如费曼指出的那样“我们必须从一开始就澄清一个观点,就是如果某事不是科学,它并不一定不好。比如说,爱情就不是科学。因此,如果我们说某事不是科学,并不是说它有什么不对,而只是说它不是科学。”与SVM相比,ANN不像一门科学,更像一门工程技巧,但并不意味着它就一定就不好。

Furtherreading:

神经网络概述:用平常语言介绍神经网络

最速下降法:xiazdong:机器学习入门:线性回归及梯度下降

神经网络结构: Pe.潘义:BP神经网络理论(十分好的一篇文章,博客的BP神经网络结构摘自该博客)

神经网络进阶:大刀:机器学习初级学习(1):RBF神经网络极简介绍及其算法的R语言实现

文章转载自:http://www.52analysis.com/R/1627.html

python实现K折交叉检验实例 在样本数量不是很多的情况下,想要检验拟合一个完美的模型。最常见的方法就是K折交叉检验。 写一个住房数据案例 # 先把数据分成k个部分,把其中一个部分用作测试集,把其余部分用作训练集以拟合模型 # 模型拟合好之后,使用测试集进行 测试,并计算误差。不断重复这个过程,知道k个部分都测试过。 # 模型的最终误差是所有模型的平均值 import pandas as pd housing=pd.read_csv('housing_renamed.csv') from sklearn.model_selection 阅读详情

相关推荐

机器学习----神经网络技术详解

机器学习(Machine Learning, ML)是一种人工智能(Artificial Intelligence, AI)技术,它使计算机能够通过经验自动改进性能,而不需要明确编程。机器学习的核心在于从数据中提取模式和知识,从而使系统能够做出预测或决策。机器学习的方法可以分为监督学习、无监督学习和强化学习等几种主要类型。监督学习:在监督学习中,模型通过一组带标签的训练数据进行训练。训练过程的目标是使模型能够根据输入数据预测正确的标签。例如,分类问题和回归问题都是监督学习的典型应用。

qq_42538588的博客 5286

神经网络详解(基本完成)

Fill you up with petrol概述人工神经网络(artificial neural network,ANN),简称神经网络(neural network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具,常用来对

大土的博客 20万+

神经网络之优化算法

先来回顾一下神经网络的经典结构,如下图所示: 一般神经网络分为:输入层,隐藏层,输出层。上图中的连线代表的是神经网络中的参数,参考下面的图: 常用的激活函数有: 如果对上面的内容有疑惑的话,可以参考笔者的上一篇文章《谈谈对神经网络的理解 “谈谈对神经网络的理解”》,这里不再赘述。 好了,下面进入正题。 损失函数的概念 在讲优化算法之前,我们先要明确损失函数的概念,损失函数有很多种说法,中文也...

xuzhezhaozhao的专栏 7169

10分钟快速了解神经网络(Neural Networks)

神经网络是深度学习算法的基本构建模块。神经网络是一种机器学习算法,旨在模拟人脑的行为。它由相互连接的节点组成,也称为人工神经元,这些节点组织成层次结构。

python12222_的博客 9241

bp神经网络优化算法对比,bp神经网络的优化算法

5.优化网络结构 ————————拓扑结构中网络层数、各层节点数、节点连接方式的不确定性——————————————构造法和剪枝法(权衰减法、灵敏度计算方法等)——————————————网络结构随样本空间进行变换,简化网络结构6混合智能算法————————与遗传算法、进化计算、人工免疫算法、蚁群算法、微粒群算法、————————模糊数学、小波理论、混沌理论。反向传播借助 链式法则 ,计算两个或两个以上复合函数的导数,将输出单元的梯度反向传播回输入单元,根据计算出的梯度,调整网络的可学习参数。

Supermen333的博客 1179

神经网络中的优化算法

什么是优化算法? 给定一个具有参数θ的目标函数,我们想要找到一个w使得目标函数取得最大值或最小值。优化算法就是帮助我们找到这个θ的算法。 在神经网络中,目标函数f就是预测值与标签的误差,我们希望找到一个θ使得f最小。优化算法的种类一阶优化算法 它通过计算目标函数f关于参数θ的梯度(一阶偏导数)来最小化代价函数。常用的SGD、Adam、RMSProp等基于梯度的优化算法都属于一阶优化算法。

庞琳卓的博客 1万+

神经网络——优化算法

一文概览神经网络优化算法优化算法是一类数学方法和技术,用于寻找在给定约束条件下使目标函数取得最优值的参数或变量。在机器学习、数据挖掘、工程优化等领域中,优化算法被广泛应用于解决各种问题。优化算法的目标通常是最小化或最大化一个被称为目标函数或者代价函数的数学表达式。这个函数通常描述了一个系统的性能或者误差,例如机器学习中的损失函数或者工程中的成本函数。优化算法通过不断地调整参数或变量的取值,使得目标函数达到最小值或最大值。而对于我们这里即将介绍的神经网络中的优化算法。

Redamancy_Xun的博客 4299

神经网络优化算法有哪些,人工神经网络优化算法

遗传代数%下面调用gaot工具箱,其中目标函数定义为gabpEval[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-611],'maxGenTerm',gen,...'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2gen3]);%绘收敛曲线图figure(1)plot(trace(:,1),1./trace(:,3),'r-');...

aifamao6的博客 512

神经网络=神经网络模型+优化算法

通过阅读周志华老师的《机器学习》,收货颇丰,突然意识到神经网络的构成,我认为,就是神经网络模型+优化算法,以下内容如有侵权,立即删除。

2401_83334134的博客 1471

神经网络优化算法大全图,人工神经网络优化算法

神经网络就像多项式或者线性模型一样,是个看不见表达式的模型,它的表达式就是网络,它比一般模型具有更高的自由度和弹性;同时它是一个典型的黑箱模型方法;比多项式等模型还黑。优化算法,就是寻优的算法,所谓寻优过程,就是寻找使目标函数最小时(都是统一表示成寻找使函数具有最小值)的自变量的值。回归或者拟合一个模型,例如用一个多项式模型去拟合一组数据,其本质就是寻找使残差平方和最小的参数值,这就是一个寻优的过程,其实就是寻找使函数F(x)值最小时的x的值;对于这个具体的寻找过程就涉及到算法问题,就是如何计算。

kfc67269的博客 513

有关神经网络的训练算法,人工神经网络优化算法

遗传代数 %下面调用gaot工具箱,其中目标函数定义为gabpEval [x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,... 'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。

kfc67269的博客 642

初解神经网络优化算法

本文概述了神经网络优化算法的主要类型及其特点。首先介绍了机器学习优化的基本目标,即通过降低代价函数来优化模型参数,强调泛化性能而非单纯追求训练集最优解。随后详细盘点了多种优化算法:1)最小二乘法适用于简单模型的解析解求解;2)遗传算法模拟自然选择进行参数优化;3)梯度下降(GD)类算法通过迭代调整参数方向,包括标准GD、随机GD(SGD)及其改进版本如带动量的Momentum、Nesterov加速梯度等;4)自适应学习率算法如Adagrad、RMSProp和Adam,能自动调整参数学习率。文章特别指出,对于

hnjzfwy的博客 1098

神经网络优化算法

神经网络发展至今,优化算法层出不穷,但大底是出不了梯度下降的框框架架。 梯度下降法 Gradient Descent 公式: 选择负梯度方向进行参数更新,算是常规操作了。对于多层神经网络如何执行梯度下降: def update_parameters_with_gd(parameters, grads, learning_rate): """ Update parame...

u011587322的博客 1711

神经网络算法优化_训练神经网络的各种优化算法

神经网络算法优化Many people may be using optimizers while training the neural network without knowing that the method is known as optimization. Optimizers are algorithms or methods used to change the attribut...

weixin_26632369的博客 1281

R语言使用MASS包中的shuttle数据集和neuralnet包构建神经网络模型

通过以上步骤,我们成功地构建了一个基于MASS包中的shuttle数据集和neuralnet包的神经网络模型,并对模型进行了评估。通过使用适当的数据集和合理的模型结构,我们可以获得令人满意的预测结果。接下来,我们将使用MASS包中的shuttle数据集作为我们的示例数据集。首先,我们需要定义模型的结构。接下来,我们需要对数据进行预处理,以便将其用于神经网络模型的训练和测试。模型训练完成后,我们可以使用测试集对其进行评估,并计算出模型的预测准确率。最后,我们可以输出模型的准确率,并进行分析和讨论。

CodeWWWCode的博客 478

FOC控制必看:单/双/三电阻电流采样方案全对比(附NXP实战避坑指南)

本文深入对比了FOC控制中单电阻、双电阻和三电阻电流采样方案的优劣与适用场景,重点剖析了采样时序、窗口与ADC转换的工程挑战。针对NXP平台,提供了解决采样窗口过窄的实战方案与配置指南,帮助工程师根据成本与性能需求做出最优选择,并规避常见设计陷阱。

n2o3p4的博客 413

【matlab】智能优化算法优化BP神经网络

BP神经网络(Back Propagation Neural Network)是一种基于误差反向传播算法的人工神经网络,由输入层、隐层和输出层组成。它通过前向传播计算输出,然后通过反向传播调整权重和阈值,以最小化输出误差。BP神经网络广泛应用于分类、回归、模式识别等领域。智能优化算法是一类受到人类智能、生物群体社会性或自然现象规律启发的算法,用于解决复杂的优化问题。这些算法通常具有全局搜索能力,能够避免陷入局部最优解。

m0_58683132的博客 3346

深入解读ES8388寄存器:从录音到播放,如何用代码控制这颗音频Codec

本文深入解析ES8388音频编解码器的寄存器设置,从录音到播放的完整控制流程。详细介绍了寄存器架构、录音通道配置、播放通道优化以及直通(Bypass)模式的高级应用,帮助开发者通过代码精准控制这颗高性能音频Codec,解决实际开发中的音质问题。

weixin_30275415的博客 550
上一篇: 几种算法的总结
下一篇: 交叉验证(Cross-Validation)
JavaChaoCo
博客等级 码龄12年 67粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值