Skip to content

Commit 6651d02

Browse files
committed
Adding support for 1D plots in the GP class
1 parent 65dbf43 commit 6651d02

10 files changed

+215
-76
lines changed

GP.m

Lines changed: 110 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ function add(obj,X,Y)
308308
function optimizeHyperParams(obj, method)
309309
%------------------------------------------------------------------
310310
% Optimize kernel hyper-parameters based on the current dictionary
311+
% Method: maximum log likelihood (See Rasmussen's book Sec. 5.4.1)
311312
%------------------------------------------------------------------
312313

313314
warning('off', 'MATLAB:nearlySingularMatrix')
@@ -317,34 +318,19 @@ function optimizeHyperParams(obj, method)
317318

318319
% error('not yet implemented!!!');
319320
for ip = 1:obj.p
320-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
321-
% TODO:
322-
% - Implement ML/MAP optimization of hyper parameters
323-
% - See Rasmussen's book Sec. 5.4.1
324-
%
325-
% - Each output dimension is a separate GP and must
326-
% be optimized separately.
327-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
328321

329322
% set optimization problem
330323
nvars = obj.n + 1 + 1; % M, var_f, var_n
331-
IntCon = [];
332324
fun = @(vars) loglikelihood(obj,ip,vars);
333-
nonlcon = [];
334-
A = [];
335-
b = [];
336-
Aeq = [];
337-
beq = [];
338325

339-
ub = [ 1e+3 * ones(obj.n,1);
340-
1e+3;
341-
1e+3 ];
326+
ub = [ 1e+5 * ones(obj.n,1);
327+
1e+5;
328+
1e+5 ];
342329
lb = [ 1e-8 * ones(obj.n,1);
343330
0*1e-8;
344-
0*1e-8 ];
331+
1e-10 ];
345332
x0 = [ diag(obj.M(:,:,ip)); obj.var_f(ip); obj.var_n(ip); ];
346333

347-
348334
% convert to log10 space
349335
ub = log10(ub);
350336
lb = log10(lb);
@@ -357,12 +343,12 @@ function optimizeHyperParams(obj, method)
357343
'PlotFcn', @gaplotbestf,...
358344
'Display','iter',...
359345
'UseParallel',false);
360-
opt_vars = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,IntCon,options);
346+
opt_vars = ga(fun,nvars,[],[],[],[],lb,ub,[],[],options);
361347
elseif strcmp(method,'fmincon')
362348
options = optimoptions('fmincon', ...
363349
'PlotFcn','optimplotfval',...
364350
'Display','iter');
365-
[opt_vars,~] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
351+
[opt_vars,~] = fmincon(fun,x0,[],[],[],[],lb,ub,[],options);
366352
else
367353
error('Method %s not implemented, please choose an existing method',method);
368354
end
@@ -382,19 +368,13 @@ function optimizeHyperParams(obj, method)
382368

383369
function logL = loglikelihood(obj,outdim,vars)
384370
%------------------------------------------------------------------
385-
% calculate the log likelihood: p(Y|X,theta)
386-
%
387-
% , where theta are the hyperparameters and (X,Y) the dictionary
371+
% calculate the log likelihood: p(Y|X,theta),
372+
% where theta are the hyperparameters and (X,Y) the dictionary
388373
%------------------------------------------------------------------
389-
390-
% M = diag(vars(1:end-2));
391-
% var_f = vars(end-1);
392-
% var_n = vars(end);
393-
394374
% variables in log10 space
395375
M = diag(10.^vars(1:end-2));
396376
var_f = 10.^vars(end-1);
397-
var_n = 10.^vars(end); % var_n = obj.var_n(outdim);
377+
var_n = 10.^vars(end);
398378

399379
Y = obj.Y(:,outdim);
400380
K = var_f * exp( -0.5 * pdist2(obj.X',obj.X','mahalanobis',M).^2 );
@@ -404,7 +384,7 @@ function optimizeHyperParams(obj, method)
404384
end
405385

406386

