Scikit learn 通过sklearnpython包定义和使用球树列表

Scikit learn 通过sklearnpython包定义和使用球树列表,scikit-learn,cluster-analysis,Scikit Learn,Cluster Analysis,我定义了一个球树对象列表,如下所示,input1是一个带有形状(100320)的NumPy数组 我将input1的一个元素作为一个示例查询,其中sample\u index被假定在范围内 sample_query = input1[sample_index,:] # Find nearest neighbour and compute distance and index distance, index = bt[0].query(sample_query,1) 这里,distance[0]

我定义了一个球树对象列表,如下所示,
input1
是一个带有形状(100320)的NumPy数组

我将
input1
的一个元素作为一个示例查询,其中
sample\u index
被假定在范围内

sample_query = input1[sample_index,:]

# Find nearest neighbour and compute distance and index
distance, index = bt[0].query(sample_query,1)
这里,
distance[0]
是预期的0,因为“sample\u query”是
input1
的成员

# Adding another BallTree instance to the list
#input2 is a numpy array with shape (70,320)  
bt.append(BallTree(input2))
distance, index = bt[0].query(sample_query,1)
print distance[0]
# Output here is NOT zero (NOT expected!!)

当我向球树列表“bt”追加一个球树对象时,“sample_query”和bt[0]的最近邻距离为什么会改变?当我向列表bt追加一个对象时,我希望对象bt[0]不会被修改。我的期望是否正确?

在这两种情况下,您仍然在同一个ball tree实例上执行查询
bt[0]
,因此您会得到两次预期的相同结果。我不明白你为什么要把BallTree实例放在python列表中,顺便说一句。

我在这个例子中发现我对BallTree的理解有差距

经过一番挖掘,我现在明白了(借用问题中的符号)bt[0]。数据实际上指向输入numpy数组,而不是它的副本。我重新使用输入numpy数组来创建更多的球树,因此bt[0]看到的数据每次都会被破坏


如果我确保为每个ball树实例创建numpy数组(或在“C-speak”中分配),则ball树查询结果是一致的。

Hi Archith。请提供一个自包含的示例(即包括输入数组、导入等),最好是github gist?这真的不是预期的行为。嗨,安德烈亚斯。谢谢你的回复。通过这个例子,我发现我对BallTree的理解存在差距。经过一番挖掘,我现在明白了(借用问题中的符号)bt[0]。数据实际上指向输入numpy数组,而不是它的副本。我重新使用输入numpy数组来创建更多的球树,因此bt[0]看到的数据每次都会被破坏。如果我确保为每个ball树实例创建(或在“C-speak”中分配)numpy数组,则ball树查询结果是一致的。不管怎样,我知道我错在哪里了。我在给安德烈亚斯的答复中已经描述了这一点。我需要一种基于查询的某些特征访问索引球树的方法。也许有更好的方法来解决这个问题。事实上,这听起来像是一个API错误。我认为默认情况下,构造函数应该是
BallTree(data,copy=True)
,以便使BallTree在默认情况下保留其自己的独立数据副本,同时允许用户在没有足够内存并且知道在
copy=False
时不应更新数据时避免复制。请随时在github问题跟踪器上为scikit学习项目打开一个问题:
# Adding another BallTree instance to the list
#input2 is a numpy array with shape (70,320)  
bt.append(BallTree(input2))
distance, index = bt[0].query(sample_query,1)
print distance[0]
# Output here is NOT zero (NOT expected!!)