ファジィマルチ集合

  • 一昨日の記事でRのパッケージsetsのことを書き、そのパッケージは普通の集合(普遍集合)だけでなく、「一般化」「拡張」できるとコメントした
  • ファジィマルチ集合の演算ができる
  • ファジィマルチ集合はこちらにあるように
    • 『要素の重複を許すことができる』
    • 『通常の集合はマルチ集合の一種とみなすことができる』
    • こちらも参考
  • ファジィ集合こちら
    • 要素をカテゴリづけするときに、そのカテゴリ割り当てに確率を持ち込んだもの
  • ラフセットはこちら(日本語のWikiもあるけれど説明が短いので英語版)
    • 「だいたいこのがカテゴリ間の境界だけど、確定しない」で要素をわりつける。順序があれば上下限を曖昧にすることに相当する
  • ラフセットとしてこんなページもあった
  • これらを扱うには「グレード」が必要らしい(特に上下限で定めるラフセットの場合?)
  • Rでやってみる
    • マルチセットでは、集合の要素が複数回登場することがあるので、登場回数をハンドリングできるようにしてある。それを"membership"という。マルチセットではその値が自然数であるし、ファジィセットでは0から1の値になる
> # multiset
> gset(support=c("A","B","C"),memberships=c(1,3,5))
{"A" [1], "B" [3], "C" [5]}
> # fuzzy set
> gset(support=c("A","B","C"),memberships=c(0.1,0.3,1))
{"A" [0.1], "B" [0.3], "C" [1]}
    • ファジィマルチセットでは「ファジィな重み」が回数付きでmembershipとして与えられる。ファジィな重み(0-1の値)はマルチセットとしても与えられる。「ウェブ検索における重み付き出現回数を情報蒐集してストックする」ときなどの用に供されてきたことを思い返すとわかりやすい考え方である
> sp<-c("A","B","C")
> gset(support=sp,memberships=list(c(0.1,0.4,0.3),c(1,1,1),gset(support=c(0.1,0.3,0.4),memberships=c(1,3,7))))
{"A" [{0.1, 0.3, 0.4}], "B" [{1 [3]}], "C" [{0.1 [1], 0.3 [3], 0.4 [7]}]}
    • gsetの中身を取り出したり、特徴情報を提示する関数たち
> gset(support=sp,memberships=list(c(0.1,0.4,0.3),c(1,1,1),gset(support=c(0.1,0.3,0.4),memberships=c(1,3,7))))->gs1
> gs1
{"A" [{0.1, 0.3, 0.4}], "B" [{1 [3]}], "C" [{0.1 [1], 0.3 [3], 0.4 [7]}]}
> gset_support(gs1)
{"A", "B", "C"}
> gset_memberships(gs1)
[[1]]
{0.1, 0.3, 0.4}

[[2]]
{1 [3]}

[[3]]
{0.1 [1], 0.3 [3], 0.4 [7]}

> gset_height(gs1)
[1] 1
> gset_core(gs1)
{"B", "C"}
    • ファジィマルチセットの演算を見てみよう
X<-gset(c("A","B","C"),4:6)
Y<-gset(c("B","C","D"),1:3)
# 和集合
X|Y
# 積集合
X & Y
gset_product(X,Y)
X + Y
X - Y
    • gsetでは、「ユニバース(全体集合)」が定義できるので、補集合もある
# 元の集合のmembershipsと補集合のmembershipsとの和は1
# 補集合は"!"
> gs2<-gset(1,0.3)
> gs2c
{1 [0.7]}
> gs2<-gset(1,0.3)
> gs2
{1 [0.3]}
> gs2c<-!gs2
> gs2c
{1 [0.7]}
> gs3<-gset("A",0.3,universe=c("A","B","C"))
> gs3
{"A" [0.3]}
> !gs3
{"A" [0.7], "B" [1], "C" [1]}
> !!gs3
{"A" [0.3]}
    • membershipsの平均をとることができる
> X<-gset(1:3,1:3/3)
> Y<-gset(1:2,1:2/2)
> gset_mean(X,Y)
{1L [0.4166667], 2L [0.8333333], 3L [0.5]}
> gset_mean(X,Y,"harmonic")
{1L [0.4], 2L [0.8]}
> gset_mean(X,Y,"geometric")
{1L [0.4082483], 2L [0.8164966]}
    • membershipsをいろいろ計算したいことはあるので、それをベクトルとして扱って一括処理するための関数がある
> x<-gset(1:10,1:10/10)
> x
{1L [0.1], 2L [0.2], 3L [0.3], 4L [0.4], 5L [0.5], 6L [0.6], 7L [0.7], 8L [0.8], 9L [0.9],
 10L [1]}
> gset_transform_memberships(x,pmax,0.5)
{1L [0.5], 2L [0.5], 3L [0.5], 4L [0.5], 5L [0.5], 6L [0.6], 7L [0.7], 8L [0.8], 9L [0.9],
 10L [1]}
      • マルチセットの場合は、membershipsをk倍するということは、観察がk倍回あるようなマルチセットであるということ
> x<-gset(c("A","B"),c(1,2))
> rep(x,3)
{"A" [3], "B" [6]}
> x<-gset(c("A","B"),c(0.1,0.3))
> rep(x,3)
{"A" [{0.1 [3]}], "B" [{0.3 [3]}]}
> x+x+x
{"A" [0.3], "B" [0.9]}
    • membershipsを標準化・調整したいこともあるだろう
> x<-gset(1:2,1:2/2)
> x
{1L [0.5], 2L [1]}
> gset_dilate(x)
{1L [0.7071068], 2L [1]}
> gset_concentrate(x)
{1L [0.25], 2L [1]}
> gset_normalize(x)
{1L [0.5], 2L [1]}
> gset_normalize(x,0.1)
{1L [0.05], 2L [0.1]}