代码之家  ›  专栏  ›  技术社区  ›  Nathan

sklearn BallTree更改传递给度量的数据

  •  1
  • Nathan  · 技术社区  · 8 年前

    我使用自定义度量函数 sklearn.neighbors.BallTree ,但我有问题,因为 BallTree 在将数据传递到我的度量函数之前更改数据。以下是一个示例:

    from sklearn.neighbors import BallTree
    import numpy as np
    
    np.random.seed(0)
    data = np.random.randint(0, 20, size=(2, 3))
    def metric(x, y):
        print('Data passed to metric')
        print(x)
        print(y)
        return 1
    
    print('Original data')
    print(data)
    BallTree(data, metric=metric)
    

    这让我

    Original data
    [[12 15  0]
     [ 3  3  7]]
    Data passed to metric
    [7.5 9.  3.5]
    [12. 15.  0.]
    Data passed to metric
    [7.5 9.  3.5]
    [3. 3. 7.]
    

    预处理的作用 鲍尔特里 在将数据传递给之前执行 metric ?有没有办法关掉这个?它甚至似乎改变了调用之间的数据 米制的 。。。

    (我的实际用例-我使用Levenstein距离作为度量并处理字符串。然而,由于我不能直接传入字符串,我将每个字符转换为预定义的标记并传入一个标记数组。由于数据被修改,我再也无法撤消编码以将字符串返回到度量函数中,从而可以正确计算Levenstein距离。如果y当处理字符串而不是数字数据时,你有一个更好的方法来寻找最近的邻居,我也很高兴听到这个)。

    1 回复  |  直到 8 年前
        1
  •  1
  •   adrin    8 年前

    事实并非如此。

    这个 BallTree 对象未更改您的数据。

    1. 它会创建数据的副本,因为:

    注意:如果X是一个C连续的双精度数组,那么数据将不会 已复制。否则,将制作内部副本。

    1. 它计算对象与树节点边界之间的距离。如下面所示,您可以使用 get_arrays 函数获取内部数组,通过检查源代码,您可以意识到边界是 [7.5, 9. , 3.5] ,这是它将对象与之进行比较的对象。

    Source :

    def get_arrays(self):
            return (self.data_arr, self.idx_array_arr,
                    self.node_data_arr, self.node_bounds_arr)
    

    和输出:

    bt.get_arrays()                                                                                                                                                                                           
    Out[x]:                                                                                                                                                                                                           
    (array([[12., 15.,  0.],                                                                                                                                                                                           
            [ 3.,  3.,  7.]]), array([0, 1]), array([(0, 2, 1, 1.)],                                                                                                                                                   
           dtype=[('idx_start', '<i8'), ('idx_end', '<i8'), ('is_leaf', '<i8'), ('radius', '<f8')]), array([[[7.5, 9. , 3.5]]])) 
    

    因此,您的度量将应用于数据和节点,而不仅仅是您自身的数据,并且节点与您的数据不同。您可以尝试单词嵌入,这将允许您计算距离,而无需对数据进行解码。不确定您想做什么,但基于树的模型可能不是您用例的最佳方式。

    推荐文章