Я думаю, вы могли бы получить хорошие результаты от динамической программы. Для каждого интервала [i, j)
пусть C(i, j)
будет функцией потерь, которая ниже, когда значения интервала, скорее всего, будут одним кластером. Тогда пусть L(k, r)
будет минимальной потерей для k
кластеров элементов [0, r)
, у нас есть уравнения
L(1, r) = C(0, r)
L(k, r), k > 1 = min over s in [0, r) of L(k-1, s) + C(s, r).
Если необходимы O(1)
значения k
, для оценки этих уравнений с запоминанием требуется O(n^2)
время и O(n)
пространство, где n
- количество выборок.
Правдоподобным первым выбором для C(i, j)
будет статистическая дисперсия выборок в этом интервале. Наивно, для этого требуется Theta(n^3)
время для вычисления для каждого интервала, но алгоритм Уэлфорда может использоваться для вычисления дисперсии в режиме онлайн, если вы итерируете s
от его наибольшего значения до его наименьшего значения, поэтому общий алгоритм все равно будет быть O(n^2)
.