统计模拟(三)——正态分布模拟

本文为第一系列的原创文章之三, 目的在于总结“Simulation” -Sheldon M.Ross一书中出现的模拟随机变量的方法. Acceptance-Rejection 在介绍正态分布的模拟前先介绍一种方法, 叫做 Acceptance-Rejection Technique. 这种方法一般用于生成比例形式的随机变量(往往用比例形式更好模拟的情况下.) 对于离散型的随机变量, 假设我们想要模拟的变量为 \(q_i\) , 已知可以模拟的变量为 \(p_i\) ,大致的做法如下: 1.选取一个常数 \(c\) 需要满足: 对于所有的 \(i\), 有 \(c \geq \large\frac{q_i}{p_i}\) ; 2.模拟出变量 \(Y\), 满足的离散分布为 \(p_i\) ; 3.生成一个服从 \((0, 1)\) 均匀分布的变量 \(U\) ; 4.如果 \(U < \large\frac{q_y}{cp_y} \), 接受, 使 \(X=Y\) 并停止, 否则执行2. 可以证明 \[P(Y=i, 第k次循环被接受) = p_i \frac{q_i}{cp_i}(1-\frac{q_i}{cp_i})^{k-1}, \quad\quad … Continue reading “统计模拟(三)——正态分布模拟”

统计模拟(二)——泊松分布与二项分布模拟

本文为第一系列的原创文章之二, 目的在于总结 “Simulation” -Sheldon M.Ross 一书中出现的模拟随机变量的方法. 泊松分布与二项分布 在本站先前的文章 Gamma 函数与 Beta/Dirichlet 分布中提到过二项分布, 其本质是离散形式的 beta 分布, 二项分布的表达式为: \begin{align*} P(x=k) &= C_n^kp^i(1-p)^{(n-k)} \\\ &=\frac{n!}{k!(n-k)!}p^i(1-p)^{(n-k)} \end{align*} 当我们尝试产生一个服从二项分布的随机数时, 我们一般通过迭代关系求出 \(P(x=i)\) , 然后产生一个 \((0,1)\) 的均匀分布, 将均匀分布映射到通过迭代关系式划分出的二项分布的区间上. (不直接计算 \(P(x=i)\) , 因为会涉及到 \(3n\) 个阶乘运算, 也不采用 \(n\) 次独立重复试验的方法, 因为需要产生 \(n\) 个随机数.) 很显而易见的, 对于二项分布 \(B(n,p)\) 我们有: \begin{align*}\frac{P(x=i+1)}{P(x=i)}&=\frac{n-i}{i+1}\frac{p}{1-p} \\\ P(x=0)&=(1-p)^n \end{align*} 记 \(p_i = P(x=i)\) … Continue reading “统计模拟(二)——泊松分布与二项分布模拟”

5 Comments so far

统计模拟(一)——随机数模拟

本文为第一系列的原创文章之一, 目的在于总结“Simulation” -Sheldon M.Ross一书中出现的模拟随机变量的方法.     我们平时所接触的各种随机变量和这些随机变量的分布, 往往会有一个确定的表达式. 但是很多复合的随机变量, 其分布往往很难被确定. 即使是确定的表达式, 当我们需要生成这个随机变量时, 也很难直接从其表达式得到.   所以我们需要对这些随机变量的生成过程进行模拟, 根据模拟得到的变量数据, 可以进行进一步的模拟, 或者得到其均值与方差等我们需要研究的数据.   一般而言, 所有的随机变量都可以通过最简单的分布: 均匀分布得到. 接下来, 我们将从均匀分布出发, 得到各种随机变量的模拟方法.   随机数与均匀分布 要想得到均匀分布, 首先需要得到随机数. 伪随机数的生成有很多种, 比较常用的有取模法. 根据迭代公式, 第 n 个数 \( x_n \)的产生为:   \[x_n = ax_{n-1}\quad modulo\quad m\] 其中 \(modulo\) 表示取模运算. 得到的伪随机数 \(x_n\) 的取值在 \(0\) 到 \(m-1\) 之间, 将 … Continue reading “统计模拟(一)——随机数模拟”

LDA学习心得(二)——文本建模

四种文本建模 在上一篇文章中, 从 Gamma 函数介绍到了 Dirichlet/Multinomial 共轭, 这都是为这一篇的文本建模打下基本的数学基础. 在接下来的文章中, 会介绍四种不同的文本模型. 介绍前三种的目的, 是为了引出最后想要总结的模型: LDA, 有了前三种模型的铺垫, 加上上一篇文章的数学基础, LDA 的真面目也就呼之欲出了. Unigram Model 在这一模型中, 我们假定人写文章是这样的, 打开一本词典, 以一定概率翻到某个词, 然后写上去, 这称之为 Unigram Model, 我比较喜欢称呼为脸滚键盘模型, 也就是任何的两个词的出现都是完全独立毫无关系的. 这是最简单的词袋模型. 对应其数学模型就是: 对于一篇文档 \(d=\overrightarrow{w}=(w_1, w_2, \cdots, w_n) = \prod_{i=1}^n p(w_i) \) 假设有一个文档库 \(\mathcal{W}=(\overrightarrow{w_1}, \overrightarrow{w_2},…,\overrightarrow{w_m})\) , 可以得到, 这个文档库的分布为: \begin{align*}p(\mathcal{W})= p(\overrightarrow{w_1})p(\overrightarrow{w_2}) \cdots p(\overrightarrow{w_m})=\prod_{k=1}^V p_k^{n_k}\end{align*} 于是我们参数估计的对象为 \(\overrightarrow{p}\) , 对这个参数进行最大似然的计算可以得到: … Continue reading “LDA学习心得(二)——文本建模”

LDA学习心得(一)——Gamma函数与Beta/Dirichlet分布

本文主要是对文章 LDA-math-神奇的Gamma函数 与 认识Beta/Dirichlet分布 的学习总结, 用于归纳 Gamma 函数与Beta/Dirichlet 分布的性质 从二项分布到 Gamma 函数 在高中学习概率论的时候, 第一次接触到了二项分布的概念. 二项分布问题的开始源于一个经典的问题:连续抛若干次硬币, 有多少硬币正面朝上的几率分别是多少? 这个问题是最简单的二项分布的例子. 同样的,也是从这个问题中引入排列组合中”组合”这个运算符的概念: $$C_{n}^{k}=\frac{n!}{k!(n-k)!}=\frac{n(n-1)(n-2)…(n-k+1)}{k(k-1)(k-2)…\times 2\times 1}$$ 在此的基础上, 又学习了二项展开的基本公式: $$(a+b)^{n}=\sum_{k=0}^{n}C_{n}^{k}a^{k}b^{(n-k)}$$ 后来, 又在大学阶段学习了一元函数的 Taylor 展开形式与 Maclaurin 展开形式, 也学习到了 Maclaurin 级数中, 形如 $(1+x)^{\alpha}$ 的 Maclaurin 展开式为: \begin{split}(1+x)^{\alpha}=1+\alpha x+\frac{\alpha(\alpha-1)}{2!}x^{2}+\frac{\alpha(\alpha-1)(\alpha-2)}{3!}x^{3}+…\\\ +\frac{\alpha(\alpha-1)(\alpha-2)…(\alpha-n+1)}{n!}x^{n}…\end{split} 此处的 \(\alpha\) 与高中接触的 \(n\) 最大的不同即 \(\alpha\) 不一定整数, 而且即使 \(\alpha\) 不是整数也并不影响 Maclaurin 级数展开的形式与计算过程. 但是如果深究细节, 便会浮现出一个问题: … Continue reading “LDA学习心得(一)——Gamma函数与Beta/Dirichlet分布”

Comments Off on LDA学习心得(一)——Gamma函数与Beta/Dirichlet分布 so far

如何向浏览器的复杂组件(如远程终端)中粘贴?

        问题的发生大概是这样的:         配置搭建本博客所在的虚拟主机的SSH时,发生了一件比较尴尬的事情。         在新建主机的时候仅仅上传了本人在实验室的Ubuntu PC的SSH公钥,而没有上传在宿舍的Windows PC的SSH公钥。所以在宿舍无法远程登录,而由于Digital Ocean蛋疼的设置,在主机新建之后,无法通过监控的页面添加新的SSH公钥。不过还好,Digital Ocean的Support页面给出了如何添加SSH的教程,然而,仔细阅读之后发现,这完全是在创建主机时完成的,但是Support还是给出了链接如何在创建主机之后添加SSH公钥,并且链接到如何使用Putty远程登录主机。         最头疼的就在这里,试图用Putty远程登录添加SSH时发现登录的验证方式只能用SSH进行验证,于是毫无意外的成了一个类似于WinRar.rar的死循环。         (补充说明,后来才知道在/etc/ssh/sshd_config文件中,PasswordAuthentication no被设置了)         当然,这个问题自然不是这么解决的,如果是这么解决的不足以用一篇博客的篇幅来记述。本人于是在Digital Ocean的主机管理页面,打开了网页版的Console,这个Console是用Canvas构成的,大概直接传输的是Console的画面,加上服务器的位置是在国外,所以一直在以极其高的延时在Console中操作。每当Console出现大量刷新时,画面便会卡很久。我小心翼翼的打开了位于 ~/.ssh目录下的公钥文件,Ubuntu主机的公钥肚子静静地躺在文件中,当我右键准备复制本地PuttyGen产生的公钥时,(补充说明,Putty似乎只支持自己生成的非对称加密的私钥,因为其后缀是.pkk,无法使用大部分操作系统默认的无后缀名的那种。)发现并没有让我粘贴的选项,而是出现的是右键浏览器空白面经常出现的内容。摆在我面前的似乎只有一个方案了,那就是把长达256位的公钥敲进去。         当我敲到1/3的时候,发现我真的不能这么干,因为我还要检查几遍对于我来说是毫无意义乱码的公钥是否输入正确,那么小的Console页面估计会让我把眼睛瞅瞎了,于是还是决定找一找有没有其他的往终端中粘贴的解决方案,终于在Digital Ocean的Community中找到了这个解决方案:         右键浏览器检查元素,在Console中输入:         JavaScript学的不是很好,这段代码大致就是定义了一个往浏览器中发送字符串的函数,也就是帮你完成了输入某个特定的字符串的功能。使用时只用继续在检查元素的Console中输入:sendString(‘The String You Wanna Paste’),然后就实现了向远程终端中粘贴的功能。不过值得注意的是,似乎公钥里的所有的”+”都会自动转换成”=”(没有深究为什么),因为这个还浪费了很多时间。不过还好,有了这个复制方法,Xftp与Putty都顺利的连接上了远程主机,可以远程操作系统的文件目录与Console,操控变得十分便利。