Страницы: 1
RSS
Кластеризация точек на диаграмме Excel
 
Доброго времени суток, умным людям!
Дано:
А(нижний предел) = 0; В(верхний предел) = 200; N(количество точек) = 100. Генерируем Х и У функцией СЛУЧМЕЖДУ(А;В) протягиваем формулу, пока ни получится N точек, то бишь 100. Копируем только значения, получаем набор случайных пар (Х;У)
Задача:
С помощью VBA произвести кластеризацию объектов(точек с координатами(Х;У)). Правила останова: 1) 7 или менее кластеров; 2) более одного объекта в каждом кластере.
Решение:
Изначально количество кластеров = количеству точек, то есть каждая точка в своем кластере. Находим "центры масс" кластеров (Mi=((сумма Хi )/Nx; (сумма Уi)/Ny) на данном этапе это - координаты точек, для каждого кластера. Теперь нужно найти расстояния между всеми центрами масс, то есть от каждой точки до всех остальных.R=(Xi-X(i+1))^2+(Yi-Y(i+1))^2.  Выбрать среди них наименьшее и соединить эти два кластера в один. Опять найти центры масс для каждого кластера, опять найти все расстояния между центрами масс, определить наименьшее, объединить два соответствующих кластера в один. И так до тех пор пока количество кластеров не буден меньше либо равно семи, и при этом в каждом кластере будет более одного объекта. В итоге должна получиться точечная диаграмма на которой точки принадлежащие к одному кластеру окрашены в какой-нибудь свой цвет. В добавок ко всему, весь процесс должен быть каким то образом заметен, но это пока не так важно. Мне б для начала с самой задачей разобраться. Я вообще не очень то с VBA знакома, но в паскале программки писать приходилось, и даже немного получалось. Языки, как я поняла, родные. Но я даже не знаю с чего начать.  Помогите, кто чем может. :oops: Важен любой совет. Посмотрите код мой в сообщениях ниже, может что и присоветуете)))
Изменено: staylecolor - 19.10.2015 19:30:44
 
Доброе время суток
Цитата
staylecolor написал:
Генерируем Х и У функцией СЛУЧМЕЖДУ(А;В)
С таким же успехом можно генерировать и просто по регулярной сетке. Критерия выявления кластера на равномерном случайном распределении точек нет. Лучше уж скачайте и подготовьте исходный файл, например, координат населённых пунктов РФ - хоть что то можно будет говорить о кластерном анализе.
 
Способ генерации определен преподом. Критерий кластеризации (если можно так сказать) - расстояние между точками на диаграмме. Алгоритм у меня уже есть, я написала его в теме весь. Нужен код для макроса. А я даже не умею массивы в VBA объявлять, да и не вполне понимаю какие и сколько в данном случае мне нужны.
 
Подскажите пожалуйста, хоть с чего начать, хоть последовательность действий, хоть что-нибудь, кто что знает. Любая информация.
 
Доброе время суток
Цитата
staylecolor написал: Подскажите пожалуйста, хоть с чего начать,
Цитата
staylecolor написал: но в паскале программки писать приходилось, и даже немного получалось
Вот и сделайте на код на Pascal - на VBA переведём.
 
Цитата
Андрей VG написал: Вот и сделайте на код на Pascal - на VBA переведём.
Скрытый текст

Андрей VG, Пока только с условием, что NК> или =7, но там я додумаю. Получилось что-то между паскалем и VBA. :oops:
 
Андрей VG,
Код
for J=1 to NK do
if M(J)>1 then CONTINUE;
IMIN = 100;
RMIN =1000;
for I=1 to N do
If I=J then Continue
RT=sqrt((XX(J)-XX(I))*(XX(J)-XX(I))+(YY(J)-YY(I))*(YY(J)-YY(I)));
if RT>RMIN then CONTINUE;
RMIN=RT;
IMIN=I;
Next;
NKL(I)=NKL(IMIN);
next

это избавление от изолированных точек
 
Это, по описанию, похоже на алгоритм k-means
http://www.kdnuggets.com/2015/05/top-10-data-mining-algorithms-explained.html
Может, кто-то и делал на VBA...
F1 творит чудеса
 
