Scipy“不支持屏蔽数组”错误

如何解决Scipy“不支持屏蔽数组”错误

我正在尝试使用 pykalman 和 scipy 优化器校准模型。由于某些原因,scipy 似乎认为我的输入是一个掩码数组,但事实并非如此。我添加了以下代码


    k =  0.00000000000001 #small sarting value
    T = np.array([1,2,3,4,5],dtype=int) #maturities
    delta = 1e-9
    x = k
    transition_covariance=delta / (1 - delta) * np.eye(1)
    
    
    def obj(x):
        k = x[0]
        Q = (1 - k) *np.eye(1)
        Z = np.exp(-k*T)
        Z =Z[:,None] #reshape to 2 dim
        transition_covariance=delta / (1 - delta) * np.eye(1)
    
        observation_covariance=0.001*np.eye(len(T))
    
        
        kf = KalmanFilter(transition_matrices=np.eye(1)*(1-k),observation_matrices= Z,transition_covariance=transition_covariance,observation_covariance=observation_covariance)
    
        lk =  kf.loglikelihood(X) # X is my observed data,1265 rows × 5 columns
        return -lk
    
    x = np.array([k])
    
    k =scipy.optimize.minimize(obj,x,method= 'TNC')

运行 scipy 优化器时出现错误

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-16-8d87c9f2ced0> in <module>
      1 # method that works: TNC,Nelder-Mead
----> 2 k =scipy.optimize.minimize(obj,method= 'TNC')

~\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun,x0,args,method,jac,hess,hessp,bounds,constraints,tol,callback,options)
    618                                 callback=callback,**options)
    619     elif meth == 'tnc':
--> 620         return _minimize_tnc(fun,callback=callback,621                              **options)
    622     elif meth == 'cobyla':

~\Anaconda3\lib\site-packages\scipy\optimize\tnc.py in _minimize_tnc(fun,eps,scale,offset,mesg_num,maxCGit,maxiter,eta,stepmx,accuracy,minfev,ftol,xtol,gtol,rescale,disp,finite_diff_rel_step,maxfun,**unkNown_options)
    373         messages = MSG_NONE
    374 
--> 375     sf = _prepare_scalar_function(fun,jac=jac,args=args,epsilon=eps,376                                   finite_diff_rel_step=finite_diff_rel_step,377                                   bounds=new_bounds)

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in _prepare_scalar_function(fun,epsilon,hess)
    259     # ScalarFunction caches. Reuse of fun(x) during grad
    260     # calculation reduces overall function evaluations.
--> 261     sf = ScalarFunction(fun,grad,262                         finite_diff_rel_step,epsilon=epsilon)
    263 

~\Anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in __init__(self,fun,finite_diff_bounds,epsilon)
     74 
     75         self._update_fun_impl = update_fun
---> 76         self._update_fun()
     77 
     78         # Gradient evaluation

~\Anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in _update_fun(self)
    164     def _update_fun(self):
    165         if not self.f_updated:
--> 166             self._update_fun_impl()
    167             self.f_updated = True
    168 

~\Anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in update_fun()
     71 
     72         def update_fun():
---> 73             self.f = fun_wrapped(self.x)
     74 
     75         self._update_fun_impl = update_fun

~\Anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py in fun_wrapped(x)
     68         def fun_wrapped(x):
     69             self.nfev += 1
---> 70             return fun(x,*args)
     71 
     72         def update_fun():

<ipython-input-13-48731c614f15> in obj(x)
     19                   observation_covariance=observation_covariance)
     20 
---> 21     lk =  kf.loglikelihood(X) # X is my observed data,1016 rows × 17 columns
     22     return -lk

~\Anaconda3\lib\site-packages\pykalman\standard.py in loglikelihood(self,X)
   1470 
   1471         # get likelihoods for each time step
-> 1472         loglikelihoods = _loglikelihoods(
   1473           observation_matrices,observation_offsets,observation_covariance,1474           predicted_state_means,predicted_state_covariances,Z

~\Anaconda3\lib\site-packages\pykalman\standard.py in _loglikelihoods(observation_matrices,predicted_state_means,observations)
    165                 + observation_covariance
    166             )
--> 167             loglikelihoods[t] = log_multivariate_normal_density(
    168                 observation[np.newaxis,:],169                 predicted_observation_mean[np.newaxis,~\Anaconda3\lib\site-packages\pykalman\utils.py in log_multivariate_normal_density(X,means,covars,min_covar)
     71                                       lower=True)
     72         cv_log_det = 2 * np.sum(np.log(np.diagonal(cv_chol)))
---> 73         cv_sol = solve_triangular(cv_chol,(X - mu).T,lower=True).T
     74         log_prob[:,c] = - .5 * (np.sum(cv_sol ** 2,axis=1) + \
     75                                      n_dim * np.log(2 * np.pi) + cv_log_det)

~\Anaconda3\lib\site-packages\scipy\linalg\basic.py in solve_triangular(a,b,trans,lower,unit_diagonal,overwrite_b,debug,check_finite)
    332 
    333     a1 = _asarray_validated(a,check_finite=check_finite)
--> 334     b1 = _asarray_validated(b,check_finite=check_finite)
    335     if len(a1.shape) != 2 or a1.shape[0] != a1.shape[1]:
    336         raise ValueError('expected square matrix')

~\Anaconda3\lib\site-packages\scipy\_lib\_util.py in _asarray_validated(a,check_finite,sparse_ok,objects_ok,mask_ok,as_inexact)
    259     if not mask_ok:
    260         if np.ma.isMaskedArray(a):
--> 261             raise ValueError('masked arrays are not supported')
    262     toarray = np.asarray_chkfinite if check_finite else np.asarray
    263     a = toarray(a)

ValueError: masked arrays are not supported

也许与 scipy 库中的更新有关?它使用不同的设置,所以这就是我能想到的。我的版本是: 蟒蛇 3.8.5 Scipy 1.5.2 皮卡尔曼 0.9.5

谢谢!

解决方法

我找到了解决方案,它涉及对pykalman库中的utils.py文件的一个小改动(第73行):

        try:
            cv_sol = solve_triangular(cv_chol,(X - mu).T,lower=True).T
        except ValueError:
            cv_sol = np.linalg.solve(cv_chol,(X - mu).T).T

来源: https://github.com/pykalman/pykalman/issues/83

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?