getting_started_3.py 3.42 KB
Newer Older
Jakob Knollmueller's avatar
Jakob Knollmueller committed
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's avatar
Jakob Knollmueller committed
8 9
    return starts, ends

10

Jakob Knollmueller's avatar
Jakob Knollmueller committed
11
if __name__ == '__main__':
12
    # ## ABOUT THIS TUTORIAL
13
    np.random.seed(42)
14
    position_space = ift.RGSpace([128, 128])
Jakob Knollmueller's avatar
Jakob Knollmueller committed
15

Jakob Knollmueller's avatar
Jakob Knollmueller committed
16
    # Setting up an amplitude model
Martin Reinecke's avatar
fixes  
Martin Reinecke committed
17
    A, amplitude_internals = ift.make_amplitude_model(
18
        position_space, 16, 1, 10, -4., 1, 0., 1.)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
19 20 21 22 23 24 25 26

    # 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)
Martin Reinecke's avatar
Martin Reinecke committed
27
    position = ift.MultiField.from_dict(position)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
28 29 30 31 32

    xi = ift.Variable(position)['xi']
    Amp = power_distributor(A)
    correlated_field_h = Amp * xi
    correlated_field = ht(correlated_field_h)
33
    # alternatively to the block above one can do:
Martin Reinecke's avatar
fixes  
Martin Reinecke committed
34
    # correlated_field,_ = ift.make_correlated_field(position_space, A)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
35 36 37 38

    # apply some nonlinearity
    signal = ift.PointwisePositiveTanh(correlated_field)
    # Building the Line of Sight response
39
    LOS_starts, LOS_ends = get_random_LOS(100)
Martin Reinecke's avatar
fixes  
Martin Reinecke committed
40 41
    R = ift.LOSResponse(position_space, starts=LOS_starts,
                        ends=LOS_ends)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
42
    # build signal response model and model likelihood
Jakob Knollmueller's avatar
Jakob Knollmueller committed
43
    signal_response = R(signal)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
44 45
    # specify noise
    data_space = R.target
Jakob Knollmueller's avatar
Jakob Knollmueller committed
46
    noise = .001
47
    N = ift.ScalingOperator(noise, data_space)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
48 49 50

    # generate mock data
    MOCK_POSITION = ift.from_random('normal', signal.position.domain)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
51
    data = signal_response.at(MOCK_POSITION).value + N.draw_sample()
Jakob Knollmueller's avatar
Jakob Knollmueller committed
52 53 54 55 56

    # set up model likelihood
    likelihood = ift.GaussianEnergy(signal_response, mean=data, covariance=N)

    # set up minimization and inversion schemes
Jakob Knollmueller's avatar
Jakob Knollmueller committed
57 58
    ic_cg = ift.GradientNormController(iteration_limit=10)
    ic_sampling = ift.GradientNormController(iteration_limit=100)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
59 60
    ic_newton = ift.GradientNormController(name='Newton', iteration_limit=100)
    minimizer = ift.RelaxedNewton(ic_newton)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
61

Jakob Knollmueller's avatar
Jakob Knollmueller committed
62
    # build model Hamiltonian
Martin Reinecke's avatar
Martin Reinecke committed
63
    H = ift.Hamiltonian(likelihood, ic_sampling)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
64

65
    INITIAL_POSITION = ift.from_random('normal', H.position.domain)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
66
    position = INITIAL_POSITION
Jakob Knollmueller's avatar
Jakob Knollmueller committed
67

68 69 70
    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's avatar
Jakob Knollmueller committed
71

Jakob Knollmueller's avatar
Jakob Knollmueller committed
72
    # number of samples used to estimate the KL
73
    N_samples = 20
Jakob Knollmueller's avatar
Jakob Knollmueller committed
74 75
    for i in range(5):
        H = H.at(position)
Martin Reinecke's avatar
Martin Reinecke committed
76
        samples = [H.metric.draw_sample(from_inverse=True)
77
                   for _ in range(N_samples)]
Jakob Knollmueller's avatar
Jakob Knollmueller committed
78

Martin Reinecke's avatar
Martin Reinecke committed
79 80
        KL = ift.SampledKullbachLeiblerDivergence(H, samples)
        KL = KL.makeInvertible(ic_cg)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
81 82 83
        KL, convergence = minimizer(KL)
        position = KL.position

84
        ift.plot(signal.at(position).value, name='reconstruction.pdf')
Jakob Knollmueller's avatar
Jakob Knollmueller committed
85

86 87
        ift.plot([A.at(position).value, A.at(MOCK_POSITION).value],
                 name='power.pdf')
Jakob Knollmueller's avatar
Jakob Knollmueller committed
88

Martin Reinecke's avatar
Martin Reinecke committed
89
    sc = ift.StatCalculator()
Jakob Knollmueller's avatar
Jakob Knollmueller committed
90
    for sample in samples:
Martin Reinecke's avatar
Martin Reinecke committed
91 92 93 94 95
        sc.add(signal.at(sample+position).value)
    ift.plot(sc.mean, name='avrg.pdf')
    ift.plot(ift.sqrt(sc.var), name='std.pdf')

    powers = [A.at(s+position).value for s in samples]
96 97
    ift.plot([A.at(position).value, A.at(MOCK_POSITION).value]+powers,
             name='power.pdf')