贝叶斯推断

贝叶斯推断是结合有关模型或模型参数的先验知识来分析统计模型的过程。这种推断的根基是贝叶斯定理:

例如,假设我们有正态观测值

其中 sigma 是已知的,theta 的先验分布为

在此公式中,mu 和 tau(有时也称为超参数)也是已知的。如果观察 X 的 n 个样本,我们可以获得 theta 的后验分布

下图显示 theta 的先验、似然和后验。

rng(0,'twister');

n = 20;

sigma = 50;

x = normrnd(10,sigma,n,1);

mu = 30;

tau = 20;

theta = linspace(-40, 100, 500);

y1 = normpdf(mean(x),theta,sigma/sqrt(n));

y2 = normpdf(theta,mu,tau);

postMean = tau^2*mean(x)/(tau^2+sigma^2/n) + sigma^2*mu/n/(tau^2+sigma^2/n);

postSD = sqrt(tau^2*sigma^2/n/(tau^2+sigma^2/n));

y3 = normpdf(theta, postMean,postSD);

plot(theta,y1,'-', theta,y2,'--', theta,y3,'-.')

legend('Likelihood','Prior','Posterior')

xlabel('\theta')

汽车试验数据

在一些简单的问题中,例如前面的正态均值推断示例,很容易计算出封闭形式的后验分布。但是,在涉及非共轭先验的一般问题中,后验分布很难或不可能通过分析来进行计算。我们将以逻辑回归作为示例。此示例包含一个试验,以帮助建模不同重量的汽车在里程测试中的未通过比例。数据包括被测汽车的重量、汽车数量以及失败次数等观测值。我们采用一组经过变换的重量,以减少回归参数估值的相关性。

% A set of car weights

weight = [2100 2300 2500 2700 2900 3100 3300 3500 3700 3900 4100 4300]';

weight = (weight-2800)/1000; % recenter and rescale

% The number of cars tested at each weight

total = [48 42 31 34 31 21 23 23 21 16 17 21]';

% The number of cars that have poor mpg performances at each weight

poor = [1 2 0 3 8 8 14 17 19 15 17 21]';

逻辑回归模型

逻辑回归(广义线性模型的一种特例)适合这些数据,因为响应变量呈二项分布。逻辑回归模型可以写作:

其中 X 是设计矩阵,b 是包含模型参数的向量。在 MATLAB® 中,我们可以将此方程写作:

logitp = @(b,x) exp(b(1)+b(2).*x)./(1+exp(b(1)+b(2).*x));

如果您有一些先验知识或者已经具备某些非信息性先验,则可以指定模型参数的先验概率分布。例如,在此示例中,我们使用正态先验值表示截距 b1 和斜率 b2,即

prior1 = @(b1) normpdf(b1,0,20); % prior for intercept

prior2 = @(b2) normpdf(b2,0,20); % prior for slope

根据贝叶斯定理,模型参数的联合后验分布与似然和先验的乘积成正比。

post = @(b) prod(binopdf(poor,total,logitp(b,weight))) ...% likelihood

* prior1(b(1)) * prior2(b(2)); % priors

请注意,此模型中后验的归一化常数很难进行分析。但是,即使不知道归一化常数,如果您知道模型参数的大致范围,也可以可视化后验分布。

b1 = linspace(-2.5, -1, 50);

b2 = linspace(3, 5.5, 50);

simpost = zeros(50,50);

for i = 1:length(b1)

for j = 1:length(b2)

simpost(i,j) = post([b1(i), b2(j)]);

end;

end;

mesh(b2,b1,simpost)

xlabel('Slope')

ylabel('Intercept')

zlabel('Posterior density')

view(-110,30)

此后验沿参数空间的对角线伸长,表明(在我们观察数据后)我们认为参数是相关的。这很有意思,因为在我们收集任何数据之前,我们假设它们是独立的。相关性来自我们的先验分布与似然函数的组合。

切片抽样

蒙特卡罗方法常用于在贝叶斯数据分析中汇总后验分布。其想法是,即使您不能通过分析的方式计算后验分布,也可以从分布中生成随机样本,并使用这些随机值来估计后验分布或推断的统计量,如后验均值、中位数、标准差等。切片抽样是一种算法,用于从具有任意密度函数的分布中进行抽样,已知项最多只有一个比例常数 - 而这正是从归一化常数未知的复杂后验分布中抽样所需要的。此算法不生成独立样本,而是生成马尔可夫序列,其平稳分布就是目标分布。因此,切片抽样器是一种马尔可夫链蒙特卡罗 (MCMC) 算法。但是,它与其他众所周知的 MCMC 算法不同,因为只需要指定缩放的后验,不需要建议分布或边缘分布。

此示例说明如何使用切片抽样器作为里程测试逻辑回归模型的贝叶斯分析的一部分,包括从模型参数的后验分布生成随机样本、分析抽样器的输出,以及对模型参数进行推断。第一步是生成随机样本。

initial = [1 1];

