ISmKmeansClusterAnalysis.Distances

Синтаксис Fore

Distances: Array;

Синтаксис Fore.NET

Distances: System.Array;

Описание

Свойство Distances возвращает расстояния объектов до центров кластеров, к которым они принадлежат.

Комментарии

Для определения варианта выбора начальных центров кластеров используйте свойство ISmKmeansClusterAnalysis.InitCenters.

Пример Fore

Добавьте ссылку на системную сборку Stat.

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;
    // Задаем рассматриваемые объекты
    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;
    // Задаем количество кластеров
    KCA.ClusterCount := 3;
    // Задаем максимальное число итераций
    KCA.MaxIt := 100;
    // Задаем вариант выбора начальных центров кластеров
    KCA.InitCenters := ClusterCentersType.FirstObject;
    // Не исключаем повторяющиеся элементы перед проведением кластеризации
    KCA.ExcludeRepeated := False;
    res := KCA.Execute;
    If res <> 0 Then
        Debug.WriteLine(KCA.Errors);
    Else
        Cls := KCA.Clusters;
        Debug.WriteLine("=== Центры кластеров ===");
        For i := 0 To KCA.Clusters.Count-1 Do //по кластерам
            Debug.WriteLine("  " + "Кластер №" + (i+1).ToString + " ");
            masDouble := Cls.Item(i).Center;
            str := "  " + "(" + masDouble[0].ToString;
            For j := 1 To masDouble.Length-1 Do //по размерности элементов
                str := str + ";" + masDouble[j].ToString;
            End For;
            str := str + ")";
            Debug.WriteLine(str);
        End For;
        Debug.WriteLine("=== Список объектов по кластерам ===");
        For i := 0 To KCA.ClusterCount - 1 Do //по кластерам
            Debug.WriteLine("  " + "Кластер №" + (i+1).ToString + " ");
            masInteger := Cls.Item(i).ObjectsList;
            str := "  " + masInteger[0].ToString;
            For j := 1 To Cls.Item(i).Size - 1 Do //по всем объектам в кластере
                str := str + ",  " + masInteger[j].ToString;
            End For;
            Debug.WriteLine(str);
        End For;
        Debug.WriteLine("=== Расстояния объектов до центров кластеров ===");
        Debug.WriteLine("Объект - Расстояние");
        For i := 0 To KCA.Distances.Length-1 Do
            Debug.WriteLine("  " + i.ToString + " - " + KCA.Distances[i].ToString)
        End For;
    End If;
End Sub UserProc;

После выполнения примера в окно консоли будут выведены:

Пример Fore.NET

Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.

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();
    // Задаем рассматриваемые объекты
    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;
    // Задаем количество кластеров
    KCA.ClusterCount := 3;
    // Задаем максимальное число итераций
    KCA.MaxIt := 100;
    // Задаем вариант выбора начальных центров кластеров
    KCA.InitCenters := ClusterCentersType.cctFirstObject;
    // Не исключаем повторяющиеся элементы перед проведением кластеризации
    KCA.ExcludeRepeated := False;
    res := KCA.Execute();
    If res <> 0 Then
        System.Diagnostics.Debug.WriteLine(KCA.Errors);
    Else
        Cls := KCA.Clusters;
        System.Diagnostics.Debug.WriteLine("=== Центры кластеров ===");
        For i := 0 To KCA.Clusters.Count-1 Do //по кластерам
            System.Diagnostics.Debug.WriteLine("  " + "Кластер №" + (i+1).ToString() + " ");
            masDouble := Cls.Item[i].Center;
            str := "  " + "(" + masDouble[0].ToString();
            For j := 1 To masDouble.Length-1 Do //по размерности элементов
                str := str + ";" + masDouble[j].ToString();
            End For;
            str := str + ")";
            System.Diagnostics.Debug.WriteLine(str);
        End For;
        System.Diagnostics.Debug.WriteLine("=== Список объектов по кластерам ===");
        For i := 0 To KCA.ClusterCount - 1 Do //по кластерам
            System.Diagnostics.Debug.WriteLine("  " + "Кластер №" + (i+1).ToString() + " ");
            masInteger := Cls.Item[i].ObjectsList;
            str := "  " + masInteger[0].ToString();
            For j := 1 To Cls.Item[i].Size - 1 Do //по всем объектам в кластере
                str := str + ",  " + masInteger[j].ToString();
            End For;
            System.Diagnostics.Debug.WriteLine(str);
        End For;
        System.Diagnostics.Debug.WriteLine("=== Расстояния объектов до центров кластеров ===");
        System.Diagnostics.Debug.WriteLine("Объект - Расстояние");
        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;

См. также:

ISmKmeansClusterAnalysis