Objects: ISlSeries;
Objects: Prognoz.Platform.Interop.Stat.ISlSeries;
The Objects property determines the list of considered objects.
Set of vectors (n): objects; vector length (m): characteristics.
Add a link to the Stat system assembly.
Sub UserProc;
Var
KCA: SmKmeansClusterAnalysis;
Obj: ISlSeries;
Cls: IClustersType;
x1: Array[2] Of 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:
Cluster centers.
List of objects by clusters.
Distances from objects to cluster centers.
The requirements and result of the Fore.NET example execution match with those in the Fore example.
Imports Prognoz.Platform.Interop.Stat;
…
Public Shared Sub Main(Params: StartParams);
Var
KCA: SmKmeansClusterAnalysis;
Obj: ISlSeries;
Cls: IClustersType;
x1: Array[2] Of 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: