Перейти к содержанию

Выбор семейства функций принадлежности

Выбирайте кривую по смыслу понятия: полоса допуска, плавный переход, предпочтение центрального значения или монотонный хвост. Фабрики возвращают неизменяемые объекты MembershipFunction и не подбирают параметры по данным. Все координаты и параметры должны удовлетворять описанным требованиям к конечным вещественным значениям. Логические значения не принимаются как числа.

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

Каждая кривая отображает 401 наблюдение от −3 до 3. Показанный интервал не определяет математическое множество поддержки. Гауссовы, логистические, гиперболические хвосты и хвосты функции желательности продолжаются за его пределами. Численное обращение в ноль при далёкой координате не меняет аналитическое множество поддержки семейства.

Hyperbolic: насыщение с убывающим хвостом

Hyperbolic(scale, exponent, cutoff) равна единице при координатах не выше cutoff и убывает после него. Положительные масштаб и показатель определяют хвост. Для иллюстративного штрафа можно взять Hyperbolic(1, 2, 0); при координате 1 степень равна 0.5.

Bell: гладкая конечная полоса допуска

Bell(left, plateauStart, plateauEnd) имеет квадратичные плечи и плоское плато. Правая опорная точка равна plateauEnd + plateauStart - left; это не гауссова функция. У Bell(-2, -1, 1) плато занимает [−1, 1], правая опорная точка равна 2.

SShoulder: плавный переход к насыщению

SShoulder(left, right) равна нулю при координатах не выше left, единице — не ниже right; между ними переход квадратичный. В середине степень равна 0.5. Используйте её, когда растущая величина постепенно достигает полного соответствия понятию.

Triangle: предпочтительное значение с линейным допуском

Triangle(left, peak, right) использует обычный порядок: левая граница, вершина, правая граница. Требуется left < peak <= right; вершина на правой границе допустима. Симметричный треугольник удобен для предпочтительной настройки, но асимметричные допуски тоже допустимы. Сценарий качества использует Triangle(10, 12, 14).

Trapezoid: полностью приемлемый интервал

Trapezoid(left, plateauStart, plateauEnd, right) имеет линейные плечи и интервал единичной принадлежности. Равенство plateauStart == plateauEnd допустимо. Используйте её, когда одинаково приемлем диапазон настроек, а не одна предпочтительная точка.

Gaussian: гладкое предпочтение вокруг центра

Gaussian(center, scale) вычисляет ненормированную кривую принадлежности

\[ \mu(x)=\exp\left[-\frac12\left(\frac{x-\mathrm{center}}{\mathrm{scale}}\right)^2\right]. \]

Масштаб положителен, значение в вершине равно единице. Это функция принадлежности, а не нормированная плотность вероятности; её площадь не обязана равняться единице.

Logistic: монотонная сигмоида

Logistic(slope, midpoint) имеет степень 0.5 в средней точке. Наклон должен быть ненулевым: положительный задаёт рост, отрицательный — убывание. Ни одна конечная координата математически не достигает предельных степеней ноль или один, хотя вычисление с плавающей точкой может округлиться до границы или обратиться в ноль из-за потери представимости.

HarringtonDesirability: фиксированная асимметричная сигмоида

HarringtonDesirability() не имеет параметров и вычисляет

\[ \mu(x)=\exp[-\exp(-x)]. \]

На вход подаётся безразмерная преобразованная координата желательности. Прежде чем передавать физическое измерение, определите такое преобразование в своей модели. При нуле степень равна \(\exp(-1)\), приблизительно 0.367879.

Вычисление всех семейств и просмотр неизменяемого определения

from math import exp, isclose
from fuzzyroutines import (
    Bell, Gaussian, HarringtonDesirability, Hyperbolic, Logistic,
    MembershipFunction, SShoulder, Trapezoid, Triangle,
)

assert Hyperbolic(1, 2, 0)(1) == 0.5
assert Bell(-2, -1, 1)(0) == 1
assert SShoulder(-2, 2)(0) == 0.5
assert Triangle(-2, 0, 2)(0) == 1
assert Trapezoid(-2, -1, 1, 2)(0) == 1
assert Gaussian(0, 1)(0) == 1
assert Logistic(2, 0)(0) == 0.5
assert isclose(HarringtonDesirability()(0), exp(-1))
definition = MembershipFunction("triangle", left=-2, peak=0, right=2)
assert definition.Evaluate(0) == definition(0) == 1
assert definition.family == "triangle" and definition.parameters["peak"] == 0
print(definition.family, dict(definition.parameters))

Фабричные функции — самый простой способ начать. Общий конструктор требует точных канонических идентификаторов семейств и имён параметров, в том числе "s_shoulder" и "harrington_desirability". Эти строковые значения — данные, а не имена объявлений Python. Все ограничения приведены в API функций принадлежности.

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