IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Подсчет энтропии источника информации., С\С++
Altair
сообщение 19.02.2006 20:20
Сообщение #1


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


(из лекции)
Энтропия это величина, вычисляемая по формуле:
Прикрепленное изображение

где P(xi) - вероятность появления символа xi в сообщении,
ni - число символов в сообщении объемом n.

Вопрос первый.
Я верно все записал, т.е. энтропия так считается ? Второй вопрос, пишу программу для подсчета :

#include <stdio.h>
#include <string.h>
#include <math.h>

double get_count (char x[], char c){
int i;
double res=0;
for (i=0; i<=strlen(x); i++) if (x[i]==c) res+=1;
return res;
}

double prob (char x[], char c){
return get_count(x,c) / strlen(x);
}


double coeff_entropy (char x[]) {
int i;
double res=0;
for (i=0; i<=strlen(x); i++) {
res+= prob(x,x[i]) * log2(prob(x,x[i]));
}
res=res*(-1);
return res;
}

int main () {
char s[80];
printf("Entropy\n Enter text...\n");
scanf("%s",&s);
printf("Entropy [s] = %f", coeff_entropy(s));
return 0;
}

выдается какой-то бред.
Для сообщения
1111111111111211111111
выдается энтропия 1.750737
а для 1234567890 -
3.654121
мне кажется результат не верен.
т.к. вторая строка гораздо больше уменьашет степень неопределенности...
где я ошибся ?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Altair
сообщение 19.02.2006 23:44
Сообщение #2


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


1. самое важное - log2 в mingw считает что-то другое... у меня после замены на
Цитата
#define LOG2TO10 0.30102999566398119521373889472449
// Ну нету у меня в Turbo C этой функции, а MinGW в лом запускать smile.gif
double log2(double x)
{
return log(x) / LOG2TO10;
}

совсем другой результат получился.

ты генерируешь массив, p_count, в котором по индексу i записанно число посвторений символа с кодом i в тексте.
(функция set_p)
и дальше проходишь по всему алфавиту (по p_count), для каждого символа которые встретился , ты считаешь
вероятность как число вхождения деленное на длинну строки...
то есть я, в цикле суммировал значение P(x) для каждого символа строки а не алфавита.

Хорошо, но при строках с различными символами результаты должны совпадать!
а не совпадают... почему ?
Я проверил. Вход 1234
выход.
у меня -5.756463
у тебя -4.605170

отчего так, я не пойму ?

я проверил, функция get_count уменя работает верно и prob тоже...
а сам цикл прозрачен, откуда такие глюки ?
вот мой вариант проги, на котором тестировал:

#include <stdio.h>
#include <string.h>
#include <math.h>
#define LOG2TO10 0.30102999566398119521373889472449
double _log2(double x)
{
return log(x) / LOG2TO10;
}
double get_count (char x[], char c){
int i;
double res=0;
for (i=0; i<=strlen(x); i++) if (x[i]==c) res+=1;
return res;
}

double prob (char x[], char c){
return get_count(x,c) / strlen(x);
}


double coeff_entropy (char x[]) {
int i,len=strlen(x);
double res=0.0;
for (i=0; i<=len; i++) {
res+= prob(x,x[i]) * _log2(prob(x,x[i]));
}
res=res*(1);
return res;
}

int main () {
char s[80];
printf("Entropy\n Enter text...\n");
scanf("%s",&s);
printf("Entropy [s] = %f", coeff_entropy(s));
//printf("Entropy [s] = %f", prob(s,'1'));
return 0;
}


добавил позже
ВСЕ. я понял почему.
for (i=0; i<=len; i++) {
strlen возвращает ведь длинну строки, а строку с 0 ... получается на 1 итерацию больше.
я заменил на
for (i=0; i< len; i++) {
теперь результаты совпадают.
Цитата
Entropy
Enter text...
1234
Entropy [s] = 4.605170


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 23.06.2025 18:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"