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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Иерархическая кластеризация., Немного DataMining на С++
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

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


Вершины – объекты
минимального остовного дерева группируются в кластеры.
Выбираются два объекта, которым соответствует минимальное ребро minjdj,
где j=1, n-1. Далее эти объекты стягиваются в один кластер (класс, таксон, страту) и
процедура шага 2 повторяется до тех пор, пока на n-1 этапе группирования не будет
сформирован один кластер, объединяющий все объекты. STOP.

Прикрепленное изображение

На рис. представлена последовательность группировки объектов в
кластеры для заданного на рис.1 примера минимального остовного дерева.
Порядок объединения объектов в кластеры отображён на рёбрах, которые
связывают объединяемые объекты .Таким образом, первыми
объединяются объекты X4 и Х5,которые в МОД связывает минимальное ребро d4
с весом 2. Вторыми объединяются объекты X2и X3, связанные ребром d2
с весом 3 , и так далее, пока на шестом этапе группирования ранее связанные объекты (X1,X2,X3,X4,X5,X6)
не будут объединены с объектом X7 ребром с весом 7.

И так , перейдем к описанию алгоритма кластеризации на примере :
Ребра МОД :
Цитата
(ИЗ--ВЕС-->В);
1. Е--2328-->Ом
2. В--2732-->И
3. Е--4667-->П
4. Л--5161-->Ом
5. О--6588-->И
7. П--14946-->В
И образуемые кластера :
(Шаг. №кластера)
1. 1.Е + ОМ значение кластера 2328
2. 1.
2. В + И 2732
3. 1. кластер поглощает вершину П, новый кластер Е+Ом+П 4667
2.
4. 1. поглощает вершину Л, новый кластер Е+Ом+П+Л 5161
2.
5. 1.
2. поглощает вершину О, новый кластер В + И + О 6588
6. 1 поглошает 2 и получается Л+Е+О+П+В+И+Ом 14946


Надеюсь понятно..вот как я понял этот алгоритм вербально :
Цикл от i=0 до n-1
Цикл от j=0 до n-1
Если множество вершин ребра/кластераi при пересечении с множеством вершин ребра/кластераj образует не пустое множество
если значение ребра/кластераj >=значению ребра/кластераi
ТОГДА образуется кластер соединением множества вершин ребра/кластераj и множества вершин ребра/кластераi
ИНАЧЕ наше ребро и есть кластер.

