机器学习之从logistic到神经网络算法

在前两节曾经介绍过logistic回归与分类算法,并对线性与非线性数据集分别进行分类实验。Logistic采用的是一层向量权值求和的方式进行映射,所以本质上只能对线性分类问题效果较好(实验也可以看到),其模型如下所示(详细的介绍可看上两次博客:

机器学习之logistic分类线性与非线性实验(续)):

既然如此,我们可不可以在Y出来之前在多进行几次映射呢?答案是可以的,这就引出了多层网络,每层网络的输出后再进行sigmod映射到0-1之间,那么它就是神经网络系统了。比如上面的多加几层就可以表示为:

同样样本的输入从最左端开始,通过权值w矩阵计算得到第一层y值,得到的结果分别进行sigmod函数映射作为第二层的输入,然后经过权值矩阵u得到z,在进行映射,依次类推最终得到输出Y,那么这个多层网络和上面的单层相比有哪些不同?

  1. 首先可以看到最终输出Y和输入(x1,x2)已经不再是简单的权值相乘再映射了,而是权值相乘后映射,然后再权值相乘映射,再相乘映射最终得到Y,那么Y与(x1,x2)的关系在网络前后早已经不再是线性关系了,是什么关系,谁知道了。
  2. 可能会说,像这样的网络,为什么多加了两层?不是还可以继续增加吗?每层里面为什么是3个节点?不是还可以增加吗?没错,上述的层数以及每层的个数都可以增加,这就是神经网络的需要设计之处,每增加一层以及每层的节点数,网络的关系就会发生变化,至于变成什么样子,不用管,至于究竟用多少层多少个节点,那就看实际效果。这就涉及到神经网络的深层讨论范畴。
  3. 先说该网络,在一个网络确定后(什么叫确定?就是网络上的所有权值系数都知道)显然Y与(x1,x2)是一种非线性关系,可以简单的看到,上述y1,y2,y3分别与(x1,x2)有关,z1,z2,z3分别于y1,y2,y3有关,而最终的Y又分别与z1,z2,z3有关,在多层迭代后,Y就可以用(x1,x2)的非线性复合关系表示出来了。一般来说,这个网络是可以表示任意的非线性关系的。
  4. 在已知这样一个网络的所有参数以后,那么给定一个输入,得到输出是非常快的,就是一直正向计算,而计算机做这件事很轻松,所以说训练好的神经网络是一种非常快的分类方法。然而这个网络参数的训练过程却并不是那么轻松愉快。

经过上述的说明,我们已经知道神经网络的强大(表示任意的非线性关系的)。那么下面的问题就是如何训练这个网络。

在logistic分类算法中,我们知道,那样一个一层网络权值参数是通过结果与预测结果的误差值,通过梯度下降法不断调整权值参数的。那么这个多层网络呢?同样采用这种方法来实现,不同的是,这里需要一层一层的计算。

首先我们设定好隐含层以及每层的节点数,然后构造一个权值随机的网络,对于训练样本的每一个样本输入就会有一个输出值o,那么这个o与实际的值t会有一个误差e(既然是训练样本,一定会有一个目标分类结果t的),根据上图的结果可以看到,这个e将直接与最后一层的输入z’(sigmod出来的值)以及权值v相关,这样我们可以通过这个e来更新v,同时我们可以将这个误差e按照输入z’和权值v的大小分别分配到上一层的误差,也就是系统经过z后出来的误差值e1,e2,e3。(这个e1,e2,e3可以通过e、z’、v计算出来)。这样我们可以根据e1,e2,e3来更新权值u,同理再上一层y层,我们同样会有一组误差e4,e5,e6,而e4,e5,e6又可以通过其后面网络的值来表示,这样再更新权值w,如果还有,再继续往前面传播。对于权值的更新以及误差,这种通过后面网络的结果往前面传播的方法,就是神经网络中的反向传播算法。

下面来简单说说关于误差怎么往后面传播的,同时权值的计算公式是怎么更新的。这部分一本书

《机器学习》

的P74-P75上有详细的推导过程可以看看(考虑到两页公式,编辑公式实属不易就省了吧)。看不进书的,在附几个blog看看(书上最详细):

神经网络与反向传播算法

反向传播神经网络 BPNN

这里只给出最终的权值更新结果:

?wij=?η?Ed?wij=η(tj?oj)oj(1?oj)xji

wij=wij+?wij

其中η是一个步长系数,t是对应该层的输出,o是对应该层的目标值,x是对应该层的输入。那么对每一层网络用此公式进行权值更新,更新完后将新的权值再进行迭代算网络输出误差,并将这个误差再反向传播,更新权值,一直这样下去即可。

下面是算法的伪代码(只是两层网络的结构,多层的话还得增加循环):

这个曾经在Matlab之BP神经网络反向传播算法也讨论过。

说了这么多可以进行实验了。实验之前首先是样本选择,这里人为产生两组数据集:线性与非线性,画出来就如下(每类100个样本,两类):

可以看到,线性与非线性里面的两类分界面人为设置了一些重叠(这些重叠是一般是不可能划出来的)。

