C# K Means Clustering Example

← All NMath Code Examples

 

using System;

using CenterSpace.NMath.Core;

namespace CenterSpace.NMath.Examples.CSharp
{
  /// <summary>
  /// A .NET example in C# showing how to perform a k-means cluster analysis on a data set.
  /// </summary>
  public class KMeansClusteringExample
  {
    static void Main( string[] args )
    {
      // Class KMeansClustering performs k-means clustering on a set of data points.
      // Instances are constructed from a matrix of data, where each row represents
      // an object to be clustered. This code clusters 30 random vectors of length 3:
      var data = new DoubleMatrix( 12, 3, new RandGenUniform() );
      var km = new KMeansClustering( data );

      Console.WriteLine();
      Console.WriteLine( "{0} objects to cluster:", km.N );
      Console.WriteLine( data.ToTabDelimited( "G7" ) );

      // The Cluster() method clusters the data into the specified number
      // of clusters. This code creates 3 clusters, using random starting
      // cluster centers:
      km.Cluster( 3 );
      DisplayKMeansResults( km, "K-MEANS CLUSTERING WITH RANDOM STARTING CENTERS" );

      // This code specifies the starting centers. K is inferred from the
      // number of rows in the matrix.
      var centers = new DoubleMatrix( "3x3[ 0.25 0.25 0.25  0.50 0.50 0.50  0.75 0.75 0.75 ]" );
      km.Cluster( centers );
      DisplayKMeansResults( km, "K-MEANS CLUSTERING WITH SPECIFIED STARTING CENTERS" );

      Console.WriteLine();
      Console.WriteLine( "Press Enter Key" );
      Console.Read();

    }  // Main

    // Display the results of a k-means clustering
    private static void DisplayKMeansResults( KMeansClustering km, string title )
    {
      Console.WriteLine();
      Console.WriteLine( title );
      Console.WriteLine();

      Console.WriteLine( "{0} clusters of sizes {1}", km.K, IntArrayToString( km.Sizes ) );
      Console.WriteLine();

      Console.WriteLine( "Initial cluster centers:" );
      Console.WriteLine( km.InitialCenters.ToTabDelimited() );

      Console.WriteLine( "{0} iterations", km.Iterations );
      Console.WriteLine( "Stopped because max iterations of {0} met? {1}", km.MaxIterations, km.MaxIterationsMet );
      Console.WriteLine();

      Console.WriteLine( "Final cluster centers:" );
      Console.WriteLine( km.FinalCenters.ToTabDelimited() );

      Console.WriteLine( "Clustering assignments:" );
      Console.WriteLine( km.Clusters );
      Console.WriteLine();

      Console.WriteLine( "Within cluster sum of squares by cluster:\n" + km.WithinSumOfSquares );
      Console.WriteLine();
    }

    // Convert an integer array to a string
    private static string IntArrayToString( int[] intArray )
    {
      string[] sArray = Array.ConvertAll<int, string>( intArray, new Converter<int, string>( Convert.ToString ) );
      return String.Join( ", ", sArray );
    }

  }  // class

}  // namespace

← All NMath Code Examples
Top