Stan:一种统计学建模语言

Stan是一个用于统计建模和高性能计算的平台,支持MCMC采样、贝叶斯计算和优化方法。文章介绍了Stan模型的代码结构,包括functions、data、parameters等模块,以及Stan提供的优化算法,如牛顿法、BFGS和LBFGS。通过Prophet示例展示了Stan如何在时间序列预测中应用,并解释了如何将模型嵌入C++环境。Stan简化了统计模型的开发和部署过程,提供了一套强大的工具链。
摘要由CSDN通过智能技术生成

1.Stan简介

Stan 是一种用于统计建模和高性能统计计算的先进平台。Stan已经在社会、生物和物理科学、工程和商业领域被应用于统计建模、数据分析和预测。

  • 基于Stan概率编程语言开发统计模型
  • 进行MCMC采样
  • 基于变分推理的近似贝叶斯计算
  • 基于正则项的极大似然函数的优化方法

Stan提供Python和R语言安装包,Stan可以自动化实现统计学模型转化为C++代码的功能,以方便用户进行部署调用。本文主要讲述怎样使用Stan进行统计学模型参数估计,并嵌入C++开发平台。

2.Stan模型代码结构

下面是Stan语言模型构建程序骨架:

  • functions模块包含了用户自定义函数
  • data指明定义了模型的输入数据格式及其数据类型
  • transformed data模块允许用户定义常量或从data转换过来的数据
  • parameters模块声明模型的参数
  • transformed parameters模块允许定义变量来保存由data或parameters生成的中间数据
  • model模块定义了模型的对数密度函数
  • generated quantities 模块允许基于parameters,data, 及随机数生成用户需要的数据
functions {
  // ... function declarations and definitions ...
}
data {
  // ... declarations ...
}
transformed data {
   // ... declarations ... statements ...
}
parameters {
   // ... declarations ...
}
transformed parameters {
   // ... declarations ... statements ...
}
model {
   // ... declarations ... statements ...
}
generated quantities {
   // ... declarations ... statements ...
}

3.Stan优化算法

Stan提供优化算法来搜索使用Stan语言定义的密度函数模式,此模式可被用来进行参数估计,或用来做贝叶斯后验分析。Stan提供三种优化算法,分别为牛顿法和两种近似牛顿法(BFGS、LBFGS)。

在使用优化算法过程中,一个主要问题是收敛性的监测问题,在Stan优化算法可以使用多种参数进行监测。任意一个监测参数满足时则认为该函数已经收敛。可以通过将其相应的容差参数设置为零来禁止此种收敛监测。

  • 参数收敛监测,如果参数θi在第i次迭代过程中,其变化量小于tol_param时,则认为收敛,公式如下:

<

一个不错的治具管理系统 namespace MainDepartment { public class MainDepartmentDAL { private string Module_Desc = "Department Maintenance"; SecAuditTrail.SecAuditTrailDAL SecAuditTrailDAL = new SecAuditTrail.SecAuditTrailDAL(); SQLAPI.SQLAPI SQLAPI = new SQLAPI.SQLAPI(); #region Search public DataTable Search(object obj) { string s = ""; try { if (obj is MainDepartment && obj !=null) { MainDepartment obj2 = (MainDepartment)obj; s = " SELECT a.DepId,a.DepCd,a.DepDesc,a.Status,a.CreatedBy,a.CreatedDate,a.UpdatedDate,a.UpdatedBy,b.SiteCd +'-'+ b.SiteDesc as Site" + " FROM CR_Department a with (nolock)" + //" inner join CR_Site b with (nolock) on a.CreatedSite = b.SiteId" + " where a.DepDesc like '" + SqlObject.Encode(obj2.DepDesc) + "%'" + " and a.DepCd like '" + SqlObject.Encode(obj2.DepCd) + "%'" + " and a.Status like '" + SqlObject.Encode(obj2.Status) + "%'" + // " and a.CreatedSite in (" + obj2.CreatedSite + ")" + " order by a.DepCd "; return SQLAPI.ExecuteNonQueryReturnDataTable(SQLAPI.ENCRYPT_CONN_STRING(), s, null, CommandType.Text); } else { throw new Exception("MainDepartment Object not found!"); } } catch (Exception ex) { throw new Exception("MainDepartmentDAL.Search : " + ex.Message); } return SQLAPI.ExecuteNonQueryReturnDataTable(SQLAPI.ENCRYPT_CONN_STRING(), s, null, CommandType.Text); } #endregion #region add public void add(Object obj) { string s = ""; try { if (obj is MainDepartment && obj !=null) { MainDepartment obj2 = (MainDepartment)obj; s = "INSERT INTO CR_Department " + "(DepCd,DepDesc,Status,CreatedBy,CreatedDate,CreatedSite) " + "VALUES(" + "'" + SqlObject.Encode(obj2.DepCd) + "'," + "'" + SqlObject.Encode(obj2.DepDesc) + "'," + "'A'," + "'" + SqlObject.Encode(obj2.CreatedBy) + "'," + " Convert(datetime,getdate(),12) , " + "'" + obj2.CreatedSite + "'" + ")"; SQLAPI.ExecuteNonQuery(SQLAPI.ENCRYPT_CONN_STRING(), s,null, CommandType.Text); SecAuditTrailDAL.add(Module_Desc, new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name.ToString(), obj2.CreatedBy.ToString()); } else { throw new Exception("MainDepartment Object not found!"); } } catch (Exception ex) { throw new Exception("MainDepartmentDAL.add : " + ex.Message); } } #endregion #region delete public void delete(Object obj) { string s = ""; try { if (obj is MainDepartment && obj !=null) { MainDepartment obj2 = (MainDepartment)obj; s = "Delete from CR_Department where DepId = '" + obj2.DepId + "'"; SQLAPI.ExecuteNonQuery(SQLAPI.ENCRYPT_CONN_STRING(), s, null, CommandType.Text); SecAuditTrailDAL.add(Module_Desc, new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name.ToString(), obj2.UpdatedBy.ToString()); } else { throw new Exception("MainDepartment Object not found!"); } } catch (Exception ex) { throw new Exception("MainDepartmentDAL.delete : " + ex.Message); } } #endregion #region update public void update(Object obj) { string s = ""; try { if (obj is MainDepartment && obj !=null) { MainDepartment obj2 = (MainDepartment)obj; s = "UPDATE CR_Department SET " + " DepCd = '" + SqlObject.Encode(obj2.DepCd) + "', " + " DepDesc = '" + SqlObject.Encode(obj2.DepDesc) + "', " + " Status = '" + SqlObject.Encode(obj2.Status) + "', " + " UpdatedBy = '" + SqlObject.Encode(obj2.UpdatedBy) + "', " + " UpdatedDate = Convert(datetime,getdate(),12) " + " where DepId = '" + obj2.DepId + "'"; SQLAPI.ExecuteNonQuery(SQLAPI.ENCRYPT_CONN_STRING(), s, null, CommandType.Text); SecAuditTrailDAL.add(Module_Desc, new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name.ToString(), Convert.ToString(obj2.UpdatedBy)); } else { throw new Exception("MainDepartment Object not found!"); } } catch (Exception ex) { throw new Exception("MainDepartmentDAL.update : " + ex.Message); } } #endregion #region CheckDuplicate public string CheckDuplicate(object obj) { string s = ""; try { if (obj is MainDepartment && obj !=null) { MainDepartment obj2 = (MainDepartment)obj; s = " select (case when count(*)='0' then 'No' else 'Yes' end) FROM CR_Department with (nolock)" + " where DepCd = '" + SqlObject.Encode(obj2.DepCd) + "' and CreatedSite = '" + obj2.CreatedSite + "'"; return SQLAPI.ExecuteScalar(SQLAPI.ENCRYPT_CONN_STRING(), s, null, CommandType.Text); } else { throw new Exception("MainDepartment Object not found!"); } } catch (Exception ex) { throw new Exception("MainDepartmentDAL.CheckDuplicate : " + ex.Message); } } #endregion #region updateStatus public void updateStatus(Object obj) { string s = ""; try { if (obj is MainDepartment && obj !=null) { MainDepartment obj2 = (MainDepartment)obj; s = "UPDATE CR_Department SET " + " Status ='" + SqlObject.Encode(obj2.Status) + "', " + " UpdatedBy = '" + SqlObject.Encode(obj2.UpdatedBy) + "', " + " UpdatedDate = Convert(datetime,getdate(),12) " + " where DepId = '" + obj2.DepId + "'"; SQLAPI.ExecuteNonQuery(SQLAPI.ENCRYPT_CONN_STRING(), s, null, CommandType.Text); SecAuditTrailDAL.add(Module_Desc, new System.Diagnostics.StackTrace().GetFrame(0).GetMethod().Name.ToString(), obj2.UpdatedBy.ToString()); } else { throw new Exception("MainDepartment Object not found!"); } } catch (Exception ex) { throw new Exception("MainDepartmentDAL.updateStatus : " + ex.Message); } } #endregion #region DDL public DataTable DDL(object obj) { string s = ""; try { if (obj is MainDepartment && obj !=null) { MainDepartment obj2 = (MainDepartment)obj; s = " SELECT DepId,DepCd+'-'+DepDesc as CdDesc " + " FROM CR_Department with (nolock)" + " where Status='A'" + " and CreatedSite in (" + obj2.CreatedSite + ") order by DepCd asc "; return SQLAPI.ExecuteNonQueryReturnDataTable(SQLAPI.ENCRYPT_CONN_STRING(), s, null, CommandType.Text); } else { throw new Exception("MainDepartment Object not found!"); } } catch (Exception ex) { throw new Exception("MainDepartmentDAL.DDL : " + ex.Message); } } #endregion } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值