The ContinuousGamma
transform adapts
values from the driver domain to a bounded range, where the relative concentrations are governed
by a member of the gamma family of distribution curves.
The range of values output by ContinuousGamma.convert()
is bounded
below by zero and unbounded above. A practical upper bound is indirectly controlled by extent
, a positive integer
maintained as a Java field. The upper bound is calculated by multiplying the extent
by the standard deviation.
The shape of the distribution curve is
controlled by two parameters: shape
, symbolized k and
scale
, symbolized λ. Both shape parameters must be greater
than zero.
Each ContinuousGamma
instance internally maintains a
ContinuousDistribution
instance
which divides the range from zero to this calculated upper bound into trapezoids of equal width. The number of trapezoids is determined
by a fourth parameter maintained as a Java field, itemCount
. For the
present purposes I have set itemCount
to 200.
The trapezoid height for sample value x
is calculated using the formula:
Math.pow(x, shape - 1) * Math.pow(-x / scale)
For the gamma family of distribution curves, Wikipedia gives a parametric mean (average, symbolized μ) of kλ and a parametric variance (squared deviation, symbolized σ2) of kλ2. The upper bound thus calculates out to:
maxRange = extent * Math.sqrt(shape) * scale
Since minRange
is fixed at zero, The width of each ContinuousDistribution
trapezoid is here maxRange/itemCount
.
Figure 1 illustrates the influence which
ContinuousGamma.convert()
exerts over driver sequences when the shape
k = 2 and
the scale
λ = 5. This panel was created using the same driver sources used for the
ContinuousUniform
,
which earlier panel provides a basis for comparison.
ContinuousGamma
output from three different
Driver
sources. Each row of graphs provides a time-series graph of samples (left)
and a histogram analyzed from the same samples (right).
The first row of graphs was generated using the standard random number generator. The second
row was generated using the balanced-bit generator. The third row was generated using an ascending sequence of driver values,
equally spaced from zero to unity.
The standard-random time-series graph (top row of Figure 1) has the same relative ups and downs as the standard-random time-series graph prepared for
ContinuousUniform
, but the
specific values are squinched down toward zero. Its hard to see how the driver distribution influences the standard-random histogram presented here, other
than the generally ragged shape of the histogram.
The balanced-bit time-series (middle row of Figure 1) likewise has the same ups and downs as the balanced-bit time-series graph prepared for
ContinuousUniform
with
values squinched similarly. Since balanced-bit sequences strive aggressively for uniformity, the jaggedness of this balanced-bit histogram is
accodingly moderated.
The time-series graph generated using ascending, equally spaced driver values (bottom row of Figure 1) presents the quantile function for this flavor of continuous gamma distribution. The histogram of sample values presents the distribution's probability density function or PDF. The PDF is an equal-ratios curve bending upward from f(v) = 1 when v = 0 to f(v) = 3 when v = 1. Looking back at the time-series graph, notice how the quantile function rises more steeply where the distribution is rarefied and less steeply where the distribution is concentrated.
For each graph in Figure 1 the average sample value is plotted as a
dashed green line, while the interval between ± one standard deviation around
the average is filled in with a lighter green background. For
k = 2 and λ = 5 the parametric average calculates out
to μ = 2×5 = 10, the parametric standard deviation calculates out to
σ = √2×5 = √50 = 7.07, and the upper bound calculates out to
6×7.07 = 42.43. By contrast the numerical
average and deviations for the bottom row of graphs were 10.135 and 6.854. Since this bottommost row illustrates the most ideal conditions
under which a profile can be generated, these parametric and numerical statistics should match closely. I was able to narrow the
gap between parametric and numerical averages by doubling the itemCount
, however this
change did nothing to close the gap between parametric and numerical deviations. I am hoping that the deviation gap will
close with increasing sample counts.
The interval from 10.135-0.280 to 10.135+6.854 is
2*6.854 = 13.708 = 32% of the full application range from zero to unity. Since the continuous uniform distribution
had 58% of samples within ± one standard deviation of the mean, this suggests that with the gamma distribution
with shape
2 and scale
5
is squeezing 58% of samples into 32% of the application range, giving a concentration rate of 58/32 = 1.81.
Figures 2 (a) through 2 (c) show how changes in parameter settings affect the distribution curves. Each figure provides two graphs. The upper graph shows the probability density function or PDF. The lower graph shows the cumulative distribution function or CDF.
When the shape
parameter k = 1 as in
Figure 2 (a), the gamma distribution simplifies to the
exponential distribution that characterizes waiting durations
in the Poisson Point Process.
For shape
k = 2 as in
Figure 2 (b) the distribution characterizes what happens when two consecutive Poisson-Point waiting durations are added
together.
For shape
k = 4 as in Figure 2 (c) the distribution characterizes what
happens when four consecutive Poisson-Point waiting durations are added together.
ContinuousGamma
implementation class.
The type hierarchy for ContinuousGamma
is:
TransformBase<T
extends Number>
extends WriteableEntity
implements Transform<T>
ContinuousDistributionTransform
extends TransformBase<Double>
implements Transform.Continuous
ContinuousGamma
extends ContinuousDistributionTransform
Class ContinuousDistributionTransform
embeds a
ContinuousDistribution
instance capable of approximating most any continuous distribution as a succession of trapezoids.
Each ContinuousDistribution
trapezoid item has
left
, right
, origin
,
and goal
fields.
Conversion happens entirely in ContinuousDistributionTransform
,
where the convert()
method does this:
return getDistribution().quantile(driver);
TransformBase
maintains a valid
field
to flag parameter changes. This field starts out false
and reverts to false
with every time ContinuousGamma
calls TransformBase.invalidate()
. This happens
with any change to shape
, scale
, extent
or itemCount
. Any call to TransformBase.getDistribution()
(and ContinuousDistributionTransform.convert()
makes such a call) first creates
the distribution if it does not already exist, then checks valid
. If false
,
then getDistribution()
calls validate()
, which is
abstract
to TransformBase
but whose implementation is
made concrete by ContinuousGamma
. And that particular implementation of validate()
makes use of ContinuousDistribution.calculateGamma(shape, scale, extent, itemCount)
to recalculate the
succession of trapezoids.
© Charles Ames | Page created: 2022-08-29 | Last updated: 2022-08-29 |