在Matlab中直接使用Python的sklearn库

6
请不要将此标记为如何从Matlab调用Python和sklearn?,因为我认为该问题并没有得到真正的回答。
自Matlab Release R2014b以来,我认为可以直接从Matlab中使用Python。简而言之,您只需要在Python调用前加上py
在我的设置中(在使用pyversion('PATH_TO_PYTHON')命令给Matlab提供Python路径后),这运行良好。我甚至可以使用dask多处理。非常酷。例如,执行py.dask.distributed.Client会产生以下结果:
  Python Client with properties:

              asynchronous: 0
                   cluster: [1×1 py.distributed.deploy.local.LocalCluster]
         get_futures_error: [1×1 py.method]
                coroutines: [1×1 py.list]
            scheduler_file: [1×1 py.NoneType]
                      loop: [1×1 py.tornado.platform.select.SelectIOLoop]
    recreate_error_locally: [1×1 py.method]
                  refcount: [1×1 py.collections.defaultdict]
                extensions: [1×1 py.dict]
                 scheduler: [1×1 py.distributed.core.rpc]
                       rpc: [1×1 py.distributed.core.ConnectionPool]
                   futures: [1×1 py.dict]
            scheduler_comm: [1×1 py.distributed.batched.BatchedSend]
                    status: [1×7 py.str]
           connection_args: [1×1 py.dict]
                        id: [1×43 py.str]
                generation: [1×1 py.int]
                   io_loop: [1×1 py.tornado.platform.select.SelectIOLoop]
                  security: [1×1 py.distributed.security.Security]

    <Client: scheduler='tcp://127.0.0.1:59795' processes=4 cores=4>

回到问题本身:我已经安装了sklearn并且可以从引用的Python安装中使用它。它的工作方式与dask相同。但是MATLAB R2017a无法找到sklearn。
类似于上述给出的py.sklearn.cluster.dbscan的调用结果为:

Undefined variable "py" or class "py.sklearn.cluster.dbscan".

有没有python专家能够解释一下?


1
无法复现。MATLAB R2017a 在这里与 sklearn 完美地配合使用。不需要额外的设置,只需正确设置 pyversion 即可。您是否百分之百确定在控制台和 MATLAB 中使用了相同的 Python 版本?您可以尝试创建一个新的虚拟环境,并在 MATLAB 中使用该环境中的 sklearn。 - hbaderts
@hbaderts:感谢您的测试。我使用Windows系统,电脑上只有一个Python版本。我确信正在运行/测试相同的Python版本(Anaconda 3 64位)。您使用的是哪种设置? - Bastian Ebeling
3个回答

6
我从MathWorks支持得到了一个解决方案。
这个解决方案的意思是,可能Python环境没有完全设置好。我被要求从Anaconda提示符中启动Matlab,因为那里有完整的环境设置。从那里运行Matlab可以得到想要的结果,因此可以使用例如sklearn等工具包。
进一步比较差异显示出,还需要将Python的更多目录添加到系统搜索路径中。
另外,我了解到,运行py.importlib.import_module(<MODULENAME>)将显示该Python模块及其依赖项是否可用。

2

在Mac上:

  • 打开新的终端窗口;

  • 输入:which python(查找默认版本的python安装位置);

  • 重新启动MATLAB;

  • 在命令行中输入:pyversion('/anaconda2/bin/python')(替换为您的路径)。
  • 现在,您可以运行默认python安装中的所有库。

例如:

>>py.sys.version;

>>py.sklearn.cluster.dbscan

1
您可以按照以下步骤创建一个 Conda 环境,并在 MATLAB 中使用它。请注意,如果您同时调试 Python 并对“some_awesome_python_module”进行更改,则每次都必须重新加载它(以下代码从clear classes开始是如何执行的)。
py_root_useFromMATLAB = fileparts(C:\anaconda_3\envs\useFromMATLAB\_conda.exe);
ENV = getenv('PATH');
ENV = strsplit(ENV, ';');
items_to_add_to_path = {
    fullfile(py_root_useFromMATLAB, 'Library', 'mingw-w64', 'bin')
    fullfile(py_root_useFromMATLAB, 'Library', 'usr', 'bin')
    fullfile(py_root_useFromMATLAB, 'Library', 'bin')
    fullfile(py_root_useFromMATLAB, 'Scripts')
    };
ENV = [items_to_add_to_path(:); ENV(:)];
ENV = unique(ENV, 'stable');
ENV = strjoin(ENV, ';');
setenv('PATH', ENV);
clear classes
module_to_load = 'some_awesome_python_module';
python_module_to_use = py.importlib.import_module(module_to_load);
py.importlib.reload(python_module_to_use);

现在你可以像这样使用它:
output = py.some_awesome_python_module.some_awesome_python_function(input)

更多细节请参见:https://www.mathworks.com/matlabcentral/answers/443558-matlab-crashes-when-using-conda-environment-other-than-base#answer_486374 - brethvoice
我对于有关MATLAB中conda的类似问题的答案:https://stackoverflow.com/a/63671567/12763497 - brethvoice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接