| 
| 
 | Вопрос # 5 444/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Хочу проконсультироваться насчет правильности алгоритмов вычисления энтропии и Фурье-преобразования.
 исходник: https://www.delphi-int.ru/code/2b7d3f01
 
|  |   Вопрос задал: mirt.steelwater (статус: Посетитель)Вопрос отправлен: 23 июня 2011, 18:08
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 6 июля 2011, 12:38; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 24 июня 2011, 08:18 [#1]:А в чём, собственно, вопрос-то? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | mirt.steelwater (статус: Посетитель), 24 июня 2011, 09:42 [#2]:ну не уверен я в правильности того, что получилось вот и спрашиваю - верно я реализовал или неверно эти алгоритмы?
 Ⓐ свобода сопротивление солидарность |  
|   | min@y™ (статус: Доктор наук), 24 июня 2011, 09:54 [#3]: Цитата (mirt.steelwater): ну не уверен я в правильности того, что получилось вот и спрашиваю - верно я реализовал или неверно эти алгоритмы?  Ты предлагаешь прочитать этот код и проанализировать? ТЫ СЕРЬЁЗНО???!!!111
 А ты его (код) компилить/запускать пробовал? Или решил сначала людям показать, а не компилятору?
 Или я чего-то не понимаю, а?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | bugmenot (статус: 3-ий класс), 24 июня 2011, 10:17 [#4]:хорощий код, аккуратненький не без wtf, конечно
 виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | mirt.steelwater (статус: Посетитель), 5 июля 2011, 18:26 [#5]:компилятору я скормил, иначе бы не спрашивал с FFT похоже на правду, т.к. для функции
 
 { array [2n] + i*array [2n+1] }
for I := 0 to ( 2 * DataLength - 1 ) do
begin
    Data [I]   := random (DataLength) * sin ( i * random (5) );
    Data [I+1] := 0;
end;получаем такую картинку:
 http://i023.radikal.ru/1107/47/3aa9056293ea.jpg
 
 но вот, прочитав статью на википедии о том, что такое информационная энтропия - я ничего не понял..
 как найти максимальную энтропию на конечном множестве (ограниченном как по длине, так и по размеру элементов)
 если пользоваться этой формулой:
 
 function Entropy (const anArray: parray_of_double;
                  const aLength: WORD;
                  const aPrecision: Double = 0.001) : Double;
var
    I   : WORD;
    Frq : Double;
begin
    Result := 0;
    try
        for I := 0 to (aLength - 1) do
        begin
            Frq := Frequency (anArray^ [I],
                              anArray,
                              aLength,
                              aPrecision);
            if ( Frq > 0 ) then
                Result := Result + Frq * log2 (1/Frq);
            Continue;
        end;
    except on E: Exception do
        raise Exception.CreateFmt ('%s : %s',[ERR_DISCRETE_MATH_GET_ENTROPY,E.Message]);
    end;
end;то для частоты Frq = 1/aLength получаем:aLength * log2 (aLength)/aLength = log2 (aLength)
 что меньше, чем то, что получается?! как это так и что я неверно делаю?
 Ⓐ свобода сопротивление солидарность |  
|   | mirt.steelwater (статус: Посетитель), 6 июля 2011, 12:38 [#6]:Разобрался! Повторяющиеся элементы я считал несколько раз.
 Правильная формула энтропии такая:
 
 function Entropy (const anArray: parray_of_double;
                  const aLength: WORD;
                  const aPrecision: Double = 0.001) : Double;
var
    I   : WORD;
    Frq : Double;
begin
    Result := 0;
    try
        { array [2n] + i*array [2n+1] }
        I := 0;
        while ( I < 2*aLength ) do
        begin
            Frq := Frequency (anArray^ [I],
                              anArray,
                              aLength,
                              aPrecision);
            if ( Frq > 0 ) then
                Result := Result + log2 (1/Frq);
            Inc (I,2); // real only
        end;
        Result := Result / aLength;
    except on E: Exception do
        raise Exception.CreateFmt ('%s : %s',[ERR_DISCRETE_MATH_GET_ENTROPY,E.Message]);
    end;
end;Ⓐ свобода сопротивление солидарность |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |