Fuzzy推論とは?

ツイッター投稿記事より(2020年)

5月14日/Fuzzy集合は、例えば物の価格を「安い」、「中ぐらい」、「高い」のように分けます。もっと多くても良いですが。

5月15日/RSIの場合、Fuzzy集合の全体は0.0から100.0までです。その中で「安い」、「中ぐらい」、「高い」に分けます。

5月16日/例えばRSIで25.0は安いか、「Yes or No」? の質問に答えるとすれば ほとんどの方はYesでしょう。

5月17日/質問を変えてRSIの25.0は安いか、「それはなぜか」? という質問だとすると 色々な答えが返って来るでしょう。例えば上昇途上とか。

5月18日/さらにRSIの25.0は安くないのはなぜか? という質問だとすると、「中ぐらい」が正しい、あるいは「高い」が正しいという答えが返ってくるかもしれません(全集合を0から100とすると)。Fuzzic200アップデートしました。

5月19日/しかし、Fuzzy集合で、例えば物の価格を「安い」か、「高い」と分ける事は必ずしも2項対立ということでもありません。価格の話はザデー博士は言っていませんが。

5月20日/Fuzzy論理はFuzzy集合から派生した多値論理の一つです。Fuzzy論理は人の直感に似ています。厳密ではありませんが論理的な推論です。

5月21日/Fuzzyでは、RSIの全体集合〔0,100}の部分集合、「安い」、「中ぐらい」、「高い」に対して、帰属度を定義します。 例えばRSIが30では、帰属度は「安い」= 1.0のように。

5月22日/例えばRSIが40では、帰属度は「安い」= 0.5、「中ぐらい」= 0.5、「高い」= 0.0ように定義します。

5月23日/帰属度はMQL5ではメンバーシップ関数で定義しています。例えばTriangularMembershipFunction()などの関数です。

5月24日/TriangularMembershipFunction()関数は、三角形型のクラス、CTriangularMembershipFunctionから作成します。

5月25日/スクリプトで使用する時は、クラスCTriangularMembershipFunctionのコンストラクターに引数を入力し関数を作り、そしてメンバーシップ関数のラッパー関数TriangularMembershipFunction()を作ります。

5月26日/インジケータで使う時は、CFuzzyTermクラスのコンストラクタCFuzzyTerm(const string name,IMembershipFunction *mf)の引数に、オブジェクトへのポインタを「new」演算子を使用して作成し、渡します。これで推論に使う用語を定義します。

5月27日/クラスINamedVariableが継承した、クラスCListの関数Add(CObject *new_node)の引数に、前日作成したクラスオブジェクトのポインタnew CFuzzyTerm(const string name,IMembershipFunction *mf)を渡します。

5月28日/その後、クラスCFuzzyVariableの関数Terms()ポインタのリストに、関数Add(CObject *new_node)で作成した用語を追加します。/br>

5月29日/CFuzzyVariableのオブジェクトは、同じように他の用語もリストに追加していきます。煩雑ですが他も機械的に作業して行きます。

5月30日/用語のリストを作成し終えたオブジェクトは、クラスCSugenoFuzzySystemオブジェクトポインタのInput()に加えます。

5月31日/推論に使う入力の用語のリストは、使用するRSIインジケータ、RVIインジケータなど、各インジケータごとに作成し、 クラスCSugenoFuzzySystemオブジェクトポインタのInput()に加えて行きます。
6月01日/推論に使う出力の用語のリストを同じように作成し、クラスCSugenoFuzzySystemオブジェクトポインタのOutput()に加えます。

6月02日/次は、クラスCSugenoFuzzySystemのメソッドにより、CSugenoFuzzyRule *rule1 = fsSignal.ParseRule(”ここにルールを書く”)のように、Fuzzy推論のルールを作成していきます。

6月03日/rule1のほか、rule2、rule3と、同じようにFuzzy推論ルールを作っていきます。経験を頼りに作りますが、最適なルールの数は存在します。

6月04日/Fuzzic201のルール数は最大9個全部使っているわけではなく、5個使っています。(但し:最適数ではありません。)

6月05日/作成したルールは、クラスCSugenoFuzzySystemのRules()オブジェクトポインタのリストに加えます。

6月06日/クラスCDictionary_Obj_Doubleオブジェクトポインタの引数に、用語を定義したクラスCFuzzyVariableオブジェクトポインタと、計算する今のインジケータの値を入力します。

6月07日/クラスCListオブジェクトポインタに、前回作成したクラスCDictionary_Obj_Doubleオブジェクトポインタ(引数入力済み)を加えます。

6月08日/クラスCListオブジェクトポインタを、CSugenoFuzzySystemオブジェクトポインタのCalculate()の引数に入力し、Fuzzy推論の計算をし、リストのオブジェクトポインタresultに加えます。

6月09日/リストresultのGetNodeAtIndex(0)の値をクラスCDictionary_Obj_Doubleオブジェクトポインタのp_od_outに入力します。

6月10日/CFuzzyVariableの関数Values()の値を、チャートシンボルの価格精度を定義した小数点以下の桁数にするため、NormalizeDouble(精度に丸める)関数を使います。

6月11日/Fuzzy推論の計算がすべて終了したら、今まで作成したオブジェクトポインタを削除します。