![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Altair |
![]()
Сообщение
#1
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
(из лекции)
Энтропия это величина, вычисляемая по формуле: ![]() где P(xi) - вероятность появления символа xi в сообщении, ni - число символов в сообщении объемом n. Вопрос первый. Я верно все записал, т.е. энтропия так считается ? Второй вопрос, пишу программу для подсчета :
выдается какой-то бред. Для сообщения 1111111111111211111111 выдается энтропия 1.750737 а для 1234567890 - 3.654121 мне кажется результат не верен. т.к. вторая строка гораздо больше уменьашет степень неопределенности... где я ошибся ? -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Олег, вопрос на засыпку: Что такое энтропия источника информации? Нас учили, что
Цитата Чем больше энтропия источника, тем больше информации получают от него. Откуда ты получишь больше информации, из первого сообщения, или из второго?P.S. Кстати, у меня результаты на TC++ совершенно другие: Entropy |
Altair |
![]()
Сообщение
#3
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Цитата у меня результаты на TC++ совершенно другие: ![]() кашмар. я на MinGW проверял. Ужас. Почему разные результаты ? У нас вот какое определение: Мерой количества информации является энтропия. Энтропия показывает, на сколбко уменьшается степень неопределенности знаний получателя информации об интересубщем его объекте или явлении -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Хм... Я бы делал вот так (я например так понимаю приведенную тобой формулу):
|
Altair |
![]()
Сообщение
#5
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
1. самое важное - log2 в mingw считает что-то другое... у меня после замены на
Цитата #define LOG2TO10 0.30102999566398119521373889472449 совсем другой результат получился. ты генерируешь массив, p_count, в котором по индексу i записанно число посвторений символа с кодом i в тексте. (функция set_p) и дальше проходишь по всему алфавиту (по p_count), для каждого символа которые встретился , ты считаешь вероятность как число вхождения деленное на длинну строки... то есть я, в цикле суммировал значение P(x) для каждого символа строки а не алфавита. Хорошо, но при строках с различными символами результаты должны совпадать! а не совпадают... почему ? Я проверил. Вход 1234 выход. у меня -5.756463 у тебя -4.605170 отчего так, я не пойму ? я проверил, функция get_count уменя работает верно и prob тоже... а сам цикл прозрачен, откуда такие глюки ? вот мой вариант проги, на котором тестировал:
добавил позже ВСЕ. я понял почему. for (i=0; i<=len; i++) { strlen возвращает ведь длинну строки, а строку с 0 ... получается на 1 итерацию больше. я заменил на for (i=0; i< len; i++) { теперь результаты совпадают. Цитата Entropy Enter text... 1234 Entropy [s] = 4.605170 -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Олег, у тебя тут есть просто ошибки... Смотри:
for (i=0; i<=strlen(x); i++) if (x[i]==c) res+=1;Это тебе что, Паскаль? Если i = strlen(x), то это - зевершающий нулевой символ строки, по идее он не должен считаться, это же НЕ информация... У меня он как раз не считается. Попробуй подправить везде, может это дает разброс результатов? Во, и я о том же ![]() |
Altair |
![]()
Сообщение
#7
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Все отлично.
Теперь осталось узнать, прогонять ли цикл по всем символам в строке или по алфавиту... конечно скорее второе... завтра спрошу к преподавателя... -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
Altair |
![]()
Сообщение
#8
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Итак.
Общее определение понятия истояника информации понятно, но есть еще и физическая интерпретация, понятия энтропия. Энтропия показывает сколько нужно потратить минимально бит, для кодирования информации в сообщении. Вот пример подсчета энтропии для строки символов: ![]() ![]() Вот окончательный вариант, правильной программы (написал только что, на основе программы volvo и моей старой)
тестирование, подтверждает пример: Цитата Enter message... ctyl._ccc.__ttttt...__yy._lll. Entropy H(x) = 2.526027 bit/symbol Компилятор MinGW, а вот функция #define LOG2TO10 0.30102999566398119521373889472449видимо неверна, если с помощтю нее вычислять получается... Цитата Enter message... , что неверно.ctyl._ccc.__ttttt...__yy._lll. Entropy H(x) = 5.816391 bit/symbol Но вобщем вопрос решен. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 1:43 |