Ticarette makine öğrenimi: teori, pratik, ticaret ve daha fazlası - sayfa 3258

 
fxsaber #:
Bu hat nedeniyle tüketim miktarı neredeyse iki katına çıkmıştır.

Bu sadece CMatrixDouble 'dan matrix<double>'a bir geçiştir. Hatta hafıza yüzünden bu matris karşılaştırmasını yapmak zorunda kaldım.

Ve bu dönüşüm ile zaman %40 artar. Yorumlandı // Res = MatrixOut.ToMatrix();

matrix<double> Matrix1 = CorrMatrix(Matrix) - 10482307 mcs, 0 MB
matrix<double> Matrix2 = Matrix.CorrCoef(false) - 28882536 mcs, 1717 MB

Yani sadece Alglibov fnctional ile çalışırsanız (matrislerini terminal matrislere dönüştürmeden), daha hızlı olacaktır.

 
fxsaber #:

Python, yukarıdaki örnekte olduğu gibi orijinal matrisin aynı boyutunu hesaplamak için ne kadar zaman alır?

import numpy as np
import time

def calc_corr_matrix():
    arr = np.random.rand(15000, 100).astype(np.float32)
    corr_matrix = np.corrcoef(arr)
    size_in_mb = corr_matrix.nbytes / 1024**2
    print("Array size:", size_in_mb, "MB")
    return corr_matrix

start_time = time.time()
corr_matrix = calc_corr_matrix()
end_time = time.time()

print("Time taken:", end_time - start_time, "seconds")
Array size: 1716.61376953125 MB
Time taken: 2.08686900138855 seconds

Matris oluşturma dikkate alınarak zaman ölçümü

 

taşlarınızı atın)



 
Maxim Dmitrievsky #:

Matris oluşturmayı dikkate alan zaman ölçümü

Array size: 1716.61376953125 MB
Time taken: 4.784467697143555 seconds

Bu eski bir FX-8350 üzerinde.

 
fxsaber #:

Buna dayanarak bir korelasyon matrisi hesaplaması yaptım.

Performans ölçüldü.

İstatistikler için, elde ettiğim sonuç şudur

2023.09.26 06:28:23.304 Test_Corr (USDJPY,H1)   EX5: 3981 AVX Release.
2023.09.26 06:28:23.304 Test_Corr (USDJPY,H1)   TerminalInfoString(TERMINAL_CPU_NAME) = AMD FX-8350 Eight-Core 
2023.09.26 06:28:23.304 Test_Corr (USDJPY,H1)   TerminalInfoInteger(TERMINAL_CPU_CORES) = 8 
2023.09.26 06:28:23.304 Test_Corr (USDJPY,H1)   TerminalInfoString(TERMINAL_CPU_ARCHITECTURE) = AVX 
2023.09.26 06:28:23.332 Test_Corr (USDJPY,H1)   inRows = 100 inCols = 15000 
2023.09.26 06:28:45.032 Test_Corr (USDJPY,H1)   matrix<double> Matrix1 = CorrMatrix(Matrix) - 21700095 mcs, 1717 MB
2023.09.26 06:29:48.495 Test_Corr (USDJPY,H1)   matrix<double> Matrix2 = Matrix.CorrCoef(false) - 63460976 mcs, 1717 MB
2023.09.26 06:29:50.225 Test_Corr (USDJPY,H1)   IsEqual(Matrix1, Matrix2) = true 

2023.09.26 06:34:21.572	Test_Corr (USDJPY,H1)	EX5: 3981 X64 Regular Release.
2023.09.26 06:34:21.572	Test_Corr (USDJPY,H1)	TerminalInfoString(TERMINAL_CPU_NAME) = AMD FX-8350 Eight-Core 
2023.09.26 06:34:21.572	Test_Corr (USDJPY,H1)	TerminalInfoInteger(TERMINAL_CPU_CORES) = 8 
2023.09.26 06:34:21.572	Test_Corr (USDJPY,H1)	TerminalInfoString(TERMINAL_CPU_ARCHITECTURE) = AVX 
2023.09.26 06:34:21.600	Test_Corr (USDJPY,H1)	inRows = 100 inCols = 15000 
2023.09.26 06:34:42.908	Test_Corr (USDJPY,H1)	matrix<double> Matrix1 = CorrMatrix(Matrix) - 21308403 mcs, 1717 MB
2023.09.26 06:35:46.736	Test_Corr (USDJPY,H1)	matrix<double> Matrix2 = Matrix.CorrCoef(false) - 63826475 mcs, 1717 MB
2023.09.26 06:35:48.481	Test_Corr (USDJPY,H1)	IsEqual(Matrix1, Matrix2) = true 
Açıkça görülüyor ki Python çok daha hızlı. Bu C'nin de daha hızlı olacağı anlamına geliyor, bu yüzden MQ'nun bize bir şey söylemediği, karşılaştırılabilir performans vaat ettiği ortaya çıkıyor....

Python'un kod çalıştırırken küçük bir paralelleştirmeye sahip olduğunu belirtmeliyim - yaklaşık iki çekirdek için yarım saniye, geri kalanı bir çekirdekte sayılır.

 
NumPy kütüphanesi C dilinde yazılmıştır
 
Maxim Dmitrievsky #:
NumPy kütüphanesi C dilinde yazılmıştır.

Evet, bu mantıklı. Bu yüzden python sarmalayıcısının MQL5 gibi bir C derleyicisinden daha hızlı olduğunu söyledim.

 

İşte R ChatGPT teklifleri

set.seed(123)  #  Задаем зерно для воспроизводимости результатов

calc_corr_matrix <- function() {
  #arr <- matrix(runif(15000 * 100), nrow = 15000, ncol = 100)
  arr <- matrix(runif(100 * 15000), nrow = 100, ncol = 15000)
  corr_matrix <- cor(arr)
  size_in_mb <- object.size(corr_matrix) / 1024^2
  cat("Array size:", size_in_mb, "MB\n")
  return(corr_matrix)
}

start_time <- Sys.time()
corr_matrix <- calc_corr_matrix()
end_time <- Sys.time()

cat("Time taken:", as.numeric(end_time - start_time), "seconds\n")

Sonuç

> set.seed(123)  #  Задаем зерно для воспроизводимости результатов

> calc_corr_matrix <- function() {
+   #arr <- matrix(runif(15000 * 100), nrow = 15000, ncol = 100)
+   arr <- matrix(runif(100 * 15000), nrow = 100,  .... [TRUNCATED] 

> start_time <- Sys.time()

> corr_matrix <- calc_corr_matrix()
Array size: 1716.614 MB

> end_time <- Sys.time()

> cat("Time taken:", as.numeric(end_time - start_time), "seconds\n")
Time taken: 27.92359 seconds
> 
 

Anladığım kadarıyla, python bir tamsayı matrisi ile çalışabiliyor ve buradaki hızlar burada farklı bir düzende

import numpy as np
import time

def calc_corr_matrix():
    arr = np.random.randint(1, 101, size=(15000, 100), dtype=np.int32)
    corr_matrix = np.corrcoef(arr, rowvar=False)
    size_in_mb = corr_matrix.nbytes / 1024**2
    print("Array size:", size_in_mb, "MB")
    return corr_matrix

np.random.seed(123)  #  Задаем зерно для воспроизводимости результатов

start_time = time.time()
corr_matrix = calc_corr_matrix()
end_time = time.time()

print("Time taken:", end_time - start_time, "seconds")

Kod doğruysa, sonuç aşağıdaki gibidir

Array size: 0.0762939453125 MB
Time taken: 0.5172276496887207 seconds

Hesaplamaların sonuçlarının doğruluğu/karşılaştırılabilirliği sorusunun kendisi kontrol edilmelidir.

 
fxsaber #:

Bu basitçe CMatrixDouble 'dan matrix<double>'a geçiştir.

Formatları her iki yönde de dönüştürmek %20 daha fazla yürütme süresi alır. Ancak yine de NumPy'den çok (> 3 kat) daha yavaştır.