1

I am trying to fit data to a sum of Gaussians.

This data is found in a file called lpeff.txt. So I write the following code:

model = 
  V1*Exp[-((r - μ1)^2/σ1^2)] + V2*Exp[-((r - μ2)^2/σ2^2)] + V3*Exp[-((r - μ3)^2/σ3^2)];

(* mydata = 
  Import[
    "C:\\Users\\em\\Documents\\lambda_we_threshold2\\vot\\lambda_p\\effective_lp\\lpeff.txt", 
    {"Data", All, {1, 2}}]; *)
mydata = Import["https://pastebin.com/raw/7m8XF3EN", "Table"];

myfit = 
  NonlinearModelFit[
    mydata, model, 
    {{V1, 53.55}, {μ1, 0.09466}, {σ1, -0.3954}, 
     {V2, 36480}, {μ2, -0.4239}, {σ2, 0.2253}, 
     {V3, -49.63}, {μ3, 0.3712}, {σ3, 0.1697}}, 
    r, 
    MaxIterations -> Infinity];

When I run the code, I get the following error:

General::munfl: 4.3598*10^-308/2 is too small to represent as a normalized machine number; precision may be lost

How can I fix this?

Michael E2
  • 235,386
  • 17
  • 334
  • 747
Otto
  • 11
  • 2
  • 1
    Increase the precision – ktm Jul 19 '19 at 14:15
  • Other duplicates: https://mathematica.stackexchange.com/questions/170416/new-generalmunfl-error-and-loss-of-precision, https://mathematica.stackexchange.com/questions/197758/underflow-error-generalmunfl-from-ex-instead-of-expx/197807#197807 – Michael E2 Jul 19 '19 at 14:31
  • Assuming that you are needing to perform a regression rather than fitting a mixture of probability distributions...having the V2 starting value at 36480 completely dominates the other two gaussian shapes. Also, while not a consequential error, having the starting value for $\sigma_1$ being negative is very odd. – JimB Jul 19 '19 at 14:36
  • The issue might not be "fixing" underflow but that underflow is a consequence of poor starting values or a model that just doesn't fit the data very well. I can't tell if this is a duplicate without the data. Is it possible to share the data? – JimB Jul 19 '19 at 14:42
  • I can get LinearAlgebraBLASTRSV::oflow and Divide::infy errors but not General::munfl. Problems with code generally require the code for the problems to be diagnosed (i.e., mydata) – Michael E2 Jul 19 '19 at 14:53
  • I put your data in pastebin.com, which provides a convenient way to share data. See https://pastebin.com/7m8XF3EN. Click the "Raw" button and you get a simple ASCII page that you can Import[] in Mathematica. See the change to your code I made. – Michael E2 Jul 20 '19 at 16:02

2 Answers2

2

