[R] Fwd: NaN-result from fuzzy_inference (package "sets") with certain input

David Meyer david.meyer at wu.ac.at
Thu May 16 09:17:20 CEST 2013


The problem is a numeric issue. As a quick (and dirty!) fix, you can use

FUN <- matchfun(function(x,y) isTRUE(all.equal(x,y)))
`%is%` <- function(x, y) cset_charfun(cset(x, matchfun = FUN))(y)

before calling fuzzy_inference().

I will probably have to change the fuzzy stuff to csets with FUN as 
default matching function for fuzzy variables.

Best
David

On 2013-05-10 09:49, Johannes Radinger wrote:
> 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.meyer at wu.ac.at
> <mailto:david.meyer at 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
>
>

-- 
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
Fax: +43-1-313-36-90-4393
HP:  http://ec.wu.ac.at/~meyer



More information about the R-help mailing list