• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

RVM算法的matlab实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

相比于SVM,MLaPP对RVM评价颇高:We attribute the enormous popularity of SVMs not to their superiority, but to ignorance of the alternatives, and also to the lack of high quality software implementing the alternatives.


这里用Matlab实现了简单的RVM算法,具体算法详见PRML 7.2节。


下图为针对训练集预测结果,可以看到相关向量(RV:Relevance Vectors)确实很少。


代码如下:

close all;
clear all;
clc;

%% parameters
N=200; % 训练集样本数
Nts=1000; % 测试集/预测集样本数

%% data generation and display
[x,t]=datagen(N);

figure(1);
hold on;
plot(x,t,‘k.’);

%% RVM
K=RBFkernal(x,x); %生成K矩阵:N*(N+1)
% 随机初始化 alpha(系数w的先验方差倒数) 和
% beta(样本点误差的方差倒数,p(t|w,x,1/beta)=N(t|y(x),beta)=N(t|w*K,1/beta)
m=size(K,2);
alp=rand(1,m);
beta=rand();

for ii=1:1000,
% 计算原理详见PRML 7.2节
sig=pinv(diag(alp)+beta*(K’K)); % 系数w的后验方差矩阵Sigma
mu=sig
K’tbeta; % 系数w的后验均值mu/u

gamma=1-alp.*diag(sig)’;

alp_old=alp;
beta_old=beta;
idx=abs(alp)<1e3; % 部分alp会趋向于无穷大,对应的mu会趋向于会向于0,对于这部分alp不再更新
alp(idx)=gamma(idx)./(mu(idx)’.^2);
beta=(N-sum(gamma))/((t-Kmu)’(t-K*mu));

% 判断收敛则退出循环
tmp_err=max(abs(alp(idx)-alp_old(idx))./abs(alp(idx)))+abs(beta-beta_old)/abs(beta);
if tmp_err<0.1,
break;
end;

end;

% 计算并呈现训练集的预测结果,注意,这里在计算预测结果时仅使用了有效的mu值,即不为零的mu值
tpred=K(:,idx)mu(idx);
figure(1);
plot(x,tpred,'b
’);

% 呈现相关向量(Relevance Vectors)
figure(1);
plot(x(idx(2:end)),t(idx(2:end)),‘ro’);
title(‘Training Data’);
xlabel(‘x’);
ylabel(‘y’);
legend(‘RAW Data’,‘Predicted’,‘Relevance Vector’);

% 测试集/验证集数据生成、预测及呈现
[xts,tts]=datagen(Nts);
figure; hold;
plot(xts,tts,’.’);

xtsK=RBFkernal(xts,x);
ttspred=xtsK(:,idx)*mu(idx);
plot(xts,ttspred,‘o’);
title(‘Testing Data’);
xlabel(‘x’);
ylabel(‘y’);
legend(‘RAW Data’,‘Predicted’);

%%%%%%%%%%%%%%%%%%%%%

function [ x, y ] = datagen( N )
%DATAGEN Summary of this function goes here
% Detailed explanation goes here

x=(rand(N,1)-0.5)4;
y=cos(x
5)-x+randn(N,1)/4; % 注意:按照RVM算法,各数据点的误差方差应该一样

end

%%%%%%%%%%%%%%%%%%

function phi = RBFkernal( x, xb )
%RBFKERNAL Summary of this function goes here
% Detailed explanation goes here
%
% x和xb之间的K矩阵:k(i,j)=exp(-(x(i)-xb(j))^2)

len=size(x,1);
lenb=size(xb,1);
phi=ones(len,lenb+1);

for ii=1:lenb,
phi(:,ii+1)=exp(-(x-xb(ii)).^2);
end;

end


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
黄聪:Delphi的流(5)--组件序列化发布时间:2022-07-18
下一篇:
使用Delphi在SqlServer中对日期的设置发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap