Densidade de séries numéricas - página 3

 
Vladimir:
Lembrei-me de uma forma de agrupamento. É algo assim: você aloca grupos de elementos (clusters) em um conjunto, de modo que a distância máxima entre os elementos de um cluster é menor que a distância mínima de qualquer elemento desse cluster para o elemento que não está nesse cluster. A distância pode ser uma distância normal, um módulo de diferença de números reais. É claro que não haverá necessariamente apenas um aglomerado desse tipo. Talvez você não precise exatamente de um grupo, talvez você deva compará-los uns com os outros também de outras maneiras. Por exemplo, o tempo médio de ocorrência de um nível no grupo.

Isto é interessante, mas até agora não consigo descobrir como determinar que números estão no agrupamento - pela força bruta? Então, suponho, haverá grupos que se sobrepõem, porque se definirmos um agrupamento procurando o menor delta, mas maior em relação a outros elementos, então, deixar cair algum elemento de tal agrupamento irá deslocar o agrupamento - a distância entre agrupamentos será importante, se for significativa, deve funcionar.

Vladimir:

A distância entre dois pontos no eixo real que todos nós medimos como módulo de sua diferença. Em matemática, isto é comumente chamado de métrica. Como medimos a distância no plano entre pontos, pares de números, cada um dos quais é real? Mais uma vez temos a solução familiar pronta - a distância euclidiana, a raiz do quadrado da soma dos quadrados das diferenças subordinadas. E os matemáticos têm outras métricas no plano, por exemplo, o maior módulo de duas diferenças, a soma dos módulos de diferenças(http://ad.cctpu.edu.ru/Math_method/math/45.htm). E isto é apenas no caso de pares de números. Apenas dois números, e sempre dois. E você precisa entrar numa medida de proximidade em uma situação muito mais complicada. Não há dois números em um grupo, e há números diferentes em grupos diferentes.

Precisamos identificar o maior grupo, ou os mesmos grupos pelo número de elementos que os compõem. Minha desvantagem é minha incapacidade de ler corretamente fórmulas complexas, portanto tenho que tentar entender tudo, desde exemplos e comentários até eles.

Vladimir:

Há métricas em matemática que medem a distância entre duas funções. Mas novamente, sempre entre dois. Mais uma vez não é adequado para você, você tem um grupo.

É por isso que é importante que você mesmo o entenda bem. Escreva, talvez possamos formalizá-lo com um algoritmo para obter uma característica numérica de proximidade em um conjunto.

Entretanto, considere também desistir de tentar criá-lo. O link acima diz quais requisitos o sistema métrico deve atender. Eles não apareceram do nada, sem que nenhum efeito estranho ocorra. No post acima, dei um exemplo de como abandonar tentativas tão abrangentes - deixar os pontos do grupo estarem mais próximos uns dos outros em pares no eixo real do que aos elementos fora do ponto. Você não teria que inventar algo muito não trivial.

Isso mesmo, inicialmente determinamos a proximidade de dois pontos, e depois tentamos excluir a distância que é grande - essa é a questão, como determinamos se a distância é grande ou não? Foi aqui que o algoritmo falhou - quando a distância parece ser uma ordem de grandeza maior.

 
Dmitry Fedoseev:
Não o anotou - conte primeiro as diferenças. Depois, tudo o resto.
Então você contou as diferenças na coluna "Delta", o que você sugere que façamos a seguir?
 

Testar tal algoritmo para filtrar os dados antes do processamento:

1. Soma os dois deltas em seqüência e multiplica o valor por dois

2. Encontre o valor médio das séries numéricas resultantes

3. Desenhe uma nova série numérica se o valor for menor que o valor médio

4. Repetir os pontos 2-3 até que a série numérica seja inferior à metade da série 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. Após a filtragem, já fazemos o cálculo de acordo com o algoritmo acima

NO.P./P.NúmeroDeltaValores próximosProximidade em uma filaMáximoDensaDensidadeDensidade 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

Tentei números diferentes - tenho uma versão plausível, ficaria feliz em ouvir comentários críticos.
 
-Aleks-:
Então você contou as diferenças na coluna "Delta", o que você sugere que façamos a seguir?
Por que você está andando em círculos? Há muito tempo está escrito aqui
 
Dmitry Fedoseev:
Por que você está andando em círculos? Já está escrito aqui há muito tempo

Aqui você afirma "A seção mais longa é quando a série original está abaixo da média", mas isto, eu entendo, é uma falha em meu algoritmo, após a qual foi tomada a decisão de fazer um filtro - eu o fiz e agora o algoritmo não fica tão obviamente estúpido quando os números são significativamente diferentes um do outro.

 
-Aleks-:

Aqui você diz "O trecho mais longo é quando a série original está abaixo da média", mas isto, como eu entendo, é uma falha em meu algoritmo, após a qual foi tomada a decisão de fazer um filtro - eu o fiz e agora o algoritmo não fica tão obviamente estúpido quando os números diferem significativamente um do outro.

Qual é a desvantagem?

O filtro não é um substituto para o algoritmo. O filtro é uma adição ao algoritmo.

 
Dmitry Fedoseev:

Qual é a desvantagem?

O filtro não é um substituto para o algoritmo. O filtro é uma adição ao algoritmo.

Não sei qual é a desvantagem - talvez eu ainda não a veja.

Acho que devo tentar codificá-lo agora - você pode me ajudar se eu tiver dificuldades?

 
-Aleks-:

Não sei qual é a desvantagem - talvez ainda não a veja.

Acho que preciso tentar codificá-lo agora - você pode me ajudar se eu tiver dificuldades?

Você deve começar primeiro. Ou talvez você não terá dificuldades. Mas não vou pensar em nada antes disso, porque acontece que estou pensando a coisa errada ou pensando da maneira errada...
 
Dmitry Fedoseev:
porque sempre que descubro que estou pensando a coisa errada, estou pensando a coisa errada.
Isso é o que torna as pessoas únicas...
 

Comecei a desenvolver um algoritmo - estou fazendo um filtro agora. Surgiu a dificuldade de sincronizar as duas colunas - "Número" e "Delta".

Idéias sobre como eliminar a imprecisão seriam bem-vindas:

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