Цитата: RazVal Смотри, ты считаешь за 5 секунд все пары, потом выбираешь одну с наибольшим значением, и обзываешь это дело первым кластером: заменяешь обе позиции на "1", и где-то запоминаешь, что в первый кластер входят эти две позиции. Дальше повторяешь расчёт, где эти позиции уже являются одной - "1". Соответственно, у тебя возможны две ситуации: либо две других позиции уже образуют кластер - его именуем по аналогии "2", и продолжаем расчёт; либо сильней всего какая-то позиция связана с кластером "1" - тогда ты эту позицию добавляешь в этот кластер - переименовываешь в "1" и "запоминаешь", что она туда входит. Если на каком-то из шагов, окажется, что сильнее всего связаны кластер "24" и кластер "96", то мы все позиции из них объединяем в новый кластер "514" - и далее рассматриваем как единый кластер, при этом в конце расчёта, если нам понадобится опуститься на уровень детализации тех кластеров, мы сможем посмотреть, какие позиции кластера "514" из кластера "24", а какие из "96" - либо будем рассматривать их как нечто единое, в любом случае - это уже делает человек смотря на итоговый результат. Заканчивать работу по кластеризации можно по достижению какого-то коэффициента связности - например, если максимальный коэффициент пары позиций или кластеров меньше 0,7, то заканчиваем расчёт.
Так, Валера, давай по порядку :)
- за 5 секунд делается анализ по отдельной позиции, а нам нужно провести тотальный анализ массива, это занимает по тестам Вадима часы. Я правильно думаю, что производиться должен анализ именно всего массива а не одной позиции? Все дальнейшие рассуждение построены на этой основе.
- сделав тотальный анализ массива на предмет совместных продаж мы получаем список пар товаров, продающихся вместе с заданными параметрами. Затем, мы заменяем в этом списке пары товара на номера кластеров. Каждая пара товаров - отдельный кластер, но если какая-то позиция из пары уже входит в другой кластер, то вторую позицию этой пары тоже включаем в этот кластер (если список будет изначально отсортирован в порядке убывания коэффициента совместности, то, думаю, ошибки в этом нет).
- запоминаем какие позиции в какие кластера входят (запоминаем в массив из трех полей: товар, уровень кластеризации, номер кластера) и после этого меняем в исходном массиве (изначальном массиве с номерами документов) наименование номенклатуры на номера полученных кластеров. Запускаем тотальный анализ массива повторно.
- получаем новый результат в виде списка пар товаров, продающихся вместе с заданными параметрами. Можно ли утверждать, что в этом списке будут все номера кластеров, полученные на предыдущем этапе (кажется, что это так, но есть сомнения)? Анализируем полученный список пар по строкам: 1ый цикл по всему списку: если с номером кластера встречается позиция номенклатуры, то мы включаем ее в этот кластер (при этом уровень кластеризации = 1), если в одной из следующих строк встречаем эту же позицию, но в паре с другим кластером, то игнорируем эту строку (вроде бы так...); 2ой цикл по всему списку: анализируем только те строки где встречаются разные кластеры и переименовываем эти кластеры в кластеры второго уровня (если один кластер из пары уже входит в другой кластер второго уровня, то второй кластер из пары включаем в этот же кластер второго уровня), и запоминаем это с уровнем кластеризации = 2.
- после этого меняем в исходном массиве (массиве с номерами документов, откорректированном на 1ом этапе) наименование номенклатуры на номера полученных кластеров и номера кластеров на номера кластеров высшего уровня. Вот тут вопрос: нужно ли делать исправления кластеров на кластера второго уровня, ведь мы включили в имеющиеся кластеры новые позиции и при повторном тотальном анализе массива к этим кластерам могут присоединиться новые позиции номенклатуры? При таком раскладе позиции будут прикрепляться к более большим кластерам верхнего уровня, что лишает нас информации о том, в какой кластер более низкого уровня входит данная позиция.
- так делаем до тех пор, пока выполняется заданный коэффициент совместности между кластерами. По идее в итого получим один кластер самого высокого уровня - весь наш ассортимент.
- в итоге, массив (в который мы запоминали какой товар соответствует какому кластеру, и какому кластеру более высокого уровня какие кластеры соответствуют более низкого уровня) можно представить в виде сводной таблицы, приблизительно такого вида:
Цитата: По времени, вроде, должно не так долго считаться - конечно всё зависит от заданного критического уровня, когда прервётся расчёт, и количества позиций, но оно во время расчёта будет всё время уменьшаться за счёт их объединения в кластера. Ещё можно попробовать ускорить расчёт за счёт того, что объединять в кластера быстрее - не по одной паре, а сразу все, удовлетворяющие условию "больше 0,7" - тогда ряд количества проверяемых связей будет сходится значительно быстрее и общее время расчёта ощутимо уменьшится...
По идее весь этот анализ в зависимости от количества уровней кластеризации будет проходить во сколько-то раз дольше обычного тотального анализа совместных продаж. Вот во сколько, пока не знаю =) Расскажи подробнее, что ты имел ввиду тут: "объединять в кластера быстрее - не по одной паре, а сразу все, удовлетворяющие условию"? Это соответствует моим рассуждениям выше?
Цитата: у тебя ядро расчёта уже реализовано, - по сути осталось только его запустить в определённой последовательности N раз... ;)
Вот как раз вопрос как это сделать и не слишком ли большое значение у N ;)
Вообще, идея сильная. Если это все реализовать, то ... круто, короче, это все )