//-Фильтр //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);
//-Основной алгоритм //1. Находим разницу между числами - это как раз их близость друг от друга.
//2. Если число меньше среднего значения дельт, получившихся из п.1, то - 1, а если нет - 0.
//3. Если значение из п.2 равно 1, то суммируем значение с предыдущим итогом, если нет - 0.
//4. Находим максимальное значение из пункта 3.
//5. Определяем диапазон - находим значение из пункта 4 и ищем вверх из пункта 3 число с нулевым значением, потом увеличиваем найденное число на единицу. //Таким образом мы получаем диапазон чисел, плотность которых наибольшая по отношению к другим. } //+------------------------------------------------------------------+
クラスタリングの一つの方法を思い出した。つまり、あるクラスタの要素間の最大距離が、そのクラスタの要素からそのクラスタに含まれない要素までの最小距離よりも小さくなるように、集合の中に要素のグループ(クラスタ)を割り当てるのである。距離は、通常の距離、実数の差のモジュラスでもよい。もちろん、そのようなクラスタは1つだけとは限りません。もしかしたら、正確に1クラスタでなくても、他の方法でも比較した方がいいのかもしれませんね。例えば、グループ内のあるレベルの平均発生時間など。
これは面白いのですが、今のところ、どの数字がクラスターにあるのかを判断する方法がわかりません。ブルートフォース(力技)でしょうか?そうすると、互いに重なり合うグループが出てくると思います。なぜなら、最小のデルタを探しながら、他の要素に関しては大きくなるようにクラスタを定義すると、そのようなクラスタからある要素を落とすとクラスタがずれるからです。クラスタ間の距離が重要で、それが大きければ、うまくいくはずなんですが。
実軸上の2点間の距離は、その差のモジュラスとして誰もが測定できる。数学では、一般にこれをメートル法と呼んでいる。実数である点の組の平面上の距離は、どのように測ればよいのだろうか。ここでもおなじみのユークリッド距離、つまり下位の差の二乗の和の平方根という解決法が用意されているのだ。また、数学者は平面上の他の指標、例えば2つの差の最大モジュラス、差のモジュラスの和(http://ad.cctpu.edu.ru/Math_method/math/45.htm) を持っています。そして、これは数字のペアの場合のみである。たった2つの数字、そしていつも2つ。そして、もっと複雑な状況で近接測定を入力する必要があります。 グループの中に2つの数字があるわけではなく、異なるグループの中に異なる数字があるのです。
最大のグループ、つまり同じグループを構成する要素の数で識別する必要があります。私の欠点は複雑な数式を正確に読めないことなので、例題やそれに対するコメントからすべてを理解するように努めなければなりません。
数学には、2つの関数の距離を測る指標がある。しかしまた、常に2つの間にある。またもや不向きな、グループを持っていますね。
だからこそ、自分でしっかり理解することが大切なんです。書けば、集合における近さの数値特性を得るためのアルゴリズムにまで定式化できるかもしれない。
しかし、それを作ることを諦めることも考えてください。上記のリンク先には、メトリックが満たすべき要件が書かれています。突然そこに現れたわけではなく、どれかが欠けても不思議な効果が生まれます。上の投稿で、そのような包括的な試みを放棄する例を挙げました。グループ内の点は、点の外の要素よりも実軸上で互いに近いペアになるようにします。とても非自明なことを発明する必要はないでしょう。
その通り、最初は2点の近さを判定し、その距離が大きいものを除外しようとするのですが、その距離が大きいかどうかをどうやって判定するのか、それが問題なのです。距離が一桁以上離れているように見えるのは、このアルゴリズムが失敗したところです。
書いてませんね~、まず違いを数える。それから、他のすべて。
処理前にデータをフィルタリングするようなアルゴリズムをテストしています。
1.2つの差分を順番に合計し、その値を2倍する
2.得られた数値列の平均値を求める
3.値が平均値より低い場合、新しい数値系列を描画する
4.数値の系列が元の系列の半分以下になるまで、ポイント2-3を繰り返す
5.フィルタリングの後、我々はすでに上記のアルゴリズムに従って計算を行う
いろいろな数字を試してみて、もっともらしいものができたので、批判的なコメントをいただけると幸いです。
デルタ」欄の差を数えたわけですが、次はどうすればいいのでしょうか?
なぜ堂々巡りなんだ?もうずいぶん前からここに 書かれていることですが
ここで、「一番長く伸びるのは、元の系列が平均を下回るとき」とありますが、これは、私の理解では、私のアルゴリズムの欠陥で、その後、フィルターを作ることが決定されました - 私が作ったので、今では、数字が大きく異なっても、アルゴリズムはそれほど明らかに馬鹿になりません。
デメリットは何ですか?
フィルターはアルゴリズムの代用品ではありません。フィルタはアルゴリズムに追加されるものです。
デメリットは何ですか?
フィルターはアルゴリズムの代用品ではありません。フィルタはアルゴリズムに追加されるものです。
デメリットがわからない......まだ見えていないかもしれない。
これからコーディングしてみようと思うのですが、難しい場合は手伝ってもらえますか?
デメリットがわからない......まだ見えていないかもしれない。
これから体系化してみようと思うのですが、難しい場合は教えていただけますか?
というのも、自分が間違ったことを考えていることに気づくたびに......。
アルゴリズムの開発に着手 - 今、フィルターを作っているところです。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 число с нулевым значением, потом увеличиваем найденное число на единицу.
//Таким образом мы получаем диапазон чисел, плотность которых наибольшая по отношению к другим.
}
//+------------------------------------------------------------------+