This might be an answer (but without your data or at least the range of values of your values for r I can't be certain).

Here is the plot of model predictions given the starting values used in NonlinearModelFit:

model = V1*Exp[-((r - μ1)^2/σ1^2)] + V2*Exp[-((r - μ2)^2/σ2^2)] + V3*Exp[-((r - μ3)^2/σ3^2)];
Plot[model /. {V1 -> 53.55, μ1 -> 0.09466, σ1 -> -0.3954, V2 -> 36480, μ2 -> -0.4239,
  σ2 -> 0.2253, V3 -> -49.63, μ3 -> 0.3712, σ3 -> 0.1697}, {r, -2, 1}, PlotRange -> All]

Initial model fit

Given this result, you might get the error messages you show whenever values of r are less than -5 and greater than +5.

model /. {V1 -> 53.55, μ1 -> 0.09466, σ1 -> -0.3954, 
   V2 -> 36480, μ2 -> -0.4239, σ2 -> 0.2253, 
   V3 -> -49.63, μ3 -> 0.3712, σ3 -> 0.1697} /. r -> -5

Result when r is 5

model /. {V1 -> 53.55, μ1 -> 0.09466, σ1 -> -0.3954, 
   V2 -> 36480, μ2 -> -0.4239, σ2 -> 0.2253, 
   V3 -> -49.63, μ3 -> 0.3712, σ3 -> 0.1697} /. r -> 5

result when r is 5

So to tell whether you just have very small numbers whose underflow needs fixing or you need better starting values depends on your data.

JimB
  • 41,653
  • 3
  • 48
  • 106
1

I get a different error (version difference?) but a good fit:

$Version
(*  "12.0.0 for Mac OS X x86 (64-bit) (April 7, 2019)"  *)

mydata = Import["https://pastebin.com/raw/7m8XF3EN", "Table"];

model = V1*Exp[-((r - μ1)^2/σ1^2)] + 
   V2*Exp[-((r - μ2)^2/σ2^2)] + 
   V3*Exp[-((r - μ3)^2/σ3^2)];

myfit = NonlinearModelFit[mydata, 
   model, {{V1, 53.55}, {μ1, 0.09466}, {σ1, -0.3954}, {V2, 
     36480}, {μ2, -0.4239}, {σ2, 
     0.2253}, {V3, -49.63}, {μ3, 0.3712}, {σ3, 0.1697}}, r,
    MaxIterations -> Infinity];

LinearAlgebra`BLAS`TRSV::oflow: Machine overflow encountered during computations.

Plot[myfit[r],
 {r, Min[data[[All, 1]]], Max[data[[All, 1]]]},
 Prolog -> {Red, Point@data}, PlotRange -> All]

enter image description here

The parameter values of V2 and μ2 seem extremely large and offsetting:

myfit["BestFitParameters"]
(*
  {V1 -> 40.168, μ1 -> 0.136379, σ1 -> -0.389159, 
   V2 -> 3.13376*10^162, μ2 -> -37.1206, σ2 -> 1.93767, 
   V3 -> -45.3854, μ3 -> 0.376968, σ3 -> 0.164943}
*)

It seems clear that the left-hand side of the data looks nothing like a normal distribution, which probably is the reason for the parameter values.

Michael E2
  • 235,386
  • 17
  • 334
  • 747
  • Thank you for the observation on the distribution of the data. Do you perhaps have any alternative suggestions on functions I can use to fit this data? – Otto Jul 20 '19 at 17:08
  • @Otto I'm not data scientist, but I believe the idea is that there is usually a scientific basis for the model, in which the parameters correspond to actual quantities in the system you're studying. On a numerical/mathematical basis, it's always possible to add more functions and get a better fit, but using random functions leads to a scientifically meaningless solution. If it's just a numerical fit in order to have, say, a smooth symbolic approximation to the data, then myfit does not seem too bad. I just doubt the parameters have any meaning. – Michael E2 Jul 20 '19 at 17:33
  • Gaussian or sum of Gaussians are ideal for representing interactions between the types of elementary particles I'm studying. – Otto Jul 20 '19 at 18:13
  • It would appear that the errors you and I have observed can be avoided by increasing precision in the computation. How does one change precision in Mathematica? – Otto Jul 20 '19 at 18:15
  • @Otto I tried this: NonlinearModelFit[SetPrecision[mydata, 20], model[[{1, 3}]] + a (1/(r - b)^2), SetPrecision[ List @@@ myfit["BestFitParameters"][[{1, 2, 3, 7, 8, 9}]], 20]~ Join~{{a, 1}, {b, 0}}, r, PrecisionGoal -> 8, WorkingPrecision -> 20, MaxIterations -> 200] and got no errors, but basically got the same fit, which should be expected, given how good myfit is. The error did not result in a bad computed fit, as it turns out. – Michael E2 Jul 20 '19 at 18:28
  • @Otto Re the sum of Gaussians: Perhaps your data does not go far enough to the left to show/determine the Gaussian "spike" accurately (i.e. V2, μ2, and σ2)? Or perhaps the parameter values make sense physically and there is no problem? – Michael E2 Jul 20 '19 at 18:32