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); }
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]); }