숫자 계열의 밀도 - 페이지 3

 
Vladimir :
나는 클러스터링의 한 방법을 기억했다. 다음과 같습니다. 한 클러스터의 요소 사이의 최대 거리가 이 클러스터의 요소에서 이 클러스터에 포함되지 않은 요소까지의 최소 거리보다 작도록 세트에서 요소 그룹(클러스터)이 구별됩니다. 거리는 평소와 같이 실수의 차이의 계수를 취할 수 있습니다. 물론 그러한 클러스터가 반드시 하나는 아닐 것입니다. 정확히 하나의 그룹이 필요하지 않을 수도 있고 다른 이유로 서로 비교해야 할 수도 있습니다. 예를 들어, 그룹에서 레벨이 발생한 평균 시간입니다.

이것은 흥미롭지 만 지금까지 클러스터의 숫자가 무딘 열거에 의해 결정되는 방법을 이해하는 것이 불가능합니까? 그러면 서로 겹칠 그룹이 있을 것이라고 생각합니다. 왜냐하면 가장 작은 델타를 검색하여 클러스터를 정의하지만 나머지 요소와 관련하여 더 큰 경우 그런 다음 그러한 요소에서 요소의 일부를 버리기 때문입니다. 클러스터, 우리는 클러스터 자체를 바꿀 것입니다. 여기서 클러스터 사이의 거리가 중요하면 모든 것이 잘 작동해야 합니다.

블라디미르 :

