Sejak saya memuat posting Saya telah berhasil menggabungkan kotak peralatan deepmat ke dalam kode saya, jadi sekarang saya RBM penggunaan pra-pelatihan Tempering paralel dan kecepatan pembelajaran adaptif, yang semuanya baik dan bagus. Satu-satunya kekurangan saat ini adalah waktu pelatihan – dibutuhkan sekitar 3 hingga 4 menit per bar untuk berlatih pada set minimal 2 fitur karena kotak peralatan ditulis dalam Oktaf kode dan kegunaan untuk loop bukannya menggunakan vektorisasiTentu saja ini adalah sesuatu yang ingin saya optimalkan, tetapi untuk masa depan terdekat saya sekarang ingin berkonsentrasi pada rekayasa fitur dan membuat serangkaian fitur yang berguna untuk saya CRBM.
Dulu saya pernah membuat blog tentang pengukuran frekuensi/periode (misalnya di sini dan di sini ) dan dalam posting ini saya ingin berbicara tentang kemungkinan cara baru untuk menghitung periode siklus dominan dalam data. Dalam Forum Stackoverflow posting beberapa waktu lalu saya diberitahu tentang generator gelombang sinus rekursif, dengan kode, yang menunjukkan cara membuat gelombang sinus maju hanya dengan menggunakan beberapa nilai terakhir dari gelombang sinus. Saya tersadar bahwa kode tersebut dapat digunakan, dengan tiga nilai terakhir dari gelombang sinus, untuk menghitung periode gelombang sinus menggunakan regresi linier sederhana, dan dalam kotak kode di bawah ini saya memberikan beberapa Oktaf kode yang menunjukkan ide dasar.
clear all
% sine wave periods
period = input( 'Enter period: ' )
period2 = input( 'Enter period2: ' )
true_periods = [ ones( 6*period , 1 ) .* period ; ones( 3*period2 , 1 ) .* period2 ; ones( 3*period , 1 ) .* period ] ;
% create sine wave and add some noise
price = awgn( 1 .* ( 2 .+ [ sinewave( 6*period , period )' ; sinewave( 3*period2 , period2 )' ; sinewave( 3*period , period )' ] ) , 100 ) ;
% extract the signal
hp = highpass_filter_basic( price ) ;
% smooth the signal
smooth = smooth_2_5( hp ) ;
Y = smooth .+ shift( smooth , 2 ) ;
X = shift( smooth , 1 ) ;
calculated_periods = zeros( size ( price ) ) ;
% do the linear regression
for ii = 50 : size( price , 1 )
calculated_periods(ii) = ( ( X( ii-4:ii , : )' * X( ii-4:ii , : ) ) X( ii-4:ii , : )' ) * Y( ii-4:ii , : ) ;
end
% get the periods from regression calculations
calculated_periods = real( sqrt( ( 8 .- 4 .* calculated_periods ) ./ ( calculated_periods .+ 2 ) ) ) ;
calculated_periods = 360 ./ ( ( calculated_periods .* 180 ) ./ pi ) ;
calculated_periods = ema( calculated_periods , 3 ) ;
calculated_periods = round( calculated_periods ) ;
figure(1) ; plot( price , 'b' , "linewidth" , 2 , hp , 'r' , "linewidth" , 2 , smooth , 'g' , "linewidth" , 2 ) ; legend( 'Price' , 'Highpass' , 'Highpass smooth' ) ;
figure(2) ; plot( true_periods , 'b' , "linewidth" , 2 , calculated_periods , 'r' , "linewidth", 2 ) ; legend( 'True Periods' , 'Calculated Periods' ) ;
Kode tersebut menciptakan gelombang sinus dengan dua periode (ditentukan pengguna), melakukan perhitungan, lalu memplot gelombang sinus dan periode masing-masing pada gambar 1 dan 2. Bagian regresi linier dari kode tersebut menggunakan lima batang terbaru untuk perhitungan, yang tentu saja juga dapat ditentukan pengguna. Pada data tanpa gangguan tambahan, plot tipikal adalah:-
yang menunjukkan “harga” yang mendasarinya dalam warna biru dan versi yang difilter dan dihaluskan dengan warna merah dan hijau dan
menunjukkan periode yang sebenarnya dan terukur. Versi harga yang tidak jelas dari yang di atas adalah :-
dan
Secara teori tampaknya berhasil, tetapi saya ingin melihat apakah ada yang bisa diperbaiki. Nantikan informasi lebih lanjut di posting saya berikutnya.