вторник, 6 мая 2008 г.

Мутация

Мутация накладывается на каждый ген каждого генома плохой части популяции после скрещивания. Мутация накладывается следующим образом:

gen = gen + (rand * 2 - 1) * μ


где: gen - текущий ген, rand - случайное число из диапазона 0...1 по равномерному закону, μ - коэффициент мутации.

Коэффициент мутации готовим к каждой мутации. В основном подаем исходное значение коэффициента мутации, но с некоторой вероятностью выдаем значение на порядок выше (умножаем на 10). Эта вероятность называется частотой "шока".

if(rand < flash) mu *= 10 ;


где: flash - частота шока.

// Код на С

#define rand_unf ( (double)rand() / (double)RAND_MAX )

void inline mutate(double *genom,
int gen_len,
double mu,
double flash)
{
double mu10 ;

mu10 = mu * 10 ;

for( ; 0<gen_len ; gen_len--,genom++ )
if(rand_unf < flash)
*genom += (rand_unf*2-1) * mu10 ;
else
*genom += (rand_unf*2-1) * mu ;
}


// Код на SciLab

function genom = mutate(genom,mu,flash)
for i = 1:length(genom)
m = mu ;

if rand(1,1,"uniform") < flash
m = mu * 10 ;
end

genom(i) = genom(i) + (rand(1,1,"uniform")*2-1)*m ;
end
endfunction

Скрещивание

Имеем два хороших генома и два плохих.

Последовательно движемся по генам плохих и хороших. Заполняем плохие геномы по одному из следующих правил:

1) bg1(i) = gg1(i) ; bg2(i) = gg2(i) ;

2) bg2(i) = gg1(i) ; bg1(i) = gg2(i) ;


где: bg1 и bg2 - плохие геномы, gg1 и gg2 - хорошие геномы.

Выбор осуществляем по случайному.

// Код на С

void inline xver(double *b1,
double *b2,
double *g1,
double *g2,
int cnt)
{


for(;0<cnt;cnt--,b1++,b2++,g1++,g2++)
if(rand_unf > 0.5)
{
*b1 = *g1 ;
*b2 = *g2 ;
}
else
{
*b2 = *g1 ;
*b1 = *g2 ;
}
}

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

В конце каждой эпохи генетической оптимизации производим трансформацию популяции. Цель трансформации - передать дальше лучшие свойства.

Делаем в несколько этапов:

1. сортировка
2. перемешивание
3. скрещивание
4. мутирование
5. ограничение


// Код на С

void trans_pop(int pop_cnt,
int *pop_ind,
double *pop_kach,
int gen_len,
double *pop,
double mu,
double flash,
int *best_num)
{
int k, p , p2, p3 ;
double *b1,*b2 ;

sort_pop(pop_cnt,pop_ind,pop_kach) ;

*best_num = pop_ind[pop_cnt-1] ;

p = pop_cnt/2 ;
mix_ind(pop_ind,p) ;
mix_ind(pop_ind+p,p) ;

p = pop_cnt/4 ;
p2 = p * 2 ;
p3 = p * 3 ;

for( k=0 ; k<p ; k++ )
{
#define IND(k) (pop_ind[k])
#define GEN(k) (pop+IND(k)*gen_len)

b1 = GEN(k) ;
b2 = GEN(k+p) ;

xver(b1,b2,GEN(k+p2),GEN(k+p3),gen_len) ;

#undef IND
#undef GEN

mutate(b1,gen_len,mu,flash) ;
mutate(b2,gen_len,mu,flash) ;

ogr(b1,gen_len) ;
ogr(b2,gen_len) ;
}
}

четверг, 9 августа 2007 г.

12.01. Первые прогнозы (исследуем шумы)

В связи с неудачами прогнозировать курсы финансовых инструментов делаем возврат.
Поучимся прогнозировать простые вещи.
Пусть есть два сигнала. Второй сигнал - это первый с добавлением некоторого шума.
Первый сигнал генерируем как случайный по нормальному закону с нормой равной 1.
Разделим данные на две равные выборки - обучающую и тестовую. На тестовой выборке сделаем шум равным нулю. Будем учить прогнозировать из первого сигнала второй на обучающей выборке. А на тестовой посмотрим как точно она угадывает закон.
Учим на нейронной сети. Перед подачей на нейронную сеть сигналы нормируем по logsig к равномерному распределению.
Результат (в равномерном представлении) при разных значениях шума ниже.


По горизонтали - исходный второй сигнал, по вертикази - результат прогнозирования.
Синим показана обучающая выборка, красным тестовая, зеленым - идеал к которому стремимся.
Как видно из результатов, модель угадывает закон даже при больших шумах.
только сильно сжимается при повышении шума. Для устранения этого эффекта нужно поработать с нормированием сигнала.
Выводы.
Раз сеть так хорошо может отделаться от шума нужно использовать это ее свойство.
Значит нужно отфильтровывать шум при помощи сети.
Для этого можно взять комптентную сеть, подать на ее входы все сигналы. Обучить ее.
Затем просимулировать и взять значения к которым она сошлась.
Эти значения будут без шума.
Остается только подобрать сложность такой сети.

пятница, 20 июля 2007 г.

Об устаревании модели

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

10.13.1. Автоматический поиск с ограничением по точности в комитетах (нейроны,точность)