VB NMF Ordered Connectivity Matrix Example

← All NMath Core Code Examples

 

Imports System.Text

Imports CenterSpace.NMath.Core
Imports System.IO

Public Class NMFOrderedConnectivityMatrixExample

  ' A .NET example in Visual Basic showing how to create an ordered connectivity matrix to display the results of
  ' NMF clustering.
  '
  ' An ordered connectivity matrix is created by taking a connectivity matrix
  ' and reordering the rows and columns so that the most affiliated elements
  ' appear as clustered values along the diagonal. The reordering is determined
  ' as follows:
  ' 
  ' First a hierarchical cluster analysis is performed on the elements 
  ' represented in the connectivity matrix. For the purpose of clustering 
  ' the elements represented in the connectivity matrix are labeled 0, 1,
  ' 2,...,n-1, where n is the number of the elements. 
  ' 
  ' Given two integers, i and j, the provided distance function should return
  ' the distance between the ith and jth elements. If no distance function is
  ' provided the default distance function returns the value 1.0 - aij for 
  ' the distance between the ith and jth elements, where aij is the i, jth 
  ' element of the connectivity matrix A. 
  ' 
  ' After the hierarchical clustering process, the leaf nodes of the
  ' dendrogram produced from the results are traversed in order to produce a
  ' permutation vector. This permutation vector is used to reorder the rows
  ' and columns of the input connectivity matrix, causing the most affiliated 
  ' elements to appear as clusters of higher values along the diagonal.
  ' 
  ' The connectivity matrix used in this example is an NMFConsensusMatrix which
  ' is the result of using a Nonnegative Matrix Factorization (NMF) to cluster a set
  ' of samples.  The display in the example is a "heat map" with tightly clustered 
  ' elements colored in darker "hotter" colors (red, orange, yellow) which "cooler" 
  ' colors (green and blue) being used for the more loosely affiliated elements.

  Private HeatMap As Bitmap
  ' Colors to use in the bitmap.

  Private Colors As New List(Of Color)()
  ' The heat map.

  Sub Painting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    If (HeatMap Is Nothing) Then
      Initialize()
    End If
    Dim BmpUpperLeftRow As Integer = 10
    Dim BmpUpperLeftCol As Integer = 10
    e.Graphics.DrawImage(HeatMap, BmpUpperLeftCol, BmpUpperLeftRow)
  End Sub

  Private Sub Initialize()

    Height = 650
    Width = 630

    ' Colors to use in the heat map. The colors range from
    ' reds and oranges, for highly affiliated elements, to
    ' greens and blues for loosely affiliated elements.
    Colors.Add(Color.DarkRed)
    Colors.Add(Color.OrangeRed)
    Colors.Add(Color.Orange)
    Colors.Add(Color.Yellow)
    Colors.Add(Color.GreenYellow)
    Colors.Add(Color.MediumSeaGreen)
    Colors.Add(Color.Green)
    Colors.Add(Color.LightGreen)
    Colors.Add(Color.LightBlue)
    Colors.Add(Color.Aqua)

    ' First read in some data to cluster. In this example columns in the
    ' the data frame represent samples to which we will apply a Nonnegative
    ' Matrix Factorization (NMF) to get a connectivity matrix in the form of a
    ' NMFConsensusMatrix.
    Dim Data As DataFrame = DataFrame.Load("nmf_data.dat", True, True, ControlChars.Tab, True)

    ' Order of the NMF.
    Dim K As Integer = 3

    ' Number of factorizations to use in constructing the consensus matrix.
    Dim NumberOfRuns As Integer = 25

    ' Construct the consensus matrix using a Gradient Descent, Constrained Least
    ' Squares iterative algorithm.
    Dim ConsensusMatrix As New NMFConsensusMatrix(Of NMFGdClsUpdate)(Data, K, NumberOfRuns)

    ' Construct the ordered connectivity matrix from the consensus matrix.
    Dim OrderedConsensusMatrix As New OrderedConnectivityMatrix(ConsensusMatrix)

    ' Construct and display the heat map by displaying the number in the ordered consensus matrix 
    ' a pixels whose colors are "hotter" (red, orange) for higher values (highly affiliated), and 
    ' cooler (green, yellow) for smaller values (less affiliated). Note that all the numbers in the
    ' consensus matrix are between 0 and 1.
    Dim BlockSize As Integer = 600 / OrderedConsensusMatrix.Order
    Dim S As Integer = (BlockSize + 1) * OrderedConsensusMatrix.Order
    HeatMap = New Bitmap(S, S)
    Dim RowOffset As Integer = 0
    Dim ColumnOffset = 0
    Dim I As Integer
    Dim J As Integer
    Dim C As Color
    Dim BI As Integer
    Dim BJ As Integer
    For I = 0 To (OrderedConsensusMatrix.Order - 1)
      For J = 0 To (OrderedConsensusMatrix.Order - 1)
        C = GetColor(OrderedConsensusMatrix(I, J))
        For BI = RowOffset To (RowOffset + BlockSize - 1)
          For BJ = ColumnOffset To (ColumnOffset + BlockSize - 1)
            HeatMap.SetPixel(BI, BJ, C)
          Next
        Next
        ColumnOffset += BlockSize
      Next
      ColumnOffset = 0
      RowOffset += BlockSize
    Next

  End Sub


  Private Function GetColor(ByVal P As Double) As Color

    If (P = 1.0) Then
      Return Colors(0)
    End If
    If (P >= 0.9) Then
      Return Colors(1)
    End If
    If (P >= 0.8) Then
      Return Colors(2)
    End If
    If (P >= 0.7) Then
      Return Colors(3)
    End If
    If (P >= 0.6) Then
      Return Colors(4)
    End If
    If (P >= 0.5) Then
      Return Colors(5)
    End If
    If (P >= 0.4) Then
      Return Colors(6)
    End If
    If (P >= 0.3) Then
      Return Colors(7)
    End If
    If (P >= 0.2) Then
      Return Colors(8)
    End If
    If (P >= 0.1) Then
      Return Colors(9)
    End If
    Return Color.MidnightBlue

  End Function

End Class

← All NMath Stats Code Examples
Top