這裡用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 梯度...