Sign up ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

If I have a spectral data set showing measured energy on the y-axis and frequency on the x-axis, how would I go about fitting this to a beta distribution?

For example, lets say I had the data for the following curves showing spectrum for this ship:

enter image description here

How do I determine the beta curve fit parameters to say the blue line?

Taking it one step further. If I have a wav sound file of the sound of an engine, how would I do the same thing?


I attempted to use the supplied answer and got an error as follows:

enter image description here

The data file can be downloaded from the following URL: acoustic power spectrum data to 3k hz

The overall goal here is to generate a curve approximating the shape like this:

enter image description here

share|improve this question
Are you sure about fitting a Beta Distribution to this data? A Beta distribution has a finite support (0..1) which your data doesn't have and an interpretation related to probability, which I find hard to make in the context of frequency spectra of sounds. – Sjoerd C. de Vries Jan 15 '14 at 12:55
What do you mean by finite support? – Tyler Durden Jan 15 '14 at 15:41
A beta distribution is defined only between 0 and 1. – Sjoerd C. de Vries Jan 15 '14 at 16:00
I get the same answer if I scale the values so they are less than 1. – Tyler Durden Jan 16 '14 at 20:10
suggest you spend some time learning what a beta distribution is. Do some plots and manually try to find some parameters that reasonably resemble your data. – george2079 Jan 16 '14 at 20:41

2 Answers 2

up vote 3 down vote accepted
data = Import["", "TEXT"];
data1 = Transpose[{Rest@Range[0, 1, 1./Length@#], #}] &@ ToExpression@StringSplit[data];
model = PDF[BetaDistribution[a, b], x];
parms = FindFit[data1, model, {a, b}, x]
Show[Graphics[Point@data1, Axes -> True], 
     Plot[model /. parms, {x, 0, 1}, Evaluated -> True, PlotRange -> All],
     AspectRatio -> 1]

Mathematica graphics

share|improve this answer
I tried to use this method and got an error about a "gradient" as shown above in the updated question. – Tyler Durden Jan 16 '14 at 17:14
@TylerDurden See Sjoerd's comments under your question – belisarius is forth Jan 16 '14 at 19:24
I get the same error if I scale the y-values to be less than 1 (see updated screenshot in question) – Tyler Durden Jan 16 '14 at 20:11
@TylerDurden Please post a sample of your data set. Otherwise your problem is impossible to debug – belisarius is forth Jan 16 '14 at 21:16
How do I post data (it is a .wav file that is about 1 megabyte in size)? – Tyler Durden Jan 16 '14 at 21:37

You mentioned in the comments that you are interested in a general shape of your data. This can be inferred from the nature of your data, and most probably does not follow a beta distribution. You can use a polynomial series of a chosen degree to visualize a more general shape of your data:

data = Import["", "TEXT"];
data1 = Transpose[{Rest@Range[0, 1, 1./Length@#], #}] &@
lp = ListLinePlot[MovingAverage[data1, 50]];

Clear[n, a, b, c, i, x, polynome, polyGauss]
polynome[n_] := 
 NonlinearModelFit[data1, Sum[a[i + 1]*x^i, {i, 0, n}], 
  Flatten[Table[{a[i + 1]}, {i, 0, n}]], x]

Show[{Plot[Evaluate[Table[polynome[n][x], {n, 3, 12, 3}]], {x, 0, 1}, 
   PlotRange -> All, AxesOrigin -> {0, 0}, PlotStyle -> Thick], lp}, ImageSize -> 600]

polynome fit

Or you can use a series of Gaussian bell functions:

polyGauss[n_] := 
 NonlinearModelFit[data1, Sum[a[i]*Exp[-(b[i] x - c[i])^2], {i, n}], 
  Flatten[Table[{{a[i], 1}, {b[i], i/(n + 1)}, c[i]}, {i, n}], 1], x]

Show[{Plot[Evaluate[Table[polyGauss[n][x], {n, 3, 12, 3}]], {x, 0, 1},
    PlotRange -> All, AxesOrigin -> {0, 0}, PlotStyle -> Thick], lp}, ImageSize -> 600]

gaussian fit

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.