我在R中有一个计算,需要迭代地调用函数进行固定点收缩映射。我一直在使用Ravi Varadhan的squarem
包中的SQUAREM
函数。今天我试图找到解决我遇到squarem
问题的方法时,我遇到了TURBOEM
包裹,也是Varadhan。乍一看,TURBOEM
似乎与SQUAREM
做同样的事情,但在某些方面具有其他功能。
是否有人知道这些包中的一个或另一个是优选的,无论是一般情况还是特定应用程序?比另一个更新/更新吗? TURBOEM
似乎能够自定义收敛标准,这可能会让我脱离当前的绑定,但我担心可能还有其他问题。显然我可以从每个软件包中测试相应的功能,但如果有人知道这两个软件包的背景,那么可能会节省很多时间。
答案 0 :(得分:3)
每个包使用四种基础SQUAREM算法。它们实际上完全相同*。您可以使用以下方法查看自己的基础功能:
SQUAREM:::cyclem1
SQUAREM:::cyclem2
SQUAREM:::squarem1
SQUAREM:::squarem2
turboEM:::bodyCyclem1
turboEM:::bodyCyclem2
turboEM:::bodySquarem1
turboEM:::bodySquarem2
*除了由于在包装内使用它们的方式之外的一些差异。 method
中SQUAREM
中的参数version
在turboEM
中被称为turboEM
我想说turboEM
一般可能是首选,原因如下:
convtype = "parameter"
允许用户根据参数向量(convtype = "objfn"
)中的变化的L2范数,变量的L1范数来选择收敛标准。在目标函数(convfn.user
)中,或通过指定自定义函数(SQUAREM
)。 turboEM
仅使用参数向量中的变化的L2范数来检查收敛。stoptype = "maxiter"
还可以在收敛之前根据迭代次数(stoptype = "maxtime"
)或经过的时间量(SQUAREM
)停止算法。 pconstr
仅在指定的迭代次数后停止。project
的{{1}}和turboem
参数允许用户定义参数空间约束,以及在违反这些参数时将估计投影回参数空间的函数。 SQUAREM
没有此功能。turboEM
可以轻松地将多个版本的算法应用于相同的数据(例如,使用不同的顺序,步长,......),为method
参数提供一个向量,并list
1}}到control.method
参数...... foreach
包并行执行此操作。turboEM
还提供了一个方便的界面来应用vanilla EM算法,以及SQUAREM以外的EM加速方案:抛物线EM(method = "pem"
),动态ECME("decme"
)和准牛顿("qn"
)。turboEM
包还提供turboSim
功能,允许用户轻松进行基准研究,比较不同的加速方案。我可以看到使用turboEM
代替SQUAREM
的一个缺点是,如果您真的对SQUAREM算法的细节感兴趣,trace
由{squarem
提供1}}提供比turboem
提供的更具体的信息(残差,外推,步长)(目标函数[如果计算],迭代次数,参数变化的L2范数)。
最后一个:SQUAREM
on CRAN(v 2016.8-2)的当前版本确实比turboEM
on CRAN的版本更新(v 2014.8-1)。但是,NEWS表明自2010年12月以来SQUAREM
的唯一更新是小插曲和演示,而turboEM
的首次发布是在2011年12月。
答案 1 :(得分:2)
感谢您对SQUAREM和turboEM的关注。我是两个包的作者。将来,如有任何问题,您可以直接与我联系。
2个套餐的目标不同。 SQUAREM实现了一类加速方法。另一方面,turboEM包括各种最先进的EM加速技术。 turboEM的目标是为您的所有EM加速需求提供最佳选择!特别是,turboEM允许您针对您的问题对不同的算法进行基准测试,并确定最佳算法。根据我的经验,平方类算法最常用于执行其他3个类(准牛顿,动态EM和抛物线EM)。因此,您也可以直接使用SQUAREM包。但是,如Mark所指出的,turboEM还有许多其他功能。
Ravi Varadhan