VB NMF Ordered Connectivity Matrix Example

← All NMath 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
    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.

    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
    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)
        ColumnOffset += BlockSize
      ColumnOffset = 0
      RowOffset += BlockSize

  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 Code Examples