|
Вопрос # 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;
Ⓐ свобода сопротивление солидарность
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|