/// <summary>
/// Clusterization method for given groups number.
/// </summary>
/// <param name="clustersCount">
/// Groups count.
/// </param>
/// <param name="data">
/// Characteristics values for every object.
/// First dimension represents objects.
/// Second Dimension represents characteristics.
/// </param>
/// <returns>
/// Optimal clusterization as <see cref="ClusterizationVariants"/>.
/// </returns>
public int[] Cluster(int clustersCount, double[][] data)
{
// all connections (pairs of elements)
var connections = new List<Connection>();
// all elements
var elements = new List<GraphElement>();
for (int i = 0; i < data.Length; i++)
{
elements.Add(new GraphElement(data[i], i));
}
for (int j = 0; j < elements.Count - 1; j++)
{
for (int k = j + 1; k < elements.Count; k++)
{
connections.Add(new Connection(j, k));
}
}
manager = new GraphManager(connections, elements);
// calculating distances
CommonCalculator.CalculateCharacteristic(manager, normalizedDistanceWeight, distanceWeight);
manager.ConnectGraph();
GraphManager tempManager = manager.Clone();
ChooseDivision(clustersCount, 0, manager);
var result = new int[data.Length];
// extracting clusters from the graph
for (int j = 0; j < optimalDivide.Elements.Count; j++)
{
result[j] = optimalDivide.Elements[j].TaxonNumber;
}
manager = tempManager;
return result;
}