Доброго времени суток, умным людям! Дано: А(нижний предел) = 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 знакома, но в паскале программки писать приходилось, и даже немного получалось. Языки, как я поняла, родные. Но я даже не знаю с чего начать. Помогите, кто чем может. Важен любой совет. Посмотрите код мой в сообщениях ниже, может что и присоветуете)))
staylecolor написал: Генерируем Х и У функцией СЛУЧМЕЖДУ(А;В)
С таким же успехом можно генерировать и просто по регулярной сетке. Критерия выявления кластера на равномерном случайном распределении точек нет. Лучше уж скачайте и подготовьте исходный файл, например, координат населённых пунктов РФ - хоть что то можно будет говорить о кластерном анализе.
Способ генерации определен преподом. Критерий кластеризации (если можно так сказать) - расстояние между точками на диаграмме. Алгоритм у меня уже есть, я написала его в теме весь. Нужен код для макроса. А я даже не умею массивы в VBA объявлять, да и не вполне понимаю какие и сколько в данном случае мне нужны.
Андрей VG написал: Вот и сделайте на код на Pascal - на VBA переведём.
Скрытый текст
Код
Sub Кластеризация
Dim XX(1..100),
YY(1..100),
//столбцы таблицы с координатами точек
X(1..100),
Y(1..100),
//рабочие массивы содержащие координаты центров масс текущих кластеров
R(1..100,1..100),
//массив расстояний между центрами масс
NT(1..100,1..100),
//номера точек вошедших в кластеры
NKL(1..100),
//номер кластера для простановки в исходную таблицу
M(1..100);
//мощность кластера
Dim
N, I, J, IMIN, JMIN, NK, RMIN,
RT;
//не знаю как сослаться на
ячейку, вдобавок еще и на другой лист, так что:
N=100;
//цикл заполнения исходного
массива (как для Pascal):
For I=1 to N
XX(I)=REN(1,200);
YY(I)=REN(1,200);
X(I)=XX(I);
Y(I)=YY(I);
M(I)=1;
NT(I,1)=I;
NK=N;
NT(J)=I;
Next;
//Цикл кластеризации:
While NK>7
For I=1 to NK-1
For J=I+1 to NK
R(I,J)=sqrt((X(I)-X(J))*(X(I)-X(J))+(Y(I)-Y(J))*(Y(I)-Y(J)));
Next;
Next;
RMIN=R(1,2); IMIN=1; JMIN=2;
For I=1 to NK-1
For J=I+1 to NK
If R(I,J)>=RMIN
then CONTINUE;
RMIN=R(I,J);
IMIN=I;
JMIN=J;
Next;
Next;
X(IMIN)=(X(IMIN)+X(JMIN))/2;
Y(IMIN)=(Y(IMIN)+Y(JMIN))/2;
M(IMIN)=M(IMIN)+M(JMIN);
For J=1 to M(JMIN) do
NT(IMIN,M(IMIN)+J)=NT(JMIN,J);
Next;
If JMIN< NK-1 then
For I= JMIN to NK-2 do
X(I)=X(I+1);
Y(I)=Y(I+1);
M(I)=M(I+1);
For J=1 to N do
NK(I,J)=NT(I+1,J)
Next;
Next;
NK=NK-1;
Wend;
For I=1 to NK do
For J= 1 to M(I) do
NKL( NK(I,J))=I;
Next;
Next;
End Sub
Андрей VG, Пока только с условием, что NК> или =7, но там я додумаю. Получилось что-то между паскалем и VBA.
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
Максим Зеленский, да это метод к-средних. Но я в инете не нашла ничего полезного для себя. Мне надо код адаптировать под VBA. Я почитала про этот язык. Там столько всего... и массивы динамические, и опять же заполнять изначально массив координат нет нужды, так ка это значения из таблицы Excel.
Увы, не похоже. Главное в Кластеризация: метод k-средних начальное число кластеров задаётся изначально и не меняется. Их начальные координаты берутся либо случайно, либо задаются, а затем уточняются по точкам, которые являются ближайшими по расстоянию к этому центру. В приведённом в первом посте описании - точки "отъёдаются" у одного кластера другим, который по расстоянию ближайший к нему
Цитата
опять найти все расстояния между центрами масс, определить наименьшее, объединить два соответствующих кластера в один.
При этом на случайном массиве получается ерунда. Фактически, один из кластеров "поедает" все остальные. В примере в методе Кластеризация на операторе Stop можно посмотреть в Locals что находится в 7 оставшихся в "живых" кластерах". В силу это вывод результата делать не стал. Либо преподаватель не всё уточнил в предлагаемом алгоритме, либо он приведён здесь кривовато.
Доброе время суток Вариант для k-means. Число кластеров задаётся пользователем от 3 до 8. Положение первого определяется как центр, остальные с равным шагом по кругу со случайным начальным положением начального угла. Построением на разных диаграммах видно один из недостатков k-mens зависимость отнесения точек к кластеру от начального положения кластеров.
P. S. Так и не нашёл, как убрать обводку вокруг точек на графике.
Андрей VG написал: Либо преподаватель не всё уточнил в предлагаемом алгоритме, либо он приведён здесь кривовато.
у меня задание такое - не совсем метод К-средних. Изначально, количество кластеров = количеству точек. Но мне все варианты пригодятся, чтобы разобраться.
staylecolor написал: у меня задание такое - не совсем метод К-средних
А как же
Цитата
staylecolor написал: Максим Зеленский, да это метод к-средних.
Где истина? На заданных условиях в первом посте - задача не решаема. Должны быть ещё ограничения. Наиболее толковое описание c-means. Моя версия некоторая смесь k-mean с идеями c-mean (высчитывается не среднее положение центра по координатам ближайших точек, а средневзвешенное).
Olezha28 написал: не силен в VBA и продебажить ошибку не входит
Чтобы это значило Берримор? Куда не входит - в крынку? Если вы об этих тестируемых данных, то у вас один из кластеров вырождается в одну точку - от этого и ошибка. Вам же в той теме писали - не делается кластерный анализ на 12 значениях - это бессмысленно.