Kitaplıklar: ALGLIB - Sayısal Analiz Kütüphanesi - sayfa 4

[Silindi]  
Yury Kulikov:

Güzel MQ! Ciddi iş!

Kütüphanenin kullanımına bir örnek MLP sinir ağına çarpım tablosunu öğretmektir.


:( Kullanıcılar kütüphaneyi uzmanlarında aktif olarak kullanmaya başladığında buluta ne olacağını düşünmekten korkuyorum.
Bu basit komut dosyası bir megabaytın altında.


Aynı ama RF için:

sayılar çok doğru değil, düzeltmeye çalışmalıyım

#include <Math\Alglib\dataanalysis.mqh>
//+------------------------------------------------------------------+
#define _rand(min,max) ((rand()/(double)SHORT_MAX)*((max)-(min))+min)
//+------------------------------------------------------------------+
void OnStart()
{
   CDecisionForest      Trf;
   CDecisionForestShell RFshell;
   CMatrixDouble        PatternsMatrix;
   CDFReport            RF_report;
   int RFinfo;
   double vector[2], out[1];
   
   // veri hazırlama
   PatternsMatrix.Resize(100,3);
   int m=0;     // ilk kalıp
   for(int i=1; i<=10; i++)
      for(int j=1; j<=10; j++)
      {
         PatternsMatrix[m].Set(0,i/10.0);       // giriş 1
         PatternsMatrix[m].Set(1,j/10.0);       // giriş 2
         PatternsMatrix[m].Set(2,(i*j)/100.0);  // hedef
         m++; //next pattern
      }
   // RF Oluşturma.
   CDForest::DFBuildRandomDecisionForest(PatternsMatrix,100,2,1,50,0.4,RFinfo,Trf,RF_report);
   Print("Info=",RFinfo,"  Error=",CDForest::DFAvgError(Trf,PatternsMatrix,100));  
   // tamsayı verilerinde ağı kontrol edin
   string s="Test 1 >> ";
   for(int i=1; i<=10; i++)
   {
      int d1=(int)_rand(1,10), d2=(int)_rand(1,10);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
      CDForest::DFProcess(Trf,vector,out);
      s+=(string)d1+"*"+(string)d2+"="+DoubleToString(out[0]*100,0)+" // ";
   }
   Print(s);
   // kesirli veriler üzerinde ağı kontrol edin
   s="Test 2 >> ";
   for(int i=1; i<=5; i++)
   {
      double d1=NormalizeDouble(_rand(1,10),1), d2=NormalizeDouble(_rand(1,10),1);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
       CDForest::DFProcess(Trf,vector,out);
      s+=DoubleToString(d1,1)+"*"+DoubleToString(d2,1)+"="+DoubleToString(out[0]*100,2)+
         "("+DoubleToString(d1*d2,2)+") // ";
   }
   Print(s);
}
2017.09.04 21:43:21.609 RF sample (EURUSD,H1)   Info=1  Error=0.01861400000000001
2017.09.04 21:43:21.610 RF sample (EURUSD,H1)   Тест 1 >> 6*9=55 // 7*3=21 // 6*6=38 // 9*7=65 // 9*9=80 // 8*4=32 // 4*1=6 // 1*8=13 // 4*3=12 // 2*2=5 // 
2017.09.04 21:43:21.610 RF sample (EURUSD,H1)   Тест 2 >> 7.7*5.8=46.64(44.66) // 3.0*3.3=9.70(9.90) // 6.0*9.2=55.32(55.20) // 2.6*6.7=20.08(17.42) // 2.5*4.0=12.54(10.00) // 

PS

CDForest::DFBuildRandomDecisionForest(PatternsMatrix,100,2,1,500,1,RFinfo,Trf,RF_report);

daha doğru, 500 antik ve r=1, daha fazla uyum ve daha az gürültü.

2017.09.04 22:08:33.227 RF sample (EURUSD,H1)   Info=1  Error=2.02997341158806 e-15
2017.09.04 22:08:33.228 RF sample (EURUSD,H1)   Тест 1 >> 2*2=4 // 2*6=12 // 1*9=9 // 9*1=9 // 4*7=28 // 9*6=54 // 5*6=30 // 5*5=25 // 4*1=4 // 1*4=4 // 
2017.09.04 22:08:33.230 RF sample (EURUSD,H1)   Тест 2 >> 4.0*3.8=16.00(15.20) // 9.6*3.1=30.00(29.76) // 5.5*6.4=36.00(35.20) // 4.0*4.4=16.00(17.60) // 1.6*4.2=8.00(6.72) // 
 
Maxim Dmitrievsky:


RF için de aynı şey:

Doğru olmadığını düşünüyor, düzeltmeye çalışması gerekiyor

PS

bu yol daha doğru, 500 ağaç ve r=1, daha fazla uyum ve daha az gürültü.

Sonuçları doğru yapmak için kaç ağaç yapmanız gerektiğini merak ediyorum? Ve bu en basit çarpım tablosudur ve eğer birkaç fonksiyon varsa, çarpım tablosundan değil RF'den geçmemiz gerekir, o zaman cevap açıkça uzaktan adil bir şeye benzeyecektir?
 
MQL5 kütüphanesi gerçekten çok güçlüdür, kütüphanenin nasıl çağrılacağı daha ayrıntılı olarak açıklanmıştır
 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

Hatalar, hatalar, sorular

Andrey Khatimlianskii, 2019.01.30 04:57 AM

MQL5\Include\Math\AlgLib\dataanalysis.mqh - CLinReg::LRLine 1M ve daha fazla değer için çalışmıyor?

Bunu bilen var mı?

 

Teşekkürler @Rashid Umarov

Herkese web sitesine gitmelerini tavsiye ederim, çünkü bu konu 3 yıldır güncelleniyor, ancak web sitesi güncellenmeye devam ediyor.

 

ALGLIB kütüphanesinin GPL C++ tabanlı sürümünü tamamen elden geçirdik ve ALGLIB++ olarak yayınladık. Bu, 2019/12 itibariyle 3.16.0 olan ALGLIB'in en son sürümünü izler. MQL5'in senkronize edildiği önceki sürümlerden bu yana Optimizasyon ve Enterpolasyon modüllerine çok şey eklenmiştir (örneğin, nokta bulut spline'ları(!), daha fazla ters mesafe ağırlıklı enterpolasyon yöntemi, çok sayıda ek optimizasyon yöntemi vb.)

ALGLIB++, ALGLIB'in uzun vadeli bir yeniden mühendislik/refactoring sürecinde ara form olarak kullanılan bir türevidir ve bu süreçte yerel C++'a (Sürüm 3'ten önceki haline benzer şekilde) yeniden kodlanacak, çoklu iş parçacığı için daha doğrudan destek sağlamanın yanı sıra ek testler ve modüller ve nihayetinde bir komut dosyası dili ön ucu sağlamaya hazırlanırken ekstra katman ve çoğaltma kaldırılacaktır.

ALGLIB'in farklı dil versiyonlarının hepsi ortak bir çekirdekten üretilmiştir, C++ versiyonu C'nin C90 lehçesi için sınırlı (ancak resmi olmayan) destek sağlar. Bu özellik, C içinde, aksi takdirde C++'a özgü olacak özellikleri simüle etmeyi ve ardından bunun üzerine bir C++ sarmalayıcı sağlamayı gerekli kılmıştır. Buna uygun olarak, iki ayrı isim alanı vardır: C versiyonunu içeren alglib_impl ve C++ sarmalayıcılarını içeren alglib. ALGLIB++ bu yapının çoğunu ve orijinal kodlamanın mümkün olduğunca çoğunu korumuştur, ancak ortadan kaldırılması ve çok iş parçacıklı yerel C++ kodu ile değiştirilmesi için ilk adım olarak küresel altyapının çoğunu azaltmış veya ortadan kaldırmış ve C++ sarmalayıcı arayüzünü önemli ölçüde basitleştirmiştir. Bu haliyle ALGLIB'in kendisi ile ALGLIB++'ın dönüşmekte olduğu gelecekteki kütüphane arasında köprü kuran bir ara formu temsil etmektedir.


MQL5 tarafından uyarlanan sürümlerden bu yana (ve öncesinde) ALGLIB'de karmaşıklığın artmasına neden olan birçok sorun, yapıda basitleştirme ve karmaşıklıkta azalma ile sonuçlanarak çözülmüştür. Mevcut haliyle, ALGLIB'in MQL5 sürümünü sürdürenler tarafından MQL5'e uyarlanması daha kolay olacaktır.

Dağıtımla birlikte, ALGLIB C++ orijinalinden ALGLIB++ için kılavuzun tamamen yeniden biçimlendirilmesi de yer almaktadır. Bununla birlikte, paketler ve alt paketlerle ilgili bölümler ALGLIB'in her iki sürümüyle de uyumludur ve hem düzen hem de içerik MQL5 sürümüne kolayca uyarlanmalıdır. Kılavuzun "Referanslar ve İlgili Bağlantılar" bölümünde MQL5'e de yer verilmiştir.


En son sürüm gelecekte ALGLIB++'a entegre edilmek üzere LAPACK'ın LAPACK++ olarak adlandırılacak bir C++ çevirisini hazırlıyoruz. MKL (bu arada sinir ağı rutinlerine sahip) dahil olmak üzere diğer kütüphaneler de gelecekteki entegrasyon için değerlendirilmektedir.

LydiaMarieWilliamson/ALGLIB_cpp
LydiaMarieWilliamson/ALGLIB_cpp
  • LydiaMarieWilliamson
  • github.com
Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Permalink
 
ALGLIB'in MQL5 sürümünü geliştirenlere birkaç ek not:

ALGLIB'i MQL5'e uyarladığınızda, "RCOMM" rutinleri ile ilgili zorluklarla karşılaştınız.

Bunlar, iş parçacığı geçişinin doğrudan koda yazıldığı, etkili bir şekilde çok iş parçacıklı rutinlerdir:
(1) her giriş ve çıkışta iş parçacığı yerel değişkenlerini önbelleğe almak - ve yineleme rutinleri potansiyel olarak milyonlarca ve milyarlarca çağrı / dönüş döngüsü gerçekleştirir!
(2) bir olayda "duraklamak" için rutinden dışarı atlayarak ve olaydan sonra "devam etmek" için rutine geri atlayarak iş parçacığı geçişini uygulamak - bu da çok sayıda goto ve çoklu giriş noktası anlamına gelir.
(3) giriş noktalarını fonksiyon gövdesinde en üst seviyeye yerleştirmek için bu rutinlerin kontrol akışı yapısını azaltmak.

ALGLIB'i MQL5'e uyarlarken, kontrol akışını azaltmayı yerinde tuttunuz, aslında kod parçacıklarını ayrı rutinlere gönderdiniz. Bu çözüm - sonunda sizin de fark ettiğiniz gibi - sürdürülebilir değildir; bu da ALGLIB güncellemelerine ayak uydurmayı imkansız hale getirmiştir. ALGLIB'in kendisi de eğrinin biraz gerisinde kaldı - RCOMM rutinleri bazen önceki sürümlerden yetim yapılar ve değişkenler bırakıyor.

ALGLIB++'da kontrol akış yapısı yeniden bütünleştirilmiştir: giriş noktaları bir döngünün veya diğer kontrol akış yapısının ortasına kaldıkları yerden geri atlar.
İş parçacığı yerel değişkenlerinin önbelleğe alınması yoktur; şimdilik statik hale getirilmişlerdir (iş parçacığı güvenliği pahasına - ancak çoklu iş parçacığı resmi olarak GPL ALGLIB'in bir parçası değildir).
ALGLIB gibi, bu da tüm ileri geri atlamaları yapmak için çok sayıda goto deyimi olduğu anlamına gelir; ancak bunlar daha temiz bir şekilde organize edilmiştir.
ALGLIB++'da yapılan onarımlar, test sonuçlarımıza göre, rutinleri kendi başlarına yaklaşık %20-25 oranında hızlandırmaktadır.

Goto deyimlerinden kurtulmak ve iş parçacığı yerel değişkenlerini daha düzgün bir şekilde ele almak için bu mimariyle başa çıkmanın iki yolu vardır:
(1) RCOMM rutinlerinin "olay" mesajları göndermesi (needf, ... algpowerup bayraklarının gerçekte ne olduğu) ve çağıranın mesajları almak ve işlemek için bir olay işleyicisi kurması gerektiği anlamına gelen gerçek iş parçacığı geçişini uygulamak. Ancak MQL5'in kullanıcı tanımlı olayları üretip işleyebileceğinden emin değilim.
(2) Olaylar için fonksiyon işaretçileri kullanın.
RCOMM rutinlerinin iç içe geçmiş olabileceğini ve bazı durumlarda kendi çağırdıkları RCOMM rutinlerinden elde edilen olayları çağıranlarına aktarabileceklerini unutmayın.

ALGLIB geliştiricileri ALGLIB'i hayata geçirirken fonksiyon işaretçileri ya da çoklu iş parçacığı kullanmamaya karar verdiler çünkü ALGLIB ilk yayınlandığında yaygın olarak dağıtılan ve kullanılan hiçbir dilde çoklu iş parçacıklı programlama için resmi bir destek yoktu ve ALGLIB'in hedeflendiği tüm diller C ve C++'ın fonksiyon işaretçilerine aynı ya da benzer bir eşdeğere sahip değildi. Ancak MQL5'te fonksiyon işaretçileri vardır. ALGLIB'i MQL5'e uyarlarsanız, kontrol akışı yapılarının yeniden entegrasyonu nedeniyle bunu ALGLIB++'dan yapmak çok daha kolay olacaktır.

Bununla birlikte, ideal çözüm iş parçacığı geçişini kullanmaktır. Sonunda, ALGLIB++'da ya fonksiyon işaretçileri ya da thread-switching kullanılacaktır; hangi yolu seçeceğimize henüz karar vermedik.

 
LydiaMW:
ALGLIB'in MQL5 sürümünü geliştirenlere birkaç ek not:

ALGLIB'i MQL5'e uyarladığınızda, "RCOMM" rutinleri ile ilgili zorluklarla karşılaştınız.

Bunlar, iş parçacığı geçişinin doğrudan koda yazıldığı, etkin bir şekilde çok iş parçacıklı rutinlerdir:
(1) her giriş ve çıkışta iş parçacığı yerel değişkenlerinin önbelleğe alınması - ve yineleme rutinleri potansiyel olarak milyonlarca ve milyarlarca çağrı/dönüş döngüsü gerçekleştirir!
(2) bir olayda "duraklatmak" için rutinden atlayarak ve olaydan sonra "devam ettirmek" için rutine geri atlayarak iş parçacığı geçişini uygulamak - bu da çok sayıda goto ve birden fazla giriş noktası anlamına gelir.
(3) giriş noktalarını fonksiyon gövdesinde en üst seviyeye yerleştirmek için bu rutinlerin kontrol akışı yapısının azaltılması.

ALGLIB'i MQL5'e uyarlarken kontrol akışı ayrıştırmasını yerinde tuttunuz, aslında kod parçacıklarını ayrı rutinlere gönderdiniz. Bu çözüm - sonunda öğrendiğiniz gibi - sürdürülemez; bu da ALGLIB güncellemelerine ayak uydurmayı imkansız hale getirdi. ALGLIB'in kendisi de eğrinin biraz gerisinde kaldı - RCOMM rutinleri bazen önceki sürümlerden yetim yapılar ve değişkenler bırakıyor.

ALGLIB++'da kontrol akış yapısı yeniden bütünleştirilir: giriş noktaları bir döngünün veya diğer kontrol akış yapısının ortasına kaldıkları yerden geri atlar.
İş parçacığı yerel değişkenlerinin önbelleğe alınması yoktur; şimdilik statik hale getirilmişlerdir (iş parçacığı güvenliği pahasına - ancak çoklu iş parçacığı resmi olarak GPL ALGLIB'in bir parçası değildir).
ALGLIB gibi, bu da tüm ileri geri atlamaları yapmak için çok sayıda goto deyimi olduğu anlamına gelir; ancak bunlar daha temiz bir şekilde organize edilmiştir.
ALGLIB++'da yapılan onarımlar, test sonuçlarımıza göre rutinleri kendi başlarına yaklaşık %20-25 oranında hızlandırmaktadır.

Goto deyimlerinden kurtulmak ve iş parçacığı yerel değişkenlerini daha düzgün bir şekilde ele almak için bu mimariyle başa çıkmanın iki yolu vardır:
(1) RCOMM rutinlerinin "olay" mesajları göndermesi (needf, ... algpowerup bayraklarının gerçekte ne olduğu) ve çağıranın mesajları almak ve işlemek için bir olay işleyicisi kurması gerektiği anlamına gelen gerçek iş parçacığı geçişini uygulayın. Ancak MQL5'in kullanıcı tanımlı olayları üretip işleyebileceğinden emin değilim.
(2) Olaylar için fonksiyon işaretçileri kullanın.
RCOMM rutinlerinin iç içe geçmiş olabileceğini ve bazı durumlarda kendi çağırdıkları RCOMM rutinlerinden elde edilen olayları çağıranlarına aktarabileceklerini unutmayın.

ALGLIB geliştiricileri ALGLIB'i hayata geçirirken fonksiyon işaretçilerini veya çoklu iş parçacığını kullanmamaya karar verdiler çünkü ALGLIB ilk yayınlandığında yaygın olarak dağıtılan ve yaygın olarak kullanılan hiçbir dilde çoklu iş parçacıklı programlama için resmi bir destek yoktu ve ALGLIB'in hedeflendiği tüm diller C ve C++'ın fonksiyon işaretçilerine aynı veya benzer bir eşdeğere sahip değildi. Ancak MQL5'te fonksiyon işaretçileri vardır. ALGLIB'i MQL5'e uyarlarsanız, kontrol akışı yapılarının yeniden entegrasyonu nedeniyle bunu ALGLIB++'dan yapmak çok daha kolay olacaktır.

Ancak ideal çözüm thread-switching kullanmaktır. Sonunda, ALGLIB++'da ya işlev işaretçileri ya da iş parçacığı geçişi kullanılacaktır; hangi yolu seçeceğimize henüz karar vermedik.

Sevgili Lydia:

Ancak github'daki ALGLIB ++ kütüphane dosyanız hala C ++ CPP formatında. MQL5 mql'e dönüştürülmemiştir. ALGLIB ++ kütüphane dosyasını .mql olarak sağlar mısınız? Teşekkür ederim!

 

Sayın geliştiriciler, lütfen karmaşık yapıya karmaşık birsayının eşlenik sayısını hesaplamak için bir yöntem ekleyin ( kaynak SB <Math\Alglib\complex.mqh> içinde).

Benim versiyonum:

   //--- işlemler
   void              Copy(const complex &rhs);
   bool              Eq(const complex &lhs, const complex &rhs);
   bool              NotEq(const complex &lhs, const complex &rhs);
   complex           Add(const complex &lhs, const complex &rhs);
   complex           Sub(const complex &lhs, const complex &rhs);
   complex           Mul(const complex &lhs, const complex &rhs);
   complex           Div(const complex &lhs, const complex &rhs);
   complex           Conjugate(void) const;


................


//+------------------------------------------------------------------+
//| Eşlenik|
//+------------------------------------------------------------------+
complex complex::Conjugate(void) const
  {
   complex complex_val(re,-im);
   return complex_val;
  };


Yeni bir yapının bir sonraki sürümünden sonra , öncekirevizyonunuza geri dönmeniz gerekir. Bu da uygunsuz bir durum.

 
Denis Kirichenko:

Sayın geliştiriciler, lütfen karmaşık birsayının eşlenik sayısını hesaplama yöntemini karmaşık yapıya ekleyin ( kaynak SB <Math\Alglib\complex.mqh> içinde).

Benim versiyonum:


Yeni bir yapının bir sonraki sürümünden sonra , öncekirevizyonunuza geri dönmeniz gerekir. Bu da uygunsuz.

Eklendi