<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>waytohigh (John Doe)</title>
    <link>https://ruby-china.org/waytohigh</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>举个简单例子说明 MAP 和 MLE 的区别</title>
      <description>&lt;p&gt;用一个最简单，又能充分体现二者区别的例子来说明，数学公式和图表都不会，所以解释效果可能不好&lt;img title=":joy:" alt="😂" src="https://twemoji.ruby-china.com/2/svg/1f602.svg" class="twemoji"&gt; 。而且我不保证我说得对&lt;img title=":sweat_smile:" alt="😅" src="https://twemoji.ruby-china.com/2/svg/1f605.svg" class="twemoji"&gt; ，可能需要后续改动&lt;/p&gt;

&lt;p&gt;首先他们都是针对一个未知量 X，求一个 X 可取的常数值，来最大化一个函数&lt;code&gt;argmax(function () {})&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;如果我们手里有一个硬币，它是个 fair coin，还是一个 biased coin，heads(H)/tails(T) 是 50/50 还是 30/70，这是我们感兴趣的未知量，这个未知量可以取的确定值是一个概率分布，50/50，30/70 这都是概率分布&lt;/p&gt;

&lt;p&gt;频度派的观点是这个未知量是一个 unknown constant，bayesian 的观点是这是个 random variable。&lt;/p&gt;

&lt;p&gt;MLE 里的 L 是 likelihood，当条件概率 P(A|B) 中，B 取确定常数值，A 不确定，P(A|B) 称为概率；当 A 取常数值，B 不确定 P(A|B) 称为 likelihood&lt;/p&gt;

&lt;p&gt;假设抛了 n 次硬币，HHH 全是 H，对 MLE 来说 Likelihood = P(HHH|X), 要找个 X = 常数值来最大化这个函数 P，显然 X = 100/0能最大化它，频度派的做法就认定了100/0是我们未知的constant&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;我们可不可以问 P(X|HHH)？可以的，但因为 X 是 unknown constant 所以只有一个 X = 常数值的 P = 1，其余全部为 0&lt;/li&gt;
&lt;li&gt;likelihood 还是一个条件概率的形式，已经发生的抛掷结果是在 X=常数值的前提下产生的，X: H=x/T=(1-x), 则 P(HHH|X) = x^3&lt;/li&gt;
&lt;li&gt;X 虽然是 P(HHH|X) 的自变量，但不是随机变量，只是说它的取值会改变 P(HHH|X) 的值&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;bayesian 的随机变量的观点是，这次你打开篮子里是个香蕉，过 5 分钟再打开可能是个苹果&lt;/p&gt;

&lt;p&gt;bayesian 要最大化的函数是 P(X|HHH), 我们称 P(X), 也就是没有任何抛掷数据前的 X 取各个值的概率函数，为 prior, 我们要最大化的是 posteriori，也就是 MAP 里的 P 了。所以 bayes 是有一个先验假设的，会根据后续的去更新假设，posteriori 是更新后，prior 是更新前。&lt;/p&gt;

&lt;p&gt;抛硬币这个例子里，怎么决定 prior？不知道，但这不妨碍我们理解 MLE 和 MAP 的区别。就假设 prior：P(X: 50/50) = 1/3, P(X: 70/30) = 1/3, P(X: 100/0) = 1/3&lt;/p&gt;

&lt;p&gt;因为抛出了 HHH 所以更新后的 posteriori 里 P(X: 100/0)一定是最大的，所以这里最大化P(X|HHH)还是100/0&lt;/p&gt;

&lt;p&gt;那区别在哪里？&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;如果你的 prior 是 P(X: 50/50) = 4/5, P(X: 70/30) = 1/10, P(X: 100/0) = 1/10，那么 HHH 的结果可能不足以修正你的后验分布使最大化 P(X|HHH) 的 X = 100/0&lt;/li&gt;
&lt;li&gt;当你要预测下一次硬币抛掷结果时，由于 MLE 看到的是 HHH 他会预测每次都是 H；MAP 虽然修正了，但其他分布的可能不是 0，如果 posteriori 是 P(X: 50/50) = 1/10, P(X: 70/30) = 1/10, P(X: 100/0) = 4/5，MAP 预测下次结果是 P(heads) = 0.5 * 0.1 + 0.7 * 0.1 + 1.0 * 0.8 = 0.92&lt;/li&gt;
&lt;li&gt;由 2 可以看出，MAP 的计算量更大，而且它需要 prior&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这里用了最简单最容易分析的 X“我们感兴趣的未知量”, 我觉得对于解决问题来讲，如何选取这个未知量直接关系到问题的解决&lt;/p&gt;

