如何在 python/scikit-learn 中实现 k 最近邻的切线距离?

数据挖掘 Python scikit-学习 距离 k-nn 线性代数
2022-03-13 12:23:06

我的最终目标是拥有一个可以NearestNeighbor作为自定义metric参数输入 scikit-learn 类的函数。

现有软件包

我一直在研究现有的图书馆。

我发现的唯一东西是这个 KMeans 包,用于 python 2 并基于实现 C 库。我既不能加载它,ctypes也不能用gcc.

我还发现了这个其他 C 代码和这个Matlab 脚本,但结果相似。

执行

我还查看了几篇论文,看看我是否可以自己实现它。例如,基于,我了解我需要做的主要事情是计算切线矩阵。但是我不理解

  • 我如何定义尤其是s(p,α)
  • 我如何计算python中的导数。

我会很高兴得到任何帮助,评论,无论如何。

更新

正如建议的那样,我提出了以下相关问题/要求:

更新 2

@ComeOnGetMe 重写了他的代码,以便可以在 scikit-learn 规范(示例代码)中使用它。非常感谢!尽管如此,当我尝试在 scikit-learn 中使用它时,它表现不佳并且速度非常慢,因此还需要进一步的工作。

从那时起,我也找到了更详细的代码实现解释,尽管基于已经提到的 C 代码。

2个回答

如果有人在这里寻找答案,我会在原始问题下重复我的回复。

直接回答这个问题:

我真的不记得两年前我是如何使用这个代码的。但我通过两个步骤完成了它:

  1. 使用 构建共享库gcc -fPIC -shared st.c -o ts.so
  2. 将tangentDistance.py中的.so路径改为ts.so文件的绝对路径。

我刚刚更新了代码,这样你就可以在编译根目录下的.so文件后直接运行它。

对这个 repo 的一点评论:

显然,这个库设计得并不好,并且充满了太多的硬代码。如果你没有做与我做的完全相同的任务,你就不能真正使用它:在 MNIST 数据集上进行 k-means 聚类。如果您希望它更通用且更适合您的目的,请告诉我。

ComOnGetMe 的KMeans 切线距离度量看起来不错,如果它最初对您不起作用,您应该分叉它并处理代码。我会直接联系他,他可能会对你有所了解。Scikit-learn 没有用于切线距离的距离度量,但文档指出您可以调用用户定义的距离(所有这些都带有开销)。

如果您想联系 scikit-learn 的开发人员,那么贡献代码可能是一个不错的方向,并且有几位研究人员发表了将切线距离作为度量的论文,因此您也可以在那里碰运气。