RVM演算法的matlab實現

2021-08-04 17:06:44 字數 2507 閱讀 5689

這裡用matlab實現了簡單的rvm演算法,具體演算法詳見prml 7.2節。

**如下:

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'*t*beta; % 係數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-k*mu)'*(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

RVM演算法的matlab實現

這裡用matlab實現了簡單的rvm演算法,具體演算法詳見prml 7.2節。如下 close all clear all clc parameters n 200 訓練集樣本數 nts 1000 測試集 集樣本數 data generation and display x,t datagen n ...

floyd演算法的matlab實現

2018.8.29 經過計算後得到的可行的演算法,可以算出任意兩點間的最短路程 function dist,path myfloyd a 尋找i,j兩點最短路徑 輸入 a 鄰接矩陣,元素 aij 是頂點i到j之間的直達距離,可以是有向的 sb 起點的標號 db 終點的標號 輸出 dist 最短路的距...

梯度演算法的Matlab實現

一 通過乙個例子來看梯度下降法是怎麼算的 函式,求解其最小值 1.求解梯度函式 2.給定初始點,計算出該點的梯度,開始迭代 3.計算初始點梯度模,判斷是否滿足終止條件 如果滿足,得到終點。如果不滿足,求得當前最優的學習率,然後迭代。function k ender steepest f,x,e 梯度...