nsamples = 1000;

trace = slicesample(initial,nsamples,'pdf',post,'width',[20 2]);

抽样器输出分析

从切片抽样器获取随机样本后,很重要的一点是研究诸如收敛和混合之类的问题,以确定将样本视为是来自目标后验分布的一组随机实现是否合理。观察边缘轨迹图是检查输出的最简单方法。

subplot(2,1,1)

plot(trace(:,1))

ylabel('Intercept');

subplot(2,1,2)

plot(trace(:,2))

ylabel('Slope');

xlabel('Sample Number');

从这些图中可以明显看出,在处理过程趋于平稳之前,参数起始值的影响会维持一段时间(大约 50 个样本)才会消失。

检查收敛以使用移动窗口计算统计量(例如样本的均值、中位数或标准差)也很有帮助。这样可以产生比原始样本轨迹更平滑的图,并且更容易识别和理解任何非平稳性。

movavg = filter( (1/50)*ones(50,1), 1, trace);

subplot(2,1,1)

plot(movavg(:,1))

xlabel('Number of samples')

ylabel('Means of the intercept');

subplot(2,1,2)

plot(movavg(:,2))

xlabel('Number of samples')

ylabel('Means of the slope');

由于这些是基于包含 50 次迭代的窗口计算的移动平均值,因此前 50 个值无法与图中的其他值进行比较。然而,每个图的其他值似乎证实参数后验均值在 100 次左右迭代后收敛至平稳分布。同样显而易见的是,这两个参数彼此相关,与之前的后验密度图一致。

由于磨合期代表目标分布中不能合理视为随机实现的样本,因此不建议使用切片抽样器一开始输出的前 50 个左右的值。您可以简单地删除这些输出行,但也可以指定一个“预热”期。在已知合适的预热长度(可能来自先前的运行)时,这种方式很简便。

trace = slicesample(initial,nsamples,'pdf',post, ...

'width',[20 2],'burnin',50);

subplot(2,1,1)

plot(trace(:,1))

ylabel('Intercept');

subplot(2,1,2)

plot(trace(:,2))

ylabel('Slope');

这些跟踪图没有显示出任何不平稳,表明预热期已完成。

但是,还需要了解跟踪图的另一方面。虽然截距的轨迹看起来像高频噪声,但斜率的轨迹好像具有低频分量,表明相邻迭代的值之间存在自相关。虽然也可以从这个自相关样本计算均值,但我们通常会通过删除样本中的冗余数据这一简便的操作来降低存储要求。如果它同时消除了自相关,我们还可以将这些数据视为独立值样本。例如,您可以通过只保留第 10 个、第 20 个、第 30 个等值来稀释样本。

trace = slicesample(initial,nsamples,'pdf',post,'width',[20 2], ...

'burnin',50,'thin',10);

要检查这种稀释的效果,可以根据轨迹估计样本自相关函数,并使用它们来检查样本是否快速混合。

F = fft(detrend(trace,'constant'));

F = F .* conj(F);

ACF = ifft(F);

ACF = ACF(1:21,:); % Retain lags up to 20.

ACF = real([ACF(1:21,1) ./ ACF(1,1) ...

ACF(1:21,2) ./ ACF(1,2)]); % Normalize.

bounds = sqrt(1/nsamples) * [2 ; -2]; % 95% CI for iid normal

labs = {'Sample ACF for intercept','Sample ACF for slope' };

for i = 1:2

subplot(2,1,i)

lineHandles = stem(0:20, ACF(:,i) , 'filled' , 'r-o');

lineHandles.MarkerSize = 4;

grid('on')

xlabel('Lag')

ylabel(labs{i})

hold on

plot([0.5 0.5 ; 20 20] , [bounds([1 1]) bounds([2 2])] , '-b');

plot([0 20] , [0 0] , '-k');

hold off

a = axis;

axis([a(1:3) 1]);

end

第一个滞后的自相关值对于截距参数很明显,对于斜率参数更是如此。我们可以使用更大的稀释参数重复抽样,以进一步降低相关性。但为了完成本示例的目的,我们将继续使用当前样本。

推断模型参数

与预期相符,样本直方图模拟了后验密度图。

subplot(1,1,1)

hist3(trace,[25,25]);

xlabel('Intercept')

ylabel('Slope')

zlabel('Posterior density')

view(-110,30)

您可以使用直方图或核平滑密度估计值来总结后验样本的边缘分布属性。

subplot(2,1,1)

hist(trace(:,1))

xlabel('Intercept');

subplot(2,1,2)

ksdensity(trace(:,2))

xlabel('Slope');

您还可以计算描述性统计量,例如随机样本的后验均值或百分位数。为了确定样本大小是否足以实现所需的精度,将所需的轨迹统计量作为样本数的函数来进行监视会很有帮助。

csum = cumsum(trace);

subplot(2,1,1)

