-
Notifications
You must be signed in to change notification settings - Fork 1
/
ellipsoid_rotation_simulation_example.sas
95 lines (83 loc) · 3.17 KB
/
ellipsoid_rotation_simulation_example.sas
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
/*********************************************************************************************************
KTCHART IML Ellipsoid Rotation Example
The generate_ellipsoid macro generates a set of training and testing dataset for ktchart simulation.
The training data consists of uniform samples from a 3-dimensional ellipsoid centered at origin
with radii (x,y,z). The testing data consists of groups of uniform samples each generated from the training
distribution after some rotation.
Copyright © 2021, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*********************************************************************************************************/
%macro generate_rotating_ellipsoids(window_size = 1000, window_num = 1000, rotation_number = 3, x_radius = 1, y_radius = 2, z_radius = 5, outlier_fraction = 1e-4, seed = 12345);
proc iml;
call randseed(&seed);
train_size = &window_size*&window_num;
X = j(train_size,3,.);
call randgen(X,"Normal",0,1);
r = randfun(train_size,"Uniform",0,1)##(1/3);
norm = X[,##]##(0.5);
g = randfun(train_size,"Bernoulli",&outlier_fraction);
g = g#2 - ((g-1)#r);
X = g#X/norm;
M = I(3);
M[1,1] = &x_radius;
M[2,2] = &y_radius;
M[3,3] = &z_radius;
X = X*M;
run Scatter(X[,1],X[,2]);
varNames = cats("x",char(1:ncol(X)));
create trainEllipsoid from X [colname = varNames];
append from X;
close trainEllipsoid;
group_size = &window_size*10;
test_size = group_size*&rotation_number;
X = j(test_size,3,.);
group = j(test_size,1,.);
call randgen(X,"Normal",0,1);
r = randfun(test_size,"Uniform",0,1)##(1/3);
pi = constant('pi');
norm = X[,##]##(0.5);
g = randfun(test_size,"Bernoulli",&outlier_fraction);
g = g#2 - ((g-1)#r);
X = g#X/norm;
M[1,1] = &x_radius;
M[2,2] = &y_radius;
M[3,3] = &z_radius;
X = X*M;
R = I(3);
do i = 1 to 3;
R[1,1] = cos(i*pi/3);
R[2,2]= cos(i*pi/3);
R[1,2]= -sin(i*pi/3);
R[2,1]= sin(i*pi/3);
X[((i-1)*group_size+1):(i*group_size),] = X[((i-1)*group_size+1):(i*group_size),]*R;
group[((i-1)*group_size+1):(i*group_size)] = i;
end;
run Scatter(X[,1],X[,2]) group = group;
varNames = cats("x",char(1:ncol(X)));
create testEllipsoid from X [colname = varNames];
append from X;
close testEllipsoid;
quit;
data mycas.train;
set trainEllipsoid;
datetime = _N_;
run;
data mycas.test;
set testEllipsoid;
datetime = _N_;
run;
%mend generate_rotating_ellipsoids;
%generate_rotating_ellipsoids(window_size = 1000, window_num = 1000, rotation_number = 3, x_radius = 1, y_radius = 2, z_radius = 5, outlier_fraction = 1e-4, seed = 12345);
ods graphics / imagemap=on;
proc kttrain data=mycas.train window=500 overlap=0 frac=1e-4 a_lcl=0.85;
input x1-x3;
kernel / bww = 0.5 bwc = trace;
output out = mycas.out
centers = mycas.centers
kt = mycas.outkt
scoreInfo = mycas.scoreinfo
SV = mycas.SV;
run;
proc ktmonitor data = mycas.test sv = mycas.sv scoreinfo = mycas.scoreinfo a_lcl=0.8;
output out = mycas.outmon centers = mycas.centersmon;
run;