R语言用Hessian-free 、Nelder-Mead优化方法对数据进行参数估计

本文主要是介绍R语言用Hessian-free 、Nelder-Mead优化方法对数据进行参数估计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近我们被客户要求撰写关于优化方法的研究报告,包括一些图形和统计输出。

主要优化方法的快速概述

我们介绍主要的优化方法。我们考虑以下问题 .

无导数优化方法

Nelder-Mead方法是最著名的无导数方法之一,它只使用f的值来搜索最小值。过程:

  1. 设置初始点x1,...,xn+1
  2. 对点进行排序,使得f(x1)≤f(x2)≤⋯≤f(xn+1)。
  3. 计算xo作为x1,...,xn的中心点。
  4. 反射
    • 计算反射点xr=xo+α(xo-xn+1)。
    • 如果f(x1)≤f(xr)<f(xn),那么用xr替换xn+1,转到步骤2。
    • 否则转到第5步。
  5. 扩展:
    • 如果f(xr)<f(x1),那么计算扩展点xe=xo+γ(xo−xn+1).
    • 如果f(xe)<f(xr),那么用xe替换xn+1,转到步骤2。
    • 否则用xr替换xn+1,转到第2步。
    • 否则转到第6步。
  6. 收缩:
    • 计算收缩点xc=xo+β(xo-xn+1).
    • 如果f(xc)<f(xn+1),那么用xc替换xn+1,进入第2步。
    • 否则转到第7步.
  7. 减少:
    • 对于i=2,...,n+1,计算xi=x1+σ(xi-x1).

Nelder-Mead方法在optim中可用。默认情况下,在optim中,α=1,β=1/2,γ=2,σ=1/2。

Hessian-free 优化方法

对于光滑的非线性函数,一般采用以下方法:局部方法结合直线搜索工作的方案xk+1=xk+tkdk,其中局部方法将指定方向dk,直线搜索将指定步长tk∈R。

基准

为了简化优化方法的基准,我们创建一个函数,用于计算所有优化方法的理想估计方法。

benchfit <- function(data, distr, ...) 

β分布的数值说明

β分布的对数似然函数及其梯度

理论值

β分布的密度由以下公式给出

其中β表示β函数。我们记得β(a,b)=Γ(a)Γ(b)/Γ(a+b)。在这里,一组观测值(x1,...,xn)的对数似然性为

与a和b有关的梯度为

R实现

我们最小化了对数似然的相反:实现了梯度的相反。对数似然和它的梯度都不被输出。

function(par) 
loglikelihood(par, fix.arg ,...) 

 样本的随机生成 

#(1) beta分布
n <- 200
x <- rbeta(n, 3, 3/4)
lnl(c(3, 4), x) #检验
 
hist(x, prob=TRUE)

拟合Beta分布

定义控制参数。

list(REPORT=1, maxit=1000)

用默认的优化函数调用,对于不同的优化方法,有梯度和无梯度。

fit(x, "beta", "mle", lower=0,...)

 

在约束优化的情况下,我们通过使用对数障碍允许线性不平等约束。

使用形状参数δ1和δ2的exp/log变换,来确保形状参数严格为正。


#取起始值的对数
lapply(default(x, "beta"), log)
#为新的参数化重新定义梯度
exp <- function(par,...) beta(exp(par), obs) * exp(par)
fit(x, distr="beta2", method="mle") 

 

#返回到原始参数化
expopt <- exp(expopt)

然后,我们提取拟合参数的值、相应的对数似然值和要最小化的函数的计数及其梯度(无论是理论上的梯度还是数值上的近似值)。

数值调查的结果

结果显示在以下表格中。1)没有指定梯度的原始参数(-B代表有界版本),(2)具有(真实)梯度的原始参数(-B代表有界版本,-G代表梯度),(3)没有指定梯度的对数转换参数,(4)具有(真实)梯度的对数转换参数(-G代表梯度)。

 

 

 我们绘制了真实值(绿色)和拟合参数(红色)周围的对数似然曲面图。

