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._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"]
.
В данной функции должно быть реализована обработка реализуемым методом массива пикселей, передаваемых переменной 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)
В данной функции должно быть реализована обработка реализуемым методом массива точек, передаваемых переменной 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)