Numerische Reihendichte - Seite 3

 
Vladimir:
Ich erinnerte mich an eine Möglichkeit der Clusterbildung. Das geht ungefähr so: Sie ordnen Gruppen von Elementen (Cluster) in einer Menge so zu, dass der maximale Abstand zwischen den Elementen eines Clusters kleiner ist als der minimale Abstand zwischen einem Element dieses Clusters und einem Element, das nicht zu diesem Cluster gehört. Der Abstand kann ein gewöhnlicher Abstand sein, ein Modul der Differenz reeller Zahlen. Natürlich wird es nicht unbedingt nur einen solchen Cluster geben. Vielleicht brauchen Sie nicht genau einen Cluster, vielleicht sollten Sie sie auch auf andere Weise miteinander vergleichen. Zum Beispiel die durchschnittliche Zeit des Auftretens eines Levels in der Gruppe.

Das ist interessant, aber bis jetzt kann ich nicht herausfinden, wie man die Zahlen im Cluster bestimmt - mit roher Gewalt? Dann wird es vermutlich Gruppen geben, die sich überschneiden, denn wenn wir einen Cluster definieren, indem wir nach dem kleinsten Delta suchen, das aber in Bezug auf andere Elemente größer ist, dann wird das Fallenlassen eines Elements aus einem solchen Cluster den Cluster verschieben - der Abstand zwischen den Clustern wird wichtig sein, wenn er signifikant ist, sollte es klappen.

Wladimir:

