-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpredictor.m
143 lines (135 loc) · 5.1 KB
/
predictor.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
function [y,or1,or2,dmse] = predictor(x,dmodel)
%PREDICTOR Predictor for y(x) using the given DACE model.
%
% Call: y = predictor(x, dmodel)
% [y, or] = predictor(x, dmodel)
% [y, dy, mse] = predictor(x, dmodel)
% [y, dy, mse, dmse] = predictor(x, dmodel)
%
% Input
% x : trial design sites with n dimensions.
% For mx trial sites x:
% If mx = 1, then both a row and a column vector is accepted,
% otherwise, x must be an mx*n matrix with the sites stored
% rowwise.
% dmodel : Struct with DACE model; see DACEFIT
%
% Output
% y : predicted response at x.
% or : If mx = 1, then or = gradient vector/Jacobian matrix of predictor
% otherwise, or is an vector with mx rows containing the estimated
% mean squared error of the predictor
% Three or four results are allowed only when mx = 1,
% dy : Gradient of predictor; column vector with n elements
% mse : Estimated mean squared error of the predictor;
% dmse : Gradient vector/Jacobian matrix of mse
% hbn@imm.dtu.dk
% Last update August 26, 2002
or1 = NaN; or2 = NaN; dmse = NaN; % Default return values
if isnan(dmodel.beta)
error('DMODEL has not been found')
end
[m,n] = size(dmodel.S); % number of design sites and number of dimensions
sx = size(x); % number of trial sites and their dimension
if min(sx) == 1 && n > 1 % Single trial point
nx = max(sx);
if nx == n
mx = 1;
x = x(:).';
end
else
mx = sx(1);
nx = sx(2);
end
if nx ~= n
error('Dimension of trial sites should be %d',n)
end
% Normalize trial sites
x = (x - repmat(dmodel.Ssc(1,:),mx,1)) ./ repmat(dmodel.Ssc(2,:),mx,1);
q = size(dmodel.Ysc,2); % number of response functions
if mx == 1 % one site only
dx = repmat(x,m,1) - dmodel.S; % distances to design sites
if nargout > 1 % gradient/Jacobian wanted
[f,df] = feval(dmodel.regr, x);
[r,dr] = feval(dmodel.corr, dmodel.theta, dx);
% Scaled Jacobian
dy = (df * dmodel.beta).' + dmodel.gamma * dr;
% Unscaled Jacobian
or1 = dy .* repmat(dmodel.Ysc(2, :)', 1, nx) ./ repmat(dmodel.Ssc(2,:), q, 1);
if q == 1
% Gradient as a column vector
or1 = or1';
end
if nargout > 2 % MSE wanted
rt = dmodel.C \ r;
u = dmodel.Ft.' * rt - f.';
v = dmodel.G \ u;
or2 = repmat(dmodel.sigma2,mx,1) .* repmat((1 + sum(v.^2) - sum(rt.^2))',1,q);
if nargout > 3 % gradient/Jacobian of MSE wanted
% Scaled gradient as a row vector
Gv = dmodel.G' \ v;
g = (dmodel.Ft * Gv - rt)' * (dmodel.C \ dr) - (df * Gv)';
% Unscaled Jacobian
dmse = repmat(2 * dmodel.sigma2',1,nx) .* repmat(g ./ dmodel.Ssc(2,:),q,1);
if q == 1
% Gradient as a column vector
dmse = dmse';
end
end
end
else % predictor only
f = feval(dmodel.regr, x);
r = feval(dmodel.corr, dmodel.theta, dx);
end
% Scaled predictor
sy = f * dmodel.beta + (dmodel.gamma*r).';
% Predictor
y = (dmodel.Ysc(1,:) + dmodel.Ysc(2,:) .* sy)';
else % several trial sites
% Get distances to design sites
dx = zeros(mx*m,n);
kk = 1 : m;
for k = 1 : mx
dx(kk,:) = repmat(x(k,:),m,1) - dmodel.S;
kk = kk + m;
end
% Get regression function and correlation
f = feval(dmodel.regr, x);
r = feval(dmodel.corr, dmodel.theta, dx);
r = reshape(r, m, mx);
% Scaled predictor
sy = f * dmodel.beta + (dmodel.gamma * r).';
% Predictor
y = repmat(dmodel.Ysc(1,:),mx,1) + repmat(dmodel.Ysc(2,:),mx,1) .* sy;
if nargout > 1 % MSE wanted
rt = dmodel.C \ r;
u = dmodel.G \ (dmodel.Ft.' * rt - f.');
or1 = repmat(dmodel.sigma2,mx,1) .* repmat((1 + sum(u.^2,1) - sum(rt.^2,1))',1,q);
if nargout > 2
disp('WARNING from PREDICTOR. Only y and or1=mse are computed')
end
end
end
end
function [r,dr] = corrgauss(theta,d)
%CORRGAUSS Gaussian correlation function,
[m,n] = size(d); % number of differences and dimension of data
if length(theta) == 1
theta = repmat(theta,1,n);
elseif length(theta) ~= n
error('Length of theta must be 1 or %d',n)
end
td = d.^2 .* repmat(-theta(:).',m,1);
r = exp(sum(td, 2));
dr = repmat(-2*theta(:).',m,1) .* d .* repmat(r,1,n);
end
function [f,df] = regpoly0(S)
%REGPOLY0 Zero order polynomial regression function
f = ones(size(S,1),1);
df = zeros(size(S,2),1);
end
function [f,df] = regpoly1(S)
%REGPOLY1 First order polynomial regression function
f = [ones(size(S,1),1),S];
df = [zeros(size(S,2),1),eye(size(S,2))];
end