下面构造网络,网络就采用最前面的那个含有2个隐含层、每层3个节点的网络,输入是二维数据正好,输出是一维数据(分类标签,也正好)。

代码如下:

%%
% * 神经网络分类设计
% * 简单0-1两类分类--线性与非线性分类
%
%%
clc
clear
close all
%% Load data
% * 数据预处理--分两类情况
% 并将标签重新设置为0与1,方便sigmod函数应用
data = load(‘data_test1.mat‘);
data = data.data‘;
%标签设置0,1
data(:,3) = data(:,3) - 1;
%选择训练样本个数
num_train = 50;
%构造随机选择序列
choose = randperm(length(data));
train_data = data(choose(1:num_train),:);
gscatter(train_data(:,1),train_data(:,2),train_data(:,3));
label_train = train_data(:,end);
test_data = data(choose(num_train+1:end),:);
label_test = test_data(:,end);
%% initial parameter
% 输入-输出的数据维度
num_in = size(train_data,2) - 1;
num_out = 1;%输出只有标签--1维
% 网络的权值参数
m = 2;%定义隐含网络层数
n = 3;%定义每层隐含网络节点
inta = 0.1;%学习步长
%% 初始化随机赋值网络权值
for i = 1:m+1
    if i == 1 %输入层
        w{i} = rand(n,num_in);
        continue;
    end
    if i == m+1 %输出层
        w{i} = rand(num_out,n);
        continue;
    end
    w{i} = rand(n,n);
end
%% 训练网络
for gen = 1:1000
    for i = 1:length(train_data)
        %% 正向计算各个层节点的输出值
        data_simple = train_data(i,1:end-1);
        net1 = data_simple*w{1}‘;%第一层隐层各节点输入
        h1 = 1./(1+exp(-net1));%得到隐层各节点输出
        net2 = h1*w{2}‘;%第而层隐层各节点输入
        h2 = 1./(1+exp(-net2));%得到隐层各节点输出
        net3 = h2*w{3}‘;%输出层各节点输入
        z = 1./(1+exp(-net3));
        %% 反向计算各个输出层的误差delta
        delta3 = (label_train(i) - z)*z*(1-z);%输出层的误差
        for j = 1:3
            delta2(j)=(delta3*w{3}(j))*h2(j)*(1-h2(j));
        end
        for j = 1:3
            delta1(j)=(delta2*w{2}(:,j))*h1(j)*(1-h1(j));
        end
        %% 逐次更新网络的权值
        % 第二层到输出层权值
        for j = 1:3
            w{3}(j) = w{3}(j) + inta*delta3*h2(j);
        end
        % 第1层到第2层权值
        for j = 1:3
            for k = 1:3
                w{2}(j,k) = w{2}(j,k) + inta*delta2(j)*h1(k);
            end
        end
        % 输入层到第1层权值
        for j = 1:3
            for k = 1:num_in
                w{1}(j,k) = w{1}(j,k) + inta*delta1(j)*data_simple(k);
            end
        end
    end%得到输出层各节点输出
end

%% 预测分类结果
predict = zeros(1,length(test_data));
for i = 1:length(test_data)
    % 正向计算各个层节点的输出值
    data_simple = test_data(i,1:end-1);
    net1 = data_simple*w{1}‘;%第一层隐层各节点输入
    h1 = 1./(1+exp(-net1));%得到隐层各节点输出
    net2 = h1*w{2}‘;%第而层隐层各节点输入
    h2 = 1./(1+exp(-net2));%得到隐层各节点输出
    net3 = h2*w{3}‘;%输出层各节点输入
    z = 1./(1+exp(-net3));
    if z > 0.5
        predict(i) = 1;
    else
        predict(i) = 0;
    end
end
%% 显示结果
figure;
index1 = find(predict==0);
data1 = (test_data(index1,:))‘;
plot(data1(1,:),data1(2,:),‘or‘);
hold on
index2 = find(predict==1);
data2 = (test_data(index2,:))‘;
plot(data2(1,:),data2(2,:),‘*‘);
hold on
indexw = find(predict‘~=(label_test));
dataw = (test_data(indexw,:))‘;
plot(dataw(1,:),dataw(2,:),‘+g‘,‘LineWidth‘,3);
accuracy = length(find(predict‘==label_test))/length(test_data);
title([‘predict the training data and the accuracy is :‘,num2str(accuracy)]);

相关的注释在程序中,更新迭代部分可能要对照公式(伪代码)才能理解是什么意思。

好了首先加载线性数据结果:

绿色的表示分错了。可以看到神经网络对于线性很轻松,设置1000此迭代足以。至于为什么还有分错的,我们说过,我在构造数据的时候特意在分界面上下设置了一些混杂数据,这些数据一般来说不可能分出来的。

下面进行非线性实验:

