MAフィードクラスターの検出をどのようにアルゴリズム化しているのでしょうか? - ページ 11

 
Mikhail Toptunov:

つまり、Modaはevery third(x[2],x[5]...)、または単にx[2]がModa である。

申し訳ありませんが、私はそれを理解することはできません...( これは,関数の第4 引数である配列 pdf[i] の最大 値に対応します).)

こんな感じ。

#include <Math\Stat\Math.mqh>
void OnStart()
{
  double a[] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.55, 0.56, 0.565, 0.57, 0.58, 0.59, 0.6, 0.7, 0.8, 0.9};
  double mode, eps = 0.01;
  mode = mode_calc(a, eps);
  Print("mode = ", mode);
}
//+------------------------------------------------------------------+
double mode_calc(double &a[], double eps)// вычисление моды для выборки a[] с точностью eps
{
  double x[], pdf[];
  MathSequence(MathMin(a), MathMax(a), eps, x);
  int n = ArraySize(x);
  ArrayResize(pdf, n);
  MathProbabilityDensityEmpirical(a, n, x, pdf);
  int ix = ArrayMaximum(pdf);
  return x[ix];
}
 
Maxim Kuznetsov:

最適化、行列、複雑な数学を使わずに、わかりやすい方法で。

1.現在のバーについて、すべてのMAを別々に数えます。N 個までの最大値を含む SMA[N] 配列が得られます。

2. ヒートマップ[M]を作成し、最小値=1.00000から価格をカバーし、各要素は(例えば)10ポイントを担当します。

3.この「生」のヒートマップを埋めるために、各マ値を取り出し、それがどのセルを参照しているかを確認します。index=(SMA[i]-minimum)/resolution.このセルの値を増やすhetmap[index]+=1.0

結果をCSVに出力して考えることができる

4.ヒートマップの「生の」値を平滑化する:配列 smotch[] を起動し,i-window から i+window までを含むヒートマップの平均 smotch[i]=average を読み込みます.

5.スムーチの局所的な最大値は、「フィードのクラスタ」を示すことになる。マキシマの探し方がわかるといいのですが :-)

ポイント1~5は、ループや余分な配列を最小限に抑え、数学的に分解して計算することで、より高速に計算できますが、必ずしも直感的に理解できるわけではありません。


hetmap[index] がよくわからないのですがindex -(例えば500MAで 解像度=10点の場合)いくらくらいになるのでしょうか?

ファックして、最小値=1.00000とは 何だ。

私の理解では.

一般的には、まさか、2つの近接MAを比較して、1より小さければ、hetmap[i]に書き込む必要があるように思われます。

 
Dmitry Fedoseev:

このヒートマップはどうでしょうか?

すみません、それではどちらからアプローチすればいいのかがわかりません

 
Mikhail Toptunov:

すみません、じゃあどっちに行けばいいのかわからないんです!

まずはABCの本を勉強することから始めましょうね。

 
Dmitry Fedoseev:

まずはABCの本を勉強するところから始めなければならないようです。



それができる、それがベストな選択だ!!!でも、それは***です。

 
Mikhail Toptunov:


ここで、私ができること、それは最良の選択です!!!でも、それは***です。

そこに記されているクラスターはどこですか?

 
直線上の点の集まりはどのように探すのでしょうか?

一番簡単なのは、平均値(密度dljat)を計算することです。

これはこちらも同じです。
 
dljat "という言葉の意味を探るため、深い瞑想に入った......。
 
Dmitry Fedoseev:

クラスターはどこにマークされているのですか?

一般に、ある束から別の束に移行する瞬間、つまりクラスタの動きが変わる瞬間を計算する必要がある。

この写真は、その瞬間を50ur地点で撮影したものと思われる。

Maxim Kuznetsov:
直線上の点群の探索はどのように行うのでしょうか?

一番簡単なのは、平均値(dljatsの密度)を計算することです。

ここも同じです。

もし (MA[i-1] - MA[i])+(MA[i] - MA[i+1])<0.005 ならば

МА[i]ゾーン内(例えば、インデックスiの値が+-10)で、MAの最小値を探す。

で、クラスタポイントのパラメータを書き込む(クラス内にオブジェクトを作成する)。

隣接するバーのバンドル(バンドルそのもの)を具体的に特定する。例えば、ピリオドとバーが近いかどうか、クラスオブジェクトに 目を通します。

と、オブジェクトの束の傾向を見ることができます。

 

一般的に、私はこのような行為をしています。

void  medianaL0_0(const int rates_total,const datetime &time[])
  {
   double masPra[Pmax]; // хранение цены МА
   int masPer[Pmax]; // хранение Периода 
   CountPO=0;
   ArrayResize(PO,CountPO); 
   ZeroMemory(PO);
   for(int b=rates_total-Pmax; b<rates_total; b++)
     {
      for(int p=2; p<Pmax; p++) // отбор по периодам
        {
         masPra[p]=sm.d[p-1].m[b]; 
         masPer[p]=p;        
        }
      MathQuickSort(masPra,masPer,2,Pmax-1,1);
      medianaL0_2(masPra,masPer,b,time);
     }
  }

void medianaL0_2(const double &masPra[],const int &masPer[],int bar,const datetime &time[])
  {
   double m[Pmax],x=0,y=0;
   for(int i=5; i<Pmax-1; i++)
     {
      filter0_0(i);
      x=MathAbs(masPra[i-1]-masPra[i]); //MathSqrt
      y=MathAbs(masPra[i]-masPra[i+1]);
      int a=MathAbs(masPer[_ot]-masPer[i]);
      int b=MathAbs(masPer[i]-masPer[_do]);
      if(masPer[i]-masPer[i-1]<=_ot)//&&masPer[i+1]-masPer[i]<=_ot
         m[i]=x+y;
       else
          m[i]=-1;
     }
   medianaL0_3(masPra,masPer,bar,time,m);
  }

void medianaL0_3(const double &masPra[],const int &masPer[],int bar,const datetime &time[],const double &m[])
  {
   for(int i=5; i<Pmax-1; i++)
     {
      filter0_0(i);
      int z=ArrayMinimum(m,_ot,_do);
      if(m[z]<=0.005&&m[z]!=-1)
        {
         ArrayResize(PO,CountPO+1); 
         PO[CountPO].bar=bar;
         PO[CountPO].period=masPer[i];
         PO[CountPO].mediana=i;
         PO[CountPO].praceMA=masPra[i];
         PO[CountPO].time=time[bar];
         CountPO++;
        }
      i=i+_do;
     }
  }