{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 正态分布随机数的生成\n", "\n", "[@jameslao](https://github.com/jameslao) / [www.jlao.net](http://www.jlao.net)\n", "\n", "正态分布——听起来非常耳熟,用起来也很顺手——因为很多语言都已经内置了有关正态分布的各种工具。但其实,在这个最普遍、最广泛的正态分布背后,要生成它还有很多学问呢。\n", "\n", "$$f(x \\; | \\; \\mu, \\sigma) = \\frac{1}{\\sigma\\sqrt{2\\pi} } \\; e^{ -\\frac{(x-\\mu)^2}{2\\sigma^2} }$$" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "(-4, 4, 0, 0.5)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import seaborn as sns\n", "sigma = 1\n", "mu = 0\n", "sns.set(style=\"dark\", palette=\"muted\", color_codes=True, font_scale=1.5)\n", "x = [np.arange(i - 4, i - 3, 0.01) for i in range(8)]\n", "f = [1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (x[i] - mu)**2 / (2 * sigma**2) ) for i in range(8)]\n", "alpha = [0.3,0.5,0.7,0.9,0.9,0.7,0.5,0.3]\n", "plt.figure(figsize=(10,5))\n", "for i in range(8):\n", " plt.fill_between(x[i], 0, f[i], alpha= alpha[i])\n", "plt.axis((-4, 4, 0, 0.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "难道教科书上没有讲吗?看看概率书上是怎么说的……比如我手头这本浙大版的《概率论与数理统计》(第四版)第 378 页上说……“标准正态变量的分布函数 $\\Phi(x)$ 的反函数不存在显式,故不能用逆变换法产生标准正态变量……”\n", "\n", "## 反变换法\n", "\n", "等下!反函数不存在显式……这都什么年代了,没有解析解难道不能用数值解嘛!求百分位这么常见的动作,怎么会不能做呢?Excel 里面提供了`NORMINV` 函数,R 语言里面有 `qnorm`,在 Python 里面可以用 SciPy.stats 里提供的 `norm.ppf`:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1.14 s, sys: 621 ms, total: 1.76 s\n", "Wall time: 1.85 s\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import scipy.stats as stats\n", "import matplotlib.pyplot as plt\n", "N = 10 ** 7\n", "%matplotlib inline\n", "%time x = stats.norm.ppf(np.random.rand(N, 1))\n", "plt.figure(figsize=(10,5))\n", "plt.hist(x,50)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "当然……不算快啦,但还是可以凑合用的。这个给高斯积分求逆的实现可以看 [SciPy 的 ndtri() 函数](https://github.com/scipy/scipy/blob/master/scipy/special/cephes/ndtri.c)。这段代码来自于 Cephes 数学库,采用了分段近似的方法但是精度还相当不错——明明是 80 年代末就有了!\n", "\n", "这个变换当然很直观啦,如果你再想变回均匀分布,只要再用一次分布函数就好了:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "(array([199998., 199574., 200044., 199704., 199574., 200141., 199944.,\n", " 200252., 199955., 200072., 199002., 199774., 200271., 200356.,\n", " 200138., 199969., 200065., 199743., 199762., 200400., 200907.,\n", " 199976., 200448., 199981., 200219., 199619., 199842., 199322.,\n", " 200232., 200700., 199807., 199073., 199608., 199413., 200921.,\n", " 199571., 199583., 199818., 200270., 201388., 199693., 200194.,\n", " 199828., 199490., 200306., 200804., 200609., 200567., 199022.,\n", " 200051.]),\n", " array([4.07138978e-09, 1.99999989e-02, 3.99999937e-02, 5.99999884e-02,\n", " 7.99999832e-02, 9.99999780e-02, 1.19999973e-01, 1.39999968e-01,\n", " 1.59999962e-01, 1.79999957e-01, 1.99999952e-01, 2.19999947e-01,\n", " 2.39999942e-01, 2.59999936e-01, 2.79999931e-01, 2.99999926e-01,\n", " 3.19999921e-01, 3.39999916e-01, 3.59999910e-01, 3.79999905e-01,\n", " 3.99999900e-01, 4.19999895e-01, 4.39999889e-01, 4.59999884e-01,\n", " 4.79999879e-01, 4.99999874e-01, 5.19999869e-01, 5.39999863e-01,\n", " 5.59999858e-01, 5.79999853e-01, 5.99999848e-01, 6.19999843e-01,\n", " 6.39999837e-01, 6.59999832e-01, 6.79999827e-01, 6.99999822e-01,\n", " 7.19999817e-01, 7.39999811e-01, 7.59999806e-01, 7.79999801e-01,\n", " 7.99999796e-01, 8.19999791e-01, 8.39999785e-01, 8.59999780e-01,\n", " 8.79999775e-01, 8.99999770e-01, 9.19999765e-01, 9.39999759e-01,\n", " 9.59999754e-01, 9.79999749e-01, 9.99999744e-01]),\n", " )" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = stats.norm.cdf(x)\n", "plt.hist(x, 50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 中心极限定理……还是不要用的好\n", "\n", "那教科书上教的是什么方法呢?它祭出了中心极限定理…… 取 $n$ 个相互独立的均匀分布 $X_i = U(0,1)$,$E(X_i)=\\frac{1}{2}$,$\\mathrm{Var}(X_i)=\\frac{1}{12}$,那么根据中心极限定理,$n$ 比较大的时候近似有\n", "\n", "$$Z = \\frac{\\displaystyle\\sum_{i=1}^n X_i - E\\left(\\displaystyle\\sum_{i=1}^n X_i\\right)}{\\sqrt{\\mathrm{Var}\\left(\\displaystyle\\sum_{i=1}^n X_i\\right)}}= \\frac{\\displaystyle\\sum_{i=1}^n X_i - \\frac{n}{2}}{\\sqrt{n} \\sqrt{\\frac{1}{12}}} \\sim N(0,1).$$\n", "\n", "取 $n=12$ 则近似有\n", "\n", "$$Z = \\sum_{i=1}^{12} U_i - 6 \\sim N(0,1).$$\n", "\n", "这个呢……我们也来试试看" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1.96 s, sys: 555 ms, total: 2.52 s\n", "Wall time: 2.52 s\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%time g = np.sum(np.random.rand(N, 12), 1) - 6\n", "plt.figure(figsize=(10,5))\n", "plt.hist(g,50)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "更慢了。形状倒是有那么点意思。那我们来看看它生成的质量如何:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "NormaltestResult(statistic=4665.739075254162, pvalue=0.0)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import scipy.stats as stats\n", "stats.normaltest(g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "竟然可耻地毫无争议地失败了…… (╯‵□′)╯︵┻━┻ 我们的样本数比较大($10^7$),用仅仅 12 个做平均是很难得到合理的“正态”样本的。可要是取更大的 $n$ 的话,要生成太多的随机数又实在太慢了。如果需要的样本数少一点(比如 1000 个)倒还可以勉强凑合:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "NormaltestResult(statistic=2.999740424803123, pvalue=0.2231591215554297)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.normaltest(np.sum(np.random.rand(1000, 12), 1) - 6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "好吧,这方法大概只有理论上的意义。我们来看一个比较常用的方法是怎么做的:\n", "\n", "## Box-Muller 变换\n", "\n", "我们再来看看这个反变换的事。基本上我们的问题就是要计算\n", "\n", "$$I = \\int_{-\\infty}^{\\infty} e^{-\\frac{x^2}{2}} \\mathrm{d} x$$\n", "\n", "大家都知道这个积分没有初等函数的表示。不过呢\n", "\n", "$$I^2 = \\int_{-\\infty}^{\\infty} e^{-\\frac{x^2}{2}} \\mathrm{d} x \\int_{-\\infty}^{\\infty} e^{-\\frac{y^2}{2}} \\mathrm{d} y = \\int_{-\\infty}^{\\infty} \\int_{-\\infty}^{\\infty} e^{-\\frac{x^2+y^2}{2}} \\mathrm{d} x \\, \\mathrm{d} y$$\n", "\n", "注意看右边,这个形式让我们想到了……极坐标!令 $x = r\\cos\\theta$,$y = r\\sin\\theta$,那么 $\\mathrm{d}x\\,\\mathrm{d}y$ 变成 $\\mathrm{d}r\\,\\mathrm{d}\\theta$ 的时候要记得乘上雅各比矩阵:\n", "\n", "$$\\mathrm{d}x\\,\\mathrm{d}y = \\begin{vmatrix}\\frac{\\partial x}{\\partial r} & \\frac{\\partial x}{\\partial \\theta} \\\\ \\frac{\\partial y}{\\partial r} & \\frac{\\partial y}{\\partial \\theta} \\end{vmatrix} \\mathrm{d}r\\,\\mathrm{d}\\theta= r\\, \\mathrm{d}r\\,\\mathrm{d}\\theta$$\n", "\n", "于是\n", "\n", "$$I ^2 = \\int_{r=0}^{\\infty}\\int_{\\theta=0}^{2\\pi}e^{-\\frac{r^2}{2}} r\\,\\mathrm{d}r\\,\\mathrm{d}\\theta = 2\\pi\\int_{r=0}^{\\infty}e^{-\\frac{r^2}{2}} r\\,\\mathrm{d}r = 2\\pi\\int_{r=0}^{\\infty}e^{-\\frac{r^2}{2}} \\mathrm{d}\\left(\\frac{r^2}{2}\\right) =2\\pi$$ \n", "\n", "有了这个技巧就求出了积分。如果再把反变换方法应用到这里,$\\Theta$ 可以均匀地取 $[0,2\\pi]$ 中的值,即\n", "\n", "$$\\Theta = 2\\pi U_1$$\n", "还可以同理计算出\n", "\n", "$$\\mathbb{P}(R\\leq r) = \\int_{r'=0}^r e^{-\\frac{r'^2}{2}}\\,r'\\,\\mathrm{d}r' = 1- e^{-r^2/2}$$\n", "\n", "令其满足均匀分布 $1-U_2$,则\n", "\n", "$$R = \\sqrt{-2\\ln(U_2)}$$\n", "\n", "因此,只需要产生均匀分布 $U_1$ 和 $U_2$,就可以计算 $R$ 和 $\\Theta$,进而计算出 $X$ 和 $Y$ 两个相互独立的正态分布了。\n", "\n", "Python 里面的 `random.gauss()` 函数用的就是这样一个实现,但是用它实在太慢了,我们还是靠 NumPy 吧:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 821 ms, sys: 168 ms, total: 989 ms\n", "Wall time: 988 ms\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhoAAAEDCAYAAABziK3oAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAY7ElEQVR4nO3df7RdZX3n8XdySe5NzA1k2ogXcOhaOn6RGSdg+bH4UQoUlyto6y9wMUoAW6iW6YjAiGYB1lI0BKgB7S8FumJqx8WPUazjZKYDDraEEQqYWJjFV2Gg7ZSrVWBIItwk5DJ/7H3q9nB/nNyTffa5ue/XWmfte5/97Oc8666buz959vM8Z97LL7+MJElSHeY33QFJkrTvMmhIkqTaGDQkSVJtDBqSJKk2Bg1JklSb/ZruwCw3CBwNjAK7G+6LJEl1GwBGgL8BdnRygUGjO0cDf910JyRJ6rFfAu7tpKJBozujAM899xPGx92PRJK0b5s/fx7Llr0KyvtfJwwa3dkNMD7+skFDkjSXdDxdwMmgkiSpNgYNSZJUG4OGJEmqjUFDkiTVxqAhSZJqY9CQJEm1MWhIkqTauI+GpL40vHQxQ4MDk54f27GbbVtf6GGPJM2EQUNSXxoaHGDl6i2Tnt+4ZgXbetgfSTNj0JA0K+3cNc7y5cOTnnfEQ+oPBg1Js9LCBfMd8ZBmASeDSpKk2hg0JElSbQwakiSpNgYNSZJUGyeDSmrEdPtkSNo3GDQkNaKTfTIkzX4dBY2I+FfA1cAJwDLg74ANwLrM3FGpdzxwLfBmYCtwK7A6M19oa28QuApYVba3Bbg8M++e4L0ba1OSJHVn2jkaEXEw8ABwLPAHwMXAQ8Aa4OZKvSOAu4Eh4JLy3AcpbuLt1pftfAm4CBgHNkbEcW3v3XSbkiSpC52MaJwNHACcmJmPlmVfiIhFwFkR8euZuQv4NPAMcHJmbgeIiKeAmyLi1Mz8Zll2DHAWcHFm3lCWbQAeAdYCJ1Xeu7E2Jc1u7hwq9YdOVp0sLY8/bCv/AbAL2B0RS4G3ABtaN+/SBmA78N5K2Rnldf88GpKZY8AtwIkRMQLQB21KmsVaO4dO9nIiqtQbnQSNb5XHWyJiRUS8NiLeD5wHrM3MceBNFKMjD1YvzMydwGbgyErxkcBjbTd6KB7PzAOOKL9vuk1JktSlaYNGZv4lcCXFSMBm4O8p5kGszczfLauNlMfRCZoYBQ6qfD8yRT0qdZtuU5IkdanTDbueBO4BfhN4D/CnwO9GxIfK84vK445XXspY5Xyr7mT1qm013aYkSerStJNBI+Is4PPAGzLz6bL4KxExH7g+Im4FXizLBydoYqhynvLryepRqdt0m5IkqUudjGhcCDxUCRktfwG8CljBTx9FjPBKI0D12tEp6lGp23SbkiSpS50EjQOBiaZnLyiP+1EsI30JOKpaISIWUkzE3Fwp3gwcFhFL2to7tjy2tgpsuk1JktSlToLG94CjIuJ1beX/DtgNfDcznwfuAla13exXAUuA2ytld1CElPNbBeWunh8ANrVGTvqgTUmS1KVONuy6DlgJbIqIPwCeBd5elv1JZv5TWe9y4D7gnoi4GTgEuBTYmJl3tRrLzPsj4nbg2nJ/iyeAc4FDKZbMVjXWpiRJ6l4ny1v/CjgeeBj498ANwOuA1cBvV+o9DJxGsaJjHXABcBNw5gTNngPcWB4/SzEacXpmbmp776bblCRJXejoQ9Uy8wHg9A7q3UvxwWvT1RsDPlq++rZNSZLUnU730ZAkSdpjHY1oSNKeGl662M8TkWTQkFSPocEBVq7eMun5jWtW9LA3kprioxNJklQbg4YkSaqNQUOSJNXGoCFJkmrjZFBJc9LOXeMsXz486fmxHbvZtvWFHvZI2jcZNCTNSQsXzJ92Vcy2HvZH2lf56ESSJNXGoCFJkmpj0JAkSbUxaEiSpNoYNCRJUm0MGpIkqTYGDUmSVBuDhiRJqo1BQ5Ik1cagIUmSamPQkCRJtTFoSJKk2hg0JElSbQwakiSpNgYNSZJUG4OGJEmqzX5Nd0DS7DO8dDFDgwNNd0PSLGDQkLTHhgYHWLl6y5R1Nq5Z0aPeSOpnPjqRJEm1MWhIkqTaGDQkSVJtDBqSJKk2TgaVpAns3DXO8uXDk54f27GbbVtf6GGPpNnJoCFJE1i4YP6UK2s2rlnBth72R5qtfHQiSZJq0/GIRkQcDXwSOB5YADwBrMvM9ZU6v1bWORz4J+AW4FOZ+VJbWwcA1wLvAhYD9wOXZObmCd63sTYlSVJ3OhrRiIiVwCaKgHElcClwF/Datjp3As8C/6H8+hPAura25gPfAM4CPgdcBhwI3BMRr5vgfRtpU5IkdW/aEY2I2B9YD/xxZl40RdXrge8Ab83M3eW1W4HVEfHZzPx+We8MilGRd2XmnWW924DvAb8DnNMnbUqSpC51MqLxPuAAiv/1ExHDETGvWiEiDqd4DPH51s279Efle7ynUnYG8DTwtVZBZv4IuA14Z0Qs6JM2JUlSlzoJGqcBjwGnR8Q/AFuBZyPimohofarSkeXxweqFmfk08H8r51t1H8rMl9ve5wFgGHh9n7QpSZK61EnQeD3FXIz15es9wFeBjwG/X9YZKY+jE1w/ChxU+X5kinpU6jbdpiRJ6lInq06WAMuAj2fm2rLsKxGxBLgwIq4GFpXlOya4foxiFUjLoinqtc5Xj021KUmSutTJiMaL5fHLbeV/TrEK5ZhKncEJrh+qnG+1N1m96vs13aYkSepSJ0Gj9Zjhh23lre+XVeqM8EojFBM1q+1NVo9K3abblCRJXeokaDxUHg9uKz+kPP4IaG2KdVS1QkQcVNarbpq1GfjF9pUrwLHAduDxSr0m25QkSV3qJGjcXh5/o1VQ3tDPB34CfDszH6VYmfKblZUoAL8FjAP/uVJ2B8Wky3dU2vt54Ezga5m5C6AP2pQkSV2adjJoZj4UERsoNrR6NfAw8DbgrcBlmbm1rPpR4C+A/x4RtwL/Bvhtij0rvldp8g7g28CGiLge+DFwIUXo+WTb2zfZpiRJ6lKnH6p2AfApinBxI8WS1w9l5nWtCpn5X4B3Az9HsQ34u4GrgQ9XGyo3yjqdYjOtDwPXUTx+OSUzH2+r21ibkiSpex19qFpm7qT4jJMrp6l3J8Vnh0zX3nMUj17O76BuY21KkqTu+DHxkiSpNgYNSZJUG4OGJEmqTUdzNCTNLcNLFzM0ODB9RUmahkFD0isMDQ6wcvWWSc9vXLOih72RNJv56ESSJNXGoCFJkmpj0JAkSbUxaEiSpNoYNCRJUm1cdSJJM7Bz1zjLlw9Pen5sx262bX2hhz2S+pNBQ5JmYOGC+dMuAd7Ww/5I/cpHJ5IkqTYGDUmSVBuDhiRJqo1BQ5Ik1cagIUmSamPQkCRJtTFoSJKk2hg0JElSbQwakiSpNgYNSZJUG4OGJEmqjUFDkiTVxqAhSZJqY9CQJEm1MWhIkqTaGDQkSVJtDBqSJKk2Bg1JklSb/ZrugKTeG166mKHBgaa7IWkOMGhIc9DQ4AArV2+Z9PzGNSt62BtJ+zIfnUiSpNoYNCRJUm1m9OgkIi4D1gJbMvOItnPHA9cCbwa2ArcCqzPzhbZ6g8BVwCpgGbAFuDwz757g/RprU5Ikzdwej2hExGuAK4CfTHDuCOBuYAi4BLgZ+CDFTbzdeuBi4EvARcA4sDEijuuzNiVJ0gzNZETjGuBBipByQNu5TwPPACdn5naAiHgKuCkiTs3Mb5ZlxwBnARdn5g1l2QbgEYqRkpP6oU1JktSdPRrRKG/mZ1OMArSfWwq8BdjQunmXNgDbgfdWys4AdlGMJACQmWPALcCJETHSJ21K0ozs3DXO8uXDU76Gly5uuptS7Toe0YiIecDngC9m5uaIaK/yprK9B6uFmbkzIjYDR1aKjwQea7vRAzwAzAOOAEb7oE1JmpGFC+ZPuYQYimXE23rUH6kpezKicQ5wOMX8jImMlMfRCc6NAge11Z2sHpW6TbcpSZK60FHQiIhhirkZ12TmRDdogEXlcccE58Yq51t1J6tXbavpNiVJUhc6HdG4AtgJfGaKOi+Wx8EJzg1VzrfqTlav2lbTbUqSpC5MO0ejnET5EeBK4MDK3IwhYGFE/ALwPD99FDHS3kZZ9nTl+9Ep6lGp23SbkiSpC52MaBwILKRYIvpk5XUs8Mby649RLCN9CTiqenFELKSYiLm5UrwZOCwilrS917HlsTWDquk2JUlSFzoJGk8C75rg9SjwVPn1hsx8HrgLWNV2s18FLAFur5TdASwAzm8VlLt6fgDYlJlPA/RBm5IkqQvTPjopb8x3tpdHxEeAlzKzeu5y4D7gnoi4GTgEuBTYmJl3Vdq8PyJuB64tH808AZwLHAqc1/ZWjbUpSZK6s1c/VC0zHwZOo1jRsQ64ALgJOHOC6ucAN5bHz1KMRpyemZv6rE1JkjRDM/pQNYDMPHmS8nuBEzq4fgz4aPmarm5jbUqSpJnzY+IlSVJtDBqSJKk2Bg1JklQbg4YkSaqNQUOSJNXGoCFJkmpj0JAkSbUxaEiSpNrMeMMuSf1reOlihgYHmu6GJBk0pH3R0OAAK1dvmfT8xjUretgbSXOZj04kSVJtDBqSJKk2Bg1JklQbg4YkSaqNk0ElqSE7d42zfPnwpOfHduxm29YXetgjae8zaEhSQxYumD/t6qBtPeyPVAcfnUiSpNoYNCRJUm0MGpIkqTYGDUmSVBuDhiRJqo1BQ5Ik1cagIUmSamPQkCRJtTFoSJKk2hg0JElSbQwakiSpNgYNSZJUG4OGJEmqjUFDkiTVxo+Jl2ah4aWLGRocaLobkjQtg4Y0Cw0NDrBy9ZZJz29cs6KHvZGkyfnoRJIk1cagIUmSajPto5OIOBo4DzgFOBR4BrgPuCIzH2+rezxwLfBmYCtwK7A6M19oqzcIXAWsApYBW4DLM/PuCd6/sTYlSVJ3OhnR+BjwbuAu4CLgC8DJwHci4o2tShFxBHA3MARcAtwMfJDiJt5uPXAx8KWyzXFgY0QcV63UB21KUmN27hpn+fLhSV/DSxc33UVpWp1MBv0M8L7M3NkqiIhbgb+lCCHnlcWfphjtODkzt5f1ngJuiohTM/ObZdkxwFnAxZl5Q1m2AXgEWAucVHnvxtqUpKYtXDB/2km/23rYH2kmph3RyMz7qiGjLPs+8CjwRoCIWAq8BdjQunmXNgDbgfdWys4AdlGMJLTaGwNuAU6MiJE+aVOSJHVpRpNBI2IecCDw47LoTRSjIw9W65UBZTNwZKX4SOCxths9wAPAPOCIPmlTkiR1aaarTt4PHAzcVn4/Uh5HJ6g7ChxU+X5kinpU6jbdpiRJ6tIeB42IOAz4Q+Be4M/K4kXlcccEl4xVzrfqTlav2lbTbUqSpC7tUdCIiNcA3wCeA87MzPHy1IvlcXCCy4Yq51t1J6tXbavpNiVJUpc63oI8IvYHNgL7Aydk5g8qp1uPIkZecWFR9nRb3cnqUanbdJuSJKlLHY1oRMQQ8HXgDcDbMzPbqjwCvAQc1XbdQoqJmJsrxZuBwyJiSVsbx5bH1lquptuUJEldmjZoRMQAxWZWx1E8Lvl2e53MfJ5iQ69VbTf7VcAS4PZK2R3AAuD8ynsMAh8ANmXm033SpiRJ6lInj05+H/g1ihGNfxERZ1fObc/MO8uvL6fYmvyeiLgZOAS4FNiYmXe1LsjM+yPiduDacn+LJ4BzKbY3P6/tvRtrU5Ikda+TRyetPSh+lWKVSfV1Q6tSZj4MnEaxomMdcAFwE3DmBG2eA9xYHj9LMRpxemZuqlbqgzYlSVIXph3RyMyTO20sM+8FTuig3hjw0fLVt21KTRleupihwYGmuyFJXet41Ymk3hkaHJj2My4kaTaY6c6gkiRJ0zJoSJKk2vjoRJJmqZ27xlm+fHjS82M7drNt6ws97JH0SgYNSZqlFi6YP+1cnm097I80ER+dSJKk2hg0JElSbQwakiSpNgYNSZJUG4OGJEmqjUFDkiTVxqAhSZJqY9CQJEm1ccMuqQF+OqukucKgITXAT2eVNFf46ESSJNXGEQ1J2kf5oWvqBwYNSdpH+aFr6gc+OpEkSbUxaEiSpNoYNCRJUm0MGpIkqTYGDUmSVBtXnUg1cOdPSSoYNKQauPOnJBUMGpI0R7mhl3rBoCFJc5QbeqkXnAwqSZJqY9CQJEm1MWhIkqTaOEdDmgGXr0pSZwwa0gy4fFVzgatStDcYNCRJE3JVivYG52hIkqTazNkRjYgYBK4CVgHLgC3A5Zl5d6MdU+OcfyF1xkcr6sScDRrAeuA9wA3A48B5wMaI+OXM/F8N9ksNm27+BTgHQwIfragzczJoRMQxwFnAxZl5Q1m2AXgEWAuc1GD3VDNHLCSpd+Zk0ADOAHYBN7cKMnMsIm4BPhURI5k52ljvVCtXjEi9Md2jFfDxylwwV4PGkcBjmbm9rfwBYB5wBNBJ0BgAmD9/3t7tnbqyZMkiBqcZsXj1AQu6Or832tjXz/dDH/r9fD/0oc7zCxfM59y1/3vK62+65LApw8iOHbvZvv3FKdtQ71Tudx0PC897+eWX6+lNH4uIR4B/zMy3tpUfDjwKnJ+Zt3TQ1InAX9fQRUmS+tkvAfd2UnGujmgsAnZMUD5WOd+Jv6H4YY8Cu/dCvyRJ6mcDwAjF/a8jczVovAgMTlA+VDnfiR10mOgkSdpHPLEnlefqhl2jFImsXavs6R72RZKkfdZcDRqbgcMiYklb+bHlcepNFCRJUkfmatC4A1gAnN8qKHcK/QCwKTMd0ZAkaS+Yk6tOACLiNuCdwDqK503nAkcDp2Tmpib7JknSvmKuTgYFOAf4vfK4DPgucLohQ5KkvWfOjmhIkqT6zdU5GpIkqQcMGpIkqTZzeY6GGhYRfwT8FvC1zHxn0/3pJxHxK8DZwAnAIRR7v9wNfCIzf9Bk35pSrgy7ClhFMa9qC3B5Zt7daMf6SEQcDZwHnAIcCjwD3AdckZmPN9i1WSEiLqP4BO8tmXlE0/3pN+Xv1yeB4ylWbj4BrMvM9VNd54iGGhER/5ZiefHYdHXnqLXALwNfBT4M3AqcBTwcEa9usmMNWg9cDHwJuAgYBzZGxHFNdqrPfAx4N3AXxc/oC8DJwHci4o0N9qvvRcRrgCuAnzTdl34UESuBTRQB40rgUorfs9dOd60jGmrKjRQ3jFOb7kifugS4NzPHWwUR8d+AbwEXUvyvYs6IiGMogtbFmXlDWbYBeIQilJ3UYPf6yWeA92XmzlZBRNwK/C1FCDmvoX7NBtcAD1L8B/yAhvvSVyJif4qg/8eZedGeXu+IhnouIs6k2LPk8qb70q8y86+qIaNVBjwLzMX/mZ4B7AJubhVk5hhwC3BiREz0kQJzTmbeVw0ZZdn3KT6Vei7+3nSkDLJnUwR8vdL7KMLXJwAiYjgi5k19yU8ZNNRTEbEIuB5Ym5mjTfdnNim3zF8C/LjpvjTgSOCxzNzeVv4AMA/wefokyhvCgczN35tplT+fzwFfzMzNTfenT50GPAacHhH/AGwFno2IayJiYLqLfXSiXruM4sZwfdMdmYU+AiwEbmu6Iw0YAf5xgvJWWD2oh32Zbd4PHIwjiJM5BzicYqdoTez1FHMx1gPXAt8B3k7xOG6I4m/TpAwampGImE9x05tWOcRNRPxLil/MCzLzxRq711dm8rOaoI2TgN8BvpyZ39qL3ZstFgE7Jigfq5xXm4g4DPhD4F7gzxruTt+JiGGKuRnXOMI6pSUUK70+nplry7KvlKOsF0bE1Zk56YiZj040UycBL3byioifL6+5jmJS2n/qeW+bNZOf1T8rbxZfpVjOeUGP+txvXgQGJygfqpxXRbmK4hvAc8CZ7XN+BBSrTHZSTKLV5Fr/vr7cVv7nFKtQjpnqYkc0NFOPUXzabSe2RcQvAu+lGMY9NCJa5/YDFkfELwDPZOa2vd3RPrBHP6vqNxHxWuAvgf8HvC0z5+rSu1GKxyftWmV+4nJFuUpgI7A/cMJc3XtlKuUE4o9QLNU8sPI3aQhYWP5Nej4zn2umh31lFPjXwA/bylvfL5vqYoOGZqT8w7W+0/rlDROKBNzuYOBJis27/qTrzvWZPf1ZtUTEz1GEjEHg1Mxs/0c+l2wGLoqIJW0TQo8tj1sa6FNfiogh4OvAG4BfycxsuEv96kCKR5pry1e7J8vyj/eyU33qIYoJoQcD/6dSfkh5/NFUFxs01Cv3A++aoPwLFP+g11DcTARExKuA/0rxD/sUd3XkDuA/Umzy1tpHY5BipGhTZjqiAZQrAG4FjgPekZnfbrhL/exJJv6bdDXwKorN4b7X0x71r9sp5tf9BuWk4nK1zvkUG5xN+Xvmp7eqURHxFLDZLch/VkTcCbwD+FPgf7ad/mFm/o/e96pZEXEbxcqAdRRbH59LsR/LKZm5qcm+9YuIuIFiR9Cv88rVSdsz887e92p2iYh7gAPcgvxnRcQXKbb/vwV4GHhb+bosM6+b6lpHNKT+1Poj9+vlq+pbwJwLGhTLEH+vPC4Dvgucbsj4Ga3fm18tX1V/Bxg0NFMXAH9PEfDPpXiE8qHM/Px0FzqiIUmSauPyVkmSVBuDhiRJqo1BQ5Ik1cagIUmSamPQkCRJtTFoSJKk2hg0JElSbQwakiSpNgYNSZJUG4OGJEmqzf8HUx07b+kgXjsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import random\n", "#%time x = [random.gauss(0, 1) for _ in range(N)]\n", "%time x = np.sqrt(-2 * np.log(np.random.rand(N, 1))) * np.cos(2 * np.pi * np.random.rand(N, 1))\n", "plt.figure(figsize=(8, 4))\n", "plt.hist(x, 50)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "当然……不是很快。不但是因为 Python 本身的速度,更是因为要计算好多次三角函数。NumPy 里面的 `numpy.random.randn()` 则又做了进一步的优化。代码可以见[这里](https://github.com/numpy/numpy/blob/master/numpy/random/mtrand/randomkit.c)的 `rk_gauss()` 函数。它的原理是这样的:我们要的分布是\n", "\n", "$$\n", "\\begin{aligned}\n", "X &= R \\cos(\\Theta) =\\sqrt{-2 \\ln U_1} \\cos(2 \\pi U_2)\\\\\n", "Y &= R \\sin(\\Theta) =\\sqrt{-2 \\ln U_1} \\sin(2 \\pi U_2)\n", "\\end{aligned}$$\n", "\n", "如果我们产生两个独立的均匀分布 $U_1$ 和 $U_2$,并且**抛弃单位圆之外的点**,那么 $s = U_1^2 + U_2^2$ 也是均匀分布的。为什么呢?因为 \n", "\n", "$$f_{U_1,U_2}(u,v) = \\frac{1}{\\pi}$$\n", "\n", "将坐标代换为 $r$ 和 $\\theta$,乘上一个雅各比行列式,我们前面算过了这个行列式就等于 $r$,所以:\n", "\n", "$$f_{R,\\Theta}(r, \\theta) = \\frac{r}{\\pi}$$\n", "\n", "$\\Theta$ 是均匀分布在 $[0, 2\\pi)$ 上的,所以\n", "\n", "$$f_R(r) = \\int_0^{2\\pi} f_{R,\\Theta}(r, \\theta)\\,\\mathrm{d}\\theta = 2r$$\n", "\n", "再做一次变量代换\n", " \n", "$$f_{R^2}(s) = f_R(r) \\frac{\\mathrm{d}r}{\\mathrm{d}(r^2)} = 2r \\cdot \\frac{1}{2r} = 1$$\n", "\n", "好了,既然 $s$ 也是均匀分布的,那么 $\\sqrt{-2 \\ln U_1}$ 和 $\\sqrt{-2 \\ln s}$ 就是同分布的。而又因为\n", "\n", "$$\\cos \\Theta, \\sin\\Theta = \\frac{U_1}{R}, \\frac{U_2}{R} = \\frac{U_1}{\\sqrt{s}}, \\frac{U_2}{\\sqrt{s}}$$\n", "\n", "那么\n", "\n", "$$u\\sqrt{\\frac{-2\\ln s}{s}}, v\\sqrt{\\frac{-2\\ln s}{s}}$$\n", "\n", "就是我们要找的两个独立正态分布。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 427 ms, sys: 44.7 ms, total: 472 ms\n", "Wall time: 470 ms\n" ] }, { "data": { "text/plain": [ "(array([1.10000e+01, 2.50000e+01, 5.50000e+01, 1.40000e+02, 3.29000e+02,\n", " 6.87000e+02, 1.53000e+03, 3.00600e+03, 5.89500e+03, 1.10390e+04,\n", " 1.99770e+04, 3.42110e+04, 5.69940e+04, 8.95570e+04, 1.36126e+05,\n", " 1.97685e+05, 2.74507e+05, 3.64938e+05, 4.65034e+05, 5.66482e+05,\n", " 6.64285e+05, 7.45167e+05, 7.99671e+05, 8.24947e+05, 8.13866e+05,\n", " 7.69930e+05, 6.95873e+05, 6.04436e+05, 5.01779e+05, 3.99359e+05,\n", " 3.04901e+05, 2.23912e+05, 1.55886e+05, 1.04550e+05, 6.74900e+04,\n", " 4.21350e+04, 2.46760e+04, 1.40400e+04, 7.41700e+03, 3.94100e+03,\n", " 1.90300e+03, 9.13000e+02, 4.08000e+02, 1.57000e+02, 8.90000e+01,\n", " 2.50000e+01, 9.00000e+00, 4.00000e+00, 2.00000e+00, 1.00000e+00]),\n", " array([-4.90597334, -4.6987957 , -4.49161807, -4.28444043, -4.07726279,\n", " -3.87008516, -3.66290752, -3.45572988, -3.24855224, -3.04137461,\n", " -2.83419697, -2.62701933, -2.4198417 , -2.21266406, -2.00548642,\n", " -1.79830878, -1.59113115, -1.38395351, -1.17677587, -0.96959824,\n", " -0.7624206 , -0.55524296, -0.34806533, -0.14088769, 0.06628995,\n", " 0.27346759, 0.48064522, 0.68782286, 0.8950005 , 1.10217813,\n", " 1.30935577, 1.51653341, 1.72371105, 1.93088868, 2.13806632,\n", " 2.34524396, 2.55242159, 2.75959923, 2.96677687, 3.17395451,\n", " 3.38113214, 3.58830978, 3.79548742, 4.00266505, 4.20984269,\n", " 4.41702033, 4.62419797, 4.8313756 , 5.03855324, 5.24573088,\n", " 5.45290851]),\n", " )" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%time x = np.random.randn(N)\n", "plt.figure(figsize=(8,4))\n", "plt.hist(x,50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这速度还是十分不错的(当然一大原因是 NumPy 是 C 实现的)。本来 Box-Muller 包括 Matlab 在内的各大数值软件所采用的标准正态分布生成方法,直到出现了速度更快的金字塔 (Ziggurat) 方法。NumPy 出于兼容性的考虑迟迟没有更新,导致生成随机数的速度已经落在了 Matlab 和 [Julia](https://github.com/JuliaLang/julia/blob/master/test/perf/kernel/ziggurat.jl) 后面。那么这个神奇的金字塔又是怎么回事呢?我们另开一篇细谈。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 接受—拒绝法\n", "\n", "求反变换固然还可行,但是碰到无法解析求逆的函数,用数值方法总归比较慢。下面我们就来说说另一个能够适合任何概率密度分布的方法——**接受—拒绝法** (Acceptance-Rejection Method),国内也有翻译成叫做**舍选法**的。接受—拒绝法的思路其实很简单——比如说你想要正态分布,我们就弄个方框框把它框起来,然后均匀地往里面扔飞镖。扔到曲线以下我就留着,扔到曲线以上就不要了。这样搞好以后来看,曲线之下的点就是(二维)均匀分布的。那这些点的**横坐标**就正好满足我们要的分布——高的地方的点就多,低的地方的点就少嘛。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "(-4, 4, 0, 0.5)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "import seaborn as sns\n", "sigma = 1\n", "mu = 0\n", "sns.set(style=\"dark\", palette=\"muted\", color_codes=True, font_scale=1.5)\n", "x = np.arange(-4,4,0.01)\n", "f = 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (x - mu)**2 / (2 * sigma**2) )\n", "Np = 1500\n", "px = np.random.rand(Np) * 8 - 4\n", "py = np.random.rand(Np) * 0.5\n", "pd = py < 1/(sigma * np.sqrt(2 * np.pi)) * np.exp( - (px - mu)**2 / (2 * sigma**2) )\n", "pu = np.logical_not(pd)\n", "plt.figure(figsize=(10,5))\n", "plt.plot(x, f)\n", "plt.plot(px[pu], py[pu], 'ro', px[pd], py[pd], 'go')\n", "plt.axis((-4, 4, 0, 0.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "很直观是吧?更普遍来讲,如果要生成一个概率密度为 $f(x)$ 的分布,我们可以\n", "\n", "1. 先找到一个容易抽样的辅助分布 $g(x)$(也就是框框,不一定是均匀分布啦),使得存在一个常数 $M>1$,在整个 $x$ 的定义域上都有 $f(x)\\leq Mg(x)$。\n", "2. 生成符合 $g(x)$ 分布的随机数 $x$。\n", "3. 生成一个在 $(0,1)$ 上均匀分布的随机数 $u$。\n", "4. 看看是不是满足 $u < f(x)/Mg(x) $。如果满足就保留 $x$,否则就丢弃。于是得到的 $x$ 就符合 $f(x)$ 分布。\n", "\n", "实际上这个思路就是生成一堆 $x$ 轴均匀分布,$y$ 轴在 $Mg(x)$ 之内的点,然后仅保留 $f(x)$ 曲线下的那部分,就和我们看到的这个图是一个意思。\n", "\n", "要比较严格的证明的话,我们先看看在操作中接受数据点 $x$ 的概率。由于 $u$ 是均匀分布的,所以接受概率\n", "\n", "$$\\begin{aligned}\n", "P(\\textrm{accept}) & =P\\left(U < \\frac{f(X)}{Mg(X)}\\right) \\\\\n", "&= \\mathbb{E}\\left[\\frac{f(X)}{Mg(X)}\\right]\\\\\n", "&= \\int \\frac{f(X)}{Mg(X)} g(x) \\mathrm{d}x \\\\\n", "& =\\frac{1}{M}\\int f(x)\\mathrm{d}x = \\frac{1}{M}\n", "\\end{aligned}\n", "$$\n", "\n", "也就是说能够保留数据点的概率是 $1/M$。那么利用贝叶斯法则,在接受条件下得到的分布\n", "\n", "$$\n", "\\begin{aligned}\n", "g(x|\\textrm{accept}) &= \\frac{P(\\textrm{accept}|X=x)g(x)}{P(\\textrm{accept})}\\\\\n", "&= \\frac{\\frac{f(x)}{Mg(x)}g(x)}{1/M} = f(x)\n", "\\end{aligned}$$\n", "\n", "这东西看起来很美很方便啊,但是请注意,所有的抽样中,被接受的概率只有 $1/M$,意味着如果 $M$ 很大,就有大量的采样被浪费掉了。特别是像正态分布这种尾巴很长的……要是直接用方框框的话,得浪费多少采样才能遇上一个在 $5\\sigma$ 之外的啊。为了改进算法的效率,就需要让 $g(x)$ 尽量能够贴近 $f(x)$,于是就有了这个神奇的金字塔 (Ziggurat) 方法。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ziggurat 方法\n", "\n", "Ziggurat 方法的思路其实也很直观,就是要让 $g(x)$ 尽量贴近 $f(x)$。怎么贴近呢?就像这样:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9.267114853273029e-12\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from scipy.stats import norm\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "n = 7\n", "f = lambda x : np.exp(- x * x / 2)\n", "fi = lambda f : np.sqrt(-np.log(f) * 2)\n", "def z(r):\n", " v = r * f(r) + (1 - norm.cdf(r))* np.sqrt(2 * np.pi)\n", " x = [r]\n", " for i in range(1, n):\n", " x.append(fi(v / x[i - 1] + f(x[i - 1])))\n", " return x[n - 1] *(f(0) - f(x[n - 1])) - v\n", "r = 2.33837169825 # 7\n", "print (z(r))\n", "plt.figure(figsize = (10, 10))\n", "plt.xlim(0,4)\n", "plt.ylim(0,1)\n", "xp = np.arange(0,4, 0.01)\n", "fp = 1 * np.exp( -xp ** 2 / 2 )\n", "v = r * f(r) + (1 - norm.cdf(r)) * np.sqrt(2 * np.pi)\n", "x = [r]\n", "for i in range(1, n):\n", " x += [fi(v / x[i - 1] + f(x[i - 1]))]\n", "x += [0, r]\n", "y = [f(_) for _ in x] \n", "plt.plot(xp, fp)\n", "plt.plot(x, y, 'ro')\n", "for i in range(n + 1):\n", " plt.axhline(y=y[i], xmin=0, xmax=x[i - 1]/4, linewidth=1, color='r')\n", " plt.axvline(x=x[i], ymin=y[i], ymax=y[i + 1], linewidth=1, color='r')\n", " plt.axvline(x=x[i], ymin=y[i], ymax=y[i + 1], linewidth=1, color='r')\n", " plt.axvline(x=x[i], ymin=y[i - 1], ymax=y[i], linewidth=1, color='r', ls = '--')\n", " plt.annotate('x', xy = (x[i], y[i]), xytext=(x[i]+0.03, y[i] + 0.01), style='italic', size = 14)\n", " plt.annotate(str(i), xy = (x[i], y[i]), xytext=(x[i]+0.09, y[i] + 0.005), style='normal', size = 10)\n", "plt.axvline(x=x[0], ymin=0, ymax=y[0], linewidth=1, color='r', ls = '--')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "是不是像一个有阶梯的金字塔?Ziggurat 这个词最初是说苏美尔人建的金字塔,但是其实玛雅人造的那个奇琴伊察的金字塔看起来也差不多……我前两年去的时候还画了一幅画就像这样\n", "\n", "![](http://www.jlao.net/wp-content/uploads/2012/12/cancun3.png)\n", "\n", "跑题了……为了计算方便起见,我们生成的是 $e^{-x^2/2}$ 而不是原始的正态分布。首先把图形分成好多个(一般实际中用 128 个或 256 个)阶梯一样的长方块,每个长方块的面积都是相等的,并且还和最下面的带长长的尾巴的这一条的面积相等。这些点的位置……只能靠数值方法了。习惯上把 $x_0$ 的位置叫做参数 $r$,那最下面一块的面积 $v$ 就是虚线左边的长方形面积加上尾巴:\n", "\n", "$$v = r\\cdot f(r) + \\int_r ^\\infty f(x) \\mathrm{d} x$$\n", "\n", "先假定一个 $r$ 值,求出 $v$ 后逐个求到最上面一个 $x_{n-1}$ 的位置,如果最上面一块面积不是 $v$ 再调整 $r$ 直到各块面积相等。\n", "\n", "这些块块分好了以后怎么办呢?先不考虑尾巴,它是这样操作的:\n", "\n", "1. 随机选定一层 $0 \\leq i < n$;\n", "2. 产生一个 $[0,1]$ 的均匀分布的随机数 $U_0$,令 $x = U_0x_i$,也就是随机产生一个均匀分布在实线框中的 $x$ 值。\n", "3. 如果 $x < x_{i+1}$,也就是落在虚线框内,那肯定就在图形之内啦,直接返回 $x$。\n", "4. 否则,那就是落在虚线和实现之间的部分,必须要做个判定了。在这个小框框中随机产生一个 $y$,即先产生一个均匀分布的 $U_1$,令 $y = y_i + U_1(y_{i+1}-y_i)$。\n", "5. 如果 $y x^2$ 就可以返回 $x + r$。\n", "\n", "这个方法好就好在,分块的多少只影响速度,不影响精度——因为在每一块中都是经过接受—拒绝的,所以生成的是精确的正态分布,哪怕只用这 8 块也可以。\n", "\n", "原始代码可以看[这里](http://www.jstatsoft.org/article/downloadSuppFile/v005i08/rnorrexp.c),基本思路就是上面说的这些,程序里面用了 SHR3 随机数生成器来生成均匀分布的 32 位整数,把所有需要用于比较的分划点都算好后存起来,并且用了一些位操作来提高效率。我把它移植到了 Python 上,配合 NumPy 使用,可以去 [GitHub](https://github.com/jameslao/zignor-python) 上下载,或者直接 `pip install zignor` 就可以啦!\n", "\n", "来看下速度" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 93.1 ms\n" ] }, { "data": { "text/plain": [ "NormaltestResult(statistic=1.1365384917237324, pvalue=0.56650507170017939)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import zignor\n", "import scipy.stats as stats\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "N = 10**7\n", "%time x = zignor.randn(N)\n", "plt.figure(figsize=(8,4))\n", "plt.hist(x,100)\n", "stats.normaltest(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "比 Box-Muller 变换快了四倍呢!哇咔咔咔~" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 4 }