getting_started_3.py 3.56 KB
 Jakob Knollmueller committed Jul 02, 2018 1 2 3 4 5 ``````import nifty5 as ift import numpy as np def get_random_LOS(n_los): `````` 6 7 `````` starts = list(np.random.uniform(0, 1, (n_los, 2)).T) ends = list(np.random.uniform(0, 1, (n_los, 2)).T) `````` Jakob Knollmueller committed Jul 02, 2018 8 9 10 `````` return starts, ends `````` 11 `````` `````` Jakob Knollmueller committed Jul 02, 2018 12 ``````if __name__ == '__main__': `````` 13 `````` # ## ABOUT THIS TUTORIAL `````` Jakob Knollmueller committed Jul 02, 2018 14 `````` np.random.seed(42) `````` 15 `````` position_space = ift.RGSpace([128, 128]) `````` Jakob Knollmueller committed Jul 02, 2018 16 `````` `````` Jakob Knollmueller committed Jul 02, 2018 17 `````` # Setting up an amplitude model `````` Martin Reinecke committed Jul 03, 2018 18 `````` A, amplitude_internals = ift.library.make_amplitude_model( `````` 19 `````` position_space, 16, 1, 10, -4., 1, 0., 1.) `````` Jakob Knollmueller committed Jul 02, 2018 20 21 22 23 24 25 26 27 28 29 30 31 32 33 `````` # Building the model for a correlated signal harmonic_space = position_space.get_default_codomain() ht = ift.HarmonicTransformOperator(harmonic_space, position_space) power_space = A.value.domain[0] power_distributor = ift.PowerDistributor(harmonic_space, power_space) position = {} position['xi'] = ift.Field.from_random('normal', harmonic_space) position = ift.MultiField(position) xi = ift.Variable(position)['xi'] Amp = power_distributor(A) correlated_field_h = Amp * xi correlated_field = ht(correlated_field_h) `````` Martin Reinecke committed Jul 03, 2018 34 35 `````` # alternatively to the block above one can do: # correlated_field,_ = ift.library.make_correlated_field(position_space, A) `````` Jakob Knollmueller committed Jul 02, 2018 36 37 38 39 `````` # apply some nonlinearity signal = ift.PointwisePositiveTanh(correlated_field) # Building the Line of Sight response `````` Jakob Knollmueller committed Jul 02, 2018 40 `````` LOS_starts, LOS_ends = get_random_LOS(100) `````` Martin Reinecke committed Jul 03, 2018 41 42 `````` R = ift.library.LOSResponse(position_space, starts=LOS_starts, ends=LOS_ends) `````` Jakob Knollmueller committed Jul 02, 2018 43 `````` # build signal response model and model likelihood `````` Jakob Knollmueller committed Jul 02, 2018 44 `````` signal_response = R(signal) `````` Jakob Knollmueller committed Jul 02, 2018 45 46 `````` # specify noise data_space = R.target `````` Jakob Knollmueller committed Jul 02, 2018 47 `````` noise = .001 `````` 48 `````` N = ift.ScalingOperator(noise, data_space) `````` Jakob Knollmueller committed Jul 02, 2018 49 50 51 `````` # generate mock data MOCK_POSITION = ift.from_random('normal', signal.position.domain) `````` Jakob Knollmueller committed Jul 02, 2018 52 `````` data = signal_response.at(MOCK_POSITION).value + N.draw_sample() `````` Jakob Knollmueller committed Jul 02, 2018 53 54 55 56 57 `````` # set up model likelihood likelihood = ift.GaussianEnergy(signal_response, mean=data, covariance=N) # set up minimization and inversion schemes `````` Jakob Knollmueller committed Jul 02, 2018 58 59 `````` ic_cg = ift.GradientNormController(iteration_limit=10) ic_sampling = ift.GradientNormController(iteration_limit=100) `````` Jakob Knollmueller committed Jul 02, 2018 60 61 `````` ic_newton = ift.GradientNormController(name='Newton', iteration_limit=100) minimizer = ift.RelaxedNewton(ic_newton) `````` Jakob Knollmueller committed Jul 02, 2018 62 `````` `````` Jakob Knollmueller committed Jul 02, 2018 63 `````` # build model Hamiltonian `````` Martin Reinecke committed Jul 02, 2018 64 `````` H = ift.Hamiltonian(likelihood, ic_sampling) `````` Jakob Knollmueller committed Jul 02, 2018 65 `````` `````` 66 `````` INITIAL_POSITION = ift.from_random('normal', H.position.domain) `````` Jakob Knollmueller committed Jul 02, 2018 67 `````` position = INITIAL_POSITION `````` Jakob Knollmueller committed Jul 02, 2018 68 `````` `````` 69 70 71 `````` ift.plot(signal.at(MOCK_POSITION).value, name='truth.pdf') ift.plot(R.adjoint_times(data), name='data.pdf') ift.plot([A.at(MOCK_POSITION).value], name='power.pdf') `````` Jakob Knollmueller committed Jul 02, 2018 72 `````` `````` Jakob Knollmueller committed Jul 02, 2018 73 `````` # number of samples used to estimate the KL `````` Jakob Knollmueller committed Jul 02, 2018 74 `````` N_samples = 20 `````` Jakob Knollmueller committed Jul 02, 2018 75 76 `````` for i in range(5): H = H.at(position) `````` 77 78 `````` samples = [H.curvature.draw_sample(from_inverse=True) for _ in range(N_samples)] `````` Jakob Knollmueller committed Jul 02, 2018 79 `````` `````` Martin Reinecke committed Jul 02, 2018 80 81 `````` KL = ift.SampledKullbachLeiblerDivergence(H, samples) KL = KL.makeInvertible(ic_cg) `````` Jakob Knollmueller committed Jul 02, 2018 82 83 84 `````` KL, convergence = minimizer(KL) position = KL.position `````` 85 `````` ift.plot(signal.at(position).value, name='reconstruction.pdf') `````` Jakob Knollmueller committed Jul 02, 2018 86 `````` `````` 87 88 `````` ift.plot([A.at(position).value, A.at(MOCK_POSITION).value], name='power.pdf') `````` Jakob Knollmueller committed Jul 02, 2018 89 `````` `````` Jakob Knollmueller committed Jul 02, 2018 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 `````` avrg = 0. va = 0. powers = [] for sample in samples: sam = signal.at(sample + position).value powers.append(A.at(sample+position).value) avrg += sam va += sam**2 avrg /= len(samples) va /= len(samples) va -= avrg**2 std = ift.sqrt(va) ift.plot(avrg, name='avrg.pdf') ift.plot(std, name='std.pdf') `````` 105 106 `````` ift.plot([A.at(position).value, A.at(MOCK_POSITION).value]+powers, name='power.pdf')``````