← All NMath Code Examples
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CenterSpace.NMath.Core;
using System.IO;
namespace CenterSpace.NMath.Examples.CSharp
{
/// <summary>
/// A .NET example in C# showing how to create an ordered connectivity matrix to display the results of
/// NMF clustering.
/// </summary>
/// <remarks>
/// 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.
/// </remarks>
public partial class NMFOrderedConnectivityMatrixExample : Form
{
// Colors to use in the bitmap.
private List<Color> colors_ = new List<Color>();
// The heat map.
private Bitmap heatMap_;
public NMFOrderedConnectivityMatrixExample()
{
InitializeComponent();
this.Height = 650;
this.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.
DataFrame data = DataFrame.Load( "nmf_data.dat", true, true, "\t", true );
// Order of the NMF.
int k = 3;
// Number of factorizations to use in constructing the consensus matrix.
int numberOfRuns = 25;
// Construct the consensus matrix using a Gradient Descent, Constrained Least
// Squares iterative algorithm.
var consensusMatrix =
new NMFConsensusMatrix<NMFGdClsUpdate>( data, k, numberOfRuns );
// Construct the ordered connectivity matrix from the consensus matrix.
var orderedConsensusMatrix = 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.
int blockSize = 600 / orderedConsensusMatrix.Order;
int s = ( blockSize + 1 ) * orderedConsensusMatrix.Order;
heatMap_ = new Bitmap( s, s );
int rowOffset = 0;
int columnOffset = 0;
for ( int i = 0; i < orderedConsensusMatrix.Order; i++ )
{
for ( int j = 0; j < orderedConsensusMatrix.Order; j++ )
{
Color c = GetColor( orderedConsensusMatrix[i, j] );
for ( int bi = rowOffset; bi < rowOffset + blockSize; bi++ )
{
for ( int bj = columnOffset; bj < columnOffset + blockSize; bj++ )
{
heatMap_.SetPixel( bi, bj, c );
}
}
columnOffset += blockSize;
}
columnOffset = 0;
rowOffset += blockSize;
}
}
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new NMFOrderedConnectivityMatrixExample() );
}
protected override void OnPaint( PaintEventArgs e )
{
base.OnPaint( e );
int bmpUpperLeftRow = 10;
int bmpUpperLeftCol = 10;
if ( heatMap_ != null )
{
e.Graphics.DrawImage( heatMap_, bmpUpperLeftCol, bmpUpperLeftRow );
}
}
private Color GetColor( double p )
{
if ( p == 1.0 )
return colors_[0];
if ( p >= .9 )
return colors_[1];
if ( p >= .8 )
return colors_[2];
if ( p >= .7 )
return colors_[3];
if ( p >= .6 )
return colors_[4];
if ( p >= .5 )
return colors_[5];
if ( p >= .4 )
return colors_[6];
if ( p >= .3 )
return colors_[7];
if ( p >= .2 )
return colors_[8];
if ( p >= .1 )
return colors_[9];
return Color.MidnightBlue;
}
}
}
← All NMath Code Examples