Сегментация временных рядов - PullRequest
4 голосов
/ 17 марта 2012

У меня есть массивы временных рядов, в среднем около 1000 значений на массив.Мне нужно независимо идентифицировать сегменты временных рядов в каждом массиве.

Я не смог найти много информации о стандартах, как этого добиться.Подход, который я сейчас использую, заключается в том, чтобы вычислять среднее значение элементов массива и сегмента всякий раз, когда прошедшее время между каждым элементом превышает его.Я уверен, что есть более подходящие методы.

Это код, который я сейчас использую.

def time_cluster(input)
  input.sort!
  differences = (input.size-1).times.to_a.map {|i| input[i+1] - input[i] }
  mean = differences.mean

  clusters = []
  j = 0

  input.each_index do |i|
    j += 1 if i > 0 and differences[i-1] > mean
    (clusters[j] ||= []) << input[i]
  end

  return clusters
end

Пара примеров из этого кода

time_cluster([1, 2, 3, 4, 7, 9, 250, 254, 258, 270, 292, 340, 345, 349, 371, 375, 382, 405, 407, 409, 520, 527])

Выходы

1  2  3  4  7  9, sparsity 1.3
250  254  258  270  292,  sparsity 8.4
340  345  349  371  375  382  405  407  409, sparsity 7
520  527, sparsity 3

Другой массив

time_cluster([1, 2, 3, 4 , 5, 6, 7, 8, 9, 10, 1000, 1020, 1040, 1060, 1080, 1200])

Выходы

1  2  3  4  5  6  7  8  9  10, sparsity 0.9
1000  1020  1040  1060  1080, sparsity 16
1200

Ответы [ 2 ]

1 голос
/ 17 мая 2012

Используйте K-средства. http://ai4r.rubyforge.org/machineLearning.html

gem install ai4r

Разложение в единственном числе также может вас заинтересовать. http://www.igvita.com/2007/01/15/svd-recommendation-system-in-ruby/

Если вы не можете сделать это в Ruby, вот отличный пример на Python.

Неуправляемая кластеризация с неизвестным количеством кластеров

0 голосов
/ 17 марта 2012

Вы можете попробовать кластеризацию алгоритмы (например, k-means).

Некоторые ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...