罗兰对MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰对MATLAB的艺术已存档,不会更新。

贝叶斯脑筋急转弯

波士顿的冬天会很冷。当雪下得很大的时候,铲完雪后我们需要休息一下,在室内玩拼图游戏是很好的消遣方式。今天的客座博主Toshi Takeuchi给你一个有趣的脑筋急转弯,写于2015年波士顿的一次暴风雪中。

内容

内特·西尔弗和贝叶斯推理

信号和噪音,著名数据科学家内特·西尔弗(Nate Silver)讨论了做出预测的不稳定之处。这本书的关键信息是,我们应该采用贝叶斯的思维方式——以概率的方式处理不确定性,并在收集更多证据时灵活地改变我们先前的信念。

它到底是如何工作的?让我们用一个有趣的脑筋急转弯来解决一个例子。

蒙蒂霍尔问题-模拟

蒙蒂·霍尔问题是基于一个游戏节目,“让我们做个交易”,主持人蒙蒂·霍尔让你从三扇门中选择,他告诉你其中一扇门后面有一辆车,如果你选对了门,你就可以留下它。如果你选错了门,你会看到一只山羊,而你什么也得不到。在你做出选择之后,蒙蒂打开了你没有选择的两扇门中的一扇,里面有一只山羊。然后他问,你是想坚持原来的选择,还是把你的选择换成另一扇没有打开的门。在这一点上,选项已经减少到两个门,其中只有一个有车,所以这似乎是一个50/50的命题。

让我们通过运行模拟来测试这种直觉。我们将多次尝试这个游戏。

试验数= 1000;

首先,Monty从1、2或3中随机选择一扇门来隐藏汽车。

Car_door = randi(3,trials,1);

你猜一猜,挑一扇你认为能藏车的门。

select = randi(3,trials,1);

让我们预习一下前五次试验。

= table(car_door,choice);disp (T (1:5)):
车门选择________ ______ 3 2 2 2 1 3 3 1 2 2 2

这时,蒙蒂打开了其中一扇未选的门,看到了一只山羊。如果车门和选择的车门不一样,Monty只有一个选择。

1 + 2 = 3 -> 3 1 + 3 = 4 -> 2 2 + 3 = 5 ->

否则他可以随机选择其中一个未打开的门打开。

1 + 1 = 2 -> 2或3 2 + 2 = 4 -> 1或3 3 + 3 = 6 -> 1或2

这个解决方案不是那么优雅,但它就是这样。

Goat_door = 0 (trials,1);Goat_door (car_door + choice == 3) = 3;Goat_door (car_door + choice = 4 & car_door ~= choice) = 2;Goat_door (car_door + choice == 5) = 1;Goat_door (Goat_door == 0 & choice == 1) = randsample([2,3],1);Goat_door (Goat_door == 0 & choice == 2) = randsample([1,3],1);Goat_door (Goat_door == 0 & choice == 3) = randsample([1,2],1);

让我们用山羊门来更新预览。

T = table(car_door,choice,goat_door);disp (T (1:5)):
car_door选择goat_door  ________ ______ _________ 3 2 1 3 2 1 1 3 2 3 1 2 2 2 3

在这一点上,你可以坚持你原来的选择或转换。我的直觉是,这将是一个50/50的命题。如果你选择留下来,这是模拟的胜率。

仿真= 0 (3,1);Simulation (1) = sum((car_door - choice) == 0)/trials*100;流(“坚持原来选择的胜率:%.2f%%\n”模拟(1))
如果坚持原来的选择,胜率:33.70%

正如你所看到的,坚持你最初的选择给你的胜率比我预期的要低得多。让我们看看如果你调换会发生什么。

Switch_choice = 0 (trials,1);Switch_choice (goat_door + choice == 3) = 3;Switch_choice (goat_door + choice == 4) = 2;Switch_choice (goat_door + choice == 5) = 1;

让我们用开关更新预览并计算胜率。

= table(car_door,choice,goat_door,switch_choice);disp(T(1:5,:)) simulation(3) = sum((car_door - switch_choice) == 0)/trials*100;流(“如果切换你的选择,胜率:%.2f%%\n”模拟(3))
car_door choice goat_door switch_choice ________ ______ _________ _____________ 3 2 1 3 3 2 1 1 3 3 1 1 2 2 2 2 1胜率如果切换你的选择:66.30%

为什么切换更好——贝叶斯分析

与直觉相反的是,模拟结果表明,改变你的选择实际上更好。现在让我们转到贝叶斯推理用贝叶斯法则找出原因。

$$P(H|E) = \frac{P(E|H)\cdot P(H)}{P(E)}$$

在这个分析中,我们假设:

  • 你一开始选了1号门。这是你的假设,H
  • 蒙蒂打开2号门,里面是一只山羊。这是你的证据E

$ $ $ $ P (H)

汽车随机隐藏在三扇门的后面,你选择了1号门。门1是车门的概率是1/3。这是之前,或P (H)

先验= ones(3,1)*1/3
先验= 0.33333 0.33333 0.33333

$ $ P $ $ (E | H)

现在Monty必须选择2号门或3号门作为山羊门,他选择了2号门。是时候考虑证据给定假设的条件概率了可能性,或P (E | H)

你注意到蒙蒂打开了2号门。他的选择不是随机的——他实际上知道车门,他需要避开它。他的选择意味着什么?

  1. 如果车在门1后面,那么Monty可以选择门2或门3。所以他选门2的概率是1/2。
  2. 如果车在2号门后面,那么蒙蒂就不可能选择它。所以概率是0。感到困惑吗?我将在下面重新讨论这个案例。
  3. 如果车在3号门后面,那么蒙蒂必须选择2号门。所以他选门2的概率是1。

我们回到情形2。我们已经知道Monty打开了2号门,那我们为什么还要讨论他打开的概率呢?我知道,概率应该是1因为他真的打开了,对吧?在这种情况下,概率取决于所考虑的假设为真。所以在每种情况下,你都需要根据这个假设算出Monty能做什么。所以我们知道门2不是车门,但是我们仍然想知道如果门2是车门,Monty可能会做什么。

似然= [1/2;0;1]
似然= 0.5 0 1

| $ $ P (E H) \ cdot P (H) $ $

现在我们准备利用这个方程,根据新的证据来更新假设的概率。我们来计算先验和似然的联合概率,方程的分子。

Joint_prob = likelihood .* prior
Joint_prob = 0.16667 0 0.33333

$ $ $ $ P (E)

联合概率不是真概率因为它们的和不等于1。为了在证据之后得到假设的最新概率我们只需要把它们归一化,首先把所有的联合概率加起来得到总数,然后用它来除以每个联合概率。这个总数叫做正常化常数,所有假设下证据的概率,P (E)

| $ $ P (H E) $ $

后,P (H | E),应该非常接近模拟结果。

post = joint_prob/sum(joint_prob);比较=表(后验,模拟,“RowNames”, {“呆”“N / A”“开关”});disp(比较(3 [1],:))
后验模拟_________ __________停留0.33333 33.7切换0.66667 66.3

内特·西尔弗的方法

在他的书中,内特·西尔弗用了一个不同的公式来计算后验,但实际上是一样的。让我们用书中的例子……

“假设你和伴侣住在一起,出差回家后发现衣柜抽屉里有一条奇怪的内衣。你可能会问自己:你的伴侣出轨的概率有多大?”

  • x先验,你的配偶在你发现内裤之前出轨的概率,他认为是4%吗
  • y你看到内裤是因为你的配偶出轨的条件概率是50%吗
  • z条件概率或者你看到内裤的可能性即使你的配偶没有出轨,5%
  • 你的配偶出轨的概率只有29%,所以不要过早下结论!
X = 0.04;Y = 0.5;Z = 0.05;后验= x*y/(x*y + z*(1-x))
后验= 0.29412

然而,我们使用的方法计算了两种假设的后验值——作弊和不作弊。

Prior = [x;1 - x];似然= [y;z];Joint_prob = likelihood .* prior;后验= joint_prob ./ sum(joint_prob)
后验= 0.29412 0.70588

机器学习中的贝叶斯

贝叶斯定理用于强大的机器学习算法。一个相当直接和有用的例子是朴素贝叶斯分类。它通常用于文本分类任务,如垃圾邮件过滤或情感分析。

让我们使用一个简单的情感分析示例来快速浏览一下。我们想要根据所包含的单词推断出一段陈述的情绪,无论是积极的还是消极的。朴素贝叶斯分类器是可用的fitcnb在MATLAB R2014b中的统计工具箱中的函数。

让我们加载训练示例。

training_examples = {{“我”“爱”“这”“食物”“非常”“多”};{“,”“左”“一个”“坏”“味道”};{“的”“电影”“是”“无聊”};{“我”“有”“一个”“非常”‘好’“时间”};{“她”“已经”“这样”“一个”“不错”“甜”“狗”};{“的”“结束”“是”“非常”“伤心”}};

这些例子被预先标记为积极或消极。

Sentiment_class = {“积极”“负面”“负面”“积极”“积极”“负面”};

下面是我们将用来测试分类器的未标记示例。

Test_example = {“她”“是”“一个”“非常”“甜”“女孩”};

将训练数据转换为数字矩阵。这是一个使用单词频率作为预测因子的词袋模型。

token = unique([training_examples {:}]);X = 0 (length(training_examples),length(tokens));i = 1:length(training_examples) X(i,:) = ismember(tokens, training_examples {i});结束

训练一个具有多项分布的朴素贝叶斯模型,这是我们拥有的词袋示例的最佳选择。即使我们知道单词有语法关系,而且它们不是完全独立的,我们也会做一个简化的假设,即我们的特征是独立的,这样我们就可以应用贝叶斯定理——因此天真的。尽管如此,它还是很好用。

Mdl = fitcnb(X,sentiment_class,“分布”“锰”“PredictorNames”、令牌);

现在用测试示例检查训练好的模型。

(标签、帖子~)=预测(Mdl、双(ismember (Mdl.PredictorNames test_example)));流(测试示例:“%s”\nSentiment: %s\nPosterior: %.2f\n”strjoin (test_example' '{1}),标签,post (strcmp (Mdl.ClassNames、标签)))
测试例子:“she was a very sweet girl”情绪:正后验:0.62

在这个简单的例子中,经过训练的模型能够正确地对其进行分类。

让我们检查训练模型中的细节Mdl看看贝叶斯定理是如何在内部应用的。

这是先验,每个类的先验都是1/2因为我们有3个正例子和3个负例子。请注意,这些数字是按正负顺序排列的。

disp(表(Mdl.Prior (1) Mdl.Prior (2),“VariableNames”, Mdl.ClassNames))
负正________ ________ 0.5 0.5

积极和消极陈述的实际频率是多少?我不知道。通常,我们不知道先验,在这种情况下,我们只是对每个假设应用相同的概率。这被称为均匀先验。

这是单词“好”和“坏”出现的概率。你会发现“坏”的负面意义是“好”的两倍,而“好”的正面意义是“坏”的两倍。

disp(表(cell2mat (Mdl.DistributionParameters (:, ismember (Mdl.PredictorNames,‘好’))),cell2mat (Mdl.DistributionParameters (:, ismember (Mdl.PredictorNames“坏”))),“VariableNames”, {‘好’“坏”},“RowNames”, Mdl.ClassNames))
好坏________ ________负0.025 0.05正0.044444 0.022222

由于我们只对负分类和正分类之间的相对分数感兴趣,我们可以忽略归一化常数,它是方程的分母,对两个类别都是一样的。因此,你所需要的只是标记的先验概率和条件概率,以计算两个假设之间的相对后验得分——正或负。

你可能会问:“如果语句中有‘not’,会发生什么呢?”非常好的观点。这种简单的方法对否定或讽刺并不管用。然而,如果你在大量的训练样本上训练你的模型,它实际上在大多数现实世界的情况下都表现得非常好。

为了以更复杂的方式处理“不好”或“不坏”这样的否定,你需要使用单词对作为特征,而不是单个单词。但是,对于需要投入的工作,性能增益将是增量的。

同样,处理讽刺也很容易——只要想出一个合适的方法来捕捉讽刺的特征就行了!(这是讽刺)。

轮到你了

我希望你现在看到贝叶斯推理是多么的强大和有用,并准备好应用到你的问题中。你有关于贝叶斯推理的有趣例子吗?请分享在这里




使用MATLAB®R2015a发布


评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。