Den Abstand zwischen zwei Punkten auf der reellen Achse messen wir alle als Modul ihrer Differenz. In der Mathematik wird dies gemeinhin als Metrik bezeichnet. Wie misst man den Abstand in der Ebene zwischen Punkten, Zahlenpaaren, von denen jedes reell ist? Auch hier haben wir die bekannte Lösung parat - den euklidischen Abstand, die Wurzel aus dem Quadrat der Summe der Quadrate der untergeordneten Differenzen. Und die Mathematiker haben noch andere Metriken in der Ebene, z. B. den größten Modulus zweier Differenzen, die Summe der Moduli der Differenzen(http://ad.cctpu.edu.ru/Math_method/math/45.htm). Und dies gilt nur für Zahlenpaare. Nur zwei Zahlen, und immer zwei. Und Sie müssen in einer viel komplizierteren Situation ein Näherungsmaß eingeben: Es gibt nicht zwei Zahlen in einer Gruppe, und es gibt verschiedene Zahlen in verschiedenen Gruppen.

Wir müssen die größte Gruppe oder die gleichen Gruppen nach der Anzahl der Elemente in ihnen identifizieren. Mein Nachteil ist, dass ich komplexe Formeln nicht richtig lesen kann, so dass ich versuchen muss, alles aus Beispielen und Kommentaren zu verstehen.

Wladimir:

In der Mathematik gibt es Metriken, die den Abstand zwischen zwei Funktionen messen. Aber auch hier gilt: immer zwischen zwei. Wieder nicht geeignet für Sie, Sie haben eine Gruppe.

Deshalb ist es wichtig, sie selbst gründlich zu verstehen. Schreiben Sie, vielleicht können wir es zu einem Algorithmus formalisieren, um ein numerisches Merkmal der Nähe in einer Menge zu erhalten.

Überlegen Sie sich aber auch, ob Sie den Versuch aufgeben wollen, es zu schaffen. Unter dem obigen Link ist angegeben, welche Anforderungen die Metrik erfüllen muss. Sie sind nicht aus heiterem Himmel dort aufgetaucht, und ohne einen von ihnen werden seltsame Effekte auftreten. Im obigen Beitrag habe ich ein Beispiel dafür gegeben, wie man auf solche umfassenden Versuche verzichten kann: Die Punkte der Gruppe sollen paarweise auf der realen Achse näher beieinander liegen als die Elemente außerhalb des Punktes. Man müsste nicht etwas sehr Untriviales erfinden.

Das ist richtig, zunächst bestimmen wir die Nähe zweier Punkte, und dann versuchen wir, die Entfernung, die groß ist, auszuschließen - das ist die Frage, wie bestimmen wir, ob die Entfernung groß ist oder nicht? An dieser Stelle hat der Algorithmus nun versagt - wenn der Abstand um eine Größenordnung größer zu sein scheint.

 
Dmitry Fedoseev:
Ich habe es nicht aufgeschrieben - zählen Sie erst die Unterschiede. Dann alles andere.
Sie haben also die Unterschiede in der Spalte "Delta" gezählt, was schlagen Sie als nächstes vor?
 

Testen eines solchen Algorithmus zum Filtern der Daten vor der Verarbeitung:

1. Summieren Sie die beiden Deltas nacheinander und multiplizieren Sie den Wert mit zwei

2. Ermitteln Sie den Durchschnittswert der resultierenden Zahlenreihe

3. Eine neue Zahlenreihe erstellen, wenn der Wert niedriger als der Mittelwert ist

4. Wiederholen Sie die Punkte 2-3, bis die numerische Reihe weniger als die Hälfte der ursprünglichen Reihe beträgt.


NUMMER P./P.NummerDelta53,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. Nach der Filterung führen wir bereits die Berechnung nach dem obigen Algorithmus durch

NO.P./P.NummerDeltaWerte schließenAnnäherung in einer ReiheMaximumDichtesDichteDichte 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

Habe verschiedene Zahlen ausprobiert - habe eine plausible Version, würde mich über kritische Kommentare freuen.
 
-Aleks-:
Sie haben also die Unterschiede in der Spalte "Delta" gezählt, was schlagen Sie als nächstes vor?
Warum drehst du dich im Kreis? Es wurde hier schon lange geschrieben
 
Dmitry Fedoseev:
Warum drehst du dich im Kreis? Hier steht es schon seit langem geschrieben

Hier stellen Sie fest: "Der längste Abschnitt ist der, in dem die ursprüngliche Reihe unter dem Durchschnitt liegt", aber das ist meines Wissens ein Fehler in meinem Algorithmus, woraufhin die Entscheidung getroffen wurde, einen Filter zu erstellen - das habe ich getan, und jetzt wird der Algorithmus nicht mehr so offensichtlich dumm, wenn die Zahlen erheblich voneinander abweichen.

 
-Aleks-:

Hier stellen Sie fest: "Die längste Strecke ist, wenn die ursprüngliche Reihe unter dem Durchschnitt liegt.", aber das ist, so wie ich es verstehe, ein Fehler in meinem Algorithmus, nach dem die Entscheidung getroffen wurde, einen Filter zu machen - ich habe ihn gemacht und jetzt wird der Algorithmus nicht so offensichtlich dumm, wenn die Zahlen signifikant voneinander abweichen.

Was ist der Nachteil?

Der Filter ist kein Ersatz für den Algorithmus. Der Filter ist ein Zusatz zum Algorithmus.

 
Dmitry Fedoseev:

Was ist der Nachteil?

Der Filter ist kein Ersatz für den Algorithmus. Der Filter ist ein Zusatz zum Algorithmus.

Ich weiß nicht, worin der Nachteil besteht - vielleicht sehe ich ihn noch nicht.

Ich denke, ich sollte jetzt versuchen, es zu codieren - können Sie mir helfen, wenn ich Schwierigkeiten habe?

 
-Aleks-:

Ich weiß nicht, was der Nachteil ist - vielleicht sehe ich ihn noch nicht.

Ich glaube, ich muss jetzt versuchen, es zu kodifizieren - können Sie mir helfen, wenn ich Schwierigkeiten habe?

Fangen Sie zuerst an. Vielleicht werden Sie aber auch keine Schwierigkeiten haben. Aber ich werde vorher an nichts denken, denn es stellt sich heraus, dass ich das Falsche denke oder auf die falsche Art und Weise denke...
 
Dmitry Fedoseev:
denn jedes Mal, wenn ich merke, dass ich das Falsche denke, denke ich das Falsche...
Das ist es, was die Menschen einzigartig macht...
 

Ich habe angefangen, einen Algorithmus zu entwickeln - ich mache jetzt einen Filter. Es ist ein Problem bei der Synchronisierung der beiden Spalten "Nummer" und "Delta" aufgetreten.

Ideen, wie die Ungenauigkeit beseitigt werden kann, wären willkommen:

//+------------------------------------------------------------------+
//|                                              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 число с нулевым значением, потом увеличиваем найденное число на единицу.
//Таким образом мы получаем диапазон чисел, плотность которых наибольшая по отношению к другим.
  }
//+------------------------------------------------------------------+
Grund der Beschwerde: