существует ли известный алгоритм + структура данных для поддержания динамической гистограммы?
Представьте, что у меня есть поток данных (x_1, w_1), (x_2, w_2), ... где x_t находятсяудваивается, что представляет некоторую измеренную переменную, а w_t - связанный вес.
Я мог бы просто сделать очевидное (псевдопифонный код):
x0,xN = 0, 10
numbins = 100
hist = [(x0 + i * delta , 0) for i in xrange(numbins)]
def updateHistogram(x, w):
k = lookup(x, hist) #find the adequated bin where to put x
hist[k][1] += 1
Но у меня есть некоторые проблемы с этим, когда у меня непрерывный поток данных.У меня нет полного набора данных в руках, и я должен проверить гистограмму между сбором данных.И я не ожидаю:
- идеальных размеров ячеек, чтобы не заканчиваться большим количеством пустых ячеек,
- диапазон данных
Так что я бы хотел определить корзины динамически.Я мог бы сделать глупость:
for x in data_stream:
data.append(x)
hist = make_histogram(data)
но я думаю, что это очень медленно замедлится ...
Если все веса равны одной из вещей, которые я думал, хранит данныев отсортированном массиве и вставка новых данных таким образом, чтобы сохранить массив отсортированным.Таким образом, я мог бы получить:
data = sortedarray();
for x in data_stream:
data.insert(x)
bins = [ data[int(i * data.size()/numbins)] for i in xrange(numbins)]
, и число внутри каждого бина будет равно data.size () / numbins для всех бинов.
Я не могу придумать, как включить в это веса, хотя ... у кого-нибудь есть предложение?(знания о библиотеках c ++, которые делают это, также приветствуются).
EDIT: (для запрашиваемого пояснения)
x_t - числа с плавающей запятой.Чтобы вычислить гистограмму, я должен разделить непрерывный диапазон, в котором х находятся в нескольких ячейкахПоэтому у меня будет последовательность чисел bin [0], bin [1] и т. Д., Поэтому я должен определить, для чего я делаю bin [i]
Так вы обычно делаете гистограмму , когда у вас есть все данные заранее .Тогда вы будете знать пределы max (x) и min (x), и будет легко определить адекватные ячейки.Например, вы можете расположить их на одинаковом расстоянии между min (x) и max (x).
Если вы не знаете диапазон заранее, вы не можете определить ячейки.Вы можете получить х, который не попадает ни в одну корзину.Или вы можете создать много пустых корзин, потому что вы выбрали слишком большой диапазон для создания корзин.