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

Типизированное представление лингвистического терма

Область действия

Современный API представляет один лингвистический терм как неизменяемую связь:

LinguisticTerm(name, fuzzySet)

name — непустая строка, сохраняемая точно в объявленном виде. fuzzySet — современный ScalarFuzzySet; представление не адаптирует исторический изменяемый FuzzySet неявно.

Упорядоченная шкала представляется так:

LinguisticScale((term1, term2, ...))

Явный кортеж сохраняется без сортировки или нормализации. Он должен быть непустым, содержать только LinguisticTerm и использовать уникальные при регистронезависимом сравнении Unicode имена. Объявления, различающиеся только регистром, например Low и LOW, отклоняются: они сделали бы регистронезависимый поиск неоднозначным.

GetTermByName(termName, exactMatching=True) ищет по полному имени. По умолчанию имена сравниваются точно, включая регистр. При exactMatching=False сравниваются имена после свёртки регистра Unicode. Оба режима возвращают исходный объявленный объект LinguisticTerm или None; ни один не ищет по подстроке, префиксу, приблизительному совпадению или принадлежности.

Фаззификация и уверенность

Fuzzify(coordinate, policy) вычисляет каждый терм ровно один раз и возвращает FuzzificationResult. Упорядоченный кортеж memberships сохраняет каждый терм и степень, а confidence — максимальная степень принадлежности, не вероятность.

FuzzificationPolicy явно задаёт оба неопределённых случая:

  • minimumConfidence отклоняет классификацию, если максимальная степень меньше или равна порогу; нулевое значение по умолчанию отклоняет нулевое покрытие, положительное — также близкое к нулю;
  • tieTolerance задаёт абсолютное расстояние от максимума, считающееся равенством;
  • tiePolicy выбирает first, last или all среди равных термов в объявленном порядке шкалы.

Нулевой допуск равенства сравнивает проверенные степени напрямую. Различные значения Fraction остаются различными, даже если преобразование в float дало бы одно значение. Положительный допуск использует нестрогое сравнение расстояния; рациональные степени и смеси рациональных и float сохраняют свои точные представленные значения при сравнении. Значения, записанные в результате и политике, не преобразуются.

Когда обе степени и явно положительный допуск имеют тип float, существующее правило граничного округления также принимает расстояние, относительно близкое к допуску (rel_tol=1e-12, abs_tol=0). Например, степени 0.7 и 0.75 считаются равными при допуске 0.05, несмотря на округление вычитания. Это правило не применяется к нулевому допуску или рациональным значениям.

Полный кортеж принадлежностей доступен даже при отсутствии совпадения. Координата должна принадлежать универсальному множеству каждого терма; частичные векторы оценок отклоняются. Семантика зафиксирована в ADR-0013.

Выборочная диагностика шкалы

Diagnose(analysisDomain, policy) вычисляет явную сетку с сохранением концов на конечной IntegrationDomain. Каждый терм должен использовать ContinuousUniverse, содержащее всю область анализа. Для каждой координаты выборки \(x_j\) результат записывает все упорядоченные степени принадлежности и

\[ c_j=\max_i\mu_{L_i}(x_j). \]

При явном пороге активности \(\tau\) терм активен только при \(\mu_{L_i}(x_j)>\tau\). Точка выборки является пробелом, если активных термов нет, и перекрытием, если активны хотя бы два. Свидетельства качества разбиения используют

\[ e_j=\left|\sum_i\mu_{L_i}(x_j)-1\right|. \]

ScaleDiagnosticsResult предоставляет все точки выборки, экстремумы и среднее покрытия, доли пробелов и перекрытий, максимальное число одновременно активных термов, среднюю и максимальную ошибки разбиения. partitionTolerance определяет, допустимы ли все выборочные ошибки. Наблюдения воспроизводимы для объявленных области, размера сетки и допусков, но не доказывают непрерывное свойство между координатами. ADR-0014 фиксирует полную границу свидетельств.

Совместимость

Исторический fuzzyroutines.FuzzyRoutines.FuzzyScale остаётся доступным. Его свойство levels по-прежнему предоставляет и принимает исходный изменяемый список словарей с обязательными ключами name и fSet. Сохраняется защищённая форма вызова GetLevelByName(levelName, exactMatching=True): по умолчанию поиск точный по полному имени, при False — регистронезависимый по полному имени через историческую таблицу верхнего регистра. Имена, совпадающие без учёта регистра, отклоняются для сохранения однозначности. Современные типы дополняют, а не заменяют изменяемый словарный фасад совместимости. Исторический Fuzzy() по-прежнему выбирает более поздний уровень при точном равенстве. Современный эквивалент — явная FuzzificationPolicy(tiePolicy="last"), а не скрытое значение по умолчанию.

Пример

from fuzzyroutines import (
    ContinuousUniverse,
    FuzzificationPolicy,
    IntegrationDomain,
    LinguisticScale,
    LinguisticTerm,
    ScaleDiagnosticsPolicy,
    ScalarFuzzySet,
)

universe = ContinuousUniverse(0.0, 1.0, leftClosed=True, rightClosed=True)
low = LinguisticTerm("Low", ScalarFuzzySet(universe, lambda value: 1.0 - value))
high = LinguisticTerm("High", ScalarFuzzySet(universe, lambda value: value))
scale = LinguisticScale((low, high))
assert scale.GetTermByName("Low") is low
assert scale.GetTermByName("high", exactMatching=False) is high
result = scale.Fuzzify(
    0.5,
    FuzzificationPolicy(tiePolicy="all", minimumConfidence=0.1),
)
assert result.confidence == 0.5
assert result.selectedTerms == (low, high)

diagnostics = scale.Diagnose(
    IntegrationDomain(0.0, 1.0),
    ScaleDiagnosticsPolicy(sampleCount=101),
)
assert diagnostics.minimumCoverage == 0.5
assert diagnostics.gapPoints == ()