Правильно ли я понял алгоритм?
Вот так его можно описать в коде..
//ribs это объект класса реализующего :
// QSet<int> - множество вершин ребра/кластера, возвращается путем вызова метода items()
// свойство value, которое возвращает вес ребра/кластера
//считать, что операции &, &= - пересечение
// += - слияние.
for(int i=0;i<ribs.size();++i)
for(int j=0;j<ribs.size();++j)
if (ribs.at(j)!=ribs.at(i))//не сравниваем сами с собой..
if ( (!(ribs.at(i)->items() & ribs.at(j)->items()).empty()))
//если пересечение не образует пустое множество
if (ribs.at(j)->value() >= ribs.at(i)->value())
//если значение j ребра/кластера меньше i
{
ribs.at(j)->items()+=ribs.at(i)->items();//соединяем j и i ребро/кластера
}
else
{
// ребро и есть кластер
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Шо-то мне не очень понятно, что там твой согруппник сделал... Нет, ну сначала все идет как надо, а потом начинается нечто, не поддающееся объяснению. Смотри, чего я тут наваял (за основу взята твоя же программа для нахождения МОД):
#include <iostream>
#include <vector>
#include <limits>

bool exists(std::vector<int> vec, int value)
{
std::vector<int>::const_iterator it = std::find(vec.begin(), vec.end(), value);
return (it != vec.end()) ? true : false;
}

int main()
{
const int matrixSize = 8; // 17; // 6;
const std::string titles[matrixSize] =
{
"Lantasovo", "Egorshino", "Orehovo", "Perm",
"Voynovka", "Inskaya", "Omsk", "Ekaterinburg"
};

int dm[matrixSize][matrixSize] =
{
{ 0, 177, 171, 642, 981, 15, 403, 1315 },
{ 177, 0, 348, 465, 804, 192, 226, 1138 },
{ 171, 348, 0, 813, 1152, 156, 574, 1486 },
{ 642, 465, 813, 0, 339, 657, 239, 673 },
{ 981, 804, 1152, 339, 0, 996, 578, 334 },
{ 15, 192, 156, 657, 996, 0, 418, 1330 },
{ 403, 226, 574, 239, 578, 418, 0, 912 },
{ 1315, 1138, 1486, 673, 334, 1330, 912, 0 }
}; // матрица смежности графа

int sm[matrixSize][matrixSize];//матрица МОД
int used[matrixSize];//использованные вершины
int count=0;
int min;

for (int i=0; i< matrixSize; ++i)
{
used[i]=0;
for(int j=0;j< matrixSize;++j) sm[i][j]=0;
}

used[0]=1;
int idx;
do
{
min=std::numeric_limits<int>::max();
for(int i=0;i<matrixSize;++i)
{
if (used[i]!=0)
{
for(int j=0;j<matrixSize;++j)
if ( (dm[j][i] < min) && (dm[j][i]!=0) && (used[j]==0))
{
min=dm[j][i]; idx = j;
}
}
}

for(int i=0;i < matrixSize;++i)
for(int j=0;j<matrixSize;++j)
if( (dm[j][i]== min) && (used[j]==0) &&(used[i]==1))
{
used[j] =1;
sm[j][i]= sm[i][j] = min;
count++;
i=matrixSize;
break;
}
}
while(count < matrixSize-1);

// Выводим матрицу МОД ...
for(int i = 0; i < matrixSize; i++)
{
for(int j = 0; j < matrixSize; j++)
{
std::cout << sm[i][j] << " ";
}
std::cout << std::endl;
}

std::vector< std::pair<std::string, int> > tree;
std::vector<int> used_vertex;
for(int cycle = 0; cycle < matrixSize; cycle++)
{
std::pair<int, int> curr;

min = (cycle) ? std::numeric_limits<int>::max() : 0;
for(int i = 0; i < matrixSize; i++)
{
for(int j = i + 1; j < matrixSize; j++)
{
if(sm[i][j] > 0 && sm[i][j] < min && cycle &&
(exists(used_vertex, i) || exists(used_vertex, j)))
{
min = sm[i][j]; curr.first = i; curr.second = j;
}
}
}

//
if(!exists(used_vertex, curr.first))
{
used_vertex.push_back(curr.first);
tree.push_back(std::pair<std::string, int>(titles[curr.first], min));
sm[curr.first][curr.second] = sm[curr.second][curr.first] = 0;
}
else
if(!exists(used_vertex, curr.second))
{
used_vertex.push_back(curr.second);
tree.push_back(std::pair<std::string, int>(titles[curr.second], min));
sm[curr.first][curr.second] = sm[curr.second][curr.first] = 0;
}
}
std::vector< std::pair<std::string, int> >::iterator it;
for(it = tree.begin(); it != tree.end(); it++)
{
std::cout << it->first << " : " << it->second << std::endl;
}

return 0;
}
cool.gif (С++ так С++, по-полной)

Данные - оттуда же, из таблицы по ссылке, при "Количество записей = 8". Вот вывод программы (исключая МОД, оно строится правильно):
Lantasovo : 0
Inskaya : 15
Orehovo : 156
Egorshino : 177
Omsk : 226
Perm : 239
Voynovka : 339
Ekaterinburg : 334

Чувствуешь? А у него каким-то необъяснимым образом сначала группируются Войновка с Екатеринбургом, и только потом этот кластер объединяется с остальными. Это откуда такое взялось?
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Andrewshkovskii   Иерархическая кластеризация.   24.11.2009 21:59
volvo   Можно уточнить, в результате ты что хочешь получит…   24.11.2009 22:15
Andrewshkovskii   http://el-niko.ru/lab/1/ Вот тут пример , это прог…   24.11.2009 22:34
volvo   Шо-то мне не очень понятно, что там твой согруппни…   25.11.2009 0:46
Andrewshkovskii   Что-то ты нагромоздил кода, хотя просто я использу…   25.11.2009 3:48
volvo   У меня в принципе то же самое вот до этого момента…   25.11.2009 4:38
Andrewshkovskii   На 0 этапе добавил Лянгасово куда-то?Ну про код пр…   25.11.2009 4:52
volvo   Так... До Qt я вчера так и не добрался, сегодня ве…   25.11.2009 17:04
Andrewshkovskii   Да, результат более понятно,сейчас в коде по-разби…   25.11.2009 17:18
Andrewshkovskii   Вот такой вот результат,из-за одинковых значений…   25.11.2009 18:41
volvo   В общем, вот чего у меня получилось после полной п…   26.11.2009 5:44
Andrewshkovskii   Мда, мне далекова-то до твоих мозгов, Владимир..Сп…   26.11.2009 6:42
volvo   Это вряд ли... В Qt очень сокращенная версия STL-я…   26.11.2009 6:59
volvo   В первом приближении - вот так (тут очень многое д…   26.11.2009 22:41
Andrewshkovskii   Ох, только добрался до компа, весь день в институт…   27.11.2009 4:04
Andrewshkovskii   Ну в общем я попробовал разобраться, все в исходни…   27.11.2009 17:44
volvo   Ты точно нужный исходник присоединил? А то по-моем…   27.11.2009 17:53
Andrewshkovskii   Упс, исходник вот. Насчет длины вектора так и дума…   27.11.2009 17:55
volvo   Вот ответы: :) (я оставил твои комментарии, ниже д…   27.11.2009 18:55
Andrewshkovskii   Так, слегка проникся кодом, и даже что-то понял:) …   27.11.2009 21:10
volvo   Написал код для визуализации на VCL (Билдер). Вот …   29.11.2009 22:21
Andrewshkovskii   Привет!:)спасибо за огромную помощь..но я поше…   30.11.2009 5:26
volvo   Блин, у меня оказывается на скрине не было видно с…   30.11.2009 5:48
Andrewshkovskii   Ну я проект скину перед сном, если надо, посмотриш…   30.11.2009 5:50
Гость   В общем проблема такая...надо как-то зафиксировать…   1.12.2009 0:34
-Volvo-   Что значит "как нибудь"? Устанавливаешь …   1.12.2009 1:12
Andrewshkovskii   Там надо минимум в 0 устанавливать, таково требова…   1.12.2009 4:27
volvo   В таком случае у тебя нет другого варианта, кроме …   1.12.2009 6:04
Andrewshkovskii   Была такая мысль у меня о фиксации каждого кластер…   1.12.2009 6:19
Andrewshkovskii   Перечитал методичку..в общем-то можно и вовсе без …   1.12.2009 6:52
Andrewshkovskii   В общем вот что вышло у меня. осталась одна пробле…   1.12.2009 20:41
Andrewshkovskii   С этой проблема ещё связано с отрисовкой кластеров…   1.12.2009 21:42
Andrewshkovskii   outCanvas->MoveTo(visLabelWidth + 30 + cluste…   1.12.2009 22:08
Andrewshkovskii   Понятно..   1.12.2009 22:57
volvo   :blink: А расскажи мне (ты свою модель лучше знаеш…   2.12.2009 1:51
Andrewshkovskii   Изменяется она потому, что она при первичной отрис…   2.12.2009 2:38
volvo   Угу... Именно: // Это у тебя было ... …   2.12.2009 3:12
Andrewshkovskii   Ну макс. длина у меня вычисляется, это я предусмот…   2.12.2009 5:07
volvo   Ну, это вообще не проблема... Делаем в drawClamp(…   2.12.2009 5:58
Andrewshkovskii   хм..действительно.. Над не забыть только biggest_e…   2.12.2009 6:06
Andrewshkovskii   С 2ой проблемой разобрался, а вот что делать с 1ой…   2.12.2009 17:49
Andrewshkovskii   Ну в общем дописал..нашел правда один мемори лик, …   3.12.2009 4:14
finasteride 1 mg no prescription   Cytotec Pills Over The Counter   29.10.2021 23:10
gabriella   Your writings and news are really interesting to m…   12.04.2022 10:27
reznit   Доступа к определенному элементу (кроме первого) п…   9.06.2022 15:17
nishaknapp   Why not settling on games that is fun and at the s…   29.07.2022 16:56
gabriella   It is the intent to provide valuable information a…   1.08.2022 9:37


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

 





- Текстовая версия 7.05.2024 21:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name