【发布时间】:2017-04-30 15:26:30
【问题描述】:
理想情况下,我希望以下内容不会从硬盘读取数据太多次。数据很大,内存无法同时保存所有数据。
- 输入是来自硬盘的流
x[t]。数字流包含N元素。 -
x的直方图可能带有m分箱。 - n 个 bin 由 bin 边缘 e01, ..., m 定义。例如,如果 ei =i+1,则 x[0] 属于第 ith 个 bin .
- 找到使 bin 包含几乎相等数量的流中元素的 bin 边缘。理想情况下,每个 bin 中的元素数量应在
N/m的某个阈值百分比内。这是因为如果我们将N元素平均分布在 m 个 bin 中,每个 bin 应该包含大约N/m元素。
目前的解决方案:
import numpy as np
def test_data(size):
x = np.random.normal(0, 0.5, size // 2)
x = np.hstack([x, np.random.normal(4, 1, size // 2)])
return x
def bin_edge_as_index(n_bin, fine_hist, fine_n_bin, data_size):
cum_sum = np.cumsum(fine_hist)
bin_id = np.empty((n_bin + 1), dtype=int)
count_per_bin = data_size * 1.0 / n_bin
for i in range(1, n_bin):
bin_id[i] = np.argmax(cum_sum > count_per_bin * i)
bin_id[0] = 0
bin_id[n_bin] = fine_n_bin
return bin_id
def get_bin_count(bin_edge, data):
n_bin = bin_edge.shape[0] - 1
result = np.zeros((n_bin), dtype=int)
for i in range(n_bin):
cmp0 = (bin_edge[i] <= data)
cmp1 = (data < bin_edge[i + 1])
result[i] = np.sum(cmp0 & cmp1)
return result
# Test Setting
test_size = 10000
n_bin = 6
fine_n_bin = 2000 # use a big number and hope it works
# Test Data
x = test_data(test_size)
# Fine Histogram
fine_hist, fine_bin_edge = np.histogram(x, fine_n_bin)
# Index of the bins of the fine histogram that contains
# the required bin edges (e_1, e_2, ... e_n)
bin_id = bin_edge_as_index(
n_bin, fine_hist, fine_n_bin, test_size)
# Find the bin edges
bin_edge = fine_bin_edge[bin_id]
print("bin_edges:")
print(bin_edge)
# Check
bin_count = get_bin_count(bin_edge, x)
print("bin_counts:")
print(bin_count)
print("ideal count per bin:")
print(test_size * 1.0 / n_bin)
程序输出:
bin_edges:
[-1.86507282 -0.22751473 0.2085489 1.30798591 3.57180559 4.40218207
7.41287669]
bin_counts:
[1656 1675 1668 1663 1660 1677]
ideal count per bin:
1666.6666666666667
问题:
我无法指定阈值 s,并且预计 bin 计数与每个 bin 的理想计数最多相差 s%。
【问题讨论】:
-
你愿意接受多少差异?例如,所有的 bin 大小是否需要彼此相差 1,或 5,或 10,或 5%,还是什么?您不能简单地对数据进行排序吗?
-
我想我很快就会睡着了...如果您的意思是对所有数据进行排序,我无法对数据进行排序,因为我猜这意味着从硬盘读取数据多次。而且硬盘速度非常慢。大多数情况下,我不喜欢我不能指定阈值 s 并且知道 bin_counts 最多与每个 bin 的理想计数不同。我想这样做是因为这意味着我以后可以控制错误。这些 bin 边缘的误差会成倍增加。
-
this answer的三篇被引论文。
-
@Adrian Colomitchi:该链接非常有帮助。谢谢。
标签: python algorithm numpy stream numerical-methods