Densité des séries numériques - page 3

 
Vladimir:
Je me suis souvenu d'une façon de regrouper. Le principe est le suivant : vous attribuez des groupes d'éléments (clusters) dans un ensemble, de sorte que la distance maximale entre les éléments d'un cluster soit inférieure à la distance minimale entre tout élément de ce cluster et l'élément qui n'est pas dans ce cluster. La distance peut être une distance ordinaire, un modulus de différence de nombres réels. Bien sûr, il n'y aura pas nécessairement un seul groupe de ce type. Peut-être n'avez-vous pas besoin d'un seul cluster, peut-être devriez-vous les comparer entre eux d'autres manières également. Par exemple, le temps moyen d'occurrence d'un niveau dans le groupe.

C'est intéressant, mais jusqu'à présent, je n'arrive pas à trouver comment déterminer les numéros qui se trouvent dans le groupe - par force brute ? Ensuite, je suppose qu'il y aura des groupes qui se chevaucheront, car si nous définissons un groupe en recherchant le delta le plus petit, mais plus grand par rapport à d'autres éléments, alors le fait de supprimer un élément de ce groupe déplacera le groupe lui-même - la distance entre les groupes aura de l'importance, si elle est significative, alors cela devrait fonctionner.

Vladimir:

La distance entre deux points sur l'axe réel que nous mesurons tous comme le module de leur différence. En mathématiques, c'est ce qu'on appelle communément la métrique. Comment mesurer la distance dans le plan entre des points, des paires de nombres, dont chacun est réel ? Là encore, nous avons la solution toute faite qui nous est familière - la distance euclidienne, la racine du carré de la somme des carrés des différences subordonnées. Et les mathématiciens ont d'autres métriques sur le plan, par exemple le plus grand module de deux différences, la somme des modules de différences(http://ad.cctpu.edu.ru/Math_method/math/45.htm). Et ceci uniquement dans le cas de paires de chiffres. Seulement deux chiffres, et toujours deux. Et vous devez entrer une mesure de proximité dans une situation beaucoup plus compliquée. Il n'y a pas deux numéros dans un groupe, et il y a des numéros différents dans des groupes différents.

Nous devons identifier le plus grand groupe, ou les mêmes groupes par le nombre d'éléments qui les composent. Mon inconvénient est mon incapacité à lire correctement des formules complexes. Je dois donc essayer de tout comprendre à partir des exemples et des commentaires qui s'y rapportent.

Vladimir:

Il existe des métriques en mathématiques qui mesurent la distance entre deux fonctions. Mais encore une fois, toujours entre deux. Encore une fois pas adapté pour vous, vous avez un groupe.

C'est pourquoi il est important de bien le comprendre vous-même. Écrire, peut-être pouvons-nous le formaliser en un algorithme pour obtenir une caractéristique numérique de la proximité dans un ensemble.

Toutefois, envisagez également de renoncer à essayer de la créer. Le lien ci-dessus indique les exigences auxquelles le système métrique doit répondre. Ils ne sont pas apparus là par hasard, sans aucun d'entre eux, des effets étranges se produiront. Dans le post ci-dessus, j'ai donné un exemple de la manière d'abandonner de telles tentatives globales : laissez les points du groupe être plus proches deux à deux sur l'axe réel que des éléments extérieurs au point. Vous n'auriez pas à inventer quelque chose de très peu trivial.

C'est vrai, au départ nous déterminons la proximité de deux points, puis nous essayons d'exclure la distance qui est grande - c'est la question, comment déterminer si la distance est grande ou non ? C'est là que l'algorithme a échoué - lorsque la distance semble être d'un ordre de grandeur supérieur.

 
Dmitry Fedoseev:
Je ne l'ai pas écrit - comptez d'abord les différences. Puis tout le reste.
Vous avez donc compté les différences dans la colonne "Delta", que suggérez-vous de faire ensuite ?
 

Tester un tel algorithme pour filtrer les données avant traitement :

1. Additionner les deux deltas en séquence et multiplier la valeur par deux

2. Trouver la valeur moyenne de la série numérique résultante.

3. Créer une nouvelle série numérique si la valeur est inférieure à la valeur moyenne.

4. Répétez les points 2-3 jusqu'à ce que la série numérique soit inférieure à la moitié de la série d'origine.


NUMÉRO P./P.NuméroDelta53,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. Après le filtrage, nous effectuons déjà le calcul selon l'algorithme ci-dessus.

NO.P./P.NuméroDeltaValeurs prochesProximité dans une rangéeMaximumDenseDensitéDensité 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

J'ai essayé différents chiffres - j'ai obtenu une version plausible, je serais heureux d'entendre des commentaires critiques.
 
-Aleks-:
Vous avez donc compté les différences dans la colonne "Delta", que suggérez-vous de faire ensuite ?
Pourquoi tournez-vous en rond ? Il a été écrit ici depuis longtemps
 
Dmitry Fedoseev:
Pourquoi tournez-vous en rond ? C'est écrit ici depuis longtemps maintenant.

Ici, vous déclarez "La section la plus longue est celle où la série originale est inférieure à la moyenne", mais ceci, je le comprends, est une faille dans mon algorithme, après quoi la décision a été prise de faire un filtre - je l'ai fait et maintenant l'algorithme ne devient pas aussi manifestement stupide lorsque les chiffres sont significativement différents les uns des autres.

 
-Aleks-:

Ici, vous déclarez : "La période la plus longue est celle où la série originale est inférieure à la moyenne", mais ceci, comme je le comprends, est une faille dans mon algorithme, après quoi la décision a été prise de faire un filtre - je l'ai fait et maintenant l'algorithme ne devient pas aussi manifestement stupide lorsque les chiffres diffèrent significativement les uns des autres.

Quel est l'inconvénient ?

Le filtre ne remplace pas l'algorithme. Le filtre est un ajout à l'algorithme.

 
Dmitry Fedoseev:

Quel est l'inconvénient ?

Le filtre ne remplace pas l'algorithme. Le filtre est un ajout à l'algorithme.

Je ne sais pas quel est l'inconvénient - je ne le vois peut-être pas encore.

Je pense que je devrais essayer de le coder maintenant - pouvez-vous m'aider si j'ai des difficultés ?

 
-Aleks-:

Je ne sais pas quel est l'inconvénient - je ne le vois peut-être pas encore.

Je pense que je dois essayer de le codifier maintenant - pouvez-vous m'aider si j'ai des difficultés ?

Commencez par vous y mettre. Ou peut-être que vous n'aurez pas de difficultés. Mais je ne penserai à rien avant, car il s'avère que je pense à la mauvaise chose ou que je pense de la mauvaise façon...
 
Dmitry Fedoseev:
parce qu'à chaque fois que je découvre que je pense à une mauvaise chose, je pense à une mauvaise chose...
C'est ce qui rend les gens uniques...
 

J'ai commencé à développer un algorithme - je suis en train de fabriquer un filtre. Des difficultés sont apparues lors de la synchronisation des deux colonnes "Nombre" et "Delta".

Les idées sur la façon d'éliminer l'imprécision seraient les bienvenues :

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