407-
function plot2d(obj, truthfun, varargin)
387+
function plot2d(obj, truefun, varargin)
408388
%------------------------------------------------------------------
409389
% Make analysis of the GP quality (only for the first output dimension.
410390
% This function can only be called when the GP input is 2D
@@ -415,79 +395,96 @@ function plot2d(obj, truthfun, varargin)
415395
% varargin{2} = rangeX2: <1,2> range of X1 and X2 where the data
416396
% will be evaluated and ploted
417397
%------------------------------------------------------------------
418-
% output dimension to be analyzed
419-
pi = 1;
420-
398+
421399
assert(obj.N>0, 'Dataset is empty. Aborting...')
422-
% we can not plot more than in 3D
423400
assert(obj.n==2, 'This function can only be used when dim(X)=2. Aborting...');
424401

425-
% Generate grid where the mean and variance will be calculated
426-
if numel(varargin) ~= 2
427-
factor = 0.3;%0.3;
428-
rangeX1 = [ min(obj.X(1,:)) - factor*range(obj.X(1,:)), ...
429-
max(obj.X(1,:)) + factor*range(obj.X(1,:)) ];
430-
rangeX2 = [ min(obj.X(2,:)) - factor*range(obj.X(2,:)), ...
431-
max(obj.X(2,:)) + factor*range(obj.X(2,:)) ];
432-
else
433-
rangeX1 = varargin{1};
434-
rangeX2 = varargin{2};
435-
end
436-
402+
%--------------------------------------------------------------
403+
% parse inputs
404+
%--------------------------------------------------------------
405+
p = inputParser;
406+
407+
addParameter(p,'factor',0.3);
408+
addParameter(p,'outdim',1);
409+
addParameter(p,'npoints',50);
410+
addParameter(p,'sigmalevel',2);
411+
parse(p,varargin{:});
412+
413+
factor = p.Results.factor;
414+
outdim = p.Results.outdim;
415+
npoints = p.Results.npoints;
416+
sigmalevel = p.Results.sigmalevel;
417+
418+
addParameter(p,'rangeX1', minmax(obj.X(1,:)) + [-1 1]*factor*range(obj.X(1,:)) );
419+
addParameter(p,'rangeX2', minmax(obj.X(2,:)) + [-1 1]*factor*range(obj.X(2,:)) );
420+
parse(p,varargin{:});
421+
422+
rangeX1 = p.Results.rangeX1;
423+
rangeX2 = p.Results.rangeX2;
424+
425+
%--------------------------------------------------------------
426+
% Evaluate Ytrue, Ymean and Ystd
427+
%--------------------------------------------------------------
428+
437429
% generate grid
438-
[X1,X2] = meshgrid(linspace(rangeX1(1),rangeX1(2),100),...
439-
linspace(rangeX2(1),rangeX2(2),100));
430+
[X1,X2] = meshgrid(linspace(rangeX1(1),rangeX1(2),npoints),...
431+
linspace(rangeX2(1),rangeX2(2),npoints));
440432
Ytrue = zeros('like',X1);
441433
Ystd = zeros('like',X1);
442434
Ymean = zeros('like',X1);
443435
for i=1:size(X1,1)
444436
for j=1:size(X1,2)
445437
% evaluate true function
446-
mutrue = truthfun([X1(i,j);X2(i,j)]);
447-
Ytrue(i,j) = mutrue(pi); % select desired output dim
438+
mutrue = truefun([X1(i,j);X2(i,j)]);
439+
Ytrue(i,j) = mutrue(outdim); % select desired output dim
448440
% evaluate GP model
449441
[mu,var] = obj.eval([X1(i,j);X2(i,j)],true);
450442
if var < 0
451443
error('GP obtained a negative variance... aborting');
452444
end
453445
Ystd(i,j) = sqrt(var);
454-
Ymean(i,j) = mu(:,pi); % select desired output dim
446+
Ymean(i,j) = mu(:,outdim); % select desired output dim
455447
end
456448
end
457449

450+
%--------------------------------------------------------------
451+
% Generate plots
452+
%--------------------------------------------------------------
453+
458454
% plot data points, and +-2*stddev surfaces
459455
figure('Color','w', 'Position', [-1827 27 550 420])
456+
%figure('Color','white','Position',[513 440 560 420]);
460457
hold on; grid on;
461-
% surf(X1,X2,Y, 'FaceAlpha',0.3)
462-
surf(X1,X2,Ymean+2*Ystd ,Ystd, 'FaceAlpha',0.3)
463-
surf(X1,X2,Ymean-2*Ystd,Ystd, 'FaceAlpha',0.3)
464-
scatter3(obj.X(1,:),obj.X(2,:),obj.Y(:,pi),'filled','MarkerFaceColor','red')
458+
s1 = surf(X1, X2, Ymean,'edgecolor',0.8*[1 1 1], 'EdgeAlpha', 0.3 ,'FaceColor', [153, 51, 255]/255)
459+
s2 = surf(X1, X2, Ymean+sigmalevel*Ystd, Ystd, 'FaceAlpha',0.2,'EdgeAlpha',0.2, 'EdgeColor',0.4*[1 1 1]); %, 'FaceColor',0*[1 1 1])
460+
s3 = surf(X1, X2, Ymean-sigmalevel*Ystd, Ystd, 'FaceAlpha',0.2,'EdgeAlpha',0.2, 'EdgeColor',0.4*[1 1 1]); %, 'FaceColor',0*[1 1 1])
461+
p1 = scatter3(obj.X(1,:),obj.X(2,:),obj.Y(:,outdim),'filled','MarkerFaceColor','red')
465462
title('mean\pm2*stddev Prediction Curves')
466463
xlabel('X1'); ylabel('X2');
467-
shading interp;
464+
view(70,10)
468465
colormap(gcf,jet);
469-
view(30,30)
466+
470467