llsurface(min.arg=c(0.1, 0.1), max.arg=c(7, 3), plot.arg=c("shape1", "shape2"), nlev=25,plot.np=50, data=x, distr="beta", back.col = FALSE)
points(unconstropt[1,"BFGS"], unconstropt[2,"BFGS"], pch="+", col="red")
points(3, 3/4, pch="x", col="green")
 

我们可以用bootdist函数来模拟bootstrap 复制的情况。

boot(fit(x, "beta", method="mle", optim.method="BFGS"))

plot(b1)
abline(v=3, h=3/4, col="red", lwd=1.5)

负二项分布的演示

负二项分布的对数似然函数及其梯度

理论值

负二项分布的p.m.f.由以下公式给出

其中Γ表示β函数。存在另一种表示方法,即μ=m(1-p)/p或等价于p=m/(m+μ)。因此,一组观测值(x1,...,xn)的对数似然性是

相对于m和p的梯度是

R实现

我们最小化对数似然性的相反:实现梯度的相反

m <- x[1]p <- x[2]c(sum(psigamma(obs+m)) - n*psigamma(m) + n*log(p),m*n/p - sum(obs)/(1-p))
 

样本的随机生成

#(1) β分布trueval <- c("size"=10, "prob"=3/4, "mu"=10/3)
x <- rnbinom(n, trueval["size"], trueval["prob"])hist(x, prob=TRUE, ylim=c(0, .3))

拟合负二项分布

定义控制参数并做基准。

list(trace=0, REPORT=1, maxit=1000)
fit(x, "nbinom", "mle", lower=0)

在约束优化的情况下,我们通过使用对数障碍允许线性不平等约束。

使用形状参数δ1和δ2的exp/log变换,来确保形状参数严格为正。

#对起始值进行变换
mu <- size / (size+mu)
arg <- list(size=log(start), prob=log(start/(1-start)))#为新的参数化重新定义梯度
function(x)c(exp(x[1]), plogis(x[2]))fit(x, distr="nbinom2", method="mle") 

#返回到原始参数化
expo <- apply(expo, 2, Trans)
 

然后,我们提取拟合参数的值、相应的对数似然值和要最小化的函数的计数及其梯度(无论是理论上的梯度还是数值上的近似值)。

数值调查的结果

结果显示在以下表格中。1)没有指定梯度的原始参数(-B代表有界版本),(2)具有(真实)梯度的原始参数(-B代表有界版本,-G代表梯度),(3)没有指定梯度的对数转换参数,(4)具有(真实)梯度的对数转换参数(-G代表梯度)。

 

 我们绘制了真实值(绿色)和拟合参数(红色)周围的对数似然曲面图。

surface(min.arg=c(5, 0.3), max.arg=c(15, 1), )
points(trueval , pch="x")
 

我们可以用bootdist函数来模拟bootstrap 复制的情况。

boot(fit(x, "nbinom", method="mle")

 

plot(b1)
abline(v=trueval)
 

结论

基于前面的两个例子,我们观察到所有的方法都收敛到了同一个点。

然而,不同方法的函数评价(和梯度评价)的结果是非常不同的。此外,指定对数似然性的真实梯度对拟合过程没有任何帮助,通常会减慢收敛速度。一般来说,最好的方法是标准BFGS方法或对参数进行指数变换的BFGS方法。由于指数函数是可微的,所以渐进特性仍被保留(通过Delta方法),但对于有限样本来说,这可能会产生一个小的偏差。


这篇关于R语言用Hessian-free 、Nelder-Mead优化方法对数据进行参数估计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/347719

相关文章

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

如何将Python彻底卸载的三种方法

《如何将Python彻底卸载的三种方法》通常我们在一些软件的使用上有碰壁,第一反应就是卸载重装,所以有小伙伴就问我Python怎么卸载才能彻底卸载干净,今天这篇文章,小编就来教大家如何彻底卸载Pyth... 目录软件卸载①方法:②方法:③方法:清理相关文件夹软件卸载①方法:首先,在安装python时,下

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1