MATH-1593: Remove duplicate functionality (provided in "Commons RNG").
This commit is contained in:
parent
8a756d763d
commit
c93520a02f
|
@ -1,51 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership.
|
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
* (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.commons.math4.legacy.random;
|
|
||||||
|
|
||||||
import org.apache.commons.rng.UniformRandomProvider;
|
|
||||||
import org.apache.commons.rng.sampling.distribution.NormalizedGaussianSampler;
|
|
||||||
import org.apache.commons.rng.sampling.distribution.MarsagliaNormalizedGaussianSampler;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Random generator that generates normally distributed samples.
|
|
||||||
*
|
|
||||||
* @since 1.2
|
|
||||||
*/
|
|
||||||
public class GaussianRandomGenerator implements NormalizedRandomGenerator {
|
|
||||||
/** Gaussian distribution sampler. */
|
|
||||||
private final NormalizedGaussianSampler sampler;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new generator.
|
|
||||||
*
|
|
||||||
* @param generator Underlying random generator.
|
|
||||||
*/
|
|
||||||
public GaussianRandomGenerator(final UniformRandomProvider generator) {
|
|
||||||
sampler = new MarsagliaNormalizedGaussianSampler(generator);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates a random scalar with zero mean and unit standard deviation.
|
|
||||||
*
|
|
||||||
* @return a random value sampled from a normal distribution.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public double nextNormalizedDouble() {
|
|
||||||
return sampler.sample();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,92 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership.
|
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
||||||
* (the "License"); you may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.commons.math4.legacy.random;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import org.apache.commons.math4.legacy.exception.DimensionMismatchException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@link RandomVectorGenerator} that generates vectors with uncorrelated
|
|
||||||
* components. Components of generated vectors follow (independent) Gaussian
|
|
||||||
* distributions, with parameters supplied in the constructor.
|
|
||||||
*
|
|
||||||
* @since 1.2
|
|
||||||
*/
|
|
||||||
public class UncorrelatedRandomVectorGenerator
|
|
||||||
implements RandomVectorGenerator {
|
|
||||||
|
|
||||||
/** Underlying scalar generator. */
|
|
||||||
private final NormalizedRandomGenerator generator;
|
|
||||||
|
|
||||||
/** Mean vector. */
|
|
||||||
private final double[] mean;
|
|
||||||
|
|
||||||
/** Standard deviation vector. */
|
|
||||||
private final double[] standardDeviation;
|
|
||||||
|
|
||||||
/** Simple constructor.
|
|
||||||
* <p>Build an uncorrelated random vector generator from
|
|
||||||
* its mean and standard deviation vectors.</p>
|
|
||||||
* @param mean expected mean values for each component
|
|
||||||
* @param standardDeviation standard deviation for each component
|
|
||||||
* @param generator underlying generator for uncorrelated normalized
|
|
||||||
* components
|
|
||||||
*/
|
|
||||||
public UncorrelatedRandomVectorGenerator(double[] mean,
|
|
||||||
double[] standardDeviation,
|
|
||||||
NormalizedRandomGenerator generator) {
|
|
||||||
if (mean.length != standardDeviation.length) {
|
|
||||||
throw new DimensionMismatchException(mean.length, standardDeviation.length);
|
|
||||||
}
|
|
||||||
this.mean = mean.clone();
|
|
||||||
this.standardDeviation = standardDeviation.clone();
|
|
||||||
this.generator = generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Simple constructor.
|
|
||||||
* <p>Build a null mean random and unit standard deviation
|
|
||||||
* uncorrelated vector generator</p>
|
|
||||||
* @param dimension dimension of the vectors to generate
|
|
||||||
* @param generator underlying generator for uncorrelated normalized
|
|
||||||
* components
|
|
||||||
*/
|
|
||||||
public UncorrelatedRandomVectorGenerator(int dimension,
|
|
||||||
NormalizedRandomGenerator generator) {
|
|
||||||
mean = new double[dimension];
|
|
||||||
standardDeviation = new double[dimension];
|
|
||||||
Arrays.fill(standardDeviation, 1.0);
|
|
||||||
this.generator = generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Generate an uncorrelated random vector.
|
|
||||||
* @return a random vector as a newly built array of double
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public double[] nextVector() {
|
|
||||||
|
|
||||||
double[] random = new double[mean.length];
|
|
||||||
for (int i = 0; i < random.length; ++i) {
|
|
||||||
random[i] = mean[i] + standardDeviation[i] * generator.nextNormalizedDouble();
|
|
||||||
}
|
|
||||||
|
|
||||||
return random;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
//Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
//or more contributor license agreements. See the NOTICE file
|
|
||||||
//distributed with this work for additional information
|
|
||||||
//regarding copyright ownership. The ASF licenses this file
|
|
||||||
//to you under the Apache License, Version 2.0 (the
|
|
||||||
//"License"); you may not use this file except in compliance
|
|
||||||
//with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
//http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
//Unless required by applicable law or agreed to in writing,
|
|
||||||
//software distributed under the License is distributed on an
|
|
||||||
//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
//KIND, either express or implied. See the License for the
|
|
||||||
//specific language governing permissions and limitations
|
|
||||||
//under the License.
|
|
||||||
|
|
||||||
package org.apache.commons.math4.legacy.random;
|
|
||||||
|
|
||||||
import org.apache.commons.rng.simple.RandomSource;
|
|
||||||
import org.apache.commons.math4.legacy.stat.StatUtils;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
|
|
||||||
public class GaussianRandomGeneratorTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMeanAndStandardDeviation() {
|
|
||||||
final GaussianRandomGenerator generator = new GaussianRandomGenerator(RandomSource.create(RandomSource.MT));
|
|
||||||
final double[] sample = new double[10000];
|
|
||||||
for (int i = 0; i < sample.length; ++i) {
|
|
||||||
sample[i] = generator.nextNormalizedDouble();
|
|
||||||
}
|
|
||||||
final double mean = StatUtils.mean(sample);
|
|
||||||
Assert.assertEquals("mean=" + mean, 0, mean, 1e-2);
|
|
||||||
final double variance = StatUtils.variance(sample);
|
|
||||||
Assert.assertEquals("variance=" + variance, 1, variance, 1e-2);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,65 +0,0 @@
|
||||||
//Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
//or more contributor license agreements. See the NOTICE file
|
|
||||||
//distributed with this work for additional information
|
|
||||||
//regarding copyright ownership. The ASF licenses this file
|
|
||||||
//to you under the Apache License, Version 2.0 (the
|
|
||||||
//"License"); you may not use this file except in compliance
|
|
||||||
//with the License. You may obtain a copy of the License at
|
|
||||||
|
|
||||||
//http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
//Unless required by applicable law or agreed to in writing,
|
|
||||||
//software distributed under the License is distributed on an
|
|
||||||
//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
//KIND, either express or implied. See the License for the
|
|
||||||
//specific language governing permissions and limitations
|
|
||||||
//under the License.
|
|
||||||
|
|
||||||
package org.apache.commons.math4.legacy.random;
|
|
||||||
|
|
||||||
import org.apache.commons.math4.legacy.linear.RealMatrix;
|
|
||||||
import org.apache.commons.rng.simple.RandomSource;
|
|
||||||
import org.apache.commons.math4.legacy.stat.descriptive.moment.VectorialCovariance;
|
|
||||||
import org.apache.commons.math4.legacy.stat.descriptive.moment.VectorialMean;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.Assert;
|
|
||||||
|
|
||||||
public class UncorrelatedRandomVectorGeneratorTest {
|
|
||||||
private double[] mean;
|
|
||||||
private double[] standardDeviation;
|
|
||||||
private UncorrelatedRandomVectorGenerator generator;
|
|
||||||
|
|
||||||
public UncorrelatedRandomVectorGeneratorTest() {
|
|
||||||
mean = new double[] {0.0, 1.0, -3.0, 2.3};
|
|
||||||
standardDeviation = new double[] {1.0, 2.0, 10.0, 0.1};
|
|
||||||
generator =
|
|
||||||
new UncorrelatedRandomVectorGenerator(mean, standardDeviation,
|
|
||||||
new GaussianRandomGenerator(RandomSource.create(RandomSource.MT,
|
|
||||||
17399225433L)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMeanAndCorrelation() {
|
|
||||||
// The test is extremely sensitive to the seed (cf. constructor).
|
|
||||||
VectorialMean meanStat = new VectorialMean(mean.length);
|
|
||||||
VectorialCovariance covStat = new VectorialCovariance(mean.length, true);
|
|
||||||
for (int i = 0; i < 10000; ++i) {
|
|
||||||
double[] v = generator.nextVector();
|
|
||||||
meanStat.increment(v);
|
|
||||||
covStat.increment(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
double[] estimatedMean = meanStat.getResult();
|
|
||||||
double scale;
|
|
||||||
RealMatrix estimatedCorrelation = covStat.getResult();
|
|
||||||
for (int i = 0; i < estimatedMean.length; ++i) {
|
|
||||||
Assert.assertEquals(mean[i], estimatedMean[i], 0.07);
|
|
||||||
for (int j = 0; j < i; ++j) {
|
|
||||||
scale = standardDeviation[i] * standardDeviation[j];
|
|
||||||
Assert.assertEquals(0, estimatedCorrelation.getEntry(i, j) / scale, 0.03);
|
|
||||||
}
|
|
||||||
scale = standardDeviation[i] * standardDeviation[i];
|
|
||||||
Assert.assertEquals(1, estimatedCorrelation.getEntry(i, i) / scale, 0.025);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue