0

我正在使用 SciPy.Spatial 中的KDQuery函数。一旦我的数据量变得非常大,我就会遇到问题。我意识到该算法不一定设计为对大型数据集有效,但它似乎(从源头)大小应该只增加处理时间,而不是影响输出。

这是一个代码片段:

sizes = [ 10**i for i in range(5,6) ] #10^5 for this test
data = np.random.random_integers(0,100,(sizes[-1],2))
for size in sizes:
    kd = ps.common.KDTree(data)
    nnq = kd.query(data,k=2+1, p=2)
    info = nnq[1] #This is the indices of the neighbors
    neighbors = {}
    idset = np.arange(len(info)) #Indices of the input point
    for i, row in enumerate(info):
        row = row.tolist()
        row.remove(i)
        neighbors[idset[i]] = list(row)

当 i 不在列表中时,这将返回一个值错误(ValueError list.remove(x): x not in list)。对于小于 10^5 的数据大小,此代码按预期工作。

错误的一个潜在原因是已达到递归限制。为了探索这一点,我将递归深度设置为 1,000,000 ( sys.setrecursionlimit(1000000))。这并不能缓解问题。

4

1 回答 1

1

错误发生在您的代码中的语句中row.remove(i)。问题是你的随机数据集可能有重复的点,有时同一个点可以重复三遍以上。当数据集很大时,这很可能发生。发生这种情况时,一个点的三个最近邻居可能不包括该点本身。这会导致row.remove(i).

于 2013-03-19T16:43:51.500 回答