-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDemoFitEllipsoidSynthetic.m
80 lines (64 loc) · 2.21 KB
/
DemoFitEllipsoidSynthetic.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
% Fit a randomly generated ellipsoid (ground truth available)
clear all
close all
%rng('default');
rng(2);
Dimension=3;
NumSamples=100;
NumSteps=20000;
Lambda=0.001;
StepSize=0.3;
MaxStepSize=2;
MinStepSize=0.001;
NumPlotPoints=30;
TrueCenter=randn(Dimension,1);
% Generate a random positive semi-definite matrix.
TrueDistanceMatrix=rand(Dimension,100);
TrueDistanceMatrix=TrueDistanceMatrix*TrueDistanceMatrix';
TrueTransformMatrix=chol(TrueDistanceMatrix)';
% Generate samples so that the true distance matrix is TrueDistanceMatrix
% and the true center is TrueCenter
% Obtain random samples evenly distributed on the surface of the unit hypersphere
Samples=randn(Dimension,NumSamples);
SampleNorms=sqrt(sum(Samples.^2,1));
Samples=Samples./repmat(SampleNorms,[Dimension 1]);
% Add some noise
Samples=Samples+0.01*randn(size(Samples));
% Transform the data into the desired hyperellipsoid
Samples=TrueTransformMatrix*Samples+repmat(TrueCenter,[1 NumSamples]);
% Check that the generated samples are on the desired hyperellipsoid
Differences=Samples-repmat(TrueCenter,[1 NumSamples]);
DistMatInvDiff=multiprod(inv(TrueDistanceMatrix),Differences,[1 2],1); % z=inv(B)*d
SquaredDistances=dot(Differences,DistMatInvDiff); % SquaredDistances=d*inv(B)*d
% Must be close to one
mean(SquaredDistances)
% Add outliers
Samples=[Samples 10*rand(3,10)];
% Fit the hyperellipsoid
tic
[FittedCenter,FittedDistanceMatrix,Errors,Volumes,Centers,LearningRates,GradientVectors]=FitEllipsoidEnhancedOpt(Samples,Lambda,StepSize,MaxStepSize,MinStepSize,NumSteps);
toc
% Plot the training samples, the true ellipsoid and the fitted ellipsoid
figure
plot3(Samples(1,:),Samples(2,:),Samples(3,:),'.g');
hold on
MyColor=[0 0 1];
PlotEllipsoid(TrueCenter,TrueDistanceMatrix,MyColor,NumPlotPoints);
MyColor=[1 0 0];
PlotEllipsoid(FittedCenter,FittedDistanceMatrix,MyColor,NumPlotPoints);
legend('Training samples','True ellipsoid','Fitted ellipsoid');
% Plot the errors
figure
plot(Errors,'-r');
xlabel('Step');
ylabel('Error');
% Plot the volumes
figure
plot(sqrt(sum(GradientVectors.^2,1)),'-b');
xlabel('Step');
ylabel('Norm of the gradient of the center vector');
% Plot the learning rates
figure
plot(LearningRates,'-r');
xlabel('Step');
ylabel('Learning rate');