Skip to content

Latest commit

 

History

History
121 lines (91 loc) · 8.35 KB

Как добавить новый метод кластеризации.md

File metadata and controls

121 lines (91 loc) · 8.35 KB

Authors:

Asanov Y. V. [[email protected]]

Как добавить новый метод кластеризации

В данный проект можно относительно просто добавить новые методы кластеризации. При их создании можно указать ряд параметров, которые конечный пользователь может затем задать в графическом интерфейсе перед запуском.

Для добавления нового метода кластеризации необходимо реализовать класс-наследник класса Strategy (см. ClasteringAlgorithms.py).

У класса-наследника должны быть реализованы метод класса _setupParams(cls), и методы clastering_image(self, pixels: np.ndarray, params: StrategyRunConfig) -> np.ndarray и clastering_points(self, points: np.ndarray, params: StrategyRunConfig) -> np.ndarray. В большинстве ситуаций, последние 2 функции будут иметь практически идентичную реализацию.

После описания нового класса, добавьте полученному классу декоратор @StrategiesManager.registerStrategy(id, name, description), вписав вместо id, name и description необходимые значения. Поле description опционально. Пример:

@StrategiesManager.registerStrategy("optics_sk", "OPTICS (SKLearn)")
class ConcreteStrategyOPTICS_from_SKLEARN(Strategy):
    # ...

После всего этого, данный класс будет отображён в главном окне программы среди других реализованных алгоритмов, а в окне настройки будут отображены все описанные ранее параметры.

Пожалуйста, если при реализации метода понадобилось подключить ещё один модуль, помимо используемых ранее (на момент написания заметки уже используются SKLearn и PyClustering), то не забудьте записать новую зависимость в файл requirements.txt в корневом каталоге проекта.

_setupParams(cls)

В функции _setupParams при помощи функции cls._addParam должны быть описаны ожидаемые параметры для конфигурации. Например:

# Взято из ClasteringMethods.ClasteringAlgorithms.ConcreteStrategyDBSCAN_from_SKLEARN

@classmethod
def _setupParams(cls):
    cls._addParam("eps", "Максимальное расстояние между объектами", StrategyParamType.UFloating,
                    """
                    Максимальное расстояние между двумя объектами выборки,
                    при котором один из них считается соседом другого.
                    """,
                    0.5)

    cls._addParam("min_samples", "Минимальное количество объектов", StrategyParamType.UNumber,
                    """
                    Минимальное количество объектов в окрестности для того, чтобы точка считалась ядром.
                    """,
                    5)

    cls._addParam("metric", "Метрика", StrategyParamType.Switch,
                    """
                    Метрика для расчета расстояния между объектами.
                    Выбор: euclidean, manhattan, chebyshev, etc.
                    """,
                    "euclidean",
                    switches=["euclidean", "manhattan", "chebyshev"])

    cls._addParam("algorithm", "Алгоритм", StrategyParamType.Switch,
                    """
                    Алгоритм вычисления расстояний: auto, ball_tree, kd_tree, brute.
                    """,
                    "auto",
                    switches=["auto", "ball_tree", "kd_tree", "brute"])

    cls._addParam("leaf_size", "Размер листа", StrategyParamType.UNumber,
                    """
                    Параметр, влияющий на скорость построения и запросов к дереву.
                    """,
                    30)

    cls._addParam("p", "Степень Minkowski", StrategyParamType.Floating,
                    """
                    Степень для метрики Minkowski.
                    """,
                    2.0)

    cls._addParam("n_jobs", "Количество потоков", StrategyParamType.UNumber,
                    """
                    Число потоков для выполнения задачи (-1 для использования всех доступных).
                    """,
                    1)

Поддерживаемые типы на момент написания данной заметки:

  • Number - Число (в Python: int)
  • UNumber - Неотрицательное число (в Python: int)
  • Floating - Число с плавающей точкой (в Python: float)
  • UFloating - Неотрицательное число с плавающей точкой (в Python: float)
  • Switch - Выбор из нескольких вариантов строк (в Python передаётся выбранный вариант типа str)
  • Bool - Булево значение (в Python: bool)

Актуальный список поддерживаемых типов параметром смотрите в ClasteringMethods.ClasteringAlgorithms.StrategyParamType.

После описания поддерживаемых параметров, их можно будет получить при запросе обработки в виде переменной params. Чтобы получить, например, параметр leaf_size, нужно будет воспользоваться следующей конструкцией: params["leaf_size"].

clastering_image(self, pixels: np.ndarray, params: StrategyRunConfig) -> np.ndarray

В данной функции должно быть реализована обработка реализуемым методом массива пикселей, передаваемых переменной pixels. Пример:

# Взято из ClasteringMethods.ClasteringAlgorithms.ConcreteStrategyOPTICS_from_SKLEARN

def clastering_image(self, pixels: np.ndarray, params: StrategyRunConfig) -> np.ndarray:
    model = OPTICS(min_samples=params["min_samples"], max_eps=params["max_eps"], metric=params["metric"],
                p=params["p"], cluster_method=params["cluster_method"], eps=params["eps"], xi=params["xi"], 
                predecessor_correction=params["predecessor_correction"], min_cluster_size=params["min_cluster_size"], 
                algorithm=params["algorithm"], leaf_size=params["leaf_size"], n_jobs=params["n_jobs"])
    return model.fit_predict(pixels)

clastering_points(self, points: np.ndarray, params: StrategyRunConfig) -> np.ndarray

В данной функции должно быть реализована обработка реализуемым методом массива точек, передаваемых переменной points. Пример:

# Взято из ClasteringMethods.ClasteringAlgorithms.ConcreteStrategyOPTICS_from_SKLEARN

def clastering_points(self, points: np.ndarray, params: StrategyRunConfig) -> np.ndarray:
    model = OPTICS(min_samples=params["min_samples"], max_eps=params["max_eps"], metric=params["metric"],
                    p=params["p"], cluster_method=params["cluster_method"], eps=params["eps"], xi=params["xi"], 
                    predecessor_correction=params["predecessor_correction"], min_cluster_size=params["min_cluster_size"], 
                    algorithm=params["algorithm"], leaf_size=params["leaf_size"], n_jobs=params["n_jobs"])
    return model.fit_predict(points)