ISmKmeansClusterAnalysis.Distances

Fore Syntax

Distances: Array;

Fore.NET Syntax

Distances: System.Array;

Description

The Distances property returns distances of objects to cluster centers, to which they belong.

Comments

To determine the variant of selection of cluster initial centers, use the ISmKmeansClusterAnalysis.InitCenters property.

Fore Example

Add a link to the Stat system assembly.

Sub UserProc;
Var
    KCA: SmKmeansClusterAnalysis;
    Obj: ISlSeries;
    Cls: IClustersType;
    x1: Array[2Of Double;
    masDouble: Array Of Double;
    masInteger: Array Of Integer;
    res, i, j: Integer;
    str: string;
Begin
    KCA := New SmKmeansClusterAnalysis.Create;
    // Set objects for consideration
    Obj := KCA.Objects;
    x1[0]:= 27; x1[1]:= 19;
    Obj.Add.Value := x1;
    x1[0]:= 11; x1[1]:= 46;
    Obj.Add.Value := x1;
    x1[0]:= 25; x1[1]:= 15;
    Obj.Add.Value := x1;
    x1[0]:= 36; x1[1]:= 27;
    Obj.Add.Value := x1;
    x1[0]:= 35; x1[1]:= 25;
    Obj.Add.Value := x1;
    x1[0]:= 10; x1[1]:= 43;
    Obj.Add.Value := x1;
    x1[0]:= 11; x1[1]:= 44;
    Obj.Add.Value := x1;
    x1[0]:= 36; x1[1]:= 24;
    Obj.Add.Value := x1;
    x1[0]:= 26; x1[1]:= 14;
    Obj.Add.Value := x1;
    x1[0]:= 26; x1[1]:= 14;
    Obj.Add.Value := x1;
    x1[0]:= 9; x1[1]:= 45;
    Obj.Add.Value := x1;
    x1[0]:= 33; x1[1]:= 23;
    Obj.Add.Value := x1;
    x1[0]:= 27; x1[1]:= 16;
    Obj.Add.Value := x1;
    x1[0]:= 10; x1[1]:= 47;
    Obj.Add.Value := x1;
    // Set the number of clusters
    KCA.ClusterCount := 3;
    // Set maximum number of iterations
    KCA.MaxIt := 100;
    // Set selection of initial centers for clusters
    KCA.InitCenters := ClusterCentersType.FirstObject;
    // Do not exclude repeated elements before clustering
    KCA.ExcludeRepeated := False;
    res := KCA.Execute;
    If res <> 0 Then
        Debug.WriteLine(KCA.Errors);
    Else
        Cls := KCA.Clusters;
        Debug.WriteLine("=== Cluster centers ===");
        For i := 0 To KCA.Clusters.Count-1 Do //by clusters
            Debug.WriteLine("  " + "Cluster #" + (i+1).ToString + " ");
            masDouble := Cls.Item(i).Center;
            str := "  " + "(" + masDouble[0].ToString;
            For j := 1 To masDouble.Length-1 Do //by element size
                str := str + ";" + masDouble[j].ToString;
            End For;
            str := str + ")";
            Debug.WriteLine(str);
        End For;
        Debug.WriteLine("=== List of objects by clusters ===");
        For i := 0 To KCA.ClusterCount - 1 Do //by clusters
            Debug.WriteLine("  " + "Cluster #" + (i+1).ToString + " ");
            masInteger := Cls.Item(i).ObjectsList;
            str := "  " + masInteger[0].ToString;
            For j := 1 To Cls.Item(i).Size - 1 Do //by all objects in cluster
                str := str + ",  " + masInteger[j].ToString;
            End For;
            Debug.WriteLine(str);
        End For;
        Debug.WriteLine("=== Distances from objects to cluster centers ===");
        Debug.WriteLine("Object - Distance");
        For i := 0 To KCA.Distances.Length-1 Do
            Debug.WriteLine("  " + i.ToString + " - " + KCA.Distances[i].ToString)
        End For;
    End If;
End Sub UserProc;

After executing the example the console window displays the following:

Fore.NET Example

The requirements and result of executing the Fore.NET Example match those of the Fore Example.

Imports Prognoz.Platform.Interop.Stat;

Public Shared Sub Main(Params: StartParams);
Var
    KCA: SmKmeansClusterAnalysis;
    Obj: ISlSeries;
    Cls: IClustersType;
    x1: Array[2Of Double;
    masDouble, masInteger, Distances: System.Array;
    res, i, j: Integer;
    str: string;
Begin
    KCA := New SmKmeansClusterAnalysis.Create();
    // Set objects for consideration
    Obj := KCA.Objects;
    x1[0]:= 27; x1[1]:= 19;
    Obj.Add().Value := x1;
    x1[0]:= 11; x1[1]:= 46;
    Obj.Add().Value := x1;
    x1[0]:= 25; x1[1]:= 15;
    Obj.Add().Value := x1;
    x1[0]:= 36; x1[1]:= 27;
    Obj.Add().Value := x1;
    x1[0]:= 35; x1[1]:= 25;
    Obj.Add().Value := x1;
    x1[0]:= 10; x1[1]:= 43;
    Obj.Add().Value := x1;
    x1[0]:= 11; x1[1]:= 44;
    Obj.Add().Value := x1;
    x1[0]:= 36; x1[1]:= 24;
    Obj.Add().Value := x1;
    x1[0]:= 26; x1[1]:= 14;
    Obj.Add().Value := x1;
    x1[0]:= 26; x1[1]:= 14;
    Obj.Add().Value := x1;
    x1[0]:= 9; x1[1]:= 45;
    Obj.Add().Value := x1;
    x1[0]:= 33; x1[1]:= 23;
    Obj.Add().Value := x1;
    x1[0]:= 27; x1[1]:= 16;
    Obj.Add().Value := x1;
    x1[0]:= 10; x1[1]:= 47;
    Obj.Add().Value := x1;
    // Set the number of clusters
    KCA.ClusterCount := 3;
    // Set maximum number of iterations
    KCA.MaxIt := 100;
    // Set selection of initial centers for clusters
    KCA.InitCenters := ClusterCentersType.cctFirstObject;
    // Do not exclude repeated elements before clustering
    KCA.ExcludeRepeated := False;
    res := KCA.Execute();
    If res <> 0 Then
        System.Diagnostics.Debug.WriteLine(KCA.Errors);
    Else
        Cls := KCA.Clusters;
        System.Diagnostics.Debug.WriteLine("=== Cluster centers ===");
        For i := 0 To KCA.Clusters.Count-1 Do //by clusters
            System.Diagnostics.Debug.WriteLine("  " + "Cluster #" + (i+1).ToString() + " ");
            masDouble := Cls.Item[i].Center;
            str := "  " + "(" + masDouble[0].ToString();
            For j := 1 To masDouble.Length-1 Do //by element size
                str := str + ";" + masDouble[j].ToString();
            End For;
            str := str + ")";
            System.Diagnostics.Debug.WriteLine(str);
        End For;
        System.Diagnostics.Debug.WriteLine("=== List of objects by clusters ===");
        For i := 0 To KCA.ClusterCount - 1 Do //by clusters
            System.Diagnostics.Debug.WriteLine("  " + "Cluster #" + (i+1).ToString() + " ");
            masInteger := Cls.Item[i].ObjectsList;
            str := "  " + masInteger[0].ToString();
            For j := 1 To Cls.Item[i].Size - 1 Do //by all objects in cluster
                str := str + ",  " + masInteger[j].ToString();
            End For;
            System.Diagnostics.Debug.WriteLine(str);
        End For;
        System.Diagnostics.Debug.WriteLine("=== Distances from objects to cluster centers ===");
        System.Diagnostics.Debug.WriteLine("Object - Distance");
        Distances := KCA.Distances;
        For i := 0 To KCA.Distances.Length-1 Do
            System.Diagnostics.Debug.WriteLine("  " + i.ToString() + " - " + Distances[i].ToString())
        End For;
    End If;
End Sub;

See also:

ISmKmeansClusterAnalysis