Adaline神经网络简单介绍和MATLAB简单实现

Adaline神经网络

Adaline利用了最小二乘法的思想,相较于感知机神经网络,对于数据的线性可分的要求更低一些,可以允许一些异常数据。

上面描述了迭代求解的过程,但是在x0(k+1)这里没看懂,如果是更新θ应该是w0(k+1)才对。应该是PPT有错。

我们来说明下迭代求解需要注意的地方。

首先,将θ并入到w中去,因为θ前面的系数始终是1,所以x也多了一列,这一列都是1。

x=[1,x1,x2,?,xn]Tw=[θ,w1,?,wn]

然后是迭代的结束条件。在代码实现中,是计算w(k?1)与w(k)之间的差来判断的,如果差很小很小,说明梯度下降很缓慢,也就是快到达极值点了。

MATLAB实现迭代求解

Adaline.m

function [ w, t ] = Adaline( X,step, init_w, init_t )
%ADALINE Summary of this function goes here
%   Detailed explanation goes here
%   X: data set with label
%   f: active function
%   step: step size
%   init_w:
%   init_t:
    if nargin < 4
       init_t = 0;
    end

    if nargin < 3
        init_w = [];
        init_t = 0;
    end

    if nargin < 2
        step = 0.1;
        init_w = [];
        init_t = 0;
    end
    label = X(:,end);

    data = X(:,1:end-1);
    [n_data,n_fea] = size(data);
    data = [ones(n_data,1) data];
    n_fea = n_fea + 1;

    n_w = size(init_w);
    if n_w ~= n_fea
       init_w = ones(n_fea,1);
       n_w = n_fea;
    end

    w = init_w;
    w(1) = init_t;
    eps = 1e-6;

    while true
        for i=1:n_w
           dw = (label - data*w)‘*data(:,i);
           new_w(i) = w(i) + step*dw;
        end
        if sum((new_w‘-w).^2) < eps
            break;
        else
            w = new_w‘;
        end

    end
    t = w(1,1);
    w = w(2:end);
end

demo.m 用于简单测试

clc;

%% create random points for train
c1 = [1 1];
c2 = [3 3];

n_L1 = 50; % number of item with label 1
n_L2 = 20; % number of item with label 2

A = zeros(n_L1,3);
A(:,3) = 1;
B = zeros(n_L2,3);
B(:,3) = -1;

% create random point
for i=1:n_L1
    A(i,1:2) = c1 + randn(1,2);
end
for i=1:n_L2
    B(i,1:2) = c2 + randn(1,2);
end
% show points
scatter(A(:,1), A(:,2),[],‘r‘);
hold on
scatter(B(:,1), B(:,2),[],‘g‘);

%% training with above points
%AA = [ones(n_L1,1) A];
%BB = [ones(n_L2,1) B];
X = [A;B];
%X = [1 1 1 0 1;1 1 0 1 1;1 1 1 1 -1];
[w, t] = Adaline(X,0.0001);
%[w,t] = Adaline2(X);

%%
% plot the result
A = w(1);
B = w(2);
C = t;
if B==0
    %生成100个-C/A放在向量x中.
    x=linspace(-C/A,-C/A,100);
    %从-A)-(|A|+|B|+|C|)到|A|+|B|+|C|等距离生成100个值放在向量y中.?
    y=linspace(-abs(A)-abs(B)-abs(C),abs(A)+abs(B)+abs(C),100);
else
    x = linspace(0, 10, 100);
    y = -w(1)/w(2) * x;
    y = y - 1/w(2)*t;
end
hold on
plot(x,y)

正规化求解

除了迭代求解外,有一种正规化的的方法。这种方法对于不是很大数据集求解是很快的,主要是因为要求矩阵的逆,如果矩阵太大了,求逆将会变得很慢很慢。

Adaline2.m

function [ w, t ] = Adaline2( X )
%ADALINE2 Summary of this function goes here
%   Detailed explanation goes here

    data = X(:,1:end-1);
    label = X(:,end);

    [n_data, n_fea] = size(X);
    data = [ones(n_data, 1) data];
    n_fea = n_fea + 1;

    w = pinv(data‘*data)*(data‘*label);

    t = w(1,1);
    w = w(2:end);
end
时间: 2024-11-05 09:37:44

Adaline神经网络简单介绍和MATLAB简单实现的相关文章

JBoss 系列九十六:JBoss MSC - 简单介绍及一个简单示例

什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MSC 替换了之前的 JMX Kernel 和 MicroContainer,它主要特定可以总结如下三点: 高并发容器(A highly concurrent state machine) 无多相位,设计简单(No multiple phases, much simpler) 不依赖 JMX 和 Jav

神经进化学的简单介绍和一个简单的CPPN(Compositional Pattern Producing Networks)DEMO

最近迷上神经进化(Neuroevolution)这个方向,感觉是Deep Learning之后的一个很不错的研究领域.该领域的一个主导就是仿照人的遗传机制来进化网络参数与结构.注意,连网络结构都可以进化,就是不像是传统的神经网络,结构是提前定义好的. 最近这个领域研究的比较多的是 弗罗里达大学的Stanley教授,主要的贡献有NEAT,HyperNEAT以及Novelty Search,有兴趣的可以去google之. NEAT与HyperNEAT都是一种indirect coding算法,目的在

iOS开发拓展篇-XMPP简单介绍

iOS开发拓展篇-XMPP简单介绍 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容 有许多的IM系统,如AOL IM.Yahoo IM. MSN以及QQ,它们最大的区别在于各自通讯协议的实现,所以即时通讯技术的核心在于它的传输协议 协议用来说明信息在网络上如何传输,如果有了统一的传输协议,那么应当可以实现各个IM之间的直接通讯,为了创建即时通讯的统一标准,目前已

iOS开发UI篇-UIWindow简单介绍

iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow.也就说,没有UIWindow,就看不见任何UI界面 补充:UIWindow是创建的第一个视图控件(创建的第一个

iOS开发数据库篇—FMDB简单介绍

iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱 3.FMDB的github地址 https://github.com/ccgus/fmdb 二.核心类 FMDB有三个主要的类 (1)FMDa

C++map类型 之 简单介绍

一:map的前世今生 (1)从关联容器与顺序容器说起.关联容器通过键(key)存储和读取元素.而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等). 关联容器(Associative containers)支持通过键来高效地查找和读取元素. 两个主要的关联容器类型是 map 和 set. 当中map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set 仅包括一个键.并有效地支持

iOS开发UI篇—UIWindow简单介绍

iOS开发UI篇—UIWindow简单介绍 - 文顶顶 - 博客园 文顶顶 iOS开发UI篇—UIWindow简单介绍 iOS开发UI篇—UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWi

iOS开发UI篇—Modal简单介绍

iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展?出来 Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为? 二.代码说明 新建一个项目,在Application的代理中添加window和控制器. TXAppDelegate.m文件 1 #import "TXAppDelegate.h" 2 #import "TXOneViewController

iOS开发UI篇—popoverController简单介绍

iOS开发UI篇—popoverController简单介绍 一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController 它只占用部分屏幕空间来呈现信息,而且显示在屏幕的最前面 2.使用步骤 要想显示一个UIPopoverController,需要经过下列步骤 (1)设置内容控制器 由于UIPopoverController直接继承