jjzjj

【证明】期望风险最小化等价后验概率最大化

LoveFishO 2023-03-28 原文

引言

在《统计学习方法》一书中,详细说明了期望风险最小化与后验概率最大化之间的关系,但是其中的公式推导过程有所省略,这篇文章作为补充说明。

证明

首先我们假设损失函数为0-1损失函数

\[Loss=L(Y, f(X))= \begin{cases} 1,\quad Y \neq f(X) \\ 0, \quad Y=f(X) \end{cases} \]

则期望风险为

\[\begin{aligned} R_{exp}(f)=R_{exp}(L(Y, f(X))) &=\int_{X \cdot Y} L(y,f(x))P(y,x)dxdy\\ & =\int_{X \cdot Y} L(y,f(x))P(y|x)P(x)dxdy \\ & =\int_{X} \int_{Y}L(y,f(x))P(y|x)dyP(x)dx = \int_{X} \Bigg(\int_{Y}L(y,f(x))P(y|x)dy\Bigg) P(x)dx \\ & = E_{x} \Bigg(\int_{Y}L(y,f(X))P(y|X)dy\Bigg) \end{aligned} \]

在朴素贝叶斯估计中是数据是离散的,故

\[\begin{aligned} R_{exp}(f)=E_{x} \Bigg(\int_{Y}L(y,f(X))P(y|X)dy\Bigg) &=E_{x}\Bigg(\sum_{k}^{K}L(c_{k},f(X))P(c_{k}|X)\Bigg) \end{aligned} \]

因此如果要使得期望风险最小化只需要对\(X=x\)逐个极小化即可

\[\begin{aligned} F(x) &= \underset{ y \in Y }{\operatorname{argmin}} \sum_{k}^{K}L(c_{k},y)P(c_{k}|X=x) \quad \because y=f(X=x) \\ & \because Equation(1) \quad when \quad y=c_{k} \quad L(c_{k},y) =0 \\ & = \underset{ y \in Y }{\operatorname{argmin}} \sum_{k}^{K}P(c_{k} \neq y|X=x) \\ & \because Each \quad X=x \quad has \quad only \quad one \quad c_{k}=y=f(X=x) \\ & = \underset{ y \in Y }{\operatorname{argmin}}(1 - P(c_{k} = y|X=x)) \\ & = \underset{ y \in Y }{\operatorname{argmax}}P(c_{k} = y|X=x) \\ \end{aligned} \]

结论

可证期望风险最小化等价于后验概率最大化

有关【证明】期望风险最小化等价后验概率最大化的更多相关文章

  1. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

    假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)

  2. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  3. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  4. ruby - 如何证明 Ruby `for` 循环实际上是使用 `each` 方法实现的? - 2

    在EloquentRuby(第21页,第一版,第六次打印)一书中,作者(RussOlsen)提倡使用each方法而不是for循环,这与我在其他地方读到的所有内容一致。但是作者还继续说,这样做的一个原因是for循环实际上调用了each方法,所以为什么不直接删掉中间人并使用each?所以我想知道这实际上是如何工作的。为了调查,我确实在github上的Ruby存储库上进行了搜索,但发现很难确定我在哪里/如何看到它的实际效果。重述问题:我如何证明Rubyfor循环实际上是使用each方法实现的? 最佳答案 您可以通过编写一个实现每个的类来展

  5. ruby - 返回空白页的最小 Capybara/Poltergeist 测试 - 2

    看来我正在回顾SO帖子中采取的步骤:Capybara,PoltergeistandPhantomjsandgivinganemptyresponseinbody.(如果你愿意,可以将其标记为重复,但我包含了一个最小的独立测试用例和版本号。)问题我做错了什么吗?我可以运行另一个可能有助于隔离问题的最小测试吗?文件:pgtest.rbrequire'rubygems'require'capybara'require'capybara/dsl'require'capybara/poltergeist'modulePGTestincludeCapybara::DSLextendselfdeft

  6. ruby - 什么标准证明在 Ruby 中使用模块而不是类? - 2

    我正在阅读我的ruby书。查看下面的代码,moduleDestroydefdestroy(anyObject)@anyObject=anyObjectputs"Iwilldestroytheobject:#{anyObject}"endendclassUserincludeDestroyattr_accessor:name,:emaildefinitialize(name,email)@name=name@email=emailendendmy_info=User.new("Bob","Bob@example.com")puts"Soyournameis:#{my_info.name}

  7. ruby - 寻找产品和商店的最佳组合以最小化成本的算法 - 2

    你好,Stackoverflow的人们,我经营一个网站,为用户寻找最便宜的书籍购买地点。这对于单本书来说很容易,但对于多本书来说,有时在一家商店购买一本书而在另一家商店购买另一本书会更便宜。目前我找到了销售用户列表中所有书籍的最便宜的商店,但我想要一个更智能的系统。这里有更多信息:一本书的价格对于一家商店来说是不变的。运费可能会有所不同,具体取决于书籍的数量或书籍的总值(value)。每个商店对象都可以获取一组书籍并返回运费。通常,并非每家书店都出售每一本书。不确定在这里链接到我的站点是否很酷,但它列在我的用户配置文件中。我希望能够找到最便宜的商店和书籍组合。我担心这需要一种蛮力方法-

  8. ruby - RSpec:期望引发错误的方法失败 - 2

    我正在尝试测试在特定条件下是否正确引发错误。在此规范中,出现了错误,但测试仍然失败。我做错了什么?require'spec_helper'describeUSBTeensyRendererdocontext'whenthecorrectUSBportnameisnotpresent'doit'raisesanerroroninstantiation'doexpect(renderer=USBTeensyRenderer.new).toraise_error(USBInitError)endendend以及“bundleexecrspec”的终端输出:Failures:1)USBTeen

  9. ruby - 删除括号内的文本(括号内的括号概率) - 2

    我试图删除括号内的文本(连同括号本身),但遇到括号内有括号的情况时遇到问题。这是我正在使用的方法(在Ruby中):sentence.gsub(/\(.*?\)/,"")在我写出如下句子之前一切正常:"Thisis(atest(string))"然后上面就噎住了。任何人都知道如何做到这一点?我完全被难住了。 最佳答案 一种方法是从内向外替换括号组:x=string.dupwhilex.gsub!(/\([^()]*\)/,"");endx 关于ruby-删除括号内的文本(括号内的括号概率)

  10. Ruby:在代码中使用 rand() 但编写测试来验证概率 - 2

    我有一些代码可以根据加权随机数提供内容。权重越大的东西越有可能被随机选择。现在作为一名优秀的ruby​​ist,我当然想用测试覆盖所有这些代码。我想测试是否根据正确的概率获取了东西。那么我该如何测试呢?为应该是随机的东西创建测试使得很难比较实际与预期。我有一些想法,以及为什么它们不会很好地工作:在我的测试中stubKernel.rand以返回固定值。这很酷,但是rand()被调用了多次,我不确定我是否可以通过足够的控制来装备它来测试我需要的东西。多次获取随机项目,并将实际比率与预期比率进行比较。但除非我可以无限次地运行它,否则这永远不会完美,并且如果我在RNG中运气不佳,可能会间歇性地

随机推荐