Максим Зеленский, да это метод к-средних. Но я в инете не нашла ничего полезного для себя. Мне надо код адаптировать под VBA. Я почитала про этот язык. Там столько всего... и массивы динамические, и опять же заполнять изначально массив координат нет нужды,  так ка это значения из таблицы Excel.  
 
Доброе время суток
Цитата
staylecolor написал: Mi=((сумма Хi )/Nx; (сумма Уi)/Ny)
тогда начальные центры кластеров будут совпадать ;)
Цитата
Это, по описанию, похоже на алгоритм k-means
Увы, не похоже. Главное в Кластеризация: метод k-средних начальное число кластеров задаётся изначально и не меняется. Их начальные координаты берутся либо случайно, либо задаются, а затем уточняются по точкам, которые являются ближайшими по расстоянию к этому центру.
В приведённом в первом посте описании - точки "отъёдаются" у одного кластера другим, который по расстоянию ближайший к нему
Цитата
опять найти все расстояния между центрами масс, определить наименьшее, объединить два соответствующих кластера в один.
При этом на случайном массиве получается ерунда. Фактически, один из кластеров "поедает" все остальные.
В примере в методе Кластеризация на операторе Stop можно посмотреть в Locals что находится в 7 оставшихся в "живых" кластерах". В силу это вывод результата делать не стал.
Либо преподаватель не всё уточнил в предлагаемом алгоритме, либо он приведён здесь кривовато.
 
Андрей VG, спасибо огромное! Я буду разбираться. Теперь есть с чем))) ОГРОМНОЕ СПАСИБО 100000000 РАЗ!
 
Доброе время суток
Вариант для k-means. Число кластеров задаётся пользователем от 3 до 8. Положение первого определяется как центр, остальные с равным шагом по кругу со случайным начальным положением начального угла. Построением на разных диаграммах видно один из недостатков k-mens зависимость отнесения точек к кластеру от начального положения кластеров.

P. S. Так и не нашёл, как убрать обводку вокруг точек на графике. :(
 
Вариант а-ля c-means
 
Андрей VG, ого!!! Спасибо огромное!
Цитата
Андрей VG написал:
Либо преподаватель не всё уточнил в предлагаемом алгоритме, либо он приведён здесь кривовато.
у меня задание такое - не совсем метод К-средних. Изначально, количество кластеров = количеству точек. Но мне все варианты пригодятся, чтобы разобраться.  
 
Цитата
staylecolor написал: у меня задание такое - не совсем метод К-средних
А как же
Цитата
staylecolor написал: Максим Зеленский, да это метод к-средних.
Где истина?
На заданных условиях в первом посте - задача не решаема. Должны быть ещё ограничения. Наиболее толковое описание c-means. Моя версия некоторая смесь k-mean с идеями c-mean (высчитывается не среднее положение центра по координатам ближайших точек, а средневзвешенное).
 
Цитата
Андрей VG написал: либо он приведён здесь кривовато.
Цитата
staylecolor написал: определить наименьшее, объединить два соответствующих кластера в один.
Так вот ты какой "олень северный"
 
А можно ли еще рядом с каждым значением выводить номер кластера?
 
Еще хотелось бы понять в связи с чем при заполнении своими данными макрос ругается на данную строчку
 
Цитата
Olezha28 написал:
А можно ли еще рядом с каждым значением выводить номер кластера?
Странный вопрос - вы разрешения спрашиваете? Конечно можно - код в полном распоряжении участников форума.
Цитата
Olezha28 написал:
ще хотелось бы понять в связи с чем при заполнении своими данными макрос ругается на данную строчку
Включите в Options, вкладка General, группа Error Trapping опцию Break in class module и проанализируйте, почему возникает переполнение.
 
Извините, но я не обладаю достаточным уровнем знаний чтобы справится с этой задачей, не силен в VBA и продебажить ошибку не входит
 
Цитата
Olezha28 написал:
не силен в VBA и продебажить ошибку не входит
Чтобы это значило Берримор? Куда не входит - в крынку?
Если вы об этих тестируемых данных, то у вас один из кластеров вырождается в одну точку - от этого и ошибка. Вам же в той теме писали - не делается кластерный анализ на 12 значениях - это бессмысленно.
Изменено: Андрей VG - 12.11.2018 09:23:06
Страницы: 1
Наверх