Sayı serisinin yoğunluğu - sayfa 3

 
Vladimir :
Kümelemenin bir yolunu hatırladım. Bunun gibi bir şey: kümede öğe grupları (kümeler) ayırt edilir, öyle ki bir kümenin öğeleri arasındaki maksimum mesafe, bu kümenin herhangi bir öğesinden bu kümeye dahil olmayan bir öğeye olan minimum mesafeden daha azdır. Mesafe, gerçek sayıların farkının modülü olan her zamanki gibi alınabilir. Tabii ki, böyle bir küme mutlaka bir tane olmayacaktır. Belki tam olarak bir gruba ihtiyacınız yok, belki de başka gerekçelerle birbirleriyle karşılaştırılmaları gerekir. Örneğin, bir gruptaki bir düzeyin ortalama oluşma süresi.

Bu ilginç, ancak şu ana kadar kümedeki sayıların künt numaralandırma ile nasıl belirleneceğini anlamak mümkün değil mi? O zaman, sanırım, birbiriyle örtüşecek gruplar olacak, çünkü en küçük deltayı arayarak bir küme tanımlarsak, ancak diğer elemanlara göre daha büyük, o zaman elemanın bir kısmını böyle bir deltadan dışarı atarak tanımlarsak. kümenin yerini alacağız - burada kümeler arasındaki mesafeler, eğer önemliyse, o zaman her şey yoluna girmelidir.

Vladimir :

Hepimiz gerçek eksendeki iki nokta arasındaki mesafeyi farklarının modülü olarak ölçüyoruz. Matematikte buna metrik denir. Düzlemde her biri gerçek olan noktalar, sayı çiftleri arasındaki mesafe nasıl ölçülür? Yine, hazır tanıdık bir çözümümüz var - Öklid mesafesi, koordinat farklılıklarının karelerinin toplamının karekökü. Ve matematikçilerin düzlemde başka metrikleri vardır, örneğin, iki farkın en büyük modülü, fark modüllerinin toplamı ( http://ad.cctpu.edu.ru/Math_method/math/45.htm ). Ve bu sadece sayı çiftleri durumunda. Sadece iki sayı ve her zaman iki. Ve çok daha zor bir durumda bir yakınlık ölçüsü getirmeniz gerekiyor. Grupta iki sayı yoktur ve farklı gruplarda farklı sayılar vardır.

İçlerindeki eleman sayısına göre en büyük grubu veya özdeş grupları belirlememiz gerekir. Benim dezavantajım karmaşık formülleri doğru okuyamamak, bu yüzden örneklerden ve yorumlardan onlara her şeyi anlamaya çalışmak zorundayım.

Vladimir :

Matematikte iki fonksiyon arasındaki mesafeyi ölçen metrikler vardır. Ama yine, her zaman ikisi arasında. Yine size yakışmıyor, bir grubunuz var.

Bu nedenle, tam olarak neye ihtiyaç duyulduğunu tam olarak anlamak önemlidir. Yaz, belki bunu bir kümedeki yakınlığın sayısal bir özelliğini elde etmek için bir algoritmaya resmileştirmek mümkün olacaktır.

Ancak, onu yaratmaya çalışmaktan vazgeçmeyi düşünün. Yukarıdaki bağlantı, metriğin hangi gereksinimleri karşılaması gerektiğini söylüyor. Orada aptalca görünmediler, hiçbiri olmadan garip etkiler ortaya çıkacak. Yukarıdaki mesajda, bu tür kapsamlı girişimlerden nasıl vazgeçileceğine dair bir örnek verdim - gruptaki noktaların, nokta dışındaki öğelerden ziyade gerçek eksende çiftler halinde birbirine daha yakın olmasına izin verin. Çok önemsiz bir şey icat etmek gerekli olmayacak.

Doğru, başlangıçta iki noktanın yakınlığını belirliyoruz ve sonra büyük olan mesafeyi dışlamaya çalışıyoruz - soru bu, bu mesafenin büyük olup olmadığını nasıl belirleyebiliriz? Bu noktada algoritma başarısız oldu - bir mesafe daha büyük bir büyüklük sırası göründüğünde.

 
Dmitry Fedoseev :
Yazmadı - önce farkı hesaplayın. Sonra diğer her şey.
Yani farklar "Delta" sütununda hesaplandı, bundan sonra ne yapmayı düşünüyorsunuz?
 

İşlemeden önce aşağıdaki veri filtreleme algoritmasını test ediyorum:

1. Serideki iki deltayı toplayın ve değeri iki ile çarpın

2. Ortaya çıkan sayı serisinin ortalama değerini bulun

3. Değer ortalama değerden küçükse yeni bir sayı dizisi oluşturun

4. Sayı serisi orijinal serinin yarısından az olana kadar 2-3. adımı tekrarlayın.


Hayır. Sayı Delta 53.33 25.82 9.60
1 on
2 20 on
3 otuz on 40 40
4 40 on 40 40
5 elli on 40 40
6 51 1 22 22 22
7 52 1 4 4 4
sekiz 53 1 4 4 4
dokuz 54 1 4 4 4
on 60 6 on dört on dört on dört
on bir 70 on 32 32
12 80 on 40 40
on üç 120 40 100
on dört 150 otuz 140
on beş 190 40 140
on altı 210 20 120
17 223 on üç 66
on sekiz 232 dokuz 44 44
on dokuz 250 on sekiz 54
20 260 on 56

5. Filtrelemeden sonra zaten yukarıdaki algoritmaya göre hesaplama yapıyoruz

Hayır. Sayı Delta Değerleri kapat Üst üste yakınlık Maksimum Yoğun Yoğunluk yoğunluk v2
1 40 4
2 elli on 0 0 elli
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

Farklı numaralar denedim - makul bir seçenek olduğu ortaya çıktı, eleştirileri duymaktan memnuniyet duyacağım.
 
-Aleks- :
Yani farklar "Delta" sütununda hesaplandı, bundan sonra ne yapmayı düşünüyorsunuz?
Çemberlerde ne yapıyorsun? zaten burada yayınlandı
 
Dmitry Fedoseev :
Çemberlerde ne yapıyorsun? zaten burada yayınlandı

Burada "En uzun bölüm, orijinal dizinin ortalamanın altında olduğu zamandır." diyorsunuz, ancak bu, anladığım kadarıyla algoritmamın bir dezavantajı, ardından bir filtre yapmaya karar verildi - yaptım ve şimdi sayılar arkadaştan önemli ölçüde farklı olduğunda algoritma çok açık bir şekilde aptal değildir.

 
-Aleks- :

Burada "En uzun bölüm, orijinal dizinin ortalamanın altında olduğu zamandır." diyorsunuz, ancak bu, anladığım kadarıyla algoritmamın bir dezavantajı, ardından bir filtre yapmaya karar verildi - yaptım ve şimdi algoritma, sayılar birbirinden önemli ölçüde farklı olduğunda açıkça aptal değildir.

O zaman dezavantajı nedir?

Filtre, bir algoritmanın yerini tutmaz. Filtre, algoritmaya bir ektir.

 
Dmitry Fedoseev :

O zaman dezavantajı nedir?

Filtre, bir algoritmanın yerini tutmaz. Filtre, algoritmaya bir ektir.

Dezavantajının ne olduğunu bilmiyorum - henüz göremiyorum.

Sanırım şimdi kodlamayı denemem gerekiyor - herhangi bir zorluk yaşarsam yardım edin?

 
-Aleks- :

Dezavantajının ne olduğunu bilmiyorum - henüz göremiyorum.

Sanırım şimdi kodlamayı denemem gerekiyor - herhangi bir zorluk yaşarsam yardım edin?

Önce başla. Ve bu bir sorun olmayabilir. Ama önceden hiçbir şey düşünmeyeceğim, aksi takdirde tekrar tekrar ya yanlış şeyi düşünüyorum ya da yanlış şeyi düşünüyorum ...
 
Dmitry Fedoseev :
ve sonra tekrar tekrar ya yanlış şeyi düşünüyorum ya da yanlış şekilde düşünüyorum...
İnsanları eşsiz kılan budur...
 

Ben bir filtre yaparken bir algoritma geliştirmeye başladım. İki sütunu senkronize etme zorluğu - "Sayı" ve "Delta"

Yanlışlığın nasıl ortadan kaldırılacağına dair fikirlerden memnuniyet duyacağım:

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