├── latex-learning.md ├── anaconda-usage.md ├── README.md └── kata └── make_a_fair_coin_from_a_biased_coin.ipynb /latex-learning.md: -------------------------------------------------------------------------------- 1 | # `Latex`公式编写学习 2 | 3 | - 入门介绍 4 | - [一份其实很短的 LaTeX 入门文档](https://liam.page/2014/09/08/latex-introduction/) 5 | - [Mathjax与LaTex公式简介 | Hoocoln个人博客](http://3iter.com/2015/10/14/Mathjax%E4%B8%8ELaTex%E5%85%AC%E5%BC%8F%E7%AE%80%E4%BB%8B/) 6 | - 实践注意 7 | - [Latex书写误区|Huan Li's Blog](https://longaspire.github.io/blog/Latex%E4%B9%A6%E5%86%99%E8%AF%AF%E5%8C%BA/) 8 | - [关于各种竖线 | (不在乎细节的可以略过本贴)](http://kuing.orzweb.net/archiver/?tid-139.html) 9 | - 常见需求/问题 10 | - 换行/对齐/编号 11 | - [Latex 公式换行问题(换行,等号对齐)- CSDN博客](https://blog.csdn.net/leichaoaizhaojie/article/details/53463598) 12 | - [Markdown下LaTeX公式、编号、对齐 - 作业部落 Cmd Markdown 编辑阅读器](https://www.zybuluo.com/fyywy520/note/82980) 13 | - 上下界排版方式 14 | - [LaTeX技巧108:求和、LaTeX技巧108:求和、积分号的上下界问题 - 新浪博客](http://blog.sina.com.cn/s/blog_5e16f1770100g7l5.html) 15 | -------------------------------------------------------------------------------- /anaconda-usage.md: -------------------------------------------------------------------------------- 1 | # `Anaconda`的使用 2 | 3 | ----------------------------- 4 | 5 | 6 | 7 | 8 | 9 | - [1. 常见的`Anaconda`使用](#1-%E5%B8%B8%E8%A7%81%E7%9A%84anaconda%E4%BD%BF%E7%94%A8) 10 | - [2. 环境维护](#2-%E7%8E%AF%E5%A2%83%E7%BB%B4%E6%8A%A4) 11 | - [2.0 环境维护的基本原则/最佳实践](#20-%E7%8E%AF%E5%A2%83%E7%BB%B4%E6%8A%A4%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%8E%9F%E5%88%99%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5) 12 | - [2.1 典型的环境](#21-%E5%85%B8%E5%9E%8B%E7%9A%84%E7%8E%AF%E5%A2%83) 13 | - [data science python 3.7](#data-science-python-37) 14 | - [data science python 3.7 with R](#data-science-python-37-with-r) 15 | - [data science python 2.7 with R](#data-science-python-27-with-r) 16 | - [2.2 用于学习的环境](#22-%E7%94%A8%E4%BA%8E%E5%AD%A6%E4%B9%A0%E7%9A%84%E7%8E%AF%E5%A2%83) 17 | - [书《深入浅出数据科学》学习环境](#%E4%B9%A6%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E5%AD%A6%E4%B9%A0%E7%8E%AF%E5%A2%83) 18 | - [2.3 用于安装`Python`工具的环境](#23-%E7%94%A8%E4%BA%8E%E5%AE%89%E8%A3%85python%E5%B7%A5%E5%85%B7%E7%9A%84%E7%8E%AF%E5%A2%83) 19 | - [`Daily Tools`](#daily-tools) 20 | - [3. 更多说明参见](#3-%E6%9B%B4%E5%A4%9A%E8%AF%B4%E6%98%8E%E5%8F%82%E8%A7%81) 21 | 22 | 23 | 24 | ----------------------------- 25 | 26 | # 1. 常见的`Anaconda`使用 27 | 28 | - 管理环境 29 | - 创建新环境:`conda create --name ` 30 | - 安装`Python 2`:`conda create --name foo_env_name python=2.7` 31 | - 安装`Python 3`:`conda create --name bar_env_name python=3.7` 32 | - 切换环境:`source activate ` 33 | - 退出环境:`conda deactivate` / `source deactivate` 34 | - 显示已创建环境:`conda info --envs` / `conda env list` 35 | - 复制环境:`conda create --name --clone ` 36 | - 删除环境:`conda remove --name --all` 37 | - 管理包 38 | - 查找可供安装的包版本 39 | - `conda search ` 40 | - `conda search --full-name ` 41 | - 获取当前环境中已安装的包信息:`conda list` 42 | - 安装包: 43 | - 在当前环境中安装包:`conda install ` 44 | - 在指定环境中安装包:`conda install --name ` 45 | - 当使用`conda install`无法进行安装时,可以使用`pip`进行安装。 46 | - `pip install ` 47 | - 更新包: 48 | - 更新所有包:`conda update --all` / `conda upgrade --all` 49 | - 更新指定包:`conda update ` / `conda upgrade ` 50 | - 卸载包: 51 | - `conda remove ` 52 | - `conda remove --name ` 53 | - 更新`Anaconda`自身: 54 | - `conda update conda` 55 | - `conda update anaconda` 56 | 57 | # 2. 环境维护 58 | 59 | ## 2.0 环境维护的基本原则/最佳实践 60 | 61 | - `Base`环境完全不动。 62 | - 不要搞坏`Anaconda`本身 😂 63 | - 提供典型的环境。 64 | - 比如 `Python 3`、`Python 2`的数据科学环境。 65 | - 如果 一个开发工程 或 一个学习主题(如学习一本书)有典型环境不满足的需求(比如要安装一个特有的包),则为它创建一个独立的环境。 66 | - 不要搞坏典型的环境 😂 67 | - 日常工具的环境。 68 | 69 | 相关资料: 70 | 71 | - https://stackoverflow.com/questions/24405561/how-to-install-2-anacondas-python-2-and-3-on-mac-os 72 | 73 | ## 2.1 典型的环境 74 | 75 | ### data science python 3.7 76 | 77 | ```sh 78 | conda create --name ds python=3.7.4 anaconda gensim tensorflow pymc3 && 79 | source activate ds 80 | ``` 81 | 82 | ### data science python 3.7 with R 83 | 84 | ```sh 85 | conda create --name dsr python=3.7.4 anaconda gensim tensorflow pymc3 r-base=3.6.1 r-essentials r-rbokeh && 86 | source activate dsr 87 | ``` 88 | 89 | - 安装上了`R`的运行环境 90 | - 同时在`Jupyter Notebook`也支持上了`R` 😻 91 | 92 | ### data science python 2.7 with R 93 | 94 | ```sh 95 | conda create --name ds2r python=2.7.17 anaconda gensim tensorflow pymc r-base=3.6.1 r-essentials r-rbokeh && 96 | source activate ds2r 97 | ``` 98 | 99 | ## 2.2 用于学习的环境 100 | 101 | ### 书《深入浅出数据科学》学习环境 102 | 103 | ```sh 104 | conda create -n Principles-of-Data-Science python=2.7 anaconda && 105 | source activate Principles-of-Data-Science 106 | ``` 107 | 108 | - 《深入浅出数据科学》的豆瓣链接:https://book.douban.com/subject/30338984/ 109 | - 代码库: https://github.com/PacktPublishing/Principles-of-Data-Science 110 | 111 | ## 2.3 用于安装`Python`工具的环境 112 | 113 | ### `Daily Tools` 114 | 115 | 用于日常工具的环境。 116 | 117 | ```sh 118 | conda create --name daily-tools python=3.7 && 119 | source activate daily-tools && 120 | pip install git-up 121 | ``` 122 | 123 | # 3. 更多说明参见 124 | 125 | - [Anaconda介绍、安装及使用教程](https://zhuanlan.zhihu.com/p/32925500) 126 | - [用 Anaconda 完美解决 Python2 和 python3 共存问题](https://foofish.net/compatible-py2-and-py3.html) 127 | - [Updating from older versions — Anaconda documentation](https://docs.anaconda.com/anaconda/install/update-version/) 128 | - [Keeping Anaconda Up To Date - Anaconda](https://www.anaconda.com/keeping-anaconda-date/) 129 | - [Using R language with Anaconda — Anaconda documentation](https://docs.anaconda.com/anaconda/user-guide/tasks/using-r-language/) 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 数据科学实践 2 | 3 | **数据科学** 是指 4 | 5 | 1. **数学/统计学** 6 | 1. **计算机技术(编程)** 7 | 1. **业务领域** 8 | 9 | 三者的交叉应用学科。数据科学这个词近些年火起来,典型事件是2015年2月美国白宫宣布任命曾在多家硅谷科技公司任职的帕蒂尔(_DJ Patil_)为白宫首位首席数据科学家。 10 | 11 | 数据科学3者下的两两交叉应用,其实已经广为大家所知: 12 | 13 | 1. 数学/统计学 **`+`** 计算机技术(编程) 14 | **`=>`** **机器学习**(Bang!) 15 | 1. 计算机技术(编程) **`+`** 业务领域 16 | **`=>`** **业务软件开发**(平时说的软件工程师) 17 | 1. 数学/统计学 **`+`** 业务领域 18 | **`=>`** **传统研究** 19 | 20 | 在数据科学火起来之前,大家用的多是『数据分析』这个词。所以2个主题的书一起看,早些年典型的『数据分析』主题的书实际讲的是数据科学的内容。 21 | 22 | ❤️❤️ 23 | 欢迎进入数据科学的世界! 24 | ❤️❤️ 25 | 26 | ----------------------------- 27 | 28 | 29 | 30 | 31 | 32 | - [0. 学习资料/书单](#0-%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99%E4%B9%A6%E5%8D%95) 33 | - [1. 实践/开发环境搭建](#1-%E5%AE%9E%E8%B7%B5%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA) 34 | - [1.1 `Python`运行环境搭建](#11-python%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA) 35 | - [1.1.1 安装`Anaconda`的`Python`发行版](#111-%E5%AE%89%E8%A3%85anaconda%E7%9A%84python%E5%8F%91%E8%A1%8C%E7%89%88) 36 | - [1.1.2 配置镜像源](#112-%E9%85%8D%E7%BD%AE%E9%95%9C%E5%83%8F%E6%BA%90) 37 | - [1.1.3 `Anaconda`的使用](#113-anaconda%E7%9A%84%E4%BD%BF%E7%94%A8) 38 | - [1.2 代码编写的环境](#12-%E4%BB%A3%E7%A0%81%E7%BC%96%E5%86%99%E7%9A%84%E7%8E%AF%E5%A2%83) 39 | - [1.2.1 `Jupyter Notebook`](#121-jupyter-notebook) 40 | - [1.2.2 `PyCharm`](#122-pycharm) 41 | - [1.2.3 `VS Code`](#123-vs-code) 42 | - [2. 自己的数据科学学习/实践](#2-%E8%87%AA%E5%B7%B1%E7%9A%84%E6%95%B0%E6%8D%AE%E7%A7%91%E5%AD%A6%E5%AD%A6%E4%B9%A0%E5%AE%9E%E8%B7%B5) 43 | 44 | 45 | 46 | ----------------------------- 47 | 48 | 49 | # 0. 学习资料/书单 50 | 51 | - [数据科学/Data Science](https://www.douban.com/doulist/119731263/) 书单,个人推荐先看: 52 | - [深入浅出数据科学](https://book.douban.com/subject/30338984/) 53 | - [集体智慧编程](https://book.douban.com/subject/3288908/) 54 | - [Python数据科学手册](https://book.douban.com/subject/27667378/) 55 | - [数据分析](https://www.douban.com/doulist/45963852/) 书单,个人推荐先看: 56 | - [精益数据分析](https://book.douban.com/subject/26278639/) 57 | - [利用Python进行数据分析 原书第2版](https://book.douban.com/subject/30283996/) 58 | 59 | 可以看看了解 60 | 61 | - [数据分析师和数据科学家有何区别? - 知乎](https://www.zhihu.com/question/20935297) 62 | 63 | # 1. 实践/开发环境搭建 64 | 65 | `Python`已经成为数据科学/机器学习的首选实践/开发环境。 66 | \# 当然也可以使用`R` 或是 `Excel`,使用不同工具环境都可以实践数据科学。 67 | \# `Excel`,是的,没听错;`Excel`应该是使用人数最多的数据分析工具。 68 | 69 | - `Python`繁荣与活跃生态 对 数据科学/机器学习 已经有了成熟的支持。 70 | - `Python`作为通用编程语言,相对`R`、`Excel`而言,灵活性不可比拟。 71 | 72 | ## 1.1 `Python`运行环境搭建 73 | 74 | **_`Anaconda`_**! 75 | 76 | - 使用[`Anaconda`的`Python`发行版](https://www.anaconda.com/)已经成为数据科学/机器学习`Python`运行环境搭建的最佳实践! 77 | - `Anaconda`快速提供了 78 | - 一个包含各种数据分析、机器学习的库的`Python`运行环境 79 | - 不同的`Python`版本/不同库的隔离环境 80 | - 而无需在琐碎但没有价值的事情上浪费时间: 81 | - 各种库的安装过程 82 | - 不同库不同版本的兼容性问题 83 | 84 | 下面给下快速搭建数据科学/机器学习的`Python`运行环境的说明。 85 | 86 | ### 1.1.1 安装`Anaconda`的`Python`发行版 87 | 88 | 下载地址: 89 | 90 | - https://www.anaconda.com/distribution/ 91 | - 照着网页上的说明,完成安装。 92 | 93 | 安装好`Anaconda`之后,执行命令 94 | 95 | - `jupyter notebook`: 运行基于`Web`浏览器里的一体化交互式环境 96 | - `ipython`:运行加强的`python`解释器 97 | 98 | ,运行看看~ 🎉 99 | 100 | 安装过程,如有问题,更多说明参见 101 | 102 | - 2019年最新最全的 Anaconda 安装指南 - 简书 103 | https://www.jianshu.com/p/e23e70fe8788 104 | - 或是搜索一下 :") 105 | 106 | ### 1.1.2 配置镜像源 107 | 108 | 在国内没有镜像可不行,包安装下载要等死。 109 | 110 | - 配置`Anaconda`的镜像源 111 | - 使用清华的镜像。 112 | - 直接修改配置文件`~/.condarc`: 113 | 114 | ```yaml 115 | channels: 116 | - defaults 117 | show_channel_urls: true 118 | default_channels: 119 | - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main 120 | - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free 121 | - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r 122 | custom_channels: 123 | conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud 124 | msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud 125 | bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud 126 | menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud 127 | pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud 128 | simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud 129 | ``` 130 | 131 | - 或是通过命令行设置(安装好`Anaconda`之后,包含了`conda`): 132 | 133 | ```clj 134 | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ 135 | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 136 | conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r 137 | conda config --set show_channel_urls yes 138 | ``` 139 | 140 | - 配置`pip`的镜像源 141 | - 修改`~/.pip/pip.conf`: 142 | 143 | ```ini 144 | [global] 145 | trusted-host = pypi.douban.com 146 | index-url = http://pypi.douban.com/simple 147 | ``` 148 | 149 | 如有问题,更多说明参见 150 | 151 | - Anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 152 | https://mirror.tuna.tsinghua.edu.cn/help/anaconda/ 153 | - `Anaconda`修改国内镜像源 - 简书 154 | https://www.jianshu.com/p/042fd657e2d4 155 | - 或是 搜索一下 :") 156 | 157 | ### 1.1.3 `Anaconda`的使用 158 | 159 | 下载安装后`Anaconda`的使用: 160 | 161 | - 常见的`Anaconda`使用 162 | - `Python`环境维护 163 | 164 | 👉 参见独立的文档:[`Anaconda`的使用](anaconda-usage.md)。 165 | 166 | ## 1.2 代码编写的环境 167 | 168 | `Jupyter Notebook` | `PyCharm` | `VS Code`。 169 | 170 | ### 1.2.1 `Jupyter Notebook` 171 | 172 | `Jupyter Notebook`已经在`Anaconda`的发行版本中有了。 173 | 174 | 提供基于`Web`浏览器里的一体化交互式环境,非常流行。试试用用,你会喜欢的。 175 | 176 | ### 1.2.2 `PyCharm` 177 | 178 | `IDE`王者`JetBrains`提供`Python`开发的专业`IDE`。 179 | 180 | - 强劲的代码编写提示支持 181 | - 内置集成支持 182 | - 流行`Jupyter Notebook`的编写 183 | - `Anaconda` 184 | 185 | 如果你是`JetBrains`/`IntelliJ`的粉丝更会喜欢。 186 | 187 | ### 1.2.3 `VS Code` 188 | 189 | 无需多解释。 190 | 191 | # 2. 自己的数据科学学习/实践 192 | 193 | - 学习 194 | - 《统计学:从数据到结论》第四版 _吴喜之_: 195 | [代码练习库 - github.com/oldratlee/statistics-from-data-to-conclusion-4e](https://github.com/oldratlee/statistics-from-data-to-conclusion-4e) 196 | 197 | - 实践 198 | - 计数不对的『豆瓣豆列』抓取: 199 | [github.com/oldratlee/doulist-wrong-counter-analysis](https://github.com/oldratlee/doulist-wrong-counter-analysis) 200 | 基于`Jupyter Notebook`使用`Python`完成 页面抓取 与 分析。 201 | -------------------------------------------------------------------------------- /kata/make_a_fair_coin_from_a_biased_coin.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 如何 利用有偏的硬币作出无偏的决策?\n", 8 | "\n", 9 | "[概率导论(第2版·修订版)](https://book.douban.com/subject/26694188/)的第1章习题33(P55): \n", 10 | "利用有偏的硬币作出无偏的决策。\n", 11 | "\n", 12 | "题目说明如下:\n", 13 | "\n", 14 | "33\\. 利用有偏的硬币作出无偏的决策。爱丽丝和鲍勃想利用一枚均匀的硬币来决定他们去看歌剧还是看电影。 \n", 15 | "不幸的是,他们只有一枚有偏的硬币(而且他们并不知道偏的程度)。 \n", 16 | "怎样利用一枚有偏的硬币作出无偏的决策,即以1/2的概率看电影,1/2的概率看歌剧呢?\n", 17 | "\n", 18 | "-----------------------\n", 19 | "\n", 20 | "网上的一些讨论:\n", 21 | "\n", 22 | "- [利用有偏硬币做出无偏决策 - niudong - 博客园](https://www.cnblogs.com/andyniu/p/7398901.html)\n", 23 | "- [一些有趣的概率问题 - 有偏硬币做出无偏决策 | 零一人生](http://chengfeng96.com/blog/2019/02/25/%E4%B8%80%E4%BA%9B%E6%9C%89%E8%B6%A3%E7%9A%84%E6%A6%82%E7%8E%87%E9%97%AE%E9%A2%98/#%E6%9C%89%E5%81%8F%E7%A1%AC%E5%B8%81%E5%81%9A%E5%87%BA%E6%97%A0%E5%81%8F%E5%86%B3%E7%AD%96)\n", 24 | "- [Make a fair coin from a biased coin - GeeksforGeeks](https://www.geeksforgeeks.org/print-0-and-1-with-50-probability/)\n", 25 | "\n", 26 | "# 1. 解法思路说明\n", 27 | "\n", 28 | "偏的硬币有偏的硬币,且不知道偏的程度,是指 \n", 29 | "\n", 30 | "- 抛掷出 正面($H (Head)$)向上 / 反面($T (Tail)$)向上 的概率不是 $1/2$。\n", 31 | "- 令正面向上的概率是 $p \\in (0, 1)$,即 $P(H) = p$\n", 32 | " - 则反面向上的概率是 $1 - p$, ,即 $P(T) = 1 - p$。\n", 33 | "- 但不知道$p$具体值是多少。\n", 34 | "\n", 35 | "如果连续抛2次,实验结果及其概率分布列是:\n", 36 | "\n", 37 | "实验结果: | $(H, H)$ | $(H, T)$ | $(T, H)$ | $(T, T)$\n", 38 | "---------- | --------- | ------- | -------| -------\n", 39 | "概率: | $p^2$ | $p(1-p)$ | $(1-p)p$ | $(1-p)^2$\n", 40 | "\n", 41 | "可以发现 实验结果 $(H, T)$ 与 $(T, H)$ 概率相等,都是 $p(1-p)$,与$p$的具体值无关。\n", 42 | "\n", 43 | "利用这一点,可以得到一个 $1/2$ 的概率:\n", 44 | "\n", 45 | "在观察到$(H, T)$ 与 $(T, H)$的条件下,出现$(H, T)$ 或 $(T, H)$的概率是$1/2$。\n", 46 | "\n", 47 | "即 下面的条件概率 是 $1/2$:\n", 48 | "\n", 49 | "$P\\big((H, T) \\mid \\{(H, T), (T, H)\\}\\big) = P\\big((T, H) \\mid \\{(H, T), (T, H)\\}\\big) = 1/2$\n", 50 | "\n", 51 | "## 2. 题目答案:利用有偏的硬币作出无偏的决策的操作过程\n", 52 | "\n", 53 | "抛掷2次硬币,以抛掷结果来决定是看歌剧还是看电影。\n", 54 | "\n", 55 | "- 如果结果是 $(H, H)$ 或 $(T, T)$ 则 不算,重新抛掷;\n", 56 | "- 如是结果是 $(H, T)$,则 看歌剧;\n", 57 | "- 如是结果是 $(T, H)$,则 看电影。\n", 58 | "\n", 59 | "# 3. 通过代码实现及其运行结果验证答案的正确性\n", 60 | "\n", 61 | "## 3.1 代码实现" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 1, 67 | "metadata": { 68 | "pycharm": { 69 | "is_executing": false, 70 | "name": "#%%\n" 71 | } 72 | }, 73 | "outputs": [], 74 | "source": [ 75 | "H = True\n", 76 | "T = False\n", 77 | "\n", 78 | "import numpy as np\n", 79 | "\n", 80 | "def count_decision(throw_coin_sequence):\n", 81 | " \"\"\"\n", 82 | " :param throw_coin_sequence: 抛掷硬币的结果序列\n", 83 | " :return: 返回决策结果,元组`(决策1/HT的次数, 决策2/TH的次数)`\n", 84 | " \"\"\"\n", 85 | " ht_count = 0 # 决策1/HT的次数\n", 86 | " th_count = 0 # 决策2/TH的次数\n", 87 | " \n", 88 | " idx = 0 \n", 89 | " for _ in throw_coin_sequence:\n", 90 | " if idx % 2 == 1: # 只处理第二次的情况,形成2次抛掷一组的观察\n", 91 | " if throw_coin_sequence[idx] == throw_coin_sequence[idx - 1]:\n", 92 | " # 如果结果是 (H, H) 或 (T, T) 则 不算,重新抛掷\n", 93 | " pass\n", 94 | " elif throw_coin_sequence[idx - 1] == H:\n", 95 | " ht_count += 1\n", 96 | " else: th_count +=1\n", 97 | "\n", 98 | " idx += 1\n", 99 | " \n", 100 | " return ht_count, th_count\n", 101 | "\n", 102 | "\n", 103 | "# Unit Test\n", 104 | "\n", 105 | "assert count_decision([H, H]) == (0, 0) # (H,H),不算作废\n", 106 | "assert count_decision([H]) == (0, 0)\n", 107 | "assert count_decision([T, T]) == (0, 0) # (T,T),不算作废\n", 108 | "assert count_decision([T]) == (0, 0)\n", 109 | "\n", 110 | "assert count_decision([H, T]) == (1, 0)\n", 111 | "assert count_decision([T, H]) == (0, 1)\n", 112 | "\n", 113 | "assert count_decision([\n", 114 | " H, H, # (H,H),不算作废\n", 115 | " H, T,\n", 116 | " T, T, # (T,T),不算作废\n", 117 | " T, H\n", 118 | "]) == (1, 1)" 119 | ] 120 | }, 121 | { 122 | "cell_type": "markdown", 123 | "metadata": { 124 | "pycharm": { 125 | "name": "#%% md\n" 126 | } 127 | }, 128 | "source": [ 129 | "## 3.2 生成大量的测试数据(1百万次抛掷硬币的结果序列)" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": 2, 135 | "metadata": { 136 | "pycharm": { 137 | "is_executing": false, 138 | "name": "#%%\n" 139 | } 140 | }, 141 | "outputs": [ 142 | { 143 | "data": { 144 | "text/plain": [ 145 | "array([False, False, True, ..., False, True, True])" 146 | ] 147 | }, 148 | "execution_count": 2, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": [ 154 | "p = 1. / 3. # 硬币正面向上的概率 P(H) = 1/3\n", 155 | "\n", 156 | "x = np.random.rand(1_000_000) < p\n", 157 | "\n", 158 | "x" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": { 164 | "pycharm": { 165 | "name": "#%% md\n" 166 | } 167 | }, 168 | "source": [ 169 | "## 3.3 验证生成数据" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 3, 175 | "metadata": { 176 | "pycharm": { 177 | "is_executing": false, 178 | "name": "#%%\n" 179 | } 180 | }, 181 | "outputs": [ 182 | { 183 | "data": { 184 | "text/plain": [ 185 | "0.334423" 186 | ] 187 | }, 188 | "execution_count": 3, 189 | "metadata": {}, 190 | "output_type": "execute_result" 191 | } 192 | ], 193 | "source": [ 194 | "delta = 0.01\n", 195 | "\n", 196 | "head_frequency = sum(x) / len(x)\n", 197 | "\n", 198 | "assert p - delta < head_frequency < p + delta\n", 199 | "\n", 200 | "head_frequency" 201 | ] 202 | }, 203 | { 204 | "cell_type": "markdown", 205 | "metadata": { 206 | "pycharm": { 207 | "name": "#%% md\n" 208 | } 209 | }, 210 | "source": [ 211 | "## 3.4 验证答案是正确的,即决策是公平的" 212 | ] 213 | }, 214 | { 215 | "cell_type": "code", 216 | "execution_count": 4, 217 | "metadata": { 218 | "pycharm": { 219 | "is_executing": false, 220 | "name": "#%%\n" 221 | } 222 | }, 223 | "outputs": [ 224 | { 225 | "data": { 226 | "text/plain": [ 227 | "(0.4992455396756046, 110839, 222013)" 228 | ] 229 | }, 230 | "execution_count": 4, 231 | "metadata": {}, 232 | "output_type": "execute_result" 233 | } 234 | ], 235 | "source": [ 236 | "decisions = count_decision(x)\n", 237 | "\n", 238 | "ht_frequency_ratio = decisions[0] / sum(decisions)\n", 239 | "\n", 240 | "assert 0.5 - delta < ht_frequency_ratio < 0.5 + delta \n", 241 | "\n", 242 | "ht_frequency_ratio, decisions[0], sum(decisions)" 243 | ] 244 | }, 245 | { 246 | "cell_type": "markdown", 247 | "metadata": {}, 248 | "source": [ 249 | "# 4 是不是可以变化操作流程,简化一些呢?简化流程之后还是正确的流程吗?" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": 5, 255 | "metadata": { 256 | "pycharm": { 257 | "is_executing": false, 258 | "name": "#%%\n" 259 | } 260 | }, 261 | "outputs": [], 262 | "source": [ 263 | "def count_flipped(xs):\n", 264 | " tf_count = 0\n", 265 | " ft_count = 0\n", 266 | " \n", 267 | " seq_start = True\n", 268 | " v = True\n", 269 | " for x in xs:\n", 270 | " if seq_start:\n", 271 | " seq_start = False\n", 272 | " v = x\n", 273 | " continue\n", 274 | "\n", 275 | " if v == x:\n", 276 | " continue\n", 277 | " else:\n", 278 | " seq_start = True\n", 279 | " \n", 280 | " if v : tf_count += 1\n", 281 | " else: ft_count += 1\n", 282 | " \n", 283 | " return tf_count, ft_count" 284 | ] 285 | }, 286 | { 287 | "cell_type": "code", 288 | "execution_count": 6, 289 | "metadata": { 290 | "pycharm": { 291 | "is_executing": false, 292 | "name": "#%%\n" 293 | } 294 | }, 295 | "outputs": [ 296 | { 297 | "data": { 298 | "text/plain": [ 299 | "(0, 0)" 300 | ] 301 | }, 302 | "execution_count": 6, 303 | "metadata": {}, 304 | "output_type": "execute_result" 305 | } 306 | ], 307 | "source": [ 308 | "count_flipped([True])" 309 | ] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": 7, 314 | "metadata": { 315 | "pycharm": { 316 | "is_executing": false, 317 | "name": "#%%\n" 318 | } 319 | }, 320 | "outputs": [ 321 | { 322 | "data": { 323 | "text/plain": [ 324 | "((1, 0), (1, 0), (1, 0))" 325 | ] 326 | }, 327 | "execution_count": 7, 328 | "metadata": {}, 329 | "output_type": "execute_result" 330 | } 331 | ], 332 | "source": [ 333 | "count_flipped([True, False]), \\\n", 334 | "count_flipped([True,True,True, False]), \\\n", 335 | "count_flipped([True,True, False, True])" 336 | ] 337 | }, 338 | { 339 | "cell_type": "code", 340 | "execution_count": 8, 341 | "metadata": { 342 | "pycharm": { 343 | "is_executing": false, 344 | "name": "#%%\n" 345 | } 346 | }, 347 | "outputs": [ 348 | { 349 | "data": { 350 | "text/plain": [ 351 | "((0, 1), (0, 1))" 352 | ] 353 | }, 354 | "execution_count": 8, 355 | "metadata": {}, 356 | "output_type": "execute_result" 357 | } 358 | ], 359 | "source": [ 360 | "count_flipped([False, True]), count_flipped([False, False, True])" 361 | ] 362 | }, 363 | { 364 | "cell_type": "code", 365 | "execution_count": 9, 366 | "metadata": { 367 | "pycharm": { 368 | "is_executing": false, 369 | "name": "#%%\n" 370 | } 371 | }, 372 | "outputs": [ 373 | { 374 | "data": { 375 | "text/plain": [ 376 | "(1, 1)" 377 | ] 378 | }, 379 | "execution_count": 9, 380 | "metadata": {}, 381 | "output_type": "execute_result" 382 | } 383 | ], 384 | "source": [ 385 | "count_flipped([True,True,False, False, False, True])" 386 | ] 387 | }, 388 | { 389 | "cell_type": "code", 390 | "execution_count": 10, 391 | "metadata": { 392 | "pycharm": { 393 | "is_executing": false, 394 | "name": "#%%\n" 395 | } 396 | }, 397 | "outputs": [ 398 | { 399 | "data": { 400 | "text/plain": [ 401 | "0.33521180889160623" 402 | ] 403 | }, 404 | "execution_count": 10, 405 | "metadata": {}, 406 | "output_type": "execute_result" 407 | } 408 | ], 409 | "source": [ 410 | "r = count_flipped(x)\n", 411 | "\n", 412 | "r[0] / sum(r)" 413 | ] 414 | }, 415 | { 416 | "cell_type": "markdown", 417 | "metadata": {}, 418 | "source": [ 419 | "## 参考资料\n", 420 | "\n", 421 | "- [在条件概率中,|应该写为\\mid - Latex书写误区|Huan Li's Blog](https://longaspire.github.io/blog/Latex%E4%B9%A6%E5%86%99%E8%AF%AF%E5%8C%BA/)" 422 | ] 423 | } 424 | ], 425 | "metadata": { 426 | "kernelspec": { 427 | "display_name": "Python 3", 428 | "language": "python", 429 | "name": "python3" 430 | }, 431 | "language_info": { 432 | "codemirror_mode": { 433 | "name": "ipython", 434 | "version": 3 435 | }, 436 | "file_extension": ".py", 437 | "mimetype": "text/x-python", 438 | "name": "python", 439 | "nbconvert_exporter": "python", 440 | "pygments_lexer": "ipython3", 441 | "version": "3.7.3" 442 | }, 443 | "pycharm": { 444 | "stem_cell": { 445 | "cell_type": "raw", 446 | "metadata": { 447 | "collapsed": false 448 | }, 449 | "source": [] 450 | } 451 | } 452 | }, 453 | "nbformat": 4, 454 | "nbformat_minor": 2 455 | } 456 | --------------------------------------------------------------------------------