Source code for pyinference.inference.variable
# coding=utf-8
import numpy as np
from pyinference.fuzzy import set as fuzzy_set
__author__ = 'sejros'
[docs]class Variable(object):
""" Класс реализует переменную
Переменная представляет собой некий параметр, могущий иметь определенный набор значений.
Набор значений переменной может задаваться двумя способами.
Во-первых, можно задать списком. В таком случае, этот список следует передать как аргумент terms конструктора.
Во-вторых, с переменной может быть ассоциирован нечеткий классификатор (см.
:class:`pyinference.fuzzy.set.FuzzySet`).
Тогда передать конструктору следует его.
Переменная в байесовском моделировании – некая сущность, обладающая именем и областью определения.
Обычно, рассматриваются переменные двух типов: дискретные и непрерывные. Дискретные переменные принимают значения
из некоторого конечного множества X, а непрерывные – определены на некотором подмножестве множества действительных
чисел. В общем случае, переменная определяется упорядоченной парой V=(N, X), где N – имя переменной, а X –
множество возможных значений.
Примером случайной переменной может быть результат подбрасывания монеты в таком случае областью ее определения
будет множество {“орел”, “решка”}. В общем случае, конкретные значения переменной не имеют синтаксического значения
(имеют место только семантически, то есть по смыслу) и их обычно заменяют соответствующим по числу элементов
подмножество множества натуральных числе. То есть в нашем примере, можно обозначить значение «решка» за 0, а
«орел» - за 1, и тогда область определения переменной будет {0, 1}.
Построим данную переменную с использованием класса Variable::
coin = Variable(name="coin", terms=["орел", "решка"])
Частным и довольно распространенным случаем дискретной переменной является переменная, способная принимать только
два значения. Такая переменная называется бинарной. В примере выше – результат подбрасывания монеты – бинарная
переменная.
Наиболее важным производным свойством дискретной переменной является мощность переменной – количество значений,
которые она может принимать. Мощность бинарной переменной равна двум.
Синтаксис:
>>> import pyinference.inference.variable
>>> a = Variable(name='a', terms=[0, 1])
>>> a.value = 'low'
>>> from pyinference.fuzzy import set as fuzzy_set
>>> fs = fuzzy_set.Partition(peaks=[0.0, 0.5, 1.0])
>>> b = Variable(name='B', terms=fs)
Поля класса:
card (`int`): мощность переменной (количество значений)
classifier(`dict` or :class:`pyinference.fuzzy.set.FuzzySet`): связанный с переменной классификатор
name (`str`): имя переменной
terms (`list`): список значений переменной (терм-множество)
value (`object`): текущее значение переемнной
Именованные параметры:
name (`str`): имя переменной
terms (`list` or `dict` or :class:`pyinference.fuzzy.set.FuzzySet`): набор значений переменной
Исключения:
`TypeError`: ошибка возникает, если агрумент terms имеет неподдерживаемый тип.
"""
def __init__(self, name='', terms=None):
self.terms = []
self.classifier = {}
if isinstance(terms, list):
self.terms = terms
self.classifier = {}
elif isinstance(terms, fuzzy_set.FuzzySet):
self.terms = terms.sets
self.classifier = terms
elif isinstance(terms, dict):
self.terms = terms.keys()
self.classifier = terms
else:
raise TypeError
self.card = len(self.terms)
self.value = None
self.name = name
[docs] def equals(self, value):
"""Проверка переменной на равенство значению.
Данный метод принимает некое значение и вычисляет меру сходства его со значением атрибута `value`.
Синтаксис:
>>> import pyinference.inference.variable
>>> a = Variable(name='a', terms=[0, 1])
>>> a.value = 'low'
>>> '%.2f' % a.equals('low')
'1.00'
>>> '%.2f' % a.equals('high')
'0.00'
>>> from pyinference.fuzzy import set as fuzzy_set
>>> import pyinference.inference.variable
>>> fs = fuzzy_set.Partition(peaks=[0.0, 0.5, 1.0])
>>> b = Variable(name='B', terms=fs)
>>> b.value = 0.5
>>> '%.2f' % b.equals(0.5)
'1.00'
>>> b.value = '1'
>>> '%.2f' % b.equals(0.25)
'0.50'
Параметры:
value (`object`): Значение переменной.
Может быть как элементом терм-множества занчений, явно перечисленного в атрибуте `terms` класса,
так и элементом области определения связанного с этой переменной классификатора.
Возвращает:
Действительное число x, где -1.0 <= x <= 1.0, характеризующую меру сходства переданного и текущего
значений переменной.
Исключения:
`AttributeError`: если текущее значение переменной не было задано до вызова данного метода.
"""
if self.value is None:
raise AttributeError
if self.value in self.classifier:
val1 = self.classifier[self.value]
else:
val1 = self.value
if value in self.classifier:
val2 = self.classifier[value]
else:
val2 = value
return float(val1 == val2)
def __repr__(self):
""" Краткое текстовое представление перееменной.
Синтаксис:
>>> import pyinference.inference.variable
>>> a = Variable(name='A', terms=[0, 1])
>>> print a
A
Возвращает:
Возвращает имя переменной
"""
return self.name