-
Notifications
You must be signed in to change notification settings - Fork 0
/
MSRDLGridSearch.m
79 lines (54 loc) · 2.18 KB
/
MSRDLGridSearch.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
%%
NNs = [10:10:100];
prctiles = 5:10:95;
Rs = 2:15;
%%
[X,Y] = extract_salinasA(); %load data
load('salinasA-SRDL-HP.mat')
Hyperparameters = rmfield(Hyperparameters,'Sigma');
X = X./vecnorm(X,2,2);
X = X + (10^(-7)).*randn(size(X));
% Calculate 1000 nearest neighbors
[Idx_NN, Dist_NN] = knnsearch(X,X,'K', 1001);
Idx_NN(:,1) = [];
Dist_NN(:,1) = [];
Dists = squareform(pdist(X));
DistsSorted = sort(Dists);
%% Run grid search
Ks = cell(length(NNs), length(Rs), length(Rs), length(prctiles));
k=0;
l=0;
for i = 1:length(NNs)
for j = 1:length(Rs)
z = zeros(M*N,1);
for l = 1:M*N
[idx1,idx2] = ind2sub([M,N], l);
z(l) = size(FindNeighbors([idx1,idx2], Rs(j), M, N),2)-1; % number of spatial neighbors at each pixel, minus 1 to exclude X(l,:).
end
l=0;
if NNs(i)<=min(z)
for k = 1:length(Rs)
for l = 1:length(prctiles)
% Set relevant hyperparameters
Hyperparameters.DiffusionNN = NNs(i);
Hyperparameters.DensityNN = NNs(i);
Hyperparameters.SpatialParams.GraphSpatialRadius=Rs(j);
Hyperparameters.SpatialParams.ConsensusSpatialRadius=Rs(k);
% Extract graph
G_SpatialRegularization = extract_graph(X, Hyperparameters);
if ~isnan(G_SpatialRegularization.EigenVals(1)) && G_SpatialRegularization.EigenVals(2)<1 && min(G_SpatialRegularization.StationaryDist) >0
% True if eigendecomposition converges to reasonable graph
Hyperparameters.Sigma0 = prctile(Dist_NN,prctiles(l),'all');
p = KDE(X,Hyperparameters, DistsSorted);
if sum(isnan(p)) == 0 && min(p)>0
Cs = M_SRDL(X, Hyperparameters, G_SpatialRegularization, p);
Ks{i,j,k,l} = Cs.K;
end
end
disp([i,j,k,l]./size(nmis))
end
end
end
disp([i,j,k,l]./size(nmis))
end
end