/// <summary> /// Creates the initial clusters. /// </summary> private void CreateInitialClusters() { // compute median and std. deviation Double[] mean = new Double[Source.Raster.NumberOfBands]; Double[] standardDeviation = new Double[Source.Raster.NumberOfBands]; for (Int32 bandIndex = 0; bandIndex < Source.Raster.NumberOfBands; bandIndex++) { mean[bandIndex] = 0; standardDeviation[bandIndex] = 0; for (Int32 rowIndex = 0; rowIndex < Source.Raster.NumberOfRows; rowIndex++) { for (Int32 columnIndex = 0; columnIndex < Source.Raster.NumberOfColumns; columnIndex++) { mean[bandIndex] += Source.Raster.GetFloatValue(rowIndex, columnIndex, bandIndex); } } mean[bandIndex] /= (Source.Raster.NumberOfColumns * Source.Raster.NumberOfRows); for (Int32 rowIndex = 0; rowIndex < Source.Raster.NumberOfRows; rowIndex++) { for (Int32 columnIndex = 0; columnIndex < Source.Raster.NumberOfColumns; columnIndex++) { standardDeviation[bandIndex] += Math.Pow(Source.Raster.GetFloatValue(rowIndex, columnIndex, bandIndex) - mean[bandIndex], 2); } } standardDeviation[bandIndex] = Math.Sqrt(standardDeviation[bandIndex] / (Source.Raster.NumberOfRows * Source.Raster.NumberOfColumns - 1)); } // generate the initial clusters _clusterCenters = new Double[_numberOfClusters][]; GaussianRandomGenerator randomGenerator = new GaussianRandomGenerator(); for (Int32 clusterIndex = 0; clusterIndex < _numberOfClusters; clusterIndex++) { Double[] randomNumbers = new Double[Source.Raster.NumberOfBands]; for (Int32 bandIndex = 0; bandIndex < Source.Raster.NumberOfBands; bandIndex++) { randomNumbers[bandIndex] = randomGenerator.NextDouble(mean[bandIndex], standardDeviation[bandIndex]); } _clusterCenters[clusterIndex] = randomNumbers; } }
public void GaussianRandomGeneratorNextDoubleTest() { // numbers between 0 and 1 List <Double> generatedNumbers = Enumerable.Range(0, _numberOfGeneratedNumbers).Select(number => _generator.NextDouble()).ToList(); // range test for (Int32 i = 0; i < _numberOfGeneratedNumbers; i++) { Assert.GreaterOrEqual(generatedNumbers[i], 0); Assert.Less(generatedNumbers[i], 1); } // numbers with specified mean and std. variation for (Int32 i = 0; i < _mean.Length; i++) { generatedNumbers = Enumerable.Range(0, _numberOfGeneratedNumbers).Select(number => _generator.NextDouble(_mean[i], _stdDeviation[i])).ToList(); // mean test Double mean = generatedNumbers.Sum() / _numberOfGeneratedNumbers; Assert.AreEqual(_mean[i], mean, _error[i]); // std. deviation test Double stdDeviation = Math.Sqrt(generatedNumbers.Sum(number => (number - mean) * (number - mean)) / _numberOfGeneratedNumbers); Assert.AreEqual(_stdDeviation[i], stdDeviation, _error[i]); } }