数列密度 - 页 3

 
Vladimir:
我记得有一种聚类的方法。它是这样的:你在一个集合中分配元素组(簇),使一个簇的元素之间的最大距离小于该簇的任何元素到不在该簇中的元素的最小距离。这个距离可以是一个普通的距离,一个实数的差值模数。当然,不一定只有一个这样的集群。也许你不完全需要一个集群,也许你也应该在其他方面相互比较。例如,小组中某一级别的平均发生时间。

这很有趣,但到目前为止,我还搞不清楚如何确定集群中的数字是什么--通过蛮力?那么,我想,会有一些群组相互重叠,因为如果我们通过寻找最小的delta来定义一个群组,但相对于其他元素来说比较大,那么从这样的群组中放弃一些元素就会使群组发生转移--群组之间的距离会很重要,如果它很重要,应该可以解决。

弗拉基米尔

实轴上两点之间的距离,我们都是以它们的差值模数来衡量的。在数学上,这通常被称为公制。我们如何测量平面内各点、各对数字之间的距离,每个数字都是实数?我们又有了熟悉的现成解决方案--欧几里得距离,即下属差异的平方之和的根。而数学家们在平面上还有其他的度量,例如,两个差值的最大模数,差值模数之和(http://ad.cctpu.edu.ru/Math_method/math/45.htm)。而这仅仅是在成对的数字的情况下。只有两个数字,而且总是两个。而你需要在更复杂的情况下输入一个接近度量。 一个组中没有两个数字,不同的组中有不同的数字。

我们需要确定最大的组,或按其中元素的数量确定相同的组。我的缺点是无法正确阅读复杂的公式,所以我必须尝试从例子和对它们的评论中理解一切。

弗拉基米尔

在数学中,有一些衡量两个函数之间距离的度量。但同样,总是在两个人之间。同样不适合你,你有一个团体。

这就是为什么自己彻底了解它很重要。写,也许我们可以把它形式化为一种算法,以获得一个集合中的接近度的数字特征。

然而,也要考虑放弃创造它的尝试。上面的链接说,该指标必须满足哪些要求。他们不是突然出现在那里的,没有他们中的任何一个就会出现奇怪的效果。在上面的帖子中,我举了一个例子,说明如何放弃这种全面的尝试--让组中的点在实轴上成对地接近对方,而不是接近点以外的元素。你不需要发明一些非常不琐碎的东西。

这就对了,最初我们确定两点的接近程度,然后我们试图排除那段很大的距离--这就是问题所在,我们如何确定这段距离是否很大?这就是算法现在失败的地方--当距离看起来大了一个数量级的时候。

 
Dmitry Fedoseev:
没有写下来--先数一下差异。然后是其他一切。
那么,你已经计算了 "三角洲 "一栏中的差异,你建议我们接下来怎么做?
 

测试这样一种算法,在处理前对数据进行过滤。

1.依次对两个三角洲进行求和,并将该值乘以2。

2.找出所得数字系列的平均值

3.如果数值低于平均值,则绘制一个新的数字序列

4.重复第2-3点,直到数字系列小于原始系列的一半。


号码P./P.数量三角洲53,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.过滤后,我们已经按照上述算法进行了计算

NO.P./P.数量三角洲关闭值靠近一排的人最大稠密密度密度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

尝试了不同的数字--得到了一个合理的版本,很乐意听到批评意见。
 
-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 число с нулевым значением, потом увеличиваем найденное число на единицу.
//Таким образом мы получаем диапазон чисел, плотность которых наибольшая по отношению к другим.
  }
//+------------------------------------------------------------------+