&lt;p&gt;比如你有个火星探测车，火星在刮沙尘暴，你的感知器传给你探测车的坐标读数（不准，有噪音），你知道探测车的位置直觉上是个 unknown constant，为了知道真实的位置，这里合适的解决办法是 MLE 吗？现实中解决这个问题的办法是基于 Bayes 和 MAP 的 Kalman Filter, 选取的 X 也不是“探测车的精确位置”。&lt;/p&gt;</description>
      <author>waytohigh</author>
      <pubDate>Sat, 12 May 2018 17:01:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/36760</link>
      <guid>https://ruby-china.org/topics/36760</guid>
    </item>
    <item>
      <title>Redis 能否存储 non persistent data?</title>
      <description>&lt;p&gt;数据类型是用户的在线状态，这个我想在 server 关闭后全部清空。查到几个做这个功能的例子用了 Redis 但没有解释 Redis 的 persistence 怎么处理，我之前在一个 non persistent model 上用过，发现&lt;code&gt;Redis.new&lt;/code&gt;只是打开一个与 Redis 会话的通道而已，Redis 本身会 persist data to disk。这样在用户在线时打断 server，再启动会发现用户已经在线了，显然不对&lt;/p&gt;

&lt;p&gt;查到 redis-server 层面是可以关掉 persistence 的，我假设这个是会全局地关闭 persistence，也许不是我想要的&lt;/p&gt;

&lt;p&gt;假设 rails app 里有用 redis 做 persistent data 的 cache，想另开一个&lt;code&gt;Redis.new&lt;/code&gt;专门用于存储用户在线状态，有无办法只关闭这个 Hash 的 persistence？或者也许可以在 config/initializer 里设置 server 启动时把该 Hash 清除来达到同样效果？具体该怎么做呢？&lt;/p&gt;

&lt;p&gt;请赐教。谢谢&lt;/p&gt;</description>
      <author>waytohigh</author>
      <pubDate>Wed, 09 May 2018 17:07:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/36730</link>
      <guid>https://ruby-china.org/topics/36730</guid>
    </item>
    <item>
      <title>实现一个类似多人游戏的功能, 在 Web 页面, 使用 Rails</title>
      <description>&lt;p&gt;类似常见的多人游戏，需要多个 player, 人满了才能开始游戏，就是说整体游戏是否能往下进行受到个别 player 的制约，不能进行的话游戏中的 player 就被卡在一个 page 不能推进游戏。然后游戏过程中在不同的 steps, 也就是不同的 web pages, 需要个别 player 做完一些动作（如 post data）, 所有 players 才能前进，才能去下一个 web page. 游戏因此而向前推进。游戏本身是静态 web page 的不断跳转而已，如果是单人游戏就很简单。&lt;/p&gt;

&lt;p&gt;这个应该算 asynchronous, 应该是要监听某个 port 某个服务器端的变量是不是发送过来，然后改变本机 browser 的 web page 上的页面内容（改变的方式之一可能是发送 request 到 server，将 response 插入当前页面）. 具体我也不知道什么术语怎么描述，因为没做过。&lt;/p&gt;

&lt;p&gt;想请教各位，有没有最最简单的此类 app, 把类似这个的功能做出来，以最最简单的形式，GitHub 上有代码可以看的。又或者有这方面经验的，请教在 Rails 的基础上，用哪个工具配合做合适些？&lt;/p&gt;

&lt;p&gt;谢谢&lt;/p&gt;</description>
      <author>waytohigh</author>
      <pubDate>Sat, 29 Jul 2017 13:15:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/33664</link>
      <guid>https://ruby-china.org/topics/33664</guid>
    </item>
  </channel>
</rss>
