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