コード例 #1
0
ファイル: SelfOrganizingMap.cs プロジェクト: kpavlov7/MLTools
        public int[] Train(InstanceRepresentation set)
        {
            set.Standardize();
            var instances = set.Instances.ToArray();

            _weights      = new float[_gridDimensions[0] * _gridDimensions[1], set.FeauturesCount];
            FeaturesCount = set.FeauturesCount;

            // Intialize weights with gaussians
            var n = _gridDimensions[0] * _gridDimensions[1];

            if (!_usePlusPlusInit || n >= instances.Length)
            {
                for (ushort i = 0; i < n; i++)
                {
                    for (ushort j = 0; j < FeaturesCount; j++)
                    {
                        _weights[i, j] = (float)GaussHelper.InvPhi(_random.NextDouble());
                    }
                }
            }
            else
            {
                _weights = PlusPlusInitializer.InitializeCentroids(n, instances, _random);
            }

            for (var i = 0; i < _iterationsCount; i++)
            {
                var instance = instances[_random.Next(instances.Length)];
                // Best Matching Unit
                var bmuIndex = Instances.MinEucDistanceIndex(instance, _weights);
                BMUCoordinates = ToCoordinates(bmuIndex);
                UpdateHexagonWeights((ushort)NeighbourhoodRadius(i), LearningRate(i), BMUCoordinates, instance.GetValues());
            }

            var instancesClusters = new int[instances.Length];

            for (var i = 0; i < instances.Length; i++)
            {
                instancesClusters[i] = Instances.MinEucDistanceIndex(instances[i], _weights);
            }

            return(instancesClusters);
        }
コード例 #2
0
        public void standardize_dense_instance()
        {
            var instance1 = new[] { -1f, 5f, 0f, 1f };
            var instance2 = new[] { 0f, 6f, 1f, 1f };
            var instance3 = new[] { 3f, 7f, 1f, 1f };
            var instance4 = new[] { 4f, 0f, 1f, 0f };

            var feature1Sigma = Math.Sqrt(new[] { -1f, 0f, 3f, 4f }.Variance());
            var feature2Sigma = Math.Sqrt(new[] { 5f, 6f, 7f, 0f }.Variance());

            var feature1Mean = new[] { -1f, 0f, 3f, 4f }.Mean();
            var feature2Mean = new[] { 5f, 6f, 7f, 0f }.Mean();

            var inputFeaturesTypes = new InputFeatureTypes[] {
                InputFeatureTypes.Ordinal,
                InputFeatureTypes.Ordinal,
                InputFeatureTypes.Flags,
                InputFeatureTypes.Flags
            };

            var mixedDenseSet = new InstanceRepresentation(
                inputFeaturesTypes,
                sparse: false);

            mixedDenseSet.AddInstance(instance1);
            mixedDenseSet.AddInstance(instance2);
            mixedDenseSet.AddInstance(instance3);
            mixedDenseSet.AddInstance(instance4);

            mixedDenseSet.Standardize();

            var value1 = mixedDenseSet.Instances[0].GetValues();

            Assert.True(Math.Abs((-1f - feature1Mean) / feature1Sigma - value1[0]) < Epsilon);
            Assert.True((Math.Abs((5f - feature2Mean) / feature2Sigma - value1[1]) < Epsilon));
            Assert.Equal(-1f, value1[2]);
            Assert.Equal(1f, value1[3]);
        }