471468
% Comparison between true and prediction mean
472469
figure('Color','w', 'Position',[-1269 32 1148 423])
473470
subplot(1,2,1); hold on; grid on;
474471
surf(X1,X2,Ytrue, 'FaceAlpha',.8, 'EdgeColor', 'none', 'DisplayName', 'True function');
475472
% surf(X1,X2,Ymean, 'FaceAlpha',.5, 'FaceColor','g', 'EdgeColor', 'none', 'DisplayName', 'Prediction mean');
476-
scatter3(obj.X(1,:),obj.X(2,:),obj.Y(:,pi),'filled','MarkerFaceColor','red', 'DisplayName', 'Sample points')
477-
zlim([ min(obj.Y(:,pi))-range(obj.Y(:,pi)),max(obj.Y(:,pi))+range(obj.Y(:,pi)) ]);
473+
scatter3(obj.X(1,:),obj.X(2,:),obj.Y(:,outdim),'filled','MarkerFaceColor','red', 'DisplayName', 'Sample points')
474+
zlim( minmax(obj.Y(:,outdim)') +[-1 1]*range(obj.Y(:,outdim)) );
478475
legend;
479476
title('True Function')
480477
xlabel('X1'); ylabel('X2');
481-
view(24,12)
478+
view(-60,17)
482479
subplot(1,2,2); hold on; grid on;
483480
% surf(X1,X2,Y, 'FaceAlpha',.5, 'FaceColor','b', 'EdgeColor', 'none', 'DisplayName', 'True function');
484481
surf(X1,X2,Ymean, 'FaceAlpha',.8, 'EdgeColor', 'none', 'DisplayName', 'Prediction mean');
485-
scatter3(obj.X(1,:),obj.X(2,:),obj.Y(:,pi),'filled','MarkerFaceColor','red', 'DisplayName', 'Sample points')
486-
zlim([ min(obj.Y(:,pi))-range(obj.Y(:,pi)),max(obj.Y(:,pi))+range(obj.Y(:,pi)) ]);
482+
scatter3(obj.X(1,:),obj.X(2,:),obj.Y(:,outdim),'filled','MarkerFaceColor','red', 'DisplayName', 'Sample points')
483+
zlim( minmax(obj.Y(:,outdim)') +[-1 1]*range(obj.Y(:,outdim)) );
487484
legend;
488485
title('Prediction Mean')
489486
xlabel('X1'); ylabel('X2');
490-
view(24,12)
487+
view(-60,17)
491488

492489
% plot bias and variance
493490
figure('Color','w', 'Position',[-1260 547 894 264])
@@ -523,7 +520,55 @@ function plot1d(obj, truthfun, varargin)
523520
% we can not plot more than in 3D
524521
assert(obj.n==1, 'This function can only be used when dim(X)=1. Aborting...');
525522

526-
error('Not implemented error')
523+
524+
%--------------------------------------------------------------
525+
% parse inputs
526+
%--------------------------------------------------------------
527+
p = inputParser;
528+
529+
addParameter(p,'factor',0.3);
530+
addParameter(p,'outdim',1);
531+
addParameter(p,'npoints',300);
532+
addParameter(p,'sigmalevel',2);
533+
parse(p,varargin{:});
534+
535+
factor = p.Results.factor;
536+
outdim = p.Results.outdim;
537+
npoints = p.Results.npoints;
538+
sigmalevel = p.Results.sigmalevel;
539+
540+
addParameter(p,'rangeX', minmax(obj.X) + [-1 1]*factor*range(obj.X) );
541+
parse(p,varargin{:});
542+
543+
rangeX = p.Results.rangeX;
544+
545+
546+
%--------------------------------------------------------------
547+
% Evaluate Ytrue, Ymean and Ystd
548+
%--------------------------------------------------------------
549+
550+
% generate grid
551+
X = linspace(rangeX(1),rangeX(2),npoints);
552+
% evaluate and calculate prediction mean+-2*std
553+
[mu,var] = obj.eval(X,true);
554+
Ytrue = truthfun(X);
555+
Ymean = mu';
556+
Ystd = sqrt(squeeze(var));
557+
558+
%--------------------------------------------------------------
559+
% Generate plots
560+
%--------------------------------------------------------------
561+
562+
figure('Color','w'); hold on; grid on;
563+
p0 = plot(X,Ytrue, 'LineWidth',2);
564+
p1 = plot(X,Ymean, 'LineWidth',0.5,'Color', [77, 0, 153]/255);
565+
p2 = plot(X,Ymean+sigmalevel*Ystd, 'LineWidth',0.5,'Color', [77, 0, 153]/255);
566+
p3 = plot(X,Ymean-sigmalevel*Ystd, 'LineWidth',0.5,'Color', [77, 0, 153]/255);
567+
p4 = patch([X fliplr(X)], [Ymean'+sigmalevel*Ystd' fliplr(Ymean'-sigmalevel*Ystd')], [153, 51, 255]/255, ...
568+
'FaceAlpha',0.2, 'EdgeColor','none');
569+
p5 = scatter( obj.X, obj.Y, 'MarkerFaceColor','r','MarkerEdgeColor','r');
570+
% title('mean \pm 2*std curves');
571+
xlabel('X'); ylabel('Y');
527572
end
528573
end
529574
end

Papers/kabzan2019learning.pdf

-1.32 MB
Binary file not shown.

Papers/kocijan2004gaussian.pdf

-432 KB
Binary file not shown.

Papers/ostafew2016learning.pdf

-1.58 MB
Binary file not shown.

ex_invertedPendulum_sim.slx

-31.1 KB
Binary file not shown.

ex_invertedPendulum_sim.slxc

-4.56 KB
Binary file not shown.

main_singletrack.m

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -487,16 +487,6 @@
487487
gamma = 1000;
488488
lambda = -0.1;
489489
offroad_error = 5*(sqrt((4+gamma*(lambda-offroad_error).^2)/gamma) - (lambda-offroad_error));
490-
491-
% % CHECK SMOOTH TRANSITION
492-
% x = -0.5:0.01:0.5
493-
% % Relaxied barrier function for (x<=lambda)
494-
% gamma = 10000;
495-
% lambda = -0.2;
496-
% y = 0.5*(sqrt((4+gamma*(lambda-x).^2)/gamma) - (lambda-x)); % y = -log(lambda-x)
497-
% figure; hold on; grid on;
498-
% plot(x,y)
499-
500490
cost_outside = q_r * offroad_error^2;
501491

502492
% ---------------------------------------------------------------------

genFigs.m renamed to test-files/genFigs.m

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,31 @@
3333
cellfun( @(h) delete(h), trackAnim.h_var_x_pred_opt )
3434
legend('off')
3535
title('')
36-
fp.savefig(imgname,'format','epsc')
36+
fp.savefig(imgname,'format','epsc')
37+
38+
39+
40+
41+
42+
%% CHECK RELAXED BARRIER FUNCTION PLOT
43+
44+
45+
x = -0.5:0.001:0.5;
46+
% Relaxied barrier function for (x<=lambda)
47+
gamma = 10000;
48+
lambda = -0.2;
49+
y = 0.5*(sqrt((4+gamma*(lambda-x).^2)/gamma) - (lambda-x));
50+
figure('Color','w'); hold on; %grid on;
51+
plot(x,y,'LineWidth',2)
52+
ylim([0,0.1])
53+
xlim([-0.4,0])
54+
set(gca,'YTickLabel',[]);
55+
set(gca,'XTickLabel',[]);
56+
%%%%
57+
lambda = -0.2;
58+
x = -0.6:0.001:(lambda-eps);
59+
y = 0.1*-log(lambda-x);
60+
figure('Color','w'); hold on; %grid on;
61+
plot(x,y,'LineWidth',2)
62+
xlim([-0.6,0])
63+

0 commit comments

Comments
 (0)