Python sklearn BallTree更改传递给metric的数据
我正在将自定义度量函数与Python sklearn BallTree更改传递给metric的数据,python,scikit-learn,Python,Scikit Learn,我正在将自定义度量函数与sklearn.neights.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('Da
sklearn.neights.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.]
在将数据传递到度量之前,BallTree
做了什么预处理?有没有办法关掉这个?它甚至似乎在调用metric
之间更改了数据
(我的真实用例-我使用Levenstein距离作为度量并处理字符串。然而,由于我不能直接传入字符串,我将每个字符转换为预定义的标记并传入一个标记数组。由于数据被修改,我不再能够撤消编码以使字符串返回到度量函数中,这样我就可以正确计算了Levenstein距离。如果您在处理字符串而不是数字数据时有更好的解决方案来查找最近邻,我也很高兴听到这一点)。它没有
BallTree
对象未更改您的数据
获取数组
函数来获取内部数组,通过检查源代码,您会意识到边界是[7.5,9,3.5]
,它将对象与之进行比较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]]]))
bt.get_数组()
Out[x]:
(数组([[12,15,0.]),
[3,3,7.]]、数组([0,1])、数组([(0,2,1,1]),
数据类型=[('idx_start','如果你在处理字符串而不是数字数据时有更好的方法来寻找最近的邻居,我也很高兴听到这一点
你考虑过使用word2vec/Hatter吗?我正在处理的字符串是短的蛋白质序列。也存在蛋白质嵌入,但我现在感兴趣的是特别是基于序列本身的距离。(还有,不确定烦恼是什么)。我最后只是“四舍五入”将树节点转换为最近的字符串表示形式,这样我仍然可以使用Levenstein距离;仍然可以确定这种近似的效果。是的,我在发布这个问题后意识到,它要求的是点之间的距离,而不是数据中的距离;感谢您澄清它也需要到树节点的距离。
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]]]))