MCMC代码-2021年12月11日

代码运行不出来的主要问题是什么?是我的基本知识没弄明白还是代码的基础知识没搞清楚?好像两者都有。那就一个一个解决吧。

首先是基本知识。
广义矩估计方法构造的拟似然函数是怎么构造出来的?
真似然是什么?
似然函数是关于模型中参数的函数,数值上等于给定参数后变量的概率
在这里插入图片描述
统计学中的另一常见概念"置信区间":
(confidence interval)中的置信度(confidence level) 或者称为置信系数 (confidence coefficient) 也不是概率。换句话说,"构建关于总体均值的95%的置信区间"里的"95%"不是概率意义下的0.95(即使它也是0到1之间的代表机会chance的一个度量)

从定义上,似然函数和密度函数是完全不同的两个数学对象:前者是关于参数的函数,后者是关于样本的函数。所以这里的等号只是函数值相等,而不是两个函数本身是同一函数,概率(密度)表达给定参数下样本随机向量X=x的可能性,而似然表达了给定样本X=x下参数为真实值的可能性。
贝叶斯理论下,待估参数也会被看作是随机变量。

1、用简单的密度函数看结果

2、师姐用核密度估计是干什么的

由于示性函数的存在可能使得在构造拟似然不光滑存在误解的情形,为此本文进一步利用核密度估计的思想对其进行光滑处理
利用高斯核函数离散型连续化。

3、可以用核密度估计得到密度函数,再借助贝叶斯方法和贝叶斯广义矩估计方法作比较吗?

思考:
估计未知分布的均值和估计未知分布的方差的区别?
从中可以发掘估计未知分布的方差和估计未知分布的基尼系数有什么区别?

  1. 首先,估计均值的话就不需要借助解决缺失数据的方法啦

理解伪似然为什么可以代替真似然?

以方差为例
从矩估计出发,若已知总体服从某一分布,方差未知。
就可以用样本方差来估计总体方差,但是估计的结果是有偏的,那我们就希望可以用多于一个的样本矩来估计总体方差。但是增加矩条件可能无解,怎么合理的运用矩条件才能让估计的效果达到最好呢?
假设现在有q个矩条件,放入一个向量中,对其取期望得到总体矩条件,构造的总体矩条件为0。
再根据样本得到q个样本矩条件。
正常的思路是:令总体矩条件等于样本矩条件等于0,但是此处有q个样本矩条件,给定一个未知参数值,使得q个样本矩条件同时为0几乎不可能。故借助最小二乘法的思想,令q个样本矩条件的平方和最小。又每个矩条件不同,可靠程度不同,故赋予不同的矩条件以不同的权重(有一个最优矩阵),我们期望通过最小化二次目标函数得到参数的最好估计值。但是最小化的过程又很复杂,故构造拟似然,YIN的论文证实了BGMM可以很好地代替B-likelihood,BGMM可以重复恢复似然函数中的信息。最后给定参数先验,得到后验,继而进行统计推断。
每一个拟似然不同的地方在矩条件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您提供一个简单的 MATLAB 示例代码来实现 MCMC-Gibbs 算法进行贝叶斯推断。在这个示例中,我们将使用一个简单的线性回归模型来进行推断。 首先,让我们定义模型和参数。假设我们有一个输入变量 x 和一个输出变量 y,它们之间的关系可以通过线性回归模型来建模: ```matlab % 模型参数 true_slope = 2; true_intercept = 1; true_sigma = 0.5; % 数据生成 N = 100; % 数据点的数量 x = rand(N, 1); % 随机生成 x 值 y = true_slope * x + true_intercept + true_sigma * randn(N, 1); % 生成 y 值,加入高斯噪声 ``` 接下来,我们将定义模型的先验分布和参数的后验分布。在这个示例中,我们假设斜率、截距和噪声的标准差都是未知的,并且它们都服从正态分布的先验分布。 ```matlab % 先验分布的超参数 prior_mean_slope = 0; prior_precision_slope = 0.01; prior_mean_intercept = 0; prior_precision_intercept = 0.01; prior_mean_sigma = 0; prior_precision_sigma = 0.01; % 参数的后验分布 posterior_samples = struct('slope', [], 'intercept', [], 'sigma', []); % MCMC-Gibbs算法 num_iterations = 1000; % 迭代次数 % 初始化参数 current_slope = 0; current_intercept = 0; current_sigma = 0; for iter = 1:num_iterations % 采样斜率 precision_slope = prior_precision_slope + N / (true_sigma^2); mean_slope = (prior_precision_slope * prior_mean_slope + sum(x .* (y - current_intercept - current_slope * x))) / precision_slope; current_slope = normrnd(mean_slope, sqrt(1 / precision_slope)); % 采样截距 precision_intercept = prior_precision_intercept + N / (true_sigma^2); mean_intercept = (prior_precision_intercept * prior_mean_intercept + sum(y - current_slope * x)) / precision_intercept; current_intercept = normrnd(mean_intercept, sqrt(1 / precision_intercept)); % 采样噪声的标准差 precision_sigma = prior_precision_sigma + N; mean_sigma = (prior_precision_sigma * prior_mean_sigma + sum((y - current_slope * x - current_intercept).^2)) / precision_sigma; current_sigma = sqrt(1 / gamrnd(precision_sigma / 2, 2 / mean_sigma)); % 将参数添加到后验分布样本中 posterior_samples.slope = [posterior_samples.slope, current_slope]; posterior_samples.intercept = [posterior_samples.intercept, current_intercept]; posterior_samples.sigma = [posterior_samples.sigma, current_sigma]; end ``` 以上代码使用了 Gibbs 采样算法来对参数进行推断。在每次迭代中,我们分别从斜率、截距和噪声的后验分布中采样一个新的值。通过多次迭代,我们可以得到这些参数的后验分布样本。 请注意,这只是一个简单的示例代码,仅用于演示 MCMC-Gibbs 算法的基本原理。在实际应用中,您可能需要对参数的先验分布进行更合理的设定,并根据具体情况调整算法的迭代次数等参数。此外,还可以使用更复杂的模型和数据集进行推断。 希望这个示例对您有所帮助!如有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值