#python #r #constraints #cluster-analysis
#python #r #ограничения #кластерный анализ
Вопрос:
Я разбиваю текст на фрагменты, пытаясь создать фрагменты «как можно более равной» длины, комбинируя текстовые группы (например, предложения с длиной символов). У меня предложения представляют собой последовательность (я работаю в r
, но мог бы в равной степени работать в pandas
или python
списках, данные исходные json
).
Итак, я ищу функцию, которая принимает упорядоченный набор чисел и группирует их (последовательно), чтобы минимизировать количество групп и расхождение размера группы с целью.
например, Возьмите [460, 100, 200, 200, 20]
и цель 500
, затем в качестве выходных данных произведите {1: [460], 2: [100, 200, 200, 20]}
Итак, учитывая цель 500, мы начинаем с первого элемента (460), затем знаем, что не следует включать второй элемент (100) в первую группу, потому что лучше быть на 40 меньше, чем на 60 больше. Итак, мы создаем вторую группу, которая начинается со 100, легко добавляя следующие два элемента (200, 200). Последний элемент увеличил бы вторую группу до 520, но все равно добавляется, потому что лучше быть на 20 больше, чем иметь короткую конечную группу (которая была бы на 480 меньше).
Я не могу решить, является ли это сокращением интервала ( cut_width
из ggplot2
не работает) или типом ограниченной агломеративной кластеризации?
В любом случае, я написал функцию, которая вроде как работает, проверяя наличие избыточного / несовершеннолетнего во время итерации, но мне пришлось использовать особый случай для последнего значения. Но на самом деле это кажется сложнее, потому что в конце может быть ряд небольших значений, которые следует добавить. Так, может быть, это рекурсивно? Может ли это быть достаточно сложным, чтобы требовался подход к программированию с линейными ограничениями? Или я упускаю что-то гораздо более простое 🙂
Кто-нибудь знает библиотеки и т.д., Которые реализуют что-то подобное?
Комментарии:
1. как бы вы сгруппировали
[460, 100, 200, 200, 20, 200, 30]
?2.
{1: [460], 2:[100, 200, 200], 3: [20, 200, 30] }
что дало бы групповые итоги[460], [500], [250]
с разницей в40, 0, 250
(или total diff290
) Хммм, или это было бы,{1: [460], 2:[100, 200, 200, 20], 3: [200, 30] }
что дало бы460, 520, 230
для различий в40, 20, 270
(total diff330
) Нет, это хуже. Таким образом, оптимизация означает проверку распределения различий, вероятно, предпочтительнее минимизировать std dev. Я думаю, пришло время для линейного решателя 🙂