我正在尝试应用glasso一个由 60 多个特征和 30k 多个观察组成的非常简单且稀疏的数据集。如果您有兴趣重现该问题,您可以在此处以 csv 格式找到它。
我通过为正则化系数尝试不同的值来使用很少的代码行的sklearn 实现:
for alpha in [0.00000001, 0.0000001, 0.000001, 0.00001, 0.0001]:
glasso_model = GraphLasso(alpha=alpha, mode='lars', max_iter=2000)
glasso_model.fit(scaled_train)
我遇到的是该模型无法拟合协方差估计,因为它在引发异常抱怨问题的非 PSD 性质后停止:
/usr/local/lib/python3.4/dist-packages/sklearn/covariance/graph_lasso_.py in graph_lasso(emp_cov, alpha, cov_init, mode, tol, max_iter, verbose, return_costs, eps, return_n_iter)
245 e.args = (e.args[0]
246 + '. The system is too ill-conditioned for this solver',)
--> 247 raise e
248
249 if return_costs:
/usr/local/lib/python3.4/dist-packages/sklearn/covariance/graph_lasso_.py in graph_lasso(emp_cov, alpha, cov_init, mode, tol, max_iter, verbose, return_costs, eps, return_n_iter)
236 break
237 if not np.isfinite(cost) and i > 0:
--> 238 raise FloatingPointError('Non SPD result: the system is '
239 'too ill-conditioned for this solver')
240 else:
FloatingPointError: Non SPD result: the system is too ill-conditioned for this solver. The system is too ill-conditioned for this solver
如果我尝试用 sklearn 的另一个函数(顺便说一句,与该graph_lasso过程使用的函数相同)对协方差进行 mle,则该矩阵确实是 PSD。所以,我怀疑问题出在代码计算的某个地方。
现在我在应用该方法之前对数据进行规范化或标准化(零均值,1.0 var),但问题仍然存在。
有什么想法吗?我是否错过了应用玻璃的一些关键点。是否有可能用另一个工具包做一些有意义的事情?