14
14
from .ordereddict import OrderedDict
15
15
16
16
17
- class FuzzyVariableAdjective (object ):
17
+ class FuzzyVariableTerm (object ):
18
18
"""
19
- An adjective and associated member function for a fuzzy varaible.
19
+ An term and associated member function for a fuzzy varaible.
20
20
For example, if one were creating a FuzzyVariable with a simple three-point
21
- liker scale, three `FuzzyVariableAdjective ` would be created: poor, average,
21
+ liker scale, three `FuzzyVariableTerm ` would be created: poor, average,
22
22
and good.
23
23
"""
24
24
@@ -31,9 +31,9 @@ def __init__(self, label, membership_function):
31
31
32
32
@property
33
33
def full_label (self ):
34
- """Adjective with parent. Ex: velocity['fast']"""
34
+ """Term with parent. Ex: velocity['fast']"""
35
35
if self .parent_variable is None :
36
- raise ValueError ("This adjective must be bound to a parent first" )
36
+ raise ValueError ("This term must be bound to a parent first" )
37
37
return self .parent_variable .label + "[" + self .label + "]"
38
38
39
39
def __repr__ (self ):
@@ -69,7 +69,7 @@ class FuzzyVariable(object):
69
69
This class is designed as the base class underlying the Antecedent and
70
70
Consequent classes, not for individual use.
71
71
"""
72
- def __init__ (self , universe , label , defuzzy_method = 'centroid' ):
72
+ def __init__ (self , universe , label , defuzzify_method = 'centroid' ):
73
73
"""
74
74
Initialization of fuzzy variable
75
75
@@ -83,8 +83,8 @@ def __init__(self, universe, label, defuzzy_method='centroid'):
83
83
"""
84
84
self .universe = np .asarray (universe )
85
85
self .label = label
86
- self .defuzzy_method = defuzzy_method
87
- self .adjectives = OrderedDict ()
86
+ self .defuzzify_method = defuzzify_method
87
+ self .terms = OrderedDict ()
88
88
89
89
self ._id = id (self )
90
90
self ._crisp_value_accessed = False
@@ -94,17 +94,17 @@ def __init__(self, var):
94
94
self .var = var
95
95
96
96
def __getitem__ (self , key ):
97
- # Get the positive version of the adjective
97
+ # Get the positive version of the term
98
98
lbl = "NOT-" + key
99
- if lbl in self .var .adjectives .keys ():
99
+ if lbl in self .var .terms .keys ():
100
100
return self .var [lbl ]
101
101
102
- posadj = self .var [key ]
103
- negadj = FuzzyVariableAdjective (lbl , 1. - posadj .mf )
104
- if posadj .membership_value is not None :
105
- negadj .membership_value = 1. - posadj .membership_value
106
- self .var [lbl ] = negadj
107
- return negadj
102
+ posterm = self .var [key ]
103
+ negterm = FuzzyVariableTerm (lbl , 1. - posterm .mf )
104
+ if posterm .membership_value is not None :
105
+ negterm .membership_value = 1. - posterm .membership_value
106
+ self .var [lbl ] = negterm
107
+ return negterm
108
108
self .not_ = _NotGenerator (self )
109
109
110
110
def __repr__ (self ):
@@ -115,17 +115,17 @@ def __len__(self):
115
115
116
116
def __getitem__ (self , key ):
117
117
"""
118
- Calling variable['label'] will activate 'label' membership function.
118
+ Calling variable['label'] will return the 'label' term
119
119
"""
120
- if key in self .adjectives .keys ():
121
- return self .adjectives [key ]
120
+ if key in self .terms .keys ():
121
+ return self .terms [key ]
122
122
else :
123
123
# Build a pretty list of available mf labels and raise an
124
124
# informative error message
125
125
options = ''
126
- i0 = len (self .adjectives ) - 1
127
- i1 = len (self .adjectives ) - 2
128
- for i , available_key in enumerate (self .adjectives .keys ()):
126
+ i0 = len (self .terms ) - 1
127
+ i1 = len (self .terms ) - 2
128
+ for i , available_key in enumerate (self .terms .keys ()):
129
129
if i == i1 :
130
130
options += "'" + str (available_key ) + "', or "
131
131
elif i == i0 :
@@ -139,19 +139,20 @@ def __getitem__(self, key):
139
139
140
140
def __setitem__ (self , key , item ):
141
141
"""
142
- Enables new membership functions or adjectives to be added with the
142
+ Enables new membership functions or term to be added with the
143
143
syntax::
144
144
145
145
variable['new_label'] = new_mf
146
146
"""
147
- if isinstance (item , FuzzyVariableAdjective ):
147
+ if isinstance (item , FuzzyVariableTerm ):
148
148
if item .label != key :
149
- raise ValueError ("Adjective 's label must match new key" )
149
+ raise ValueError ("Term 's label must match new key" )
150
150
if item .parent_variable is not None :
151
- raise ValueError ("Adjective must not already have a parent" )
151
+ raise ValueError ("Term must not already have a parent" )
152
152
else :
153
- # Try to create an adjective
154
- item = FuzzyVariableAdjective (key , np .asarray (item ))
153
+ # Try to create a term from item, assuming it is a membership
154
+ # function
155
+ item = FuzzyVariableTerm (key , np .asarray (item ))
155
156
156
157
if self ._crisp_value_accessed :
157
158
# TODO: Overcome this limitation
@@ -172,45 +173,45 @@ def __setitem__(self, key, item):
172
173
173
174
# If above pass, add the new membership function
174
175
item .parent_variable = self
175
- self .adjectives [key ] = item
176
+ self .terms [key ] = item
176
177
177
178
@property
178
179
def crisp_value (self ):
179
180
"""Derive crisp value based on membership of adjectives"""
180
181
output_mf , cut_mfs = self ._find_crisp_value ()
181
182
if len (cut_mfs ) == 0 :
182
- raise ValueError ("No adjectives have memberships. Make sure you "
183
+ raise ValueError ("No terms have memberships. Make sure you "
183
184
"have at least one rule connected to this "
184
185
"variable and have run the rules calculation." )
185
186
self ._crisp_value_accessed = True
186
- return defuzz (self .universe , output_mf , self .defuzzy_method )
187
+ return defuzz (self .universe , output_mf , self .defuzzify_method )
187
188
188
189
@crisp_value .setter
189
190
def crisp_value (self , value ):
190
191
"""Propagate crisp value down to adjectives by calculating membership"""
191
- if len (self .adjectives ) == 0 :
192
- raise ValueError ("Set Adjective membership function(s) first" )
192
+ if len (self .terms ) == 0 :
193
+ raise ValueError ("Set Term membership function(s) first" )
193
194
194
- for label , adj in self .adjectives .items ():
195
+ for label , adj in self .terms .items ():
195
196
adj .membership_value = \
196
197
interp_membership (self .universe , adj .mf , value )
197
198
self ._crisp_value_accessed = True
198
199
199
200
def _find_crisp_value (self ):
200
201
# Check we have some adjectives
201
- if len (self .adjectives .keys ()) == 0 :
202
- raise ValueError ("Set Adjective membership function(s) first" )
202
+ if len (self .terms .keys ()) == 0 :
203
+ raise ValueError ("Set term membership function(s) first" )
203
204
204
205
# Initilize membership
205
206
output_mf = np .zeros_like (self .universe , dtype = np .float64 )
206
207
207
208
# Build output membership function
208
209
cut_mfs = {}
209
- for label , adj in self .adjectives .items ():
210
- cut = adj .membership_value
210
+ for label , term in self .terms .items ():
211
+ cut = term .membership_value
211
212
if cut is None :
212
213
continue # No membership defined for this adjective
213
- cut_mfs [label ] = np .minimum (cut , adj .mf )
214
+ cut_mfs [label ] = np .minimum (cut , term .mf )
214
215
np .maximum (output_mf , cut_mfs [label ], output_mf )
215
216
216
217
return output_mf , cut_mfs
@@ -316,7 +317,7 @@ def automf(self, number=5, variable_type='quality', names=None,
316
317
abcs = [[c - w / 2 , c , c + w / 2 ] for c , w in zip (centers , widths )]
317
318
318
319
# Clear existing adjectives, if any
319
- self .adjectives = OrderedDict ()
320
+ self .terms = OrderedDict ()
320
321
321
322
# Repopulate
322
323
for name , abc in zip (names , abcs ):
0 commit comments