【问题标题】:Using MATLAB regression from Python在 Python 中使用 MATLAB 回归
【发布时间】:2020-09-10 10:44:44
【问题描述】:

我想从 Python 调用 MATLAB 逻辑回归。似乎 Python 无法处理 MATLAB 返回的对象。我的代码和错误如下:

代码:

from __future__ import division
import matlab.engine
xVals = [[1,2,1],[1,3,1],[2,2,1]]
xVals = matlab.double(xVals)
yVals = matlab.double([1,0])
eng = matlab.engine.start_matlab()
[Mdl,FitInfo] = eng.fitclinear(eng.spconvert(xVals),eng.categorical(yVals), 'learner', 'logistic''PostFitBias',true, nargout=2)

错误:

[Mdl,FitInfo] = eng.fitclinear(eng.spconvert(xVals),eng.categorical(yVals), 'learner', 'logistic''PostFitBias',true, nargout=2)
  File "/Library/Python/2.7/site-packages/matlab/engine/matlabengine.py", line 71, in __call__
    _stderr, feval=True).result()
  File "/Library/Python/2.7/site-packages/matlab/engine/futureresult.py", line 67, in result
    return self.__future.result(timeout)
  File "/Library/Python/2.7/site-packages/matlab/engine/fevalfuture.py", line 82, in result
    self._result = pythonengine.getFEvalResult(self._future,self._nargout, None, out=self._out, err=self._err)
TypeError: unsupported data type returned from MATLAB

【问题讨论】:

    标签: python matlab regression


    【解决方案1】:

    Python 不喜欢 matlab 创建的类。

    我可以这样运行你的 fit 函数,将结果留在 MATLAB 工作区中:

    eng.workspace['xVals']=xVals
    eng.workspace['yVals'] = yVals
    eng.eval("[Mdl, FitInfo]=fitclinear(spconvert(xVals),categorical(yVals), 'learner', 'logistic','PostFitBias',true)",nargout=0)
    

    从那里开始,这是一个将这两个变量从 MATLAB 中取出并输入到 Python 中的练习。 FitInfo 转换没有问题:

    eng.eval('FitInfo')
    
    
    {'Lambda': 0.5,
     'Objective': 0.6375789538304049,
     'IterationLimit': 1000.0,
     'NumIterations': 8.0,
     'GradientNorm': 1.014275386457264e-07,
     'GradientTolerance': 1e-06,
     'RelativeChangeInBeta': 5.3806464923025154e-05,
     'BetaTolerance': 0.0001,
     'DeltaGradient': matlab.double([]),
     'DeltaGradientTolerance': matlab.double([]),
     'TerminationCode': 1.0,
     'TerminationStatus': ['Tolerance on coefficients satisfied.'],
     'History': matlab.double([]),
     'FitTime': 0.02450061,
     'Solver': ['bfgs']}
    

    但是当尝试对Mdl 执行相同操作时,会得到TypeError:unsupported data type returned from MATLAB

    但是,您仍然可以将 Mdl 中的部件一个接一个地移动到您的 python 环境中。例如,

    Beta = eng.eval('Mdl.Beta')
    

    或者,您可以通过将其转换为 json(文本),然后在 Python 中对其进行解码,从而一次性获取所有内容。当然,在文本和数字之间来回切换时,您应该小心谨慎。

    import json
    Mdl = json.loads(eng.eval('jsonencode(Mdl)'))
    

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 2013-08-08
      • 2012-03-17
      • 2011-10-11
      • 2019-07-11
      • 2016-10-21
      • 1970-01-01
      • 2014-05-27
      • 2014-03-06
      相关资源
      最近更新 更多