четверг, 6 ноября 2008 г.

Результаты тестирования

Получены результаты тестирования модели. Ранее уже писали о начале эксперимента.


В принципе результаты можно считать положительными. На отборе рост и на тесте тоже рост и удерживание на уровне. Но стабильности в модели нет.

Возможно это связано с тем что мы использовали только 1 эпоху промежуточного обучения для нижней модели.

Теперь попробуем дать ей две эпохи нижнего промежуточного обучения. Эксперимент запущен. Ждем результатов. Результаты скорее всего будут завтра.

Ждем.

Методы для генетики

После расчёта качества на популяции производим её трансформацию. Здесь в матрице популяции (pop) отдельные геномы - это строки. Отдельные гены - это числа в диапазоне от 0 до 1. Для трансформации популяции даем качество для каждого генома, коэффициент мутации (mu) и частоту шока (flash).

Трансформация популяции

function [pop,bi] = trans_pop(pop,kach,mu,flash)
[s,idx] = sort(kach) ;

gi = idx(1:($/2)) ;
bi = idx(($/2+1):$) ;

gi = gi(randperm(length(gi))) ;
bi = bi(randperm(length(bi))) ;

for i = 1:2:length(gi)
[pop(bi(i),:),pop(bi(i+1),:)] = xver(pop(gi(i),:),pop(gi(i+1),:),mu,flash) ;
end
endfunction


Скрещивание

function [gb1,gb2] = xver(gg1,gg2,mu,flash)
gb1 = gg2 ;
gb2 = gg1 ;

for k = 1:length(gg1)
if rand(1,1,"normal") > 0
gb1(k) = gg1(k) ;
gb2(k) = gg2(k) ;
end
end
gb1 = mutate(gb1,mu,flash) ;
gb2 = mutate(gb2,mu,flash) ;
endfunction


Мутация генома

function genom = mutate(genom,mu,flash)
for k = 1:length(genom)
my_mu = mu ;
if rand(1,1,"uniform") < flash
my_mu = my_mu * 10 ;
end
genom(k) = genom(k) + (rand(1,1,"uniform")*2-1)*my_mu ;
if genom(k) > 1
genom(k) = 1 ;
end
if genom(k) < 0
genom(k) = 0 ;
end
end

endfunction

Скрипт для компиляции C кода из Scilab.

[comp.sci]
mode(-1) ;
close
clear

function ulink_str(str)
while 1
[c,n] = c_link(str) ;
if c
ulink(n) ;
else
break ;
end
end
endfunction

function ul
ulink_str('calc_rek_zad') ;
ulink_str('calc_rek_zad_vib') ;
endfunction

ul ;

my_dir = pwd() + "\" ;
comp_sub_dir = "lib\" ;
f_name = "my_comp" ;
names = ["calc_rek_zad","calc_rek_zad_vib"] ;

// -----------------------------------------

c_name = f_name + ".c" ;

try
cd(my_dir + comp_sub_dir) ;

ddd = ls() ;
for k = 1:size(ddd,1)
if ~(ddd(k) == c_name)
mdelete(ddd(k)) ;
disp(ddd(k)) ;
end
end

res = ilib_for_link(names,f_name + ".o",[],"c") ;
disp(res) ;
end

cd( my_dir ) ;

В дочернем каталоге LIB держим библиотеку my_comp.c. В Scilab-е все время находимся в родительском каталоге. Правим код C в библиотеке и после правки запускаем скрипт перекомпиляции. Он сначала вычищает все подключенные рутины. Затем вычищает все в дочернем каталоге LIB кроме исходников на C. Затем запускает компиляцию.

Этот скрипт все делает. А то раньше пока все отключишь пальцы болеть начинают.

Здесь для примера отключаются и перекомпилируются две рутины.

Получены первые результаты по новой модели

[081031_sim_all_test]

Получены первые результаты по тестированию новой модели.
Прогнозируем направление изменения курса валютной пары eurusd со скважностью 15 минут. Отбираем модели на диапазоне в 300 отсчетов и затем лучшую гоним на следующих 50-ти. Смотрим сколько знаков угадывает.


На верхнем левом графике качество на отборе, на правом верхнем качество в тесте. На левом нижнем графике искомый параметр верхней генетики. На правом нижнем графике норма по популяции.

Наша цель увидеть на тестовом графике рост вместе с ростом графика отбора. Это будет означать, что обеспечив рост качества на отборе мы получим растущее качество в тесте. Значит можно строить рабочую модель на отборе и гарантировать успех в прогнозе следующего дня.

Модель пока слабая. Но нужно подтвердить основной принцип. Ждем результатов.

В результате компиляции большей части кода удалось получить хорошую производительность. Вчера за пару часов она успела пройти 9 эпох.

Думаю хватит порядка 50-100 верхних эпох чтобы получить результаты которые можно взять за основу для выводов. Так что за пару-тройку дней управимся.