có một thuật toán đã biết + cấu trúc dữ liệu để duy trì một biểu đồ động không?Làm thế nào để giữ một biểu đồ động?
Hãy tưởng tượng tôi có luồng dữ liệu (x_1, w_1), (x_2, w_2), ... trong đó x_t tăng gấp đôi, đại diện cho một số biến được đo và w_t là trọng số liên quan.
tôi chỉ có thể làm (mã pseudo-python) rõ ràng:
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
Nhưng tôi có một số vấn đề với điều đó khi tôi có một dòng liên tục của dữ liệu. Tôi không có tập dữ liệu đầy đủ trong tay và tôi phải kiểm tra biểu đồ ở giữa thu thập dữ liệu. Và tôi không có kỳ vọng về:
- kích thước bin lý tưởng cho không kết thúc với rất nhiều thùng rỗng,
- phạm vi của dữ liệu
Vì vậy, tôi muốn xác định thùng tự động. Tôi có thể làm điều ngu ngốc:
for x in data_stream:
data.append(x)
hist = make_histogram(data)
nhưng tôi đoán đây sẽ được làm chậm rất nhanh chóng ...
Nếu tất cả các trọng nơi bằng một trong những điều tôi nghĩ đã được lưu trữ dữ liệu trong một mảng được sắp xếp và chèn dữ liệu mới theo cách giữ cho mảng được sắp xếp. Bằng cách này, tôi có thể có:
data = sortedarray();
for x in data_stream:
data.insert(x)
bins = [ data[int(i * data.size()/numbins)] for i in xrange(numbins)]
và số bên trong mỗi thùng sẽ bằng với dữ liệu.size()/numbins cho tất cả các thùng.
Tôi không thể nghĩ ra một cách để bao gồm trọng số trong này mặc dù ... có ai có đề xuất không? (kiến thức về thư viện C++ làm điều này cũng sẽ được hoan nghênh).
CHỈNH SỬA: (để được giải thích rõ)
X_t là số dấu phẩy động. Để tính toán biểu đồ, tôi phải chia phạm vi liên tục trong đó x thuộc về một số thùng. Vì vậy, tôi sẽ có một chuỗi số bin [0], bin [1], v.v ... vì vậy tôi phải xác định những gì tôi làm bin [i] < x < bin [i + 1].
Đây là cách bạn thường làm biểu đồ khi bạn có tất cả dữ liệu trước. Sau đó, bạn sẽ biết giới hạn tối đa (x) và min (x) và sẽ dễ dàng xác định các thùng đầy đủ. Bạn có thể có chúng khoảng cách bằng nhau giữa min (x) và max (x), ví dụ.
Nếu bạn không biết phạm vi trước, bạn không thể xác định các thùng. Bạn có thể nhận được một x mà không rơi vào bất kỳ thùng. Hoặc bạn có thể có nhiều thùng rỗng khiến bạn chọn một phạm vi quá lớn để tạo ra các thùng.
Bạn có thể làm rõ, nếu bạn chỉ quan tâm đến trọng số, tại sao bạn không chỉ đơn giản là làm 'dữ liệu [x] + = w'? Bạn quan tâm gì ngoài trọng lượng? – ninjagecko
x là một số dấu phẩy động ... cho một chuỗi số bin [0], bin [1], ... Tôi phải xác định xem tôi có bin [i]
@ninjagecko xem chỉnh sửa của tôi. –