ThreeB 1.1
|
Class for computing the negitve free energy using thermodynamic integration. More...
Public Member Functions | |
NegativeFreeEnergy (const DataForMCMC &d) | |
double | variance_from_sample (double sample, double samples, double base_sigma, double scale_pow) const |
double | compute_with_mask (const Vector<> &spots, const vector< vector< int > > &spot_pixels) const |
double | operator() (const Vector<> &spots) const |
MT19937 & | get_rng () const |
Protected Attributes | |
const vector< ImageRef > & | pixels |
const vector< vector< double > > & | pixel_intensities |
const double | mu_brightness |
const double | sigma_brightness |
const double | mu_blur |
const double | sigma_blur |
const double | variance |
const int | samples |
const int | sample_iterations |
const Matrix< 3 > | A |
const Vector< 3 > | pi |
MT19937 & | rng |
Class for computing the negitve free energy using thermodynamic integration.
Definition at line 261 of file multispot5.cc.
NegativeFreeEnergy::NegativeFreeEnergy | ( | const DataForMCMC & | d | ) | [inline] |
double NegativeFreeEnergy::variance_from_sample | ( | double | sample, |
double | samples, | ||
double | base_sigma, | ||
double | scale_pow | ||
) | const [inline] |
Give the noise variance given a sample number and growth parameters.
sample | Sample number |
samples | Total number of samples |
base_sigma | Starting value of sigme |
scale_pow | Exponent scaling |
Definition at line 276 of file multispot5.cc.
double NegativeFreeEnergy::compute_with_mask | ( | const Vector<> & | spots, |
const vector< vector< int > > & | spot_pixels | ||
) | const [inline] |
Estimate free energy using the Slow Growth Thermodynamic Integration method given in Probalistic Inference Using Markov Chain Monte Carlo Methods, Radford.
M. Neal, 1993 Except using a 5 point stencil instead of forward differenceing in Eq 6.30
spots | list of spots |
spot_pixels | Mask around each spot to use to save on computation |
Definition at line 290 of file multispot5.cc.
References Kahan::add(), SampledMultispot::compute_spot_intensity(), DataForMCMC::get_rng(), log_log_normal(), SampledMultispot::GibbsSampler2::next(), SampledMultispot::GibbsSampler2::sample_intensities(), SampledMultispot::GibbsSampler2::set_variance(), spots_to_vector(), and sq().
Referenced by FitSpots::try_modifying_model().
{ //Estimate free energy using the Slow Growth Thermodynamic Integration method given in //Probalistic Inference Using Markov Chain Monte Carlo Methods, Radford. M. Neal, 1993 //Except using a 5 point stencil instead of forward differenceing in Eq 6.30 double base_sigma = sqrt(variance); // should be 1 double scale_pow = 100.0; const unsigned int nspots = spots.size()/4; const unsigned int nframes = pixel_intensities.size(); const unsigned int npixels = pixels.size(); assert(spots.size() %4 == 0); assert(spot_pixels.size() == nspots); //Compute the intensities and derivatives for all spot vector<vector<double> > spot_intensity; //[spot][pixel] for(unsigned int i=0; i < nspots; i++) spot_intensity.push_back(compute_spot_intensity(pixels, spots.slice<Dynamic,4>(i*4,4))); GibbsSampler2 sampler(pixel_intensities, spot_intensity, spots_to_vector(spots), spot_pixels, A, pi, variance, sample_iterations); double sum = 0; Kahan ksum; for(int sample=0; sample < samples; sample++) { //Compute the positions of the surrounding steps double var1 = variance_from_sample(sample-2, samples, base_sigma, scale_pow); double var2 = variance_from_sample(sample-1, samples, base_sigma, scale_pow); double var3 = variance_from_sample(sample+1, samples, base_sigma, scale_pow); double var4 = variance_from_sample(sample+2, samples, base_sigma, scale_pow); //Take a sample sampler.set_variance(var2); sampler.next(DataForMCMC::get_rng()); //Compute the SSD. This is fixed regardless of sigma. double err_sum=0; for(unsigned int frame=0; frame < nframes; frame++) for(unsigned int pixel=0; pixel < npixels; pixel++) err_sum -= sq(pixel_intensities[frame][pixel] - sampler.sample_intensities()[frame][pixel]); //Compute the derivative using a five point stencil //This could be done in a better but less clear way double e1 = err_sum / (2*var1) - npixels*nframes*::log(2*M_PI*var1)/2; double e2 = err_sum / (2*var2) - npixels*nframes*::log(2*M_PI*var2)/2; double e3 = err_sum / (2*var3) - npixels*nframes*::log(2*M_PI*var3)/2; double e4 = err_sum / (2*var4) - npixels*nframes*::log(2*M_PI*var4)/2; sum += (-e1 + 8*e2 - 8*e3 + e4)/12; ksum.add(-e1/12); ksum.add(8*e2/12); ksum.add(-8*e3/12); ksum.add(e4/12); } double log_final = (log(variance_from_sample(samples, samples, base_sigma, scale_pow)*2*M_PI)/2) * npixels * nframes; double priors=0; for(unsigned int i=0; i < nspots; i++) { priors += log_log_normal(spots[i*4+0], mu_brightness, sigma_brightness); priors += log_log_normal(spots[i*4+1], mu_blur, sigma_blur); } /*cout << "Thermo:\n"; cout << "sum: " << sum -log_final << endl; cout << "kah: " << ksum.sum -log_final << endl; cout << "priors: " << priors + sum -log_final << endl; cout << " kah: " << priors + ksum.sum -log_final << endl; */ //cout << log_final << endl; //cout << sum + log_final << endl; sampler.set_variance(variance); return -(sum+priors - log_final); }
double NegativeFreeEnergy::operator() | ( | const Vector<> & | spots | ) | const [inline] |
Estimate free energy using the Slow Growth Thermodynamic Integration method given in Probalistic Inference Using Markov Chain Monte Carlo Methods, Radford.
M. Neal, 1993 Except using a 5 point stencil instead of forward differenceing in Eq 6.30
spots | list of spots |
Definition at line 372 of file multispot5.cc.
References Kahan::add(), SampledMultispot::compute_spot_intensity(), DataForMCMC::get_rng(), log_log_normal(), SampledMultispot::GibbsSampler::next(), SampledMultispot::GibbsSampler::sample_intensities(), SampledMultispot::GibbsSampler::set_variance(), spots_to_vector(), and sq().
{ double base_sigma = sqrt(variance); // should be 1 double scale_pow = 100.0; const unsigned int nspots = spots.size()/4; const unsigned int nframes = pixel_intensities.size(); const unsigned int npixels = pixels.size(); assert(spots.size() %4 == 0); //Compute the intensities and derivatives for all spot vector<vector<double> > spot_intensity; //[spot][pixel] for(unsigned int i=0; i < nspots; i++) spot_intensity.push_back(compute_spot_intensity(pixels, spots.slice<Dynamic,4>(i*4,4))); GibbsSampler sampler(pixel_intensities, spot_intensity, spots_to_vector(spots), A, pi, variance, sample_iterations); double sum = 0; Kahan ksum; for(int sample=0; sample < samples; sample++) { //Compute the positions of the surrounding steps double var1 = variance_from_sample(sample-2, samples, base_sigma, scale_pow); double var2 = variance_from_sample(sample-1, samples, base_sigma, scale_pow); double var3 = variance_from_sample(sample+1, samples, base_sigma, scale_pow); double var4 = variance_from_sample(sample+2, samples, base_sigma, scale_pow); //Take a sample sampler.set_variance(var2); sampler.next(DataForMCMC::get_rng()); //Compute the SSD. This is fixed regardless of sigma. double err_sum=0; for(unsigned int frame=0; frame < nframes; frame++) for(unsigned int pixel=0; pixel < npixels; pixel++) err_sum -= sq(pixel_intensities[frame][pixel] - sampler.sample_intensities()[frame][pixel]); //Compute the derivative using a five point stencil //This could be done in a better but less clear way double e1 = err_sum / (2*var1) - npixels*nframes*::log(2*M_PI*var1)/2; double e2 = err_sum / (2*var2) - npixels*nframes*::log(2*M_PI*var2)/2; double e3 = err_sum / (2*var3) - npixels*nframes*::log(2*M_PI*var3)/2; double e4 = err_sum / (2*var4) - npixels*nframes*::log(2*M_PI*var4)/2; sum += (-e1 + 8*e2 - 8*e3 + e4)/12; ksum.add(-e1/12); ksum.add(8*e2/12); ksum.add(-8*e3/12); ksum.add(e4/12); } double log_final = (log(variance_from_sample(samples, samples, base_sigma, scale_pow)*2*M_PI)/2) * npixels * nframes; double priors=0; for(unsigned int i=0; i < nspots; i++) { priors += log_log_normal(spots[i*4+0], mu_brightness, sigma_brightness); priors += log_log_normal(spots[i*4+1], mu_blur, sigma_blur); } /*cout << "Thermo:\n"; cout << "sum: " << sum -log_final << endl; cout << "kah: " << ksum.sum -log_final << endl; cout << "priors: " << priors + sum -log_final << endl; cout << " kah: " << priors + ksum.sum -log_final << endl; */ //cout << log_final << endl; //cout << sum + log_final << endl; sampler.set_variance(variance); return -(sum+priors - log_final); }
MT19937& DataForMCMC::get_rng | ( | ) | const [inline, inherited] |
Definition at line 189 of file multispot5.cc.
Referenced by compute_with_mask(), and operator()().
{ return rng; }
const vector<ImageRef>& DataForMCMC::pixels [protected, inherited] |
Definition at line 179 of file multispot5.cc.
const vector<vector<double> >& DataForMCMC::pixel_intensities [protected, inherited] |
Definition at line 180 of file multispot5.cc.
const double DataForMCMC::mu_brightness [protected, inherited] |
Definition at line 181 of file multispot5.cc.
const double DataForMCMC::sigma_brightness [protected, inherited] |
Definition at line 181 of file multispot5.cc.
const double DataForMCMC::mu_blur [protected, inherited] |
Definition at line 181 of file multispot5.cc.
const double DataForMCMC::sigma_blur [protected, inherited] |
Definition at line 181 of file multispot5.cc.
const double DataForMCMC::variance [protected, inherited] |
Definition at line 182 of file multispot5.cc.
const int DataForMCMC::samples [protected, inherited] |
Definition at line 183 of file multispot5.cc.
const int DataForMCMC::sample_iterations [protected, inherited] |
Definition at line 183 of file multispot5.cc.
const Matrix<3> DataForMCMC::A [protected, inherited] |
Definition at line 184 of file multispot5.cc.
const Vector<3> DataForMCMC::pi [protected, inherited] |
Definition at line 185 of file multispot5.cc.
MT19937& DataForMCMC::rng [protected, inherited] |
Definition at line 186 of file multispot5.cc.