optimization - 使用 RcppEnsmallen 发散的分位数回归
问题描述
我正在尝试RcppEnsmallen
估计分位数回归模型。我注意到结果似乎并不收敛。每次弹出不同的结果。我在我的代码中设置了它的一阶条件。我想这种分歧可能是由于目标函数在零处不可微。我不确定。
这里的代码
#include <RcppEnsmallen.h>
// [[Rcpp::depends(RcppEnsmallen)]]
class QuantileRegressionFunction
{
public:
// Construct the QuantileRegressFunction with the given data.
QuantileRegressionFunction(const arma::mat& X,
const arma::colvec& y,
const double tau
) : X(X),y(y),tau(tau){}
// Define the objective function.
double EvaluateWithGradient(const arma::mat& beta, arma::mat& gradient ){
const arma::mat fit = y - X * beta;
const arma::vec eval =0.5* arma::abs(fit) + (tau - 0.5 )*fit;
const arma::vec v= tau - arma::ones<arma::vec>(y.n_rows) % ( fit < 0 ) ;
gradient = - (X.t() * v)*(1/X.n_rows) ;
return arma::accu( (1/y.n_rows) *eval ) ;
}
private:
const arma::mat& X;
const arma::vec& y;
const double tau;
};
// [[Rcpp::export]]
arma::mat qr_reg(const arma::mat& X, const arma::vec& y,const double& tau){
QuantileRegressionFunction qrf(X,y,tau);
ens::L_BFGS lbfgs;
lbfgs.MaxIterations()= 1000 ;
//lbfgs.MaxLineSearchTrials() = 10000;
//lbfgs.ArmijoConstant() = 1e-18;
arma::mat beta(X.n_cols, 1 , arma::fill::randn);
lbfgs.Optimize(qrf,beta);
return beta;
}
这是一个简单的模拟练习:
n <- 1000
beta <- c(-2, 1.5, 3, 8.2, 6.6)
p <- length(beta)
X <- cbind(1, matrix(rnorm(n), ncol = p - 1))
y <- X %*% beta + rnorm(n / (p - 1))
qr_reg(X,y,0.1)
每次qr_reg(X,y,.1)
报告不同的估计。
解决方案
推荐阅读
- windows - 如何检查图像是否具有 Alpha 通道
- javascript - 谷歌图表从数组中添加行
- json - Xcode - 将字符串解析为可用的数据结构
- java - 如何从java文件中删除特定文本?
- python - Python:从 ACCESS db 读取图像后无法写入图像文件
- twitter-bootstrap - Bootstrap 4 - 通过 SASS 修改禁用按钮样式
- github-pages - 部署到 github 页面后的空白页面
- android - 如何在 Whatsapp 中共享 PDF 和文本
- slack - 导出松弛文件
- python - 如何在 tf_logging 中为日志添加时间戳前缀?