示例#1
0
        /// <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;
            }
        }
示例#2
0
        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]);
            }
        }