double SafeCrossEntropy( double T, double Z ){
//--------------------------------------------double Result, R;
//--------------------------------------------// Print("Процедура проверки порогов.");//--------------------------------------------if( T==0 )
return(0);
else {
if( MathAbs(Z)>1 )
// Shouldn//t be the case with softmax,// but we just want to be sure.if( T/Z==0 )
R = MathPow(0.1,300); // MinRealNumber;else
R = MathAbs(T/Z);
else// В нормальном случаеif( (Z==0) || (MathAbs(T)>=MathPow(10.0,300)*MathAbs(Z)) ) // MaxRealNumber*MathAbs(Z) )
R = MathPow(10.0,300); // MaxRealNumber;else
R = MathAbs(T/Z);
Result = T*MathLog(R); // MathLog(R);
}
return(Result);
}
Вместо выделенного текста можете смело написать: if( false )
Результат не изменится.
Если Т или Z - вычисляемые параметры, то, соответственно, T==0 и Z==0 также тождественны false.
Та то, что это деление на ноль - это и коню понятно.
Не понятно откуда оно берётся, ведь при малых объёмах данных его нет, а как только задашь в работу 20-30 рабочих индикаторов - так и выскакивает.
При 10-15 индикаторах - великолепно работает, но хочется более точных прогнозов. Вот и пытаюсь задать больше вариантов.
К тому же if-ы перед всеми возможными делениями - пробовал. Не помогло. И нормализацию пробовал. Тоже не помогло.
Вот подозреваю вот это место, при расчёте логарифма. Там используются максимально большие и минимально малые значения (таких два куска симметричных за исключением мелочей), которые, возможно, из-за нехватки разрядности и представляются как "0". Может они и вылетают как "0", хотя не должны.
А за идею с print-ами большое спасибо. Сам её частенько использую, а тут что-то не догадался.
if( T==0 )
return(0);
else {
if( MathAbs(Z)>1 )
// Shouldn//t be the case with softmax,// but we just want to be sure.if( T/Z==0 )
R = MathPow(0.1,300); // MinRealNumber;
Условие T/Z==0 всегда false.
См. выше по цепочке условий: если T!=0, если |Z|>1, то T/Z всегда != 0
tara:
imho, нечто вроде повязки счастья на глазах. Препятствует падению в пропасть, но не развивает навыков подниматься.
:D
сознаюсь - грешен не проверяю в своих кодах такие ошибки, НО к счастью не помню на своей памяти за последние годы появления такой ошибки, возможно все дело в том, что я ВСЕГДА проверяю исходные данные, и в зависимости от задачи, привожу исходные данные в соответствие, для исторических данных у меня это предыдущее ненулевое знаечние
Та то, что это деление на ноль - это и коню понятно.
Не понятно откуда оно берётся, ведь при малых объёмах данных его нет, а как только задашь в работу 20-30 рабочих индикаторов - так и выскакивает.
При 10-15 индикаторах - великолепно работает, но хочется более точных прогнозов. Вот и пытаюсь задать больше вариантов.
К тому же if-ы перед всеми возможными делениями - пробовал. Не помогло. И нормализацию пробовал. Тоже не помогло.
Вот подозреваю вот это место, при расчёте логарифма. Там используются максимально большие и минимально малые значения (таких два куска симметричных за исключением мелочей), которые, возможно, из-за нехватки разрядности и представляются как "0". Может они и вылетают как "0", хотя не должны.
А за идею с print-ами большое спасибо. Сам её частенько использую, а тут что-то не догадался.
Условие T/Z==0 всегда false.
См. выше по цепочке условий: если T!=0, если |Z|>1, то T/Z всегда != 0
вот тут лажа
думаю проще через Ctrl+F найти все "/" и сделать ф-цию вида:
логические ошибки не уйдут, но ошибки в ходе исполнения будут видны и работоспособность кода не будет утеряна
думаю проще через Ctrl+F найти все "/" и сделать ф-цию вида:
логические ошибки не уйдут, но ошибки в ходе исполнения будут видны и работоспособность кода не будет утеряна
imho, нечто вроде повязки счастья на глазах. Препятствует падению в пропасть, но не развивает навыков подниматься.
:D
сознаюсь - грешен не проверяю в своих кодах такие ошибки, НО к счастью не помню на своей памяти за последние годы появления такой ошибки, возможно все дело в том, что я ВСЕГДА проверяю исходные данные, и в зависимости от задачи, привожу исходные данные в соответствие, для исторических данных у меня это предыдущее ненулевое знаечние