Densidad de la serie numérica - página 3

 
Vladimir:
He recordado una forma de agrupación. Es algo así: se asignan grupos de elementos (clusters) en un conjunto, de manera que la distancia máxima entre los elementos de un cluster es menor que la distancia mínima de cualquier elemento de ese cluster al elemento que no está en ese cluster. La distancia puede ser una distancia ordinaria, un módulo de diferencia de números reales. Por supuesto, no necesariamente habrá una sola agrupación de este tipo. Tal vez no necesites exactamente un clúster, sino que también debas compararlos entre sí de otras maneras. Por ejemplo, el tiempo medio de aparición de un nivel en el grupo.

Esto es interesante, pero hasta ahora no puedo averiguar cómo determinar qué números están en el clúster - ¿por fuerza bruta? Entonces, supongo que habrá grupos que se solapen entre sí, porque si definimos un cluster buscando el delta más pequeño, pero más grande con respecto a otros elementos, entonces al eliminar algún elemento de dicho cluster se desplazará el cluster - la distancia entre clusters será importante, si es significativa, debería funcionar.

Vladimir:

La distancia entre dos puntos en el eje real la medimos todos como el módulo de su diferencia. En matemáticas, esto se conoce comúnmente como la métrica. ¿Cómo se mide la distancia en el plano entre puntos, pares de números, cada uno de los cuales es real? Una vez más tenemos la conocida solución lista: la distancia euclidiana, la raíz del cuadrado de la suma de los cuadrados de las diferencias subordinadas. Y los matemáticos tienen otras métricas en el plano, por ejemplo, el mayor módulo de dos diferencias, la suma de módulos de diferencias(http://ad.cctpu.edu.ru/Math_method/math/45.htm). Y esto es sólo en el caso de los pares de números. Sólo dos números, y siempre dos. No hay dos números en un grupo, y hay diferentes números en diferentes grupos.

Tenemos que identificar el grupo más grande, o los mismos grupos por el número de elementos que contienen. Mi desventaja es mi incapacidad para leer correctamente las fórmulas complejas, por lo que tengo que tratar de entender todo lo de los ejemplos y los comentarios a los mismos.

Vladimir:

En matemáticas existen métricas que miden la distancia entre dos funciones. Pero de nuevo, siempre entre dos. De nuevo no es adecuado para ti, tienes un grupo.

Por eso es importante que lo entiendas a fondo tú mismo. Escribe, tal vez podamos formalizarlo hasta un algoritmo para obtener una característica numérica de proximidad en un conjunto.

Sin embargo, considere también la posibilidad de dejar de intentar crearla. En el enlace anterior se indican los requisitos que debe cumplir la métrica. No aparecieron allí de la nada, sin ninguno de ellos se producirán efectos extraños. En el post anterior di un ejemplo de cómo abandonar tales intentos exhaustivos: que los puntos del grupo estén más cerca por parejas en el eje real que los elementos fuera del punto. No habría que inventar algo muy poco trivial.

Así es, inicialmente determinamos la proximidad de dos puntos, y luego tratamos de excluir la distancia que es grande - esa es la pregunta, ¿cómo determinamos si la distancia es grande o no? Aquí es donde el algoritmo ha fallado: cuando la distancia parece ser un orden de magnitud mayor.

 
Dmitry Fedoseev:
No lo he anotado, cuenta primero las diferencias. Luego todo lo demás.
Así que ha contado las diferencias en la columna "Delta", ¿qué sugiere que hagamos a continuación?
 

Probar un algoritmo de este tipo para filtrar los datos antes de procesarlos:

1. Suma los dos deltas en secuencia y multiplica el valor por dos

2. Hallar el valor medio de la serie numérica resultante

3. Crear una nueva serie numérica si el valor es inferior al valor medio

4. Repita los puntos 2-3 hasta que la serie numérica sea inferior a la mitad de la serie original


NÚMERO P./P.NúmeroDelta53,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. Tras el filtrado, ya hacemos el cálculo según el algoritmo anterior

NO.P./P.NúmeroDeltaCerrar valoresProximidad en una filaMáximoDensoDensidadDensidad 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

Probado con diferentes figuras - tiene una versión plausible, sería feliz de escuchar los comentarios críticos.
 
-Aleks-:
Así que has contado las diferencias en la columna "Delta", ¿qué sugieres que hagamos a continuación?
¿Por qué estás dando vueltas en círculos? Hace tiempo que se escribió aquí
 
Dmitry Fedoseev:
¿Por qué estás dando vueltas en círculos? Se ha escrito aquí desde hace mucho tiempo

Aquí afirmas "El tramo más largo es cuando la serie original está por debajo de la media", pero esto, entiendo, es un fallo de mi algoritmo, tras el cual se decidió hacer un filtro - lo hice y ahora el algoritmo no se vuelve tan obviamente estúpido cuando los números son significativamente diferentes entre sí.

 
-Aleks-:

Aquí afirmas "El tramo más largo es cuando la fila original está por debajo de la media", pero esto, según entiendo, es un fallo de mi algoritmo, tras el cual se decidió hacer un filtro: lo hice y ahora el algoritmo no se vuelve tan obviamente estúpido cuando los números son significativamente diferentes entre sí.

¿Cuál es la desventaja?

El filtro no sustituye al algoritmo. El filtro es un añadido al algoritmo.

 
Dmitry Fedoseev:

¿Cuál es la desventaja?

El filtro no sustituye al algoritmo. El filtro es un añadido al algoritmo.

No sé cuál es la desventaja - puede que no la vea todavía.

Creo que debería intentar codificarlo ahora - ¿podéis ayudarme si tengo dificultades?

 
-Aleks-:

No sé cuál es el inconveniente, puede que no lo vea todavía.

Creo que tengo que intentar codificarlo ahora, ¿podéis ayudarme si tengo dificultades?

Empieza primero. O tal vez no tenga dificultades. Pero no voy a pensar en nada antes de eso, porque resulta que estoy pensando mal o que estoy pensando mal...
 
Dmitry Fedoseev:
porque cada vez que descubro que pienso mal, pienso mal...
Eso es lo que hace única a la gente...
 

Comenzó a desarrollar un algoritmo - Estoy haciendo un filtro ahora. Ha surgido la dificultad de sincronizar las dos columnas: "Número" y "Delta"

Se agradecerían ideas sobre cómo eliminar la inexactitud:

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