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