RBF神经网络简单介绍与MATLAB实现
2017-05-30 09:10
2191 查看
RBF的直观介绍
RBF是一种两层的网络
RBF的隐层是一种非线性的映射
RBF输出层是线性的
RBF的基本思想是将数据转化到高维空间使其在高维空间线性可分
RBF学习算法
Lazy RBF
MATLAB实现RBF神经网络
yj=∑i=1nwijϕ(∥x−ui∥2),(j=1,…,p)
ϕ(∥x−u∥)=e−∥x−u∥2σ2
上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
对于上图的RBF网络,其未知量有:中心向量ui,高斯函数中常数σ,输出层权值W。
学习算法的整个流程大致如下图:
具体可以描述为:
1. 利用kmeans算法寻找中心向量ui
2. 利用kNN(K nearest neighbor)rule 计算 σ
σi=1K∑k=1K∥uk−ui∥2−−−−−−−−−−−−−−⎷
3. W可以利用最小二乘法求得
demo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。
上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果y来看,其实对于XOR问题来说,4个就可以了。
RBF_training.m 对demo.m中训练的过程进行封装
RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的’\‘方法
RBF_predict.m 预测
RBF是一种两层的网络
RBF的隐层是一种非线性的映射
RBF输出层是线性的
RBF的基本思想是将数据转化到高维空间使其在高维空间线性可分
RBF学习算法
Lazy RBF
MATLAB实现RBF神经网络
RBF的直观介绍
RBF具体原理,网络上很多文章一定讲得比我好,所以我也不费口舌了,这里只说一说对RBF网络的一些直观的认识1 RBF是一种两层的网络
是的,RBF结构上并不复杂,只有两层:隐层和输出层。其模型可以数学表示为:yj=∑i=1nwijϕ(∥x−ui∥2),(j=1,…,p)
2 RBF的隐层是一种非线性的映射
RBF隐层常用激活函数是高斯函数:ϕ(∥x−u∥)=e−∥x−u∥2σ2
3 RBF输出层是线性的
4 RBF的基本思想是:将数据转化到高维空间,使其在高维空间线性可分
RBF隐层将数据转化到高维空间(一般是高维),认为存在某个高维空间能够使得数据在这个空间是线性可分的。因此啊,输出层是线性的。这和核方法的思想是一样一样的。下面举个老师PPT上的例子:上面的例子,就将原来的数据,用高斯函数转换到了另一个二维空间中。在这个空间里,XOR问题得到解决。可以看到,转换的空间不一定是比原来高维的。
RBF学习算法
对于上图的RBF网络,其未知量有:中心向量ui,高斯函数中常数σ,输出层权值W。
学习算法的整个流程大致如下图:
具体可以描述为:
1. 利用kmeans算法寻找中心向量ui
2. 利用kNN(K nearest neighbor)rule 计算 σ
σi=1K∑k=1K∥uk−ui∥2−−−−−−−−−−−−−−⎷
3. W可以利用最小二乘法求得
Lazy RBF
可以看到原来的RBF挺麻烦的,又是kmeans又是knn。后来就有人提出了lazy RBF,就是不用kmeans找中心向量了,将训练集的每一个数据都当成是中心向量。这样的话,核矩阵Φ就是一个方阵,并且只要保证训练中的数据是不同的,核矩阵Φ就是可逆的。这种方法确实lazy,缺点就是如果训练集很大,会导致核矩阵Φ也很大,并且要保证训练集个数要大于每个训练数据的维数。MATLAB实现RBF神经网络
下面实现的RBF只有一个输出,供大家参考参考。对于多个输出,其实也很简单,就是W变成了多个,这里就不实现了。demo.m 对XOR数据进行了RBF的训练和预测,展现了整个流程。最后的几行代码是利用封装形式进行训练和预测。
clc; clear all; close all; %% ---- Build a training set of a similar version of XOR c_1 = [0 0]; c_2 = [1 1]; c_3 = [0 1]; c_4 = [1 0]; n_L1 = 20; % number of label 1 n_L2 = 20; % number of label 2 A = zeros(n_L1*2, 3); A(:,3) = 1; B = zeros(n_L2*2, 3); B(:,3) = 0; % create random points for i=1:n_L1 A(i, 1:2) = c_1 + rand(1,2)/2; A(i+n_L1, 1:2) = c_2 + rand(1,2)/2; end for i=1:n_L2 B(i, 1:2) = c_3 + rand(1,2)/2; B(i+n_L2, 1:2) = c_4 + rand(1,2)/2; end % show points scatter(A(:,1), A(:,2),[],'r'); hold on scatter(B(:,1), B(:,2),[],'g'); X = [A;B]; data = X(:,1:2); label = X(:,3); %% Using kmeans to find cinter vector n_center_vec = 10; rng(1); [idx, C] = kmeans(data, n_center_vec); hold on scatter(C(:,1), C(:,2), 'b', 'LineWidth', 2); %% Calulate sigma n_data = size(X,1); % calculate K K = zeros(n_center_vec, 1); for i=1:n_center_vec K(i) = numel(find(idx == i)); end % Using knnsearch to find K nearest neighbor points for each center vector % then calucate sigma sigma = zeros(n_center_vec, 1); for i=1:n_center_vec [n, d] = knnsearch(data, C(i,:), 'k', K(i)); L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2); L2 = sum(L2(:)); sigma(i) = sqrt(1/K(i)*L2); end %% Calutate weights % kernel matrix k_mat = zeros(n_data, n_center_vec); for i=1:n_center_vec r = bsxfun(@minus, data, C(i,:)).^2; r = sum(r,2); k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2)); end W = pinv(k_mat'*k_mat)*k_mat'*label; y = k_mat*W; %y(y>=0.5) = 1; %y(y<0.5) = 0; %% training function and predict function [W1, sigma1, C1] = RBF_training(data, label, 10); y1 = RBF_predict(data, W, sigma, C1); [W2, sigma2, C2] = lazyRBF_training(data, label, 2); y2 = RBF_predict(data, W2, sigma2, C2);
上图是XOR训练集。其中蓝色的kmenas选取的中心向量。中心向量要取多少个呢?这也是玄学问题,总之不要太少就行,代码中取了10个,但是从结果y来看,其实对于XOR问题来说,4个就可以了。
RBF_training.m 对demo.m中训练的过程进行封装
function [ W, sigma, C ] = RBF_training( data, label, n_center_vec ) %RBF_TRAINING Summary of this function goes here % Detailed explanation goes here % Using kmeans to find cinter vector rng(1); [idx, C] = kmeans(data, n_center_vec); % Calulate sigma n_data = size(data,1); % calculate K K = zeros(n_center_vec, 1); for i=1:n_center_vec K(i) = numel(find(idx == i)); end % Using knnsearch to find K nearest neighbor points for each center vector % then calucate sigma sigma = zeros(n_center_vec, 1); for i=1:n_center_vec = knnsearch(data, C(i,:), 'k', K(i)); L2 = (bsxfun(@minus, data(n,:), C(i,:)).^2); L2 = sum(L2(:)); sigma(i) = sqrt(1/K(i)*L2); end % Calutate weights % kernel matrix k_mat = zeros(n_data, n_center_vec); for i=1:n_center_vec r = bsxfun(@minus, data, C(i,:)).^2; r = sum(r,2); k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2)); end W = pinv(k_mat'*k_mat)*k_mat'*label; end
RBF_lazytraning.m 对lazy RBF的实现,主要就是中心向量为训练集自己,然后再构造核矩阵。由于Φ一定可逆,所以在求逆时,可以使用快速的’\‘方法
function [ W, sigma, C ] = lazyRBF_training( data, label, sigma ) %LAZERBF_TRAINING Summary of this function goes here % Detailed explanation goes here if nargin < 3 sigma = 1; end n_data = size(data,1); C = data; % make kernel matrix k_mat = zeros(n_data); for i=1:n_data L2 = sum((data - repmat(data(i,:), n_data, 1)).^2, 2); k_mat(i,:) = exp(L2'/(2*sigma)); end W = k_mat\label; end
RBF_predict.m 预测
function [ y ] = RBF_predict( data, W, sigma, C ) %RBF_PREDICT Summary of this function goes here % Detailed explanation goes here n_data = size(data, 1); n_center_vec = size(C, 1); if numel(sigma) == 1 sigma = repmat(sigma, n_center_vec, 1); end % kernel matrix k_mat = zeros(n_data, n_center_vec); for i=1:n_center_vec r = bsxfun(@minus, data, C(i,:)).^2; r = sum(r,2); k_mat(:,i) = exp((-r.^2)/(2*sigma(i)^2)); end y = k_mat*W; end
相关文章推荐
- RBF神经网络的matlab简单实现
- 神经网络之感知器算法简单介绍和MATLAB简单实现
- RBF神经网络的matlab简单实现
- RBF神经网络的matlab简单实现
- Adaline神经网络简单介绍和MATLAB简单实现
- RBF神经网络与BP神经网络与matlab实现
- 径向基函数(RBF)神经网络及matlab实现
- 最简单的三层神经网络Matlab实现
- TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络
- 在matlab基础上简单实现一个神经网络算法
- 神经网络及其简单实现(MATLAB)
- 一个简单的matlab项目实现三层神经网络的简单应用
- 机器学习-实现简单神经网络+自适应神经网络
- 神经网络学习(四)反向(BP)传播算法(2)-Matlab实现
- KVM虚拟化的四种简单网络模型介绍及实现(二)
- 机器学习与神经网络(四):BP神经网络的介绍和Python代码实现
- Neural Networks神经网络个人小结与MATLAB实现
- 基于NAR神经网络的化工产品价格预测的实现(Matlab)
- MATLAB神经网络学习笔记之:感知器网络实现‘或’门
- 神经网络简单实现和公式推导