我一直在尝试找到一种将Java-ml导入我的python项目的方法。我的 jar 文件与我的项目位于同一路径中。
我想将其用于 kmeans 聚类,因为它允许我更改距离指标。我想知道你们中的一个人是否能够通过你们中的一个人建议的实现,我是否能够传递一个不同的 java 类作为函数的参数?
我尝试使用:
import sys
sys.path.append(r"C:UsersXDesktopXjavaml-0.1.7javaml-0.1.7.jar")
import net.sf.javaml as jml
test = jml.clustering.Kmeans()
我考虑过使用 jython,但我不确定它是如何工作的,目前还不清楚我是否可以继续使用 idle 以及我是否必须重新编程我的项目。
最后,我考虑使用PyJNIus,但它根本不起作用。
简而言之,你不能在CPython解释器中原生运行Java代码。
首先,Python只是语言规范的名称。如果您使用的是操作系统提供的 Python(或从 Python 官方网站下载),那么您使用的是 CPython。CPython没有解释Java代码的能力。
但是,正如你提到的,JVM有一个Python的实现,叫做Jython。Jython是Python的实现,它在JVM上运行,因此可以与Java模块交互。但是,很少有人与Jython合作,因此您将对使一切正常工作有点独立。你不需要重写你的原版Python代码(因为Jython可以解释Python 2.x),但并非所有库(如numpy)都受支持。
最后,我认为您需要更好地理解 K-Means 算法,因为该算法是根据欧几里得距离隐式定义的。使用任何其他距离度量将不再被视为 K 均值,并且可能会影响算法的收敛性。有关更多信息,请参阅此处。
同样,您不能在CPython解释器中本地运行Java代码。当然,有各种第三方库可以处理Java和Python之间的数据编组。但是,我坚持我的说法,对于这个特定的用例,您可能最好使用本机Python库(类似于Scikit-Learn中的K-Medoid)。在我看来,尝试调用 Java 以及所有相关的开销对于这个问题来说是矫枉过正的。
为了直接"回答"您的问题,如果您只想导入Java类,Jython将是最好的选择。 Jython非常努力地与Python 2.x兼容,并且做得很好。 因此,您不必花费太多时间重写代码。 只需简单地使用 Jython 运行它,看看会发生什么,然后修改中断的内容。
现在对于Python的答案:D。您可能希望将scikit
用于本机实现。 它肯定会比在 Jython 中运行任何东西都快。
更新
我认为Py4J
模块就是您正在寻找的。 它的工作原理是在 Java 代码中运行服务器,Python 代码将与 Java 服务器通信。 "Py4J"的唯一好处是它为您提供了样板代码。 您可以非常轻松地设置自己的客户端/服务器,而无需额外的模块。 但是,与Python的本机模块相比,我仍然不认为这是一个更好的选择。
引用
如何导入带有Jython的Java类
Scikit - K-Means