우리는 모두 실제 축의 두 점 사이의 거리를 차이의 계수로 측정합니다. 수학에서는 이것을 미터법이라고 합니다. 각각이 실제인 점, 숫자 쌍 사이의 평면에서 거리를 측정하는 방법은 무엇입니까? 다시 말하지만, 우리는 이미 만들어진 친숙한 솔루션인 유클리드 거리, 좌표 차이의 제곱합의 제곱근을 가지고 있습니다. 그리고 수학자들은 평면에 다른 메트릭을 가지고 있습니다. 예를 들어, 두 차이의 가장 큰 계수, 차이 계수의 합( http://ad.cctpu.edu.ru/Math_method/math/45.htm ). 그리고 그것은 숫자 쌍의 경우에만 해당됩니다. 단 두 개의 숫자, 그리고 항상 두 개. 그리고 훨씬 더 어려운 상황에서 근접성 측정을 도입해야 합니다. 그룹에는 두 개의 숫자가 없으며 다른 그룹에는 다른 숫자가 있습니다.

우리는 가장 큰 그룹 또는 동일한 그룹을 요소 수로 결정해야 합니다. 제 단점은 복잡한 공식을 제대로 읽을 수 없다는 점입니다. 그래서 예제와 설명에서 모든 것을 이해하려고 노력해야 합니다.

블라디미르 :

수학에는 두 함수 사이의 거리를 측정하는 메트릭이 있습니다. 그러나 다시, 항상 둘 사이에. 다시 말하지만, 그것은 당신에게 적합하지 않습니다. 당신은 그룹이 있습니다.

그렇기 때문에 정확히 무엇이 필요한지 철저히 이해하는 것이 중요합니다. 쓰기, 아마도 이것을 집합에서 근접성의 수치적 특성을 얻기 위한 알고리즘으로 공식화하는 것이 가능할 것입니다.

그러나 그것을 만드는 것을 포기하는 것에 대해 생각해보십시오. 위의 링크는 메트릭이 충족해야 하는 요구 사항을 나타냅니다. 그것들이 없으면 이상한 효과가 발생합니다. 위의 메시지에서 나는 그러한 포괄적인 시도를 포기하는 방법에 대한 예를 제시했습니다. 즉, 그룹의 포인트가 포인트 외부의 요소보다 실제 축에서 쌍으로 더 가깝도록 하십시오. 아주 사소하지 않은 것을 발명할 필요는 없을 것입니다.

그래서 맞습니다. 처음에는 두 점의 근접성을 결정한 다음 큰 거리를 제외하려고 시도합니다. 이것이 문제입니다. 이 거리가 큰지 여부를 결정하는 방법은 무엇입니까? 이 시점에서 알고리즘이 실패했습니다. 거리가 훨씬 더 크게 나타났을 때입니다.

 
Dmitry Fedoseev :
쓰지 않았습니다 - 먼저 차이를 계산하십시오. 그런 다음 다른 모든 것.
차이는 "델타" 열에서 계산되었습니다. 다음에 무엇을 제안하시겠습니까?
 

처리하기 전에 다음 데이터 필터링 알고리즘을 테스트하고 있습니다.

1. 두 개의 델타를 직렬로 합산하고 값에 2를 곱합니다.

2. 결과 숫자 시리즈의 평균 값 찾기

3. 값이 평균값보다 작으면 새로운 숫자 계열을 구성합니다.

4. 숫자 시리즈가 원래 시리즈의 절반 미만이 될 때까지 2-3단계를 반복합니다.


번호 P./P. 숫자 델타 53.33 25.82 9.60
하나
2 20
서른 40 40
4 40 40 40
5 오십 40 40
6 51 하나 22 22 22
7 52 하나 4 4 4
여덟 53 하나 4 4 4
아홉 54 하나 4 4 4
60 6 십사 십사 십사
열하나 70 32 32
12 80 40 40
열셋 120 40 100
십사 150 서른 140
열 다섯 190 40 140
열여섯 210 20 120
17 223 열셋 66
십팔 232 아홉 44 44
십구 250 십팔 54
20 260 56

5. 필터링 후 이미 위의 알고리즘에 따라 계산을 수행합니다.

번호 P./P. 숫자 델타 닫기 값 연속된 근접성 최고 밀집한 밀도 밀도 v2
하나 40 4
2 오십 0 0 오십
51 하나 하나 하나 51 0.80 1.00
4 52 하나 하나 2 52
5 53 하나 하나 53
6 54 하나 하나 4 54
7 60 6 0 0

나는 다른 숫자를 시도했습니다. 그럴듯한 옵션으로 판명되었으며 비판을 듣게되어 기쁩니다.
 
-Aleks- :
차이는 "델타" 열에서 계산되었습니다. 다음에 무엇을 제안하시겠습니까?
서클에서 무엇을 하고 있나요? 이미 여기 에 게시됨
 
Dmitry Fedoseev :
서클에서 무엇을 하고 있나요? 이미 여기 에 게시됨

여기에서 "가장 긴 섹션은 원래 시리즈가 평균보다 낮을 때입니다."라고 말했지만, 이것은 내가 이해하는 바에 따라 필터를 만들기로 결정한 내 알고리즘의 단점입니다. 알고리즘은 숫자가 친구와 크게 다를 때 바보가 아닙니다.

 
-Aleks- :

여기에서 "가장 긴 섹션은 원래 시리즈가 평균보다 낮을 때입니다."라고 말했지만, 이것은 내가 이해하는 바에 따라 필터를 만들기로 결정한 내 알고리즘의 단점입니다. 알고리즘은 숫자가 친구와 크게 다를 때 바보가 아닙니다.

그럼 단점은?

필터는 알고리즘을 대신할 수 없습니다. 필터는 알고리즘에 추가된 것입니다.

 
Dmitry Fedoseev :

그럼 단점은?

필터는 알고리즘을 대신할 수 없습니다. 필터는 알고리즘에 추가된 것입니다.

단점이 무엇인지 모르겠습니다. 아직 볼 수 없습니다.

이제 코딩을 해야 한다고 생각합니다. 어려움이 있으면 도와주세요.

 
-Aleks- :

단점이 무엇인지 모르겠습니다. 아직 볼 수 없습니다.

이제 코딩을 해야 한다고 생각합니다. 어려움이 있으면 도와주세요.

먼저 시작하십시오. 그리고 그것은 문제가 아닐 수도 있습니다. 그러나 미리 나는 아무 것도 생각하지 않을 것입니다. 그렇지 않으면 내가 잘못된 것을 생각하고 있거나 잘못된 것을 생각하고 있다는 것이 계속해서 밝혀집니다 ...
 
Dmitry Fedoseev :
그리고 나서 또다시 내가 잘못된 것을 생각하거나 잘못된 방식으로 생각한다는 것이 밝혀졌습니다 ...
이것이 사람들을 독특하게 만드는 것입니다 ...
 

필터를 만드는 동안 알고리즘 개발을 시작했습니다. "숫자"와 "델타"의 두 열을 동기화하는 데 어려움이 있었습니다.

부정확성을 제거하는 방법에 대한 아이디어를 기쁘게 생각합니다.

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