这是50个训练下150个测试样本在迭代10000次后的结果,结果的好坏与训练样本的个数,权值学习步长,迭代次数有很大的关系。说实话这个结果并不不是很理想,但是起码非线性的效果有了。我调整过参数,也增加了迭代次数,始终没有把准确率弄到80%以上。我觉得可能的原因是

  1. 首先这个程序是最简单基础的神经网络,学习步长是定值,权值更新无记忆性,这些都可以进一步的优化,就拿学习步长,迭代初期学习步长可以大点,后期,学习步长可以小点。权值更新也可以再加一个记忆性,就是将上一次的结果以一定的比例加到这一次的结果中。
  2. 还有一点就是关于样本输出值的问题,可以看到最终的输出值也是经过了sigmod函数变为0-1之间的,也就是说如果事先你的所有样本的目标值不在0-1之间,网络就不会有正负反馈的(要么都是正反馈,要么都是负反馈),不可能找到正确的网络参数。当然我这里样本目标输出是变化到0,1,也就是类标签,很极限,不知道有没有这个原因导致结果的准确性,其实我感觉理想结果是分类面会出来一个圆的,虽然是基础神经网络,但是毕竟是神经网络,至于为什么差了那么一点,这位仁兄你知道原因吗?

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-22 23:39:14

机器学习之从logistic到神经网络算法的相关文章

机器学习(4)之Logistic回归

机器学习(4)之Logistic回归 1. 算法推导 与之前学过的梯度下降等不同,Logistic回归是一类分类问题,而前者是回归问题.回归问题中,尝试预测的变量y是连续的变量,而在分类问题中,y是一组离散的,比如y只能取{0,1}. 假设一组样本为这样如图所示,如果需要用线性回归来拟合这些样本,匹配效果会很不好.对于这种y值只有{0,1}这种情况的,可以使用分类方法进行. 假设,且使得 其中定义Logistic函数(又名sigmoid函数): 下图是Logistic函数g(z)的分布曲线,当z

《机器学习实战》Logistic回归算法(1)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

Python神经网络算法与深度学习视频教程人工智能算法机器学习实战视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

人工智能,神经网络算法,机器学习,深度学习三者关系

对于很多初入学习人工智能的学习者来说,对人工智能.机器学习.深度学习的概念和区别还不是很了解,有可能你每天都能听到这个概念,也经常提这个概念,但是你真的懂它们之间的关系吗?那么接下来就给大家从概念和特点上进行阐述.先看下三者的关系. 人工智能包括了机器学习和深度学习,机器学习包括了深度学习,他们是子类和父类的关系. 下面这张图则更加细分. 2.什么是人工智能 人工智能(ArtificialIntelligence),英文缩写为AI.是计算机科学的一个分支.人工智能是对人的意识.思维的信息过程的模

推荐文章:机器学习:“一文读懂机器学习,大数据/自然语言处理/算法全有了

PS:文章主要转载自CSDN大神"黑夜路人"的文章:          http://blog.csdn.NET/heiyeshuwu/article/details/43483655      本文主要对机器学习进行科普,包括机器学习的定义.范围.方法,包括机器学习的研究领域:模式识别.计算机视觉.语音识别.自然语言处理.统计学习和数据挖掘.这是一篇非常好的文章,尤其感学原文作者~          http://www.thebigdata.cn/JieJueFangAn/1308

一文读懂机器学习,大数据/自然语言处理/算法全有了……

原文地址 http://www.open-open.com/lib/view/open1420615208000.html http://www.cnblogs.com/subconscious/p/4107357.html 引论 在本篇文章中,我将对机器学习做个概要的介绍.本文的目的是能让即便全然不了解机器学习的人也能了解机器学习.而且上手相关的实践.这篇文档也算是 EasyPR开发的番外篇.从这里開始.必须对机器学习了解才干进一步介绍EasyPR的内核.当然,本文也面对一般读者.不会对阅读有

如何用70行Java代码实现深度神经网络算法(转)

对于现在流行的深度学习,保持学习精神是必要的——程序员尤其是架构师永远都要对核心技术和关键算法保持关注和敏感,必要时要动手写一写掌握下来,先不用关心什么时候用到——用不用是政治问题,会不会写是技术问题,就像军人不关心打不打的问题,而要关心如何打赢的问题. 程序员如何学习机器学习 对程序员来说,机器学习是有一定门槛的(这个门槛也是其核心竞争力),相信很多人在学习机器学习时都会为满是数学公式的英文论文而头疼,甚至可能 知难而退.但实际上机器学习算法落地程序并不难写,下面是70行代码实现的反向多层(B

使用Python scikit-learn 库实现神经网络算法

1:神经网络算法简介 2:Backpropagation算法详细介绍 3:非线性转化方程举例 4:自己实现神经网络算法NeuralNetwork 5:基于NeuralNetwork的XOR实例 6:基于NeuralNetwork的手写数字识别实例 7:scikit-learn中BernoulliRBM使用实例 8:scikit-learn中的手写数字识别实例 一:神经网络算法简介 1:背景 以人脑神经网络为启发,历史上出现过很多版本,但最著名的是backpropagation 2:多层向前神经网

scikit-learn学习之神经网络算法

====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正 转载请注明出处,谢谢 ====================================================================== scikit-learn博主使用的是0.17版本,是稳定版,当然现在有0.18发行