3

我一直在尝试找到一种将 Java-ml 导入我的 python 项目的方法。我的 jar 文件与我的项目位于同一路径中。

我想将它用于 kmeans 聚类,因为它允许我更改距离度量。我想知道是否通过你们中的一个人建议的实现,我是否能够将不同的 java 类作为函数的参数传递?

我尝试使用:

import sys

sys.path.append(r"C:\Users\X\Desktop\X\javaml-0.1.7\javaml-0.1.7.jar")

import net.sf.javaml as jml

test = jml.clustering.Kmeans()

我考虑过使用 jython,但是我不确定它是如何工作的,并且不清楚我是否可以继续使用 idle 以及是否必须重新编程我的项目。

最后我考虑使用 PyJNIus,但它根本不起作用。

4

2 回答 2

3

简而言之,您不能在 CPython 解释器中本地运行 Java 代码。

首先,Python 只是语言规范的名称。如果您使用操作系统提供的 Python(或从 Python 官方网站下载),那么您使用的是 CPython。CPython 没有解释 Java 代码的能力。

但是,正如您所提到的,有一个用于 JVM 的 Python 实现,称为 Jython。Jython 是在 JVM 上运行的 Python 实现,因此可以与 Java 模块交互。但是,很少有人使用 Jython,因此您需要靠自己来确保一切正常运行。您不需要重新编写您的普通 Python 代码(因为 Jython 可以解释 Python 2.x),但并非所有库(例如 numpy)都将受支持。

最后,我认为您需要更好地理解 K-Means 算法,因为该算法是根据欧几里得距离隐式定义的。使用任何其他距离度量将不再被视为 K-Means,并且可能会影响算法的收敛性。请参阅此处了解更多信息。


同样,您不能在 CPython 解释器中本地运行 Java 代码。当然,有各种第三方库可以处理 Java 和 Python 之间的数据编组。但是,我坚持我的说法,对于这个特定的用例,您可能会更好地使用原生 Python 库(类似于Scikit-Learn中的 K-Medoid )。在我看来,尝试调用 Java 以及所有相关的开销对于这个问题来说太过分了。

于 2016-02-28T15:38:37.807 回答
1

要直接“回答”您的问题,如果您只想导入 Java 类,Jython 将是您的最佳选择。Jython 非常努力地尽可能与 Python 2.x 兼容并且做得很好。所以你不必花太多时间重写代码。只需简单地用 Jython 运行它,看看会发生什么,然后修改什么中断。

现在对于 Python 答案:D。您可能希望scikit用于本机实现。它肯定比在 Jython 中运行任何东西都要快。

更新

我认为该Py4J模块就是您正在寻找的。它通过在您的 Java 代码中运行服务器来工作,Python 代码将与 Java 服务器进行通信。“Py4J”唯一的好处是它为你提供了样板代码。您可以非常轻松地设置自己的客户端/服务器,而无需额外的模块。但是,与 Python 的原生模块相比,我仍然认为它不是一个更好的选择。

参考

如何使用 Jython 导入 Java 类

Scikit - K-Means

于 2016-02-28T15:46:10.623 回答