Поэтому я решил записать (теоретическое) решение, к которому пришел. Отчасти потому, что это могло бы помочь мне (подробнее об этом см. ниже), а отчасти потому, что для всех, кто интересуется, есть достойное решение. Это система линейных уравнений, которую можно решить с помощью симплексного алгоритма.
Ограничения, которые я придумал, следующие:
1) Каждый объект находится ровно в одном кластере
2) Каждый кластер имеет не более M (постоянных) объектов.
3) Измерение кластера истинно тогда и только тогда, когда хотя бы один из объектов в этом кластере имеет это измерение как истинное.
Я объясню, как теперь применяются ограничения:
Пусть имеется n объектов и k кластеров. Считаем сумму (в дальнейшем это одна строка)
x11 + x21 + x31< /sup> + ... + xn1 + d11 + d2< /sub>1 + d31 + ... + dn1 +
x12 + x22 + x32< /sup> + ... + xn2 + d12 + d2< /sub>2 + d32 + ... + dn2 +
...
x1k + x2k + x3k< /sup> + ... + xnk + d1k + d2< /sub>k + d3k + ... + dnk
куда
xac истинно, если и только если объект a является целым кластером c
dbc истинно, если и только если измерение b в кластере c истинно
Поскольку всегда лучше (или, по крайней мере, никогда не вредно) объединять объекты в кластеры, мы знаем, что число кластеров равно ceil(объекты, деленные на M). Для простоты я сейчас опущу переменные и напишу только коэффициенты.
1) Каждый объект находится ровно в одном кластере
10...0 0...0 10...0 0...0 10...0 0...0 ... 10...0 0...0 = 1
010...0 0...0 010...0 0...0 010...0 0...0 ... 010...0 0...0 = 1
...
0..01 0...0 0...01 0...0 0...01 0...0 ... 0...01 0...0 = 1
Это заставит каждый объект находиться ровно в одном кластере. Теоретически это может позволить объектам с частями (‹1) находиться в нескольких кластерах. Но поскольку мы ищем оптимальное решение, этого не произойдет.
2) Каждый кластер содержит не более M (постоянных) объектов.
11...1 0...0 0...0 0...0 0...0 0...0 ... 0...0 0...0 <= M
0...0 0...0 11...1 0...0 0...0 0...0 ... 0...0 0...0 <= M
...
0...0 0...0 0...0 0...0 0...0 0...0 ... 11...1 0...0 <= M
Сумма объектов не больше M. Это ограничение должно быть очевидным.
Теперь начинается сложная часть:
3) Измерение кластера истинно, если хотя бы для одного из объектов в этом кластере это измерение задано как истинное.
Для каждого измерения и каждого кластера учитывайте те элементы, у которых это измерение установлено в значение true (мы также могли бы рассмотреть и ложное, но это не имеет значения). Теперь напишем строку для каждого из них (и каждого кластера)
0..010...0 -10...0 0...0 0...0 ... 0...0 0...0 <= 0
где 1 означает, что это измерение для этого объекта (в этом кластере) имеет значение true, а -1 идентифицирует измерение (в данном случае первое). Если объект установлен в этом кластере, размерность для этого кластера должна быть 1 (1*1 -1*d ‹= 0), если он не установлен, размерность также может быть нулевой (0*1 - 1*d ‹ = 0).
Для второго измерения в первом кластере это будет выглядеть так:
0..010...0 0-10...0 0...0 0...0 ... 0...0 0...0 <= 0
и для последнего кластера и последнего измерения, подобного этому
0...0 0...0 0...0 0...0 ... 0..010..0 0...0-1 <= 0
Теперь мы можем просто минимизировать сумму xac, и все готово.
Вероятно, это можно было бы записать лучше, но я надеюсь, что это понятно.
Теперь проблема в следующем: я работаю с 70 кластерами, 3000 объектов и 2300 измерений. Используя описанный выше подход, это приводит к 371000 переменных (кластеры * объекты + кластеры * измерения) и 1292095 строк (оценка строк как объектов + кластер + измерения * журнал (объекты) * кластеры)
Я склонен полагать, что оптимальное решение неосуществимо. Даже если вы все еще можете оптимизировать описанный здесь подход, маловероятно, что аналогичный подход будет работать намного лучше. Так что теперь я ищу хорошие приближения, любые идеи, как решить эту проблему, приветствуются.
Спасибо :)
person
aZen
schedule
10.02.2013