我有一个数据集,以以下形式描述一些痕迹:
traceId1: event1 time1 event2 time2 ... eventN timeN
traceId2: event1 time1 event2 time2 ... eventM-1 timeM-1 eventM timeM
.
.
.
也就是说,该文件包含多个痕迹。每个跟踪由多个事件以及这些事件发生的时间组成。每条迹线的长度可能会有所不同。因此我无法将数据转换为矩阵。
我编写了一个 Point 类来将每个跟踪保存为一个对象。我还编写了一个自定义函数来计算每对迹线之间的距离。当我尝试使用我的指标构建 BallTree 时,它给出:
File "/home/yangzhao/anaconda3/lib/python3.5/site-packages/numpy/core/numeric.py", line 474, in asarray
return array(a, dtype, copy=False, order=order)
TypeError: float() argument must be a string or a number, not 'Point'
基于此post ,看来 BallTree 只接受可以转换为 float 的数据类型。由于这是2013年发布的,现在有解决办法吗?比如在类定义中写一个float方法?
PS:我可以自己用Python编写一个BallTree,但它没有经过优化,因此运行缓慢。并且系统限制了递归的最大深度,因此它无法在我的完整数据集上运行。我还在 C++ 中实现了 BallTree,在 Python 中调用该函数是个好主意吗?
最佳答案
球树仅适用于可以形成 2D float 组的数据。您可以在对象 in the source code 的初始化中看到这一点。我预计代码库不会更改为支持自定义对象数组。
无论如何,由于所使用的 Python 回调的限制,自定义距离度量的性能不会很高。如果您有其他适用于您的问题的 C++ 代码,则将其包装起来以便在 Python 中使用相对简单,例如使用cython .
关于numpy - BallTree现在支持不规则数据的自定义指标吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35937456/