@@ -67,7 +67,7 @@ randomizedLASSO = function(X,
67
67
objective_stop , # objective_stop
68
68
kkt_stop , # kkt_stop
69
69
param_stop ) # param_stop
70
-
70
+
71
71
sign_soln = sign(result $ soln )
72
72
73
73
unpenalized = lam == 0
@@ -78,6 +78,14 @@ randomizedLASSO = function(X,
78
78
active_set = which(active )
79
79
inactive_set = which(inactive )
80
80
81
+ # observed opt state
82
+
83
+ observed_scalings = abs(result $ soln )[active ]
84
+ observed_unpen = result $ soln [unpenalized ]
85
+ observed_subgrad = result $ gradient [inactive ]
86
+
87
+ observed_opt_state = c(observed_unpen , observed_scalings , observed_subgrad )
88
+
81
89
# affine transform for optimization variables
82
90
83
91
E = c(unpenalized_set , active_set )
@@ -120,12 +128,97 @@ randomizedLASSO = function(X,
120
128
internal_transform = list (linear_term = linear_term ,
121
129
offset_term = offset_term )
122
130
131
+ # density for sampling optimization variables
132
+
133
+ observed_raw = - t(X ) %*% Y
134
+ inactive_lam = lam [inactive_set ]
135
+ inactive_start = sum(unpenalized ) + sum(active )
136
+ active_start = sum(unpenalized )
137
+
138
+ # XXX only for Gaussian so far
139
+
140
+ log_optimization_density = function (opt_state
141
+ ) {
142
+
143
+
144
+ if ((sum(abs(opt_state [(inactive_start + 1 ): p ]) > inactive_lam ) > 0 ) ||
145
+ (sum(opt_state [(active_start + 1 ): inactive_start ] < 0 ) > 0 )) {
146
+ return (- Inf )
147
+ }
148
+
149
+ D = log_density_gaussian_conditional_(noise_scale ,
150
+ opt_transform $ linear_term ,
151
+ as.matrix(opt_state ),
152
+ observed_raw )
153
+ return (D )
154
+ }
155
+
123
156
return (list (active_set = active_set ,
124
157
inactive_set = inactive_set ,
125
158
unpenalized_set = unpenalized_set ,
126
159
sign_soln = sign_soln ,
127
160
optimization_transform = opt_transform ,
128
- internal_transform = internal_transform
161
+ internal_transform = internal_transform ,
162
+ log_optimization_density = log_optimization_density ,
163
+ observed_opt_state = observed_opt_state ,
164
+ observed_raw = observed_raw
129
165
))
130
166
131
167
}
168
+
169
+ sample_opt_variables = function (randomizedLASSO_obj , jump_scale , nsample = 10000 ) {
170
+ return (MCMC(randomizedLASSO_obj $ log_optimization_density ,
171
+ nsample ,
172
+ randomizedLASSO_obj $ observed_opt_state ,
173
+ acc.rate = 0.2 ,
174
+ scale = jump_scale ))
175
+ }
176
+
177
+ # Carry out a linear decompositon of an internal
178
+ # representation with respect to a target
179
+
180
+ # Returns an affine transform into raw coordinates (i.e. \omega or randomization coordinates)
181
+
182
+ linear_decomposition = function (observed_target ,
183
+ observed_internal ,
184
+ var_target ,
185
+ cov_target_internal ,
186
+ internal_transform ) {
187
+ var_target = as.matrix(var_target )
188
+ if (nrow(var_target ) == 1 ) {
189
+ nuisance = observed_internal - cov_target_internal * observed_target / var_target
190
+ target_linear = internal_transform $ linear_part %*% cov_target_internal / var_target
191
+ } else {
192
+ nuisance = observed_internal - cov_target_internal %*% solve(var_target ) %*% observed_target
193
+ target_linear = internal_transform $ linear_part %*% cov_target_internal %*% solve(var_target )
194
+ }
195
+ target_offset = internal_transform $ linear_part %*% nuisance + internal_transform $ offset
196
+ return (list (linear_term = target_linear ,
197
+ offset_term = target_offset ))
198
+ }
199
+
200
+ # XXX only for Gaussian so far
201
+
202
+ importance_weight = function (noise_scale ,
203
+ target_sample ,
204
+ opt_sample ,
205
+ opt_transform ,
206
+ target_transform ,
207
+ observed_raw ) {
208
+
209
+ log_num = log_density_gaussian_(noise_scale ,
210
+ target_transform $ linear_term ,
211
+ as.matrix(target_sample ),
212
+ optimization_transform $ linear_term ,
213
+ as.matrix(opt_state ),
214
+ target_transform $ offset_term + optimization_transform $ offset_term )
215
+
216
+ log_den = log_density_gaussian_conditional_(noise_scale ,
217
+ opt_transform $ linear_term ,
218
+ as.matrix(opt_sample ),
219
+ observed_raw )
220
+ W = log_num - log_den
221
+ W = W - max(W )
222
+ return (exp(W ))
223
+ }
224
+
0 commit comments