← 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