# VB Cluster Example

← All NMath Code Examples

```Imports System

Imports CenterSpace.NMath.Core

Namespace CenterSpace.NMath.Examples.VisualBasic

A .NET example in Visual Basic showing how to perform a hierarchical cluster analysis on a data set.
Module ClusterExample

Sub Main()

Class ClusterAnalysis perform hierarchical cluster analysis. Instances
are constructed from a matrix of data, where each row represents an object
to be clustered. This code clusters 8 random vectors of length 3:
Dim Data As New DoubleMatrix(8, 3, New RandGenUniform())

Console.WriteLine()
Console.WriteLine("Data =")
Console.WriteLine(Data.ToTabDelimited("F5"))

Dim CA As New ClusterAnalysis(Data)

The N property gets the number of objects clustered:
Console.WriteLine("Number of objects clustered = " & CA.N)
Console.WriteLine()

Distances between objects are computed using a Distance.Function delegate.
The default distance delegates is Distance.EuclideanFunction. Property
Distances gets the vector of distances between all possible object pairs,
computed using the current distance delegate. For n objects, the distance
vector is of length (n-1)(n/2), with distances arranged in the order:
(1,2), (1,3), ..., (1,n), (2,3), ..., (2,n), ..., ..., (n-1,n)
Console.WriteLine("Results using Euclidean distance and Single linkage...")
Console.WriteLine()
Console.WriteLine("Distances: ")
Console.WriteLine(CA.Distances.ToString("F3"))
Console.WriteLine()

Distances between clusters of objects are computed using a Linkage.Function
from Distances using the current linkage delegate. At each level in the tree,
Columns 1 and 2 contain the indices of the clusters linked to form the next
cluster. Column 3 contains the distances between the clusters.

The CopheneticDistances property gets the vector of cophenetic distances
between all possible object pairs. The cophenetic distance between two
objects is defined to be the intergroup distance when the objects are first
combined into a single cluster in the linkage tree. The correlation between
the original Distances and the CopheneticDistances is sometimes taken as a
measure of appropriateness of a cluster analysis relative to the original data:
Dim R As Double = StatsFunctions.Correlation(CA.Distances, CA.CopheneticDistances)
Console.WriteLine("Cophenetic correlation = " & R)
Console.WriteLine()

Delegates are provided as static variables on class Distance for
euclidean, squared euclidean, city-block (Manhattan), maximum (Chebychev),
and power distance functions. Delegates are provided as static variables
on class Linkage for single, complete, unweighted average, weighted average,
centroid, median, and Wards linkage functions. You can also easily create
your own distance or linkage functions. This code repeats the analysis using
Console.WriteLine("Results using Squared Euclidean distance and Complete linkage...")
Console.WriteLine()
Console.WriteLine("Distances:")
Console.WriteLine(CA.Distances.ToString("F3"))
Console.WriteLine()

The CutTree() method constructs a set of clusters by cutting the
hierarchical linkage tree either at the specified height, or into the
specified number of clusters. This code cuts the tree into 3 clusters:
Console.WriteLine("CutTree() into 3 clusters...")
Dim CS As ClusterSet = CA.CutTree(3)
Console.WriteLine("Cluster each object is assigned to: " & CS.ToString())

The indexer on ClusterSet gets the cluster to which a given object is
assigned.
Console.WriteLine("Object 0 is in cluster: " & CS(0))
Console.WriteLine("Object 3 is in cluster: " & CS(3))

The Cluster() method returns an array of integers identifying the objects
assigned to a given cluster.
Dim Objects As Array = CS.Cluster(1)
Console.Write("Objects in cluster 1: ")
Dim I As Integer
For I = 0 To Objects.Length - 1
Console.Write(Objects(I) & " ")
Next
Console.WriteLine()

Console.WriteLine()
Console.WriteLine("Press Enter Key")