Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 444

/ вопрос открыт /

Здравствуйте, эксперты!
Хочу проконсультироваться насчет правильности алгоритмов вычисления энтропии и Фурье-преобразования.
исходник: https://www.delphi-int.ru/code/2b7d3f01

mirt.steelwater Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: mirt.steelwater (статус: Посетитель)
Вопрос отправлен: 23 июня 2011, 18:08
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 6 июля 2011, 12:38; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 24 июня 2011, 08:18 [#1]:

А в чём, собственно, вопрос-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
mirt.steelwater

mirt.steelwater (статус: Посетитель), 24 июня 2011, 09:42 [#2]:

ну не уверен я в правильности того, что получилось
вот и спрашиваю - верно я реализовал или неверно эти алгоритмы?
Ⓐ свобода сопротивление солидарность
min@y™

min@y™ (статус: Доктор наук), 24 июня 2011, 09:54 [#3]:

Цитата (mirt.steelwater):

ну не уверен я в правильности того, что получилось вот и спрашиваю - верно я реализовал или неверно эти алгоритмы?

Ты предлагаешь прочитать этот код и проанализировать? ТЫ СЕРЬЁЗНО???!!!111
А ты его (код) компилить/запускать пробовал? Или решил сначала людям показать, а не компилятору?
Или я чего-то не понимаю, а?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 24 июня 2011, 10:17 [#4]:

хорощий код, аккуратненький
не без wtf, конечно
виконання програми розпочинається з того самого мiсця, де призупинилося.

mirt.steelwater

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

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;
Ⓐ свобода сопротивление солидарность

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:47
Выполнено за 0.04 сек.