Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите с условной энтропией  (Прочитано 8494 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Gezhel
Гость
« : 18-10-2008 07:34 » 

Всем здравствуйте. У меня есть проблемка: не получается написать программу вычисления условной энтропии. Входным параметром является строка, энтропию которой каждой буквы надо расчитать. Программу я написала, проблем с компилятором нет, программа запускается и работает, вот только считает энтропию неправильно. Помогите исправить ошибки

Код:
procedure TForm1.Button4Click(Sender: TObject);
var
i,j:byte;
sum,int:real;
mas:array[1..100,1..100] of char;
begin
s:=Edit1.Text;
h:=length(s);
 for i:=1 to h do
  mas[1,i+1]:=s[i];
 for i:=1 to h do
  mas[i+1,1]:=s[i];

 for i:=1 to h-1 do
  begin
   for j:=1 to h do
    begin
     if mas[i+2,1]=mas[1,j+1] then
      mas[i+1,j+1]:='1';
    end;
  end;

sum:=0;
 for i:=1 to h-1 do
  begin
   for j:=1 to h do
    begin
     if mas[i+1,j+1]<>'' then
      sum:=sum+1;
    end;
    int:=(sum/h)*log2(sum/h);
    ListBox1.Items.Add(s[i]+' = '+FloatToStr(int));
    sum:=0;
  end;

end;

« Последнее редактирование: 18-10-2008 08:51 от RXL » Записан
Gezhel
Гость
« Ответ #1 : 18-10-2008 07:37 » 

Предыдущую программу, расчет энтропии, я выводила  в стрингрид, таблицу с алфавитом тоже там же. В этой программе решила сделать массив только с буквами строки и вывела условную энтропию в лист. Преподаватель сказал, ято считает неправильно. Помогите разобраться, где здесь ошибки
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 18-10-2008 07:38 » 

Gezhel, опиши на словах, какой алгоритм применяешь ?
Записан

Gezhel
Гость
« Ответ #3 : 18-10-2008 07:51 » 

С помошью двумерного массива записываю буквы строки в первую строку массива и в первую колонку. Затем проверяю стоит ли после данной буквы следущая. В совпавшие клетки массива помещаю '1'. Далее считаю сумму появления буквы (по строке массива) и по формуле вычисляю условную энтропию для каждого символа. Для последнего символа, кажется не считается энтропия.   
Плохо как-то описала =((
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 18-10-2008 08:02 » 

Gezhel, я, вот, например, понятия не имею, как считается условняа энтропия Улыбаюсь Нашёл вот http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%8D%D0%BD%D1%82%D1%80%D0%BE%D0%BF%D0%B8%D1%8F#.D0.A3.D1.81.D0.BB.D0.BE.D0.B2.D0.BD.D0.B0.D1.8F_.D1.8D.D0.BD.D1.82.D1.80.D0.BE.D0.BF.D0.B8.D1.8F

пока ещё втыкаю....
Записан

Gezhel
Гость
« Ответ #5 : 18-10-2008 08:06 » new

Спасибо, сейчас посмотрю, поразбираюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 18-10-2008 08:15 » 

мне кажется, в 2-мерный массив надо не строку записывать, а символы алфавита (массив для ASCII будет максимум 256*256)

Для каждой клетки считаем, сколько раз символ "слева" идёт за символом "сверху". Вероятность = частота_появления/длина_сообщения. Затем считаем сумму по формуле из вики
« Последнее редактирование: 18-10-2008 08:34 от Алексей1153++ » Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 18-10-2008 08:26 » 

по коду пару замечаний
массив mas не инициализирован
Код:
for i:=1 to h-1 do
  begin
   for j:=1 to h do
    begin
     if mas[i+2,1]=mas[1,j+1] then
      mas[i+1,j+1]:='1';
    end;
  end;
видимо нужно сделать следующим
Код:
for i:=1 to h-1 do
  begin
   for j:=1 to h do
     if mas[i+2,1]=mas[1,j+1] then
      mas[i+1,j+1]:='1'
      else mas[i+1,j+1]:=' '
  end;
Код:
h:=length(s);
 for i:=1 to h do
  mas[1,i+1]:=s[i];
 for i:=1 to h do
  mas[i+1,1]:=s[i];
переделываем в более наглядный
Код:
h:=length(s);
 for i:=1 to h do
  begin
    mas[1,i+1]:=s[i];
    mas[i+1,1]:=s[i];
  end;
И не забываем проверить длину строки s (а если она больше 99?)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines