Hi,
@David: thank you for your fast response. I changed the universe to
cover the at least the total range of the values in the dataframe.
However, this does not save the problem for several combination of depth
and velocity. I attached the same example as before but with a dataframe
of such combinations that don't work. Is the problem caused by the
definition of the membership classes? How can the problem bis solved?
## set universe
sets_options("universe", seq(from = 0, to = 5, by = 0.001))
## set up fuzzy variables
variables <-
set(depth = fuzzy_variable(verylow = fuzzy_trapezoid(corners =
c(-3,0,0.2,0.5)),
medium = fuzzy_trapezoid(corners
=c(0.45,0.55,0.7,0.9)),
veryhigh = fuzzy_trapezoid(corners =
c(0.85,1,15,20))),
velocity = fuzzy_variable(verylow = fuzzy_trapezoid(corners =
c(-3,0,0.2,0.5)),
medium = fuzzy_trapezoid(corners =
c(0.35,0.55,0.65,0.8)),
veryhigh = fuzzy_trapezoid(corners =
c(0.7,0.9,15,20))),
suitability = fuzzy_partition(varnames = c(none = 0.2, low =
0.4, medium = 0.6, high = 0.8),FUN = fuzzy_cone, radius = 0.2))
## set up rules
rules <-
set(
fuzzy_rule(depth %is% verylow && velocity %is% verylow, suitability
%is% low),
fuzzy_rule(depth %is% medium && velocity %is% verylow, suitability
%is% medium),
fuzzy_rule(depth %is% veryhigh && velocity %is% verylow,
suitability %is% low),
fuzzy_rule(depth %is% verylow && velocity %is% medium, suitability
%is% medium),
fuzzy_rule(depth %is% medium && velocity %is% medium, suitability
%is% high),
fuzzy_rule(depth %is% veryhigh && velocity %is% medium, suitability
%is% medium),
fuzzy_rule(depth %is% verylow && velocity %is% veryhigh,
suitability %is% none),
fuzzy_rule(depth %is% medium && velocity %is% veryhigh, suitability
%is% low),
fuzzy_rule(depth %is% veryhigh && velocity %is% veryhigh,
suitability %is% none)
)
## combine to a system
system <- fuzzy_system(variables, rules)
print(system)
plot(system) ## plots variables
# test df
test_df <-
data.frame(depth=c(1.71,0.61,1.56,0.47,0.70,0.42,1.90),velocity=c(0.70,1.40,0.95,0.65,0.58,0.47,1.24),suitability=NA)
# do inference on test_df
fuzzy_result <- function(df){
gset_defuzzify(fuzzy_inference(system, list(depth = df["depth"],
velocity = df["velocity"])),"centroid")
}
apply(test_df,1,fuzzy_result)
/Johannes
On Thu, May 9, 2013 at 12:35 AM, David Meyer <david.me...@wu.ac.at
<mailto:david.me...@wu.ac.at>> wrote:
It's because you restricted the universe to [0,1], so the fuzzy
inference returns empty sets for those entries in your df with
values larger than 1 ...
David
On 2013-05-08 14:53, Johannes Radinger wrote:
This email has already been sent to the R-mailing list,
but maybe you as the author of the package "sets" can help here
best....
Hi,
I am trying to use the fuzzy_inference system on multiple input
values.
Basically I combine two variables (depth, velocity) into the
variable
suitability.
Both depth and velocity have 3 trapezoid classes
(verylow,medium,high) each.
The consequent (suitability) has 4 fuzzy levels
(none,low,medium,high)
and should
finally range between 0 and 1.
I already set up the level definitions (trapez-corners) and the
rules (a
combination
of all depth-levels with all velocity-levels and the consequent
suitability).
Now I wanted to test the system on a dataframe with dummy
variables (in
the range
of values I will supply), but some how I get for some
combinations of depth
and velocity no resulting suitablilty.
I provide here now some code (simpler than my actual) that
produces also
this
NaN values:
# Load "sets"
library(sets)
## set universe
sets_options("universe", seq(from = 0, to = 1, by = 0.001))
## set up fuzzy variables
variables <-
set(depth = fuzzy_variable(verylow = fuzzy_trapezoid(corners =
c(-3,0,0.2,0.5)),
medium = fuzzy_trapezoid(corners
=c(0.45,0.55,0.7,0.9)),
veryhigh =
fuzzy_trapezoid(corners =
c(0.85,1,15,20))),
velocity = fuzzy_variable(verylow =
fuzzy_trapezoid(corners =
c(-3,0,0.2,0.5)),
medium =
fuzzy_trapezoid(corners =
c(0.35,0.55,0.65,0.8)),
veryhigh =
fuzzy_trapezoid(corners =
c(0.7,0.9,15,20))),
suitability = fuzzy_partition(varnames = c(none = 0.2,
low =
0.4, medium = 0.6, high = 0.8),FUN = fuzzy_cone, radius = 0.15))
## set up rules
rules <-
set(
fuzzy_rule(depth %is% verylow && velocity %is% verylow,
suitability
%is% low),
fuzzy_rule(depth %is% medium && velocity %is% verylow,
suitability
%is% medium),
fuzzy_rule(depth %is% veryhigh && velocity %is% verylow,
suitability %is% low),
fuzzy_rule(depth %is% verylow && velocity %is% medium,
suitability
%is% medium),
fuzzy_rule(depth %is% medium && velocity %is% medium,
suitability
%is% high),
fuzzy_rule(depth %is% veryhigh && velocity %is% medium,
suitability
%is% medium),
fuzzy_rule(depth %is% verylow && velocity %is% veryhigh,
suitability %is% none),
fuzzy_rule(depth %is% medium && velocity %is% veryhigh,
suitability
%is% low),
fuzzy_rule(depth %is% veryhigh && velocity %is% veryhigh,
suitability %is% none)
)
## combine to a system
system <- fuzzy_system(variables, rules)
print(system)
plot(system) ## plots variables
# test df
test_df <-
data.frame(depth=round(runif(__20,0,2),2),velocity=round(__runif(20,0,1.5),2),__suitability=NA)
# do inference on test_df
fuzzy_result <- function(df){
gset_defuzzify(fuzzy___inference(system, list(depth =
df["depth"],
velocity = df["velocity"])),"centroid")
}
apply(test_df,1,fuzzy_result)
Does anyone know what is happening there?
/Johannes
--
Priv.-Doz. Dr. David Meyer
Department of Information Systems and Operations
WU
Wirtschaftsuniversität Wien
Vienna University of Economics and Business
Augasse 2-6, 1090 Vienna, Austria
Tel: +43-1-313-36-4393 <tel:%2B43-1-313-36-4393>
Fax: +43-1-313-36-90-4393 <tel:%2B43-1-313-36-90-4393>
HP: http://ec.wu.ac.at/~meyer