plot(csum(:,1)'./(1:nsamples))

xlabel('Number of samples')

ylabel('Means of the intercept');

subplot(2,1,2)

plot(csum(:,2)'./(1:nsamples))

xlabel('Number of samples')

ylabel('Means of the slope');

在这种情况下,样本大小 1000 似乎足以为后验均值估计值提供良好的精度。

bHat = mean(trace)

bHat =

-1.6931 4.2569

总结

Statistics and Machine Learning Toolbox™ 提供了多种函数,让您能够轻松地指定似然和先验。您也可以将它们结合起来用于推断后验分布。使用 slicesample 函数,您可以通过马尔可夫链蒙特卡罗模拟在 MATLAB 中执行贝叶斯分析。甚至在使用标准随机数生成函数难以抽样的后验分布问题中也可以使用此函数。

贝叶斯回归 matlab,逻辑回归模型的贝叶斯分析相关推荐

  1. 朴素贝叶斯算法和逻辑回归算法的区别?

    朴素贝叶斯算法和逻辑回归算法的区别? 1.两种算法的模型不同: Naive Bayes是一个生成模型,在计算P(y|x)之前,先要从训练数据中计算P(x|y)和P(y)的概率,从而利用贝叶斯公式计算P ...

  2. ML之NBLoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    ML之NB&LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结果 ...

  3. ML之NBLoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    ML之NB&LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结果 ...

  4. NLP之TEA之NB/LoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    NLP之TEA之NB/LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结 ...

  5. NLP之TEA之NB/LoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    NLP之TEA之NB/LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结 ...

  6. matlab 逻辑回归实现,逻辑回归原理介绍及Matlab实现

    一.逻辑回归基本概念 1. 什么是逻辑回归 逻辑回归就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏. Log ...

  7. MATLAB逻辑回归实例及代码

    MATLAB逻辑回归实例及代码 逻辑回归基本流程: 注:回归系数W更新公式写错了,应该是减号,错写成加号了. 训练数据(包含训练样本及对应的标签)百度云链接:https://pan.baidu.com ...

  8. 贝叶斯方法与Ridge回归的联系

    贝叶斯方法与Ridge回归有什么联系?废话少说,我们直接来看. 为了方便说明问题,考虑一维的自变量,将一系列自变量排成向量的形式: x = ( x 1 , ⋯ , x N ) T \mathbf{x} ...

  9. 从朴素贝叶斯的角度推导logistic模型

    从朴素贝叶斯的角度推导logistic模型 文章结构预览 1.朴素贝叶斯算法的理解 2.logistic模型简介 3.从朴素贝叶斯的角度解释为什么logistic模型的sigmoid函数可以表示概率 ...

  10. 简单粗暴理解与实现机器学习之逻辑回归:逻辑回归介绍、应用场景、原理、损失以及优化...

    作者 | 汪雯琦 责编 | Carol 来源 | CSDN 博客 出品 | AI科技大本营(ID:rgznai100) 学习目标 知道逻辑回归的损失函数 知道逻辑回归的优化方法 知道sigmoid函数 ...

最新文章

  1. php框架使用统计_2015 年最好的 PHP 框架调查统计
  2. java8学习:用流收集数据
  3. labelimg颜色
  4. 二进制在计算机电路中得到广泛的应用,电子技术与单片机的发展应用2喜欢就下吧(全文完整版)...
  5. ksql 数量大于2_别人1加1大于2大于3,雍禾植发1加1小于2……
  6. Android之动画
  7. 嵌入式软件工程师2021面试指南【转】
  8. WordPress插件-WBOLT热门关键词推荐插件v1.3.0 Pro绿色版
  9. Spring Security MVC登录注销示例教程
  10. 经典Python面试题之Python基础篇
  11. 本机与服务器、镜像机之间文件互传
  12. 从鲁班造木鸢到智能控制,图解世界无人机发展简史
  13. 严重漏洞可导致 Juniper 设备遭劫持或破坏
  14. 华为电脑c盘哪些文件可以删除,c盘可以删除哪些文件
  15. GNOME 3.32.1 维护版本更新发布
  16. Mysql启动报错:本地计算机上的mysql服务启动停止后,某些服务在未由其他服务或程序使用时将自动停止
  17. 全网最全sql入门经典
  18. 软件质量与测试的新纪元
  19. 解决局域网文件传输慢的问题
  20. 家庭局域网的组建(2台或2台以上)

热门文章

  1. Touch 电容式触摸按键 触摸按键PCB设计参考
  2. Python 操作pdf文件-合并操作 (三)
  3. 手绘风格的原型图制作工具
  4. CAD软件绘图如何提高效率 (下)
  5. vs 安装qtaddin_VS2015安装Qt5的Add-in的问题与解决方案【记录贴】
  6. 智能算法——蚁群算法
  7. RF 无法连接到服务器,这可能由于连接的服务不存在,TCP 错误代码 10061
  8. 掌握到胃-奈氏图与伯德图的绘制
  9. CSS案例2:用定位是实现三级导航
  10. 数据分析法、数据分析方法论总结