VB NMF Clustering Example

← All NMath Stats Code Examples


Imports System
Imports System.IO
Imports System.Text
Imports System.Collections.Generic

Imports CenterSpace.NMath.Core
Imports CenterSpace.NMath.Stats

Namespace CenterSpace.NMath.Stats.Examples.VisualBasic

  ' A .NET example in Visual Basic demonstrating how to cluster the "samples" represented as columns
  ' of a matrix using a Nonnegative Matrix Factorization (NMF). Note that the output
  ' of this example may vary from run to run since the NMF algorithm uses an iterative
  ' process that starts at a random solution. Thus the factorization may converge
  ' to different results on different runs (the NMF factorization is not unique).
  Module NMFClusteringExample

    Sub Main()

      Dim Start As DateTime = DateTime.Now

      Dim MatData As New DoubleMatrix(100, 10, New RandGenUniform(45))

      Dim Names(MatData.Cols) As String
      Dim I As Integer = 0
      For I = 0 To Names.Length - 1
        Names(I) = "a" & I
      Dim Data As New DataFrame(MatData, Names)

      ' Factor the matrix using defaults for all factorization settings and the divergence iterative 
      ' update for computing the factorization.
      Dim Cluster As New NMFClustering(Of NMFDivergenceUpdate)()
      Cluster.MaxFactorizationIterations = 20000
      Dim K As Integer = 3
      Cluster.Factor(MatData, K)


      ' Check if the iterative factorization converged before hitting the default maximum
      ' number of iterations.
      If (Cluster.Converged) Then
        Console.WriteLine("Factorization converged in {0} iterations.", Cluster.Iterations)
        Console.WriteLine("Factorization failed to converge in {0} iterations.", Cluster.MaxFactorizationIterations)
      End If

      ' Get the connectivity matrix. The connectivity matrix is an adjacency matrix, A, such that 
      ' columns of the factored matrix are in the same cluster if A[i,j] == 1 and are not in the
      ' same cluster if A[i,j] == 0
      Dim Connectivity As ConnectivityMatrix = Cluster.Connectivity
      Console.WriteLine("Connectivity Matrix: ")

      ' Print out the cluster each column belongs to using the cluster set.
      Dim Cs As ClusterSet = Cluster.ClusterSet
      For I = 0 To Cs.N - 1
        Console.WriteLine("Column {0} belongs to cluster {1}", Data.ColumnHeaders(I), Cs(I))

      ' Print out the the members of each cluster using the cluster set.
      Dim ClusterNumber As Integer = 0
      For ClusterNumber = 0 To Cs.NumberOfClusters - 1
        Dim Members() As Integer = Cs.Cluster(ClusterNumber)
        Console.Write("Cluster number {0} contains: ", ClusterNumber)
        For I = 0 To Members.Length - 1
          Console.Write("{0} ", Data.ColumnHeaders(Members(I)))

      Console.WriteLine("Press Enter Key")

    End Sub
  End Module
End Namespace

← All NMath Stats Code Examples