Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2013, 20:28   #21
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

Я к нему теперь только во вторник иду, может снова чего новое придумает, изменит...
Ягодка вне форума Ответить с цитированием
Старый 17.02.2013, 20:34   #22
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от Ягодка Посмотреть сообщение
Я к нему теперь только во вторник иду, может снова чего новое придумает, изменит...
Не забудьте рассказать, если что-то новое будет. А так текст программы вроде бы соответствует заданию. Ну, учитывая исправления, которые я выше писал..
По крайней мере, у меня то, что в программе и то, что на бумаге сошлось.
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 17.02.2013, 20:43   #23
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

alexander13, обязательно расскажу, спасибо Вам за неравнодушие! =)
Ягодка вне форума Ответить с цитированием
Старый 19.02.2013, 18:19   #24
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

В общем, преподаватель ничего путного не сообщил. Стоит на своем: ошибка должна стать в 1000 раз меньше!
Исправил вот это:
Код:
E1:=E1+((sqr(Dm1[i])*In1[i])+(sqr(Dm2[i])*In2[i]));{ошибка Е начальная}
Соответственно и вот это:
Код:
E:=E+((sqr(Dm1[i])*In1[i])+(sqr(Dm2[i])*In2[i]));
И нахождение новых координат m1, m2:
Код:
for i:=1 to 10 do begin
sumIn1:=sumIn1+In1[i];
sumIn2:=sumIn2+In2[i];
end;

for i:=1 to 10 do begin
sumKol1:=sumKol1+(Kol[i]*In1[i]);
sumGar1:=sumGar1+(Gar[i]*In1[i]);
sumRem1:=sumRem1+(Rem[i]*In1[i]);
sumKol2:=sumKol2+(Kol[i]*In2[i]);
sumGar2:=sumGar2+(Gar[i]*In2[i]);
sumRem2:=sumRem2+(Rem[i]*In2[i]);
end;

for i:=1 to 3 do begin
m1[1]:=sumKol1/sumIn1;
m1[2]:=sumGar1/sumIn1;
m1[3]:=sumRem1/sumIn1;
m2[1]:=sumKol2/sumIn2;
m2[2]:=sumGar2/sumIn2;
m2[3]:=sumRem2/sumIn2;
end;
Пришла домой, стала считать всё это дело на листочке. Если задавать m1=13,10,0; m2=1,1,5, то после двух "прокруток"-итераций m1 становится 11; 6: 0,75, m2 становится 2,5; 2,125; 1,025, ошибка Е=86, 695, и больше ничего не меняется! Если же задать m1=4; 2;0,9, m2=3; 1; 0 - число итераций возрастает до 4, конечная ошибка снова становится 86, 695 и значения m1, m2 снова становятся 11; 6: 0,75, и 2,5; 2,125; 1,025. Вот так-то
Ягодка вне форума Ответить с цитированием
Старый 19.02.2013, 18:20   #25
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

В общем, нужно смотреть - если ничего не меняется, а именно - ошибка Е и значения m1, m2 - надо выходить из цикла. Но как это сделать-я не знаю.
Ягодка вне форума Ответить с цитированием
Старый 19.02.2013, 19:31   #26
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от Ягодка Посмотреть сообщение
В общем, нужно смотреть - если ничего не меняется, а именно - ошибка Е и значения m1, m2 - надо выходить из цикла. Но как это сделать-я не знаю.
Вот то, что он исправил - это как раз модификация до hard c-means. По идее там ошибка должна уменьшаться, но все равно не в 1000 раз.
А выходить из цикла - просто. Можно, например, сравнивать центроиды на предыдущем и текущем шаге, если они равны, то делать break. Можно, конечно, и ошибки сравнивать, но мне кажется, сравнивать центроиды надежнее.

Upd.
Понимаете, да? Т.е. Вам нужно сохранять старые значения центроидов, потом вводить какой-нибудь if, где в условии стоит разность предыдущего и текущего центроидов и, если она равно нулю, то делать break;
А ошибка не обязана уменьшаться в 1000 раз. Это не следует из самого метода...
Μολὼν λαβέ

Последний раз редактировалось alexander13; 19.02.2013 в 19:36.
alexander13 вне форума Ответить с цитированием
Старый 19.02.2013, 19:34   #27
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

Обалдеть... Зачем он мне c-means сделал?! Ладно, это риторический вопрос... А как получить предыдущий и текущий шаг из Until-Repeat?
Ягодка вне форума Ответить с цитированием
Старый 19.02.2013, 19:44   #28
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

Старые значения центроидов - это значения m1, m2. Но они же первые, которые мы ищем по масимуму и минимуму.
Если делать
Код:
for i:=1 to 3 do begin
mm1[1]:=sumKol1/sumIn1;
mm1[2]:=sumGar1/sumIn1;
mm1[3]:=sumRem1/sumIn1;
mm2[1]:=sumKol2/sumIn2;
mm2[2]:=sumGar2/sumIn2;
mm2[3]:=sumRem2/sumIn2;
end;
Т.е. сохранять новые значения центроидов в новые массивы mm1, mm2 и сравнивать их с m1,m2 - это не то
Ягодка вне форума Ответить с цитированием
Старый 19.02.2013, 19:45   #29
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от Ягодка Посмотреть сообщение
А как получить предыдущий и текущий шаг из Until-Repeat?
Ну как же.. у Вас в каждой итерации цикла вычисляются новые компоненты центроида. Вот до того, как их вычислять, сохраните старые в отдельные переменные.
Например, можно их сохранять в координаты начальных точек центроидов, они все равно, кажется, дальше не используются. Если сильно не заморачиваться, то как-то так:
Код:
x1 := m1[1];  y1 := m1[2];  z1 := m1[3];
x2 := m2[1];  y2 := m2[2];  z2 := m2[3];

for i:=1 to 10 do begin
...
{вычисляем новые центроиды}
...
end;

if (x1-m1[1] = 0) and (y1-m1[2]=0) and (z1-m1[3]=0)
    and (x2-m2[1] = 0) and (y2-m2[2]=0) and (z2-m2[3]=0) then
  break;
Μολὼν λαβέ
alexander13 вне форума Ответить с цитированием
Старый 19.02.2013, 19:54   #30
Ягодка
Пользователь
 
Аватар для Ягодка
 
Регистрация: 11.02.2013
Сообщений: 32
По умолчанию

Цикл Repeat-Until при этом остаётся?
Ягодка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл repeat until ac1d_buRn Помощь студентам 4 06.10.2009 21:55
Как правильно построить цикл для выборки? Tanuska___:) БД в Delphi 1 12.01.2009 14:50
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34