是否有已知的算法+數據結構來維護動態直方圖?假設我有一個數據流(x_1,w_1),(x_2,w_2)...,其中x_t是雙精度的,表示一些測量變量,w_t是關聯的權重。如何保持動態直方圖?
我可以做明顯的(僞Python代碼):
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)]
並且每個bin內的計數將等於所有bin的data.size()/ numbins。
我想不出一種包括權重在內的方法,但是......有沒有人有建議? (關於這樣做的C++庫的知識也會受到歡迎)。
編輯:(爲澄清問)
的X_T是浮點數。要計算直方圖,我必須將連續範圍除以x所屬的多個分箱。所以我會有一系列的數字bin [0],bin [1]等等...所以我必須確定我的bin [i] < x < bin [i + 1]。
當您事先獲得所有數據時,通常會這樣做直方圖。然後你會知道極限max(x)和min(x),並且很容易確定足夠的分箱。例如,您可以讓它們在min(x)和max(x)之間等距分佈。
如果您事先不知道範圍,則無法確定垃圾箱。你可能會收到一個不屬於任何垃圾箱的x。或者你可以有許多空箱子,因爲你選擇了太大的範圍來創建箱子。
請您澄清一下,如果您只關心權重,爲什麼不簡單地執行'data [x] + = w'?除了重量,你還關心什麼? – ninjagecko
x是一個浮點數......對於數字序列bin [0],bin [1],...我必須確定bin [i]
@ninjagecko請參閱我的編輯。 –