数値列密度 - ページ 3

 
Vladimir:
クラスタリングの一つの方法を思い出した。つまり、あるクラスタの要素間の最大距離が、そのクラスタの要素からそのクラスタに含まれない要素までの最小距離よりも小さくなるように、集合の中に要素のグループ(クラスタ)を割り当てるのである。距離は、通常の距離、実数の差のモジュラスでもよい。もちろん、そのようなクラスタは1つだけとは限りません。もしかしたら、正確に1クラスタでなくても、他の方法でも比較した方がいいのかもしれませんね。例えば、グループ内のあるレベルの平均発生時間など。

これは面白いのですが、今のところ、どの数字がクラスターにあるのかを判断する方法がわかりません。ブルートフォース(力技)でしょうか?そうすると、互いに重なり合うグループが出てくると思います。なぜなら、最小のデルタを探しながら、他の要素に関しては大きくなるようにクラスタを定義すると、そのようなクラスタからある要素を落とすとクラスタがずれるからです。クラスタ間の距離が重要で、それが大きければ、うまくいくはずなんですが。

ウラジミール

実軸上の2点間の距離は、その差のモジュラスとして誰もが測定できる。数学では、一般にこれをメートル法と呼んでいる。実数である点の組の平面上の距離は、どのように測ればよいのだろうか。ここでもおなじみのユークリッド距離、つまり下位の差の二乗の和の平方根という解決法が用意されているのだ。また、数学者は平面上の他の指標、例えば2つの差の最大モジュラス、差のモジュラスの和(http://ad.cctpu.edu.ru/Math_method/math/45.htm) を持っています。そして、これは数字のペアの場合のみである。たった2つの数字、そしていつも2つ。そして、もっと複雑な状況で近接測定を入力する必要があります。 グループの中に2つの数字があるわけではなく、異なるグループの中に異なる数字があるのです。

最大のグループ、つまり同じグループを構成する要素の数で識別する必要があります。私の欠点は複雑な数式を正確に読めないことなので、例題やそれに対するコメントからすべてを理解するように努めなければなりません。

ウラジミール

数学には、2つの関数の距離を測る指標がある。しかしまた、常に2つの間にある。またもや不向きな、グループを持っていますね。

だからこそ、自分でしっかり理解することが大切なんです。書けば、集合における近さの数値特性を得るためのアルゴリズムにまで定式化できるかもしれない。

しかし、それを作ることを諦めることも考えてください。上記のリンク先には、メトリックが満たすべき要件が書かれています。突然そこに現れたわけではなく、どれかが欠けても不思議な効果が生まれます。上の投稿で、そのような包括的な試みを放棄する例を挙げました。グループ内の点は、点の外の要素よりも実軸上で互いに近いペアになるようにします。とても非自明なことを発明する必要はないでしょう。

その通り、最初は2点の近さを判定し、その距離が大きいものを除外しようとするのですが、その距離が大きいかどうかをどうやって判定するのか、それが問題なのです。距離が一桁以上離れているように見えるのは、このアルゴリズムが失敗したところです。

 
Dmitry Fedoseev:
書いてませんね~、まず違いを数える。それから、他のすべて。
では、「デルタ」欄の差を数えたわけですが、次はどうすればいいのでしょうか?
 

処理前にデータをフィルタリングするようなアルゴリズムをテストしています。

1.2つの差分を順番に合計し、その値を2倍する

2.得られた数値列の平均値を求める

3.値が平均値より低い場合、新しい数値系列を描画する

4.数値の系列が元の系列の半分以下になるまで、ポイント2-3を繰り返す


NUMBER P./P.番号デルタ53,3325,829,60
1 10
2 20 10
3 30 10 40 40
4 40 10 40 40
5 50 10 40 40
6 51 1 22 22 22
7 52 1 4 4 4
8 53 1 4 4 4
9 54 1 4 4 4
10 60 6 14 14 14
11 70 10 32 32
12 80 10 40 40
13 120 40 100
14 150 30 140
15 190 40 140
16 210 20 120
17 223 13 66
18 232 9 44 44
19 250 18 54
20 260 10 56

5.フィルタリングの後、我々はすでに上記のアルゴリズムに従って計算を行う

NO.P./P.番号デルタ近い値プロキシミティ・イン・ザ・ロウ最大緻密な密度密度v2
1 40 4
2 50 10 0 0 50
3 51 1 1 1 51 0,80 1,00
4 52 1 1 2 52
5 53 1 1 3 53
6 54 1 1 4 54
7 60 6 0 0

いろいろな数字を試してみて、もっともらしいものができたので、批判的なコメントをいただけると幸いです。
 
-Aleks-:
デルタ」欄の差を数えたわけですが、次はどうすればいいのでしょうか?
なぜ堂々巡りなんだ?以前からここに 書かれている
 
Dmitry Fedoseev:
なぜ堂々巡りなんだ?もうずいぶん前からここに 書かれていることですが

ここで、「一番長い区間は、元の系列が平均を下回っているとき」とありますが、これは、私のアルゴリズムの欠陥だと理解しています。その後、フィルターを作ることが決定され、それを実行したところ、数字が互いに大きく異なるときに、アルゴリズムはそれほど明らかにバカにはならなくなったのです。

 
-Aleks-:

ここで、「一番長く伸びるのは、元の系列が平均を下回るとき」とありますが、これは、私の理解では、私のアルゴリズムの欠陥で、その後、フィルターを作ることが決定されました - 私が作ったので、今では、数字が大きく異なっても、アルゴリズムはそれほど明らかに馬鹿になりません。

デメリットは何ですか?

フィルターはアルゴリズムの代用品ではありません。フィルタはアルゴリズムに追加されるものです。

 
Dmitry Fedoseev:

デメリットは何ですか?

フィルターはアルゴリズムの代用品ではありません。フィルタはアルゴリズムに追加されるものです。

デメリットがわからない......まだ見えていないかもしれない。

これからコーディングしてみようと思うのですが、難しい場合は手伝ってもらえますか?

 
-Aleks-:

デメリットがわからない......まだ見えていないかもしれない。

これから体系化してみようと思うのですが、難しい場合は教えていただけますか?

まずは始めてみてください。あるいは、困難がないのかもしれません。でも、それまでは何も考えません。間違ったことを考えたり、間違った考え方をしたりすることが判明するから......。
 
Dmitry Fedoseev:
というのも、自分が間違ったことを考えていることに気づくたびに......。
それが人の個性というものだろう...。
 

アルゴリズムの開発に着手 - 今、フィルターを作っているところです。Number "と "Delta "の2つのカラムの同期に問題がある。

不正確さを解消するためのアイデアをお待ちしています。

//+------------------------------------------------------------------+
//|                                              Test_FindOblast.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int massivSize=19; //размер массива  
   double Digit[19]=
     {
      10,
      20,
      30,
      40,
      50,
      51,
      52,
      53,
      54,
      60,
      70,
      80,
      120,
      150,
      190,
      210,
      223,
      232,
      250,
      260
     };
   double summDelta[19-1];
   int N=massivSize-1;//Количество оставшихся цифровых значений
   double avrMass=0;//Среднее значение массива дельт

//-Фильтр
//1. Суммируем  последовательно две дельты и умножаем значение на два
   for(int i=1;i<massivSize;i++)
     {
      summDelta[i-1]=((Digit[i]-Digit[i-1])+(Digit[i+1]-Digit[i]))*2;
     }
   for(int i=0;i<massivSize-1;i++) printf("summDelta[%d] = %G",i,summDelta[i]);

//2. Находим среднее значение получившегося числового ряда
//3. Составляем новый числовой ряд, если значение меньше среднего значения
//4. Повторяем пункт 2-3 пока числовой ряд не будет меньше половины первоначального ряда
   for(int Z=0;N>massivSize/2;Z++)
     {
      int SizeMass=ArraySize(summDelta);//Узнаем размер массива
      avrMass=iMAOnArray(summDelta,0,SizeMass,0,0,0);
      Print("Среднее значение получившегося числового ряда",Z,"=",avrMass);

      for(int i=0;i<SizeMass;i++)
        {            
         if(summDelta[i]>avrMass)
           {
            summDelta[i]=0;
            Digit[i]=0;
            N--;
           }
        }

         Print("N=",N);
         ArraySort(summDelta,WHOLE_ARRAY,0,MODE_DESCEND);
         ArraySort(Digit,WHOLE_ARRAY,0,MODE_DESCEND);
         if(N!=0)
           {
            ArrayResize(summDelta,N,0);
            for(int i=0;i<N;i++) printf("summDelta[%d] = %G",i,summDelta[i]);
            ArrayResize(Digit,N+1,0);
            for(int i=0;i<N+1;i++) printf("Digit[%d] = %G",i,Digit[i]);          
           }
         else
           {
            for(int i=0;i<N;i++) printf("summDelta[%d] = %G",i,summDelta[i]);            
            for(int i=0;i<N+1;i++) printf("Digit[%d] = %G",i,Digit[i]);  
            return;
           }
     }
      int SizeMass=ArraySize(summDelta);//Узнаем размер массива
      avrMass=iMAOnArray(summDelta,0,SizeMass,0,0,0);
      Print("Среднее значение получившегося числового ряда=",avrMass);

//-Основной алгоритм
//1. Находим разницу между числами - это как раз их близость друг от друга.

//2. Если число меньше среднего значения дельт, получившихся из п.1, то - 1, а если нет - 0.

//3. Если значение из п.2 равно 1, то суммируем значение с предыдущим итогом, если нет - 0.

//4. Находим максимальное значение из пункта 3.

//5. Определяем диапазон - находим значение из пункта 4 и ищем вверх из пункта 3 число с нулевым значением, потом увеличиваем найденное число на единицу.
//Таким образом мы получаем диапазон чисел, плотность которых наибольшая по отношению к другим.
  }
//+------------------------------------------------------------------+