ISmHierarchicalClusterAnalysis.HCStoppingCriterion

Синтаксис Fore

HCStoppingCriterion: HCStoppingCriterionType;

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

HCStoppingCriterion: Prognoz.Platform.Interop.Stat.HCStoppingCriterionType;

Описание

Свойство HCStoppingCriterion определяет критерий останова.

Комментарии

Для определения порогового значения расстояний между кластерами используйте свойство ISmHierarchicalClusterAnalysis.ThresholdClusterDistance.

Пример Fore

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

Sub UserProc;
Var
    hc: SmHierarchicalClusterAnalysis;
    Dist: ISlDistance;
    Cls: IClustersType;
    Obj: ISlSeries;
    ClustCompOrd: IClustersCompositionOrderItem;
    masDouble, std: Array Of Double;
    masInteger: Array Of Integer;
    x1: Array[2Of Double;
    res, i, j: Integer;
    str: String;
Begin
    hc := New SmHierarchicalClusterAnalysis.Create;
    //список показателей
    Obj := hc.Objects;
    Obj.Clear;
    //добавление показателей
    x1[0] := 27; x1[1] := 19;
    Obj.Add.Value := x1;
    x1[0] := Double.Nan; 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;
    //число кластеров, на которое нужно разбить множество объектов
    hc.ClusterCount := 2;
    //способ расчета расстояния между кластерами
    hc.ClusterLink := ClusterLinkType.Centroid;
    //параметры расчёта расстояний между объектами
    Dist := hc.Distance;
    //способ расчета расстояния между объектами
    hc.Distance.Type := ObjectDistanceType.EuclideanSqr;
    //способ стандартизации признаков
    hc.Distance.Standartization := StandartizationType.ScaleStd; // через стандартное отклонение
    std := New Double[hc.Objects.Count];
    For i := 0 To std.Length - 1 Do
        std[i] := 1 + i / 2;
    End For;
    //коэффициенты стандартизации
    hc.Distance.StandartizationCoefficients := std;
    //критерий останова
    hc.HCStoppingCriterion := HCStoppingCriterionType.NumberOfClusters;
    //ThresholdDistance
    //пороговое значение расстояний между кластерами
    hc.ThresholdClusterDistance := 0.00;
    //создание дендограммы
    hc.CreateDendogram := True;
    //ориентация дендограммы
    hc.DendogramOrientation := DendogramOrientationType.East;
    // Метод обработки пропусков
    hc.MissingData.Method := MissingDataMethod.LinTrend;
    res := hc.Execute;
    Debug.WriteLine(hc.Errors);
    Debug.WriteLine("=== Принадлежность ===");
    Debug.WriteLine("Объект-Кластер");
    //принадлежность к кластерам
    masDouble := hc.Membership.Value;
    For i := 0 To masDouble.Length - 1 Do
        Debug.WriteLine(i.ToString + " - " + masDouble[i].ToString);
    End For;
    Debug.WriteLine("");
    Debug.WriteLine("=== Расстояния ===");
    //последовательность составления кластеров
    For i := 0 To hc.ClustersCompositionOrder.Count - 1 Do
        ClustCompOrd := hc.ClustersCompositionOrder.Item(i);
        Debug.WriteLine(i.ToString + " - " + ClustCompOrd.ClusterDistance.ToString);
    End For;
    Debug.WriteLine("");
    Debug.WriteLine("=== Центры кластеров ===");
    //последовательность кластеров
    Cls := hc.Clusters;
    For i := 0 To Cls.Count - 1 Do //по кластерам
        Debug.WriteLine("Кластер №" + (i + 1).ToString + " ");
        masDouble := Cls.Item(i).Center;
        For j := 0 To masDouble.Length - 1 Do //по всем признакам в кластере
            Debug.WriteLine(masDouble[j].ToString);
        End For;
    End For;
    Debug.WriteLine("");
    Debug.WriteLine("=== Списки объектов ===");
    For i := 0 To hc.Clusters.Count - 1 Do //по кластерам
        Debug.WriteLine("Кластер №" + i.ToString);
        masInteger := hc.Clusters.Item(i).ObjectsList;
        For j := 0 To hc.Clusters.Item(i).Size - 1 Do //по всем объектам в кластере
            Debug.WriteLine(masInteger[j].ToString);
        End For;
    End For;
    Debug.WriteLine("");
    Debug.WriteLine("=== Дендограмма ===");
    //возвращение дендограммы (массив символов)
    For j := 0 To hc.Dendogram.GetUpperBound(1Do
        str := "";
        For i := 0 To hc.Dendogram.GetUpperBound(2Do
            str := str + hc.Dendogram[j, i];
        End For;
        Debug.WriteLine(str);
    End For;
End Sub UserProc;

В результате выполнения примера заданы настройки:

В окно консоли выведены списки объектов принадлежность к кластерам, последовательность кластеров, последовательность составления кластеров, и дендограмма.

Пример Fore.NET

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

Imports Prognoz.Platform.Interop.Stat;

Public Shared Sub Main(Params: StartParams);
Var
    hc: SmHierarchicalClusterAnalysis;
    Dist: ISlDistance;
    Cls: IClustersType;
    Obj: ISlSeries;
    ClustCompOrd: IClustersCompositionOrderItem;
    std: Array Of Double;
    x1: Array[2Of Double;
    res, i, j: Integer;
    str: String;
    Dendogram, masDouble, masInteger: Array;
Begin
    hc := New SmHierarchicalClusterAnalysis.Create();
    //список показателей
    Obj := hc.Objects;
    Obj.Clear();
    //добавление показателей
    x1[0] := 27; x1[1] := 19;
    Obj.Add().Value := x1;
    x1[0] := Double.Nan; 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;
    //число кластеров, на которое нужно разбить множество объектов
    hc.ClusterCount := 2;
    //способ расчета расстояния между кластерами
    hc.ClusterLink := ClusterLinkType.cltCentroid;
    //параметры расчёта расстояний между объектами
    Dist := hc.Distance;
    //способ расчета расстояния между объектами
    hc.Distance.Type := ObjectDistanceType.odEuclideanSqr;
    //способ стандартизации признаков
    hc.Distance.Standartization := StandartizationType.stScaleStd; // через стандартное отклонение
    std := New Double[hc.Objects.Count];
    For i := 0 To std.Length - 1 Do
        std[i] := 1 + i / 2;
    End For;
    //коэффициенты стандартизации
    hc.Distance.StandartizationCoefficients := std;
    //критерий останова
    hc.HCStoppingCriterion := HCStoppingCriterionType.hcscNumberOfClusters;
    //пороговое значение расстояний между кластерами
    hc.ThresholdClusterDistance := 0.00;
    //создание дендограммы
    hc.CreateDendogram := True;
    //ориентация дендограммы
    hc.DendogramOrientation := DendogramOrientationType.doEast;
    // Метод обработки пропусков
    hc.MissingData.Method := MissingDataMethod.mdmLinTrend;
    res := hc.Execute();
    System.Diagnostics.Debug.WriteLine(hc.Errors);
    System.Diagnostics.Debug.WriteLine("=== Принадлежность ===");
    System.Diagnostics.Debug.WriteLine("Объект-Кластер");
    //принадлежность к кластерам
    masDouble := hc.Membership.Value;
    For i := 0 To masDouble.Length - 1 Do
        System.Diagnostics.Debug.WriteLine(i.ToString() + " - " + masDouble[i].ToString());
    End For;
    System.Diagnostics.Debug.WriteLine("");
    System.Diagnostics.Debug.WriteLine("=== Расстояния ===");
    //последовательность составления кластеров
    For i := 0 To hc.ClustersCompositionOrder.Count - 1 Do
        ClustCompOrd := hc.ClustersCompositionOrder.Item[i];
        System.Diagnostics.Debug.WriteLine(i.ToString() + " - " + ClustCompOrd.ClusterDistance.ToString());
    End For;
    System.Diagnostics.Debug.WriteLine("");
    System.Diagnostics.Debug.WriteLine("=== Центры кластеров ===");
    //последовательность кластеров
    Cls := hc.Clusters;
    For i := 0 To Cls.Count - 1 Do //по кластерам
        System.Diagnostics.Debug.WriteLine("Кластер №" + (i + 1).ToString() + " ");
        masDouble := Cls.Item[i].Center;
        For j := 0 To masDouble.Length - 1 Do //по всем признакам в кластере
            System.Diagnostics.Debug.WriteLine(masDouble[j].ToString());
        End For;
    End For;
    System.Diagnostics.Debug.WriteLine("");
    System.Diagnostics.Debug.WriteLine("=== Списки объектов ===");
    For i := 0 To hc.Clusters.Count - 1 Do //по кластерам
        System.Diagnostics.Debug.WriteLine("Кластер №" + i.ToString());
        masInteger := hc.Clusters.Item[i].ObjectsList;
        For j := 0 To hc.Clusters.Item[i].Size - 1 Do //по всем объектам в кластере
            System.Diagnostics.Debug.WriteLine(masInteger[j].ToString());
        End For;
    End For;
    System.Diagnostics.Debug.WriteLine("");
    System.Diagnostics.Debug.WriteLine("=== Дендограмма ===");
    //возвращение дендограммы (массив символов)
    Dendogram := hc.Dendogram;
    For j := 0 To hc.Dendogram.GetUpperBound(0Do
        str := "";
        For i := 0 To hc.Dendogram.GetUpperBound(1Do
            str := str + Dendogram[j, i];
        End For;
        System.Diagnostics.Debug.WriteLine(str);
    End For;
End Sub;

См. также:

ISmHierarchicalClusterAnalysis