-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathregressiontest.m
110 lines (93 loc) · 2.27 KB
/
regressiontest.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
function [perf, error, time] = regressiontest(Xtrain,ytrain,Xtest,ytest,kernel,method,lambda,varargin)
N = size(Xtrain,2);
kernels = struct('gaussian',@kernel_gaussian,...
'laplacian',@kernel_laplacian,...
'linear',@kernel_linear);
ytrain_mean = mean(ytrain);
ytrain = ytrain-ytrain_mean;
perf.method = method;
perf.lambda = lambda;
%perf.kernels = kernels;
perf.kernel = kernel;
perf.ytrain_mean = ytrain_mean;
fprintf('Factoring...');
tic
switch method
case 'calibvar'
perf = calibvar(Xtrain); return;
case 'exact'
K = feval(getfield(kernels,kernel),Xtrain);
case 'nystrom'
d = varargin{1};
[G,W] = nystrom(Xtrain,d,getfield(kernels,kernel));
case 'rp_factorize'
d = varargin{1};
[G,W] = rp_factorize(Xtrain,d,kernel);
case 'rp_factorize_large'
d = varargin{1};
[GG,Gy,W] = rp_factorize_large(Xtrain,ytrain,d,kernel, 500);
case 'rp_factorize_large_real'
d = varargin{1};
[GG,Gy,W,B] = rp_factorize_large_real(Xtrain,ytrain,d,kernel,1000);
case 'rpbin'
d = varargin{1};
[G,W] = rpbin(Xtrain,d,kernel);
%spy(G);drawnow
otherwise
error('Don''t have a test like that');
end
perf.factorizetime = toc;
time = perf.factorizetime;
if exist('d','var')
perf.rps = d;
end
if exist('W','var')
perf.W = W;
end
if exist('B', 'var')
perf.B = B;
end
fprintf('solving...');
tic;
switch method
case 'exact'
c = (K+eye(N)*lambda)\ytrain(:);
perf.c = c;
case 'nystrom'
c = lowranksolver(G,ytrain(:),lambda);
perf.c = c;
case {'rp_factorize','rpbin'}
u = lowranksolver2(G,ytrain(:),lambda);
perf.u = u;
case {'rp_factorize_large','rp_factorize_large_real'}
u = lowranksolver3(GG,Gy,lambda);
perf.u = u;
end
perf.solvetime = toc;
if ~isempty(Xtest)
perf = evalregression(perf,Xtest,ytest);
error = perf.error
end
end
function v = calibvar(X)
p = logical(binornd(1,2000/size(X,2),1,size(X,2)));
R= L2_distance(X(:,p),X(:,p)).^2;
v= mean(R(:));
end
function K = kernel_linear(X,Y)
if nargin==1
Y = X;
end
K = X'*Y;
end
function K = kernel_gaussian(X,Y)
if nargin==1
Y = X;
end
R = L2_distance(X,Y);
K = exp(-R.^2);
end
function K = kernel_laplacian(varargin)
R = L1_distance(varargin{:});
K = exp(-R);
end