├── .gitignore ├── .nojekyll ├── CNAME ├── Dockerfile ├── LICENSE ├── NAV.md ├── README.md ├── SUMMARY.md ├── asset ├── back-to-top.css ├── back-to-top.js ├── dark-mode.css ├── dark-mode.js ├── docsify-apachecn-footer.js ├── docsify-baidu-push.js ├── docsify-baidu-stat.js ├── docsify-clicker.js ├── docsify-cnzz.js ├── docsify-copy-code.min.js ├── docsify-quick-page.css ├── docsify-quick-page.js ├── docsify-sidebar-collapse.min.js ├── docsify.min.js ├── edit.css ├── edit.js ├── edit.svg ├── left.svg ├── moon.svg ├── prism-darcula.css ├── prism-python.min.js ├── right.svg ├── search.min.js ├── share.css ├── share.js ├── share.svg ├── sidebar.min.css ├── style.css ├── sun.svg ├── up.svg └── vue.css ├── docs ├── 1.md ├── 2.md ├── 3.md ├── 4.md ├── 5.md ├── 6.md ├── 7.1.md ├── 7.10.md ├── 7.11.md ├── 7.12.md ├── 7.13.md ├── 7.14.md ├── 7.15.md ├── 7.2.md ├── 7.3.md ├── 7.4.md ├── 7.5.md ├── 7.6.md ├── 7.7.md ├── 7.8.md ├── 7.9.md ├── 7.md ├── 8.1.md ├── 8.10.md ├── 8.11.md ├── 8.12.md ├── 8.13.md ├── 8.14.md ├── 8.15.md ├── 8.16.md ├── 8.17.md ├── 8.2.md ├── 8.3.md ├── 8.4.md ├── 8.5.md ├── 8.6.md ├── 8.7.md ├── 8.8.md ├── 8.9.md ├── 8.md ├── 9.1.md ├── 9.10.md ├── 9.11.md ├── 9.2.md ├── 9.3.md ├── 9.4.md ├── 9.5.md ├── 9.6.md ├── 9.7.md ├── 9.8.md ├── 9.9.md ├── 9.md ├── skl01.md ├── skl02.md ├── skl03.md ├── skl04.md ├── skl05.md ├── skl06.md ├── skl07.md ├── skl08.md ├── skl09.md ├── skl10.md ├── skl11.md ├── skl12.md ├── skl13.md ├── skl14.md ├── skl15.md ├── skl16.md ├── skl17.md ├── skl18.md ├── skl19.md ├── skl20.md ├── skl21.md ├── skl22.md └── skl23.md ├── img ├── 1-10-1.png ├── 1-10-2.png ├── 1-10-3.png ├── 1-11-1.png ├── 1-2-1.png ├── 10-1-1.png ├── 10-1-10.png ├── 10-1-11.png ├── 10-1-12.png ├── 10-1-13.png ├── 10-1-14.png ├── 10-1-2.png ├── 10-1-3.png ├── 10-1-4.png ├── 10-1-5.png ├── 10-1-6.png ├── 10-1-7.png ├── 10-1-8.png ├── 10-1-9.png ├── 10-2-1.png ├── 10-2-10.png ├── 10-2-2.png ├── 10-2-3.png ├── 10-2-4.png ├── 10-2-5.png ├── 10-2-6.png ├── 10-2-7.png ├── 10-2-8.png ├── 10-2-9.png ├── 2-5-1.png ├── 4-1-1.png ├── 4-1-2.png ├── 4-1-3.png ├── 4-1-4.png ├── 4-6-1.png ├── 4-6-2.png ├── 4-7-1.png ├── 4-9-1.png ├── 4-9-2.png ├── 6-1-1.png ├── 6-1-2.png ├── 6-1-3.png ├── 6-2-1.png ├── 6-2-10.png ├── 6-2-2.png ├── 6-2-3.png ├── 6-2-4.png ├── 6-2-5.png ├── 6-2-6.png ├── 6-2-7.png ├── 6-2-8.png ├── 6-2-9.png ├── 6-3-1.png ├── 6-3-2.png ├── 7-11-1.png ├── 7-12-1.png ├── 7-12-2.png ├── 7-12-3.png ├── 7-14-1.png ├── 7-14-10.png ├── 7-14-11.png ├── 7-14-12.png ├── 7-14-13.png ├── 7-14-2.png ├── 7-14-3.png ├── 7-14-4.png ├── 7-14-5.png ├── 7-14-6.png ├── 7-14-7.png ├── 7-14-8.png ├── 7-14-9.png ├── 7-2-1.png ├── 8-1-1.png ├── 8-1-2.png ├── 8-1-3.png ├── 8-1-4.png ├── 8-10-1.png ├── 8-10-10.png ├── 8-10-2.png ├── 8-10-3.png ├── 8-10-4.png ├── 8-10-5.png ├── 8-10-6.png ├── 8-10-7.png ├── 8-10-8.png ├── 8-10-9.png ├── 8-11-1.png ├── 8-11-2.png ├── 8-11-3.png ├── 8-11-4.png ├── 8-11-5.png ├── 8-11-6.png ├── 8-11-7.png ├── 8-11-8.png ├── 8-12-1.png ├── 8-12-2.png ├── 8-12-3.png ├── 8-12-4.png ├── 8-12-5.png ├── 8-12-6.png ├── 8-13-1.png ├── 8-13-2.png ├── 8-13-3.png ├── 8-13-4.png ├── 8-13-5.png ├── 8-13-6.png ├── 8-13-7.png ├── 8-13-8.png ├── 8-14-1.png ├── 8-14-10.png ├── 8-14-11.png ├── 8-14-2.png ├── 8-14-3.png ├── 8-14-4.png ├── 8-14-5.png ├── 8-14-6.png ├── 8-14-7.png ├── 8-14-8.png ├── 8-14-9.png ├── 8-15-1.png ├── 8-15-10.png ├── 8-15-2.png ├── 8-15-3.png ├── 8-15-4.png ├── 8-15-5.png ├── 8-15-6.png ├── 8-15-7.png ├── 8-15-8.png ├── 8-15-9.png ├── 8-16-1.png ├── 8-16-2.png ├── 8-16-3.png ├── 8-16-4.png ├── 8-16-5.png ├── 8-16-6.png ├── 8-16-7.png ├── 8-16-8.png ├── 8-16-9.png ├── 8-17-1.png ├── 8-17-10.png ├── 8-17-11.png ├── 8-17-12.png ├── 8-17-13.png ├── 8-17-14.png ├── 8-17-15.png ├── 8-17-16.png ├── 8-17-17.png ├── 8-17-18.png ├── 8-17-19.png ├── 8-17-2.png ├── 8-17-20.png ├── 8-17-21.png ├── 8-17-22.png ├── 8-17-3.png ├── 8-17-4.png ├── 8-17-5.png ├── 8-17-6.png ├── 8-17-7.png ├── 8-17-8.png ├── 8-17-9.png ├── 8-2-1.png ├── 8-2-2.png ├── 8-2-3.png ├── 8-2-4.png ├── 8-2-5.png ├── 8-2-6.png ├── 8-2-7.png ├── 8-3-1.png ├── 8-3-2.png ├── 8-3-3.png ├── 8-3-4.png ├── 8-4-1.png ├── 8-4-10.png ├── 8-4-11.png ├── 8-4-12.png ├── 8-4-13.png ├── 8-4-14.png ├── 8-4-15.png ├── 8-4-2.png ├── 8-4-3.png ├── 8-4-4.png ├── 8-4-5.png ├── 8-4-6.png ├── 8-4-7.png ├── 8-4-8.png ├── 8-4-9.png ├── 8-5-1.png ├── 8-5-2.png ├── 8-5-3.png ├── 8-5-4.png ├── 8-5-5.png ├── 8-5-6.png ├── 8-5-7.png ├── 8-6-1.png ├── 8-6-2.png ├── 8-6-3.png ├── 8-7-1.png ├── 8-7-2.png ├── 8-7-3.png ├── 8-7-4.png ├── 8-7-5.png ├── 8-8-1.png ├── 8-8-2.png ├── 8-8-3.png ├── 8-8-4.png ├── 8-8-5.png ├── 8-8-6.png ├── 8-9-1.png ├── 8-9-2.png ├── 8-9-3.png ├── 8-9-4.png ├── 8-9-5.png ├── 8-9-6.png ├── 8-9-7.png ├── 8-9-8.png ├── 9-1-1.png ├── 9-1-2.png ├── 9-10-1.png ├── 9-10-2.png ├── 9-3-1.png ├── 9-3-2.png ├── 9-6-1.png ├── 9-7-1.png ├── 9-7-2.png ├── 9-8-1.png ├── 9-9-1.png ├── 9-9-2.png ├── 9-9-3.png ├── ConvNet LeNet.png ├── LSTM3-chain.png ├── MLP.png ├── MaxPool.png ├── Perceptron and MLP.png ├── Perceptron.png ├── RNN-rolled.png ├── RNN-unrolled.png ├── Table.png ├── autoencoder.png ├── average-per-class.png ├── backprop.png ├── bag_of_words.svg ├── bkwd_step_net.png ├── check_env-1.png ├── cluster_comparison.png ├── clustering-linkage.png ├── clustering.png ├── cnn1.png ├── cnn2.png ├── cnn3.png ├── cnn4.png ├── cnn5.png ├── cnn6.png ├── conv.png ├── convnets_cover.png ├── cross_validation.svg ├── data_representation.svg ├── dbscan.png ├── dl_overview.png ├── feature_union.svg ├── fwd_step.png ├── fwd_step_net.png ├── grid_search_cross_validation.svg ├── gru.png ├── hashing_vectorizer.svg ├── ipython_help-1.png ├── ipython_help-2.png ├── ipython_run_cell.png ├── iris_setosa.jpg ├── iris_versicolor.jpg ├── iris_virginica.jpg ├── keDyv.png ├── keras_rank.jpg ├── keras_rank_details.jpg ├── logistic_function.png ├── ml_taxonomy.png ├── mlp_details.png ├── mnist.png ├── multi-layers-1.png ├── multi-layers-2.png ├── multi_input_model.png ├── overfitting.png ├── overfitting_underfitting_cartoon.svg ├── parallel_text_clf.png ├── parallel_text_clf_average.png ├── petal_sepal.jpg ├── pipeline.svg ├── pipeline_cross_validation.svg ├── plot_kneigbors_regularization.png ├── qr_alipay.png ├── randomized_search.png ├── resnet34.png ├── resnet_bb.png ├── rnn.png ├── rnn2.png ├── sigmoid.png ├── single_layer.png ├── supervised_scikit_learn.png ├── supervised_workflow.svg ├── tex1.gif ├── tex2.gif ├── tex3.gif ├── tex4.gif ├── tex5.gif ├── tex6.gif ├── tex7.gif ├── train_test_split.svg ├── train_test_split_matrix.svg ├── train_validation_test2.svg ├── unsupervised_workflow.svg ├── vgg16.png └── vgg19.png ├── index.html ├── styles └── ebook.css └── update.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | .DS_Store 103 | 104 | # gitbook 105 | _book 106 | 107 | # node.js 108 | node_modules 109 | 110 | # windows 111 | Thumbs.db 112 | 113 | # word 114 | ~$*.docx 115 | ~$*.doc 116 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/.nojekyll -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | ds-ipynb.apachecn.org -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM httpd:2.4 2 | COPY ./ /usr/local/apache2/htdocs/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 数据科学 IPython 笔记本 2 | 3 | > 原文:[donnemartin/data-science-ipython-notebooks](https://github.com/donnemartin/data-science-ipython-notebooks) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 我们在人生的每个阶段,能影响多少人,就影响多少人,哪怕只能影响一个人,也好过不影响。——罗永浩 10 | 11 | + [ApacheCN 机器学习交流群 629470233](http://shang.qq.com/wpa/qunwpa?idkey=30e5f1123a79867570f665aa3a483ca404b1c3f77737bc01ec520ed5f078ddef) 12 | + [ApacheCN 学习资源](http://www.apachecn.org/) 13 | 14 | 15 | 16 | + [在线阅读](https://ds-ipynb.apachecn.org) 17 | + [在线阅读(Gitee)](https://apachecn.gitee.io/ds-ipynb-zh/) 18 | + [PDF格式](https://www.gitbook.com/download/pdf/book/wizardforcel/ds-ipynb) 19 | + [EPUB格式](https://www.gitbook.com/download/epub/book/wizardforcel/ds-ipynb) 20 | + [MOBI格式](https://www.gitbook.com/download/mobi/book/wizardforcel/ds-ipynb) 21 | + [代码仓库](https://github.com/apachecn/ds-ipynb-zh) 22 | 23 | ## 下载 24 | 25 | ### Docker 26 | 27 | ``` 28 | docker pull apachecn0/ds-ipynb-zh 29 | docker run -tid -p :80 apachecn0/ds-ipynb-zh 30 | # 访问 http://localhost:{port} 查看文档 31 | ``` 32 | 33 | ### PYPI 34 | 35 | ``` 36 | pip install ds-ipynb-zh 37 | ds-ipynb-zh 38 | # 访问 http://localhost:{port} 查看文档 39 | ``` 40 | 41 | ### NPM 42 | 43 | ``` 44 | npm install -g ds-ipynb-zh 45 | ds-ipynb-zh 46 | # 访问 http://localhost:{port} 查看文档 47 | ``` 48 | 49 | ## 赞助我 50 | 51 | ![](http://ww1.sinaimg.cn/large/841aea59ly1fx0qnvulnjj2074074747.jpg) -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | + [数据科学 IPython 笔记本](docs/README.md) 2 | + [一、TensorFlow](docs/1.md) 3 | + [二、TensorFlow 练习](docs/2.md) 4 | + [三、Theano](docs/3.md) 5 | + [四、Keras](docs/4.md) 6 | + [五、scikit-learn](docs/5.md) 7 | + [5.1 Python 机器学习简介](docs/skl01.md) 8 | + [5.2 Python 中的科学计算工具](docs/skl02.md) 9 | + [5.3 数据表示和可视化](docs/skl03.md) 10 | + [5.4 训练和测试数据](docs/skl04.md) 11 | + [5.5 监督学习第一部分:分类](docs/skl05.md) 12 | + [5.6 监督学习第二部分:回归分析](docs/skl06.md) 13 | + [5.7 无监督学习第一部分:变换](docs/skl07.md) 14 | + [5.8 无监督学习第二部分:聚类](docs/skl08.md) 15 | + [5.9 sklearn 估计器接口回顾](docs/skl09.md) 16 | + [5.10 案例学习:泰坦尼克幸存者](docs/skl10.md) 17 | + [5.11 文本特征提取](docs/skl11.md) 18 | + [5.12 案例学习:用于 SMS 垃圾检测的文本分类](docs/skl12.md) 19 | + [5.13 交叉验证和得分方法](docs/skl13.md) 20 | + [5.14 参数选择、验证和测试](docs/skl14.md) 21 | + [5.15 估计器流水线](docs/skl15.md) 22 | + [5.16 模型评估、得分指标和处理不平衡类别](docs/skl16.md) 23 | + [5.17 深入:线性模型](docs/skl17.md) 24 | + [5.18 深入:决策树与森林](docs/skl18.md) 25 | + [5.19 自动特征选择](docs/skl19.md) 26 | + [5.20 无监督学习:层次和基于密度的聚类算法](docs/skl20.md) 27 | + [5.21 无监督学习:非线性降维](docs/skl21.md) 28 | + [5.22 无监督学习:异常检测](docs/skl22.md) 29 | + [5.23 核外学习 - 用于语义分析的大规模文本分类](docs/skl23.md) 30 | + [六、SciPy 统计推断](docs/6.md) 31 | + [七、Pandas](docs/7.md) 32 | + [7.1 Pandas](docs/7.1.md) 33 | + [7.2 数据整理](docs/7.2.md) 34 | + [7.3 Pandas 数据操作](docs/7.3.md) 35 | + [7.4 Pandas 对象介绍](docs/7.4.md) 36 | + [7.5 数据索引和选择](docs/7.5.md) 37 | + [7.6 Pandas 中的数据操作](docs/7.6.md) 38 | + [7.7 处理缺失数据](docs/7.7.md) 39 | + [7.8 分层索引](docs/7.8.md) 40 | + [7.9 组合数据集:连接和附加](docs/7.9.md) 41 | + [7.10 组合数据集:合并和连接](docs/7.10.md) 42 | + [7.11 聚合和分组](docs/7.11.md) 43 | + [7.12 透视表](docs/7.12.md) 44 | + [7.13 向量化字符串操作](docs/7.13.md) 45 | + [7.14 处理时间序列](docs/7.14.md) 46 | + [7.15 高性能 Pandas:`eval()`和`query()`](docs/7.15.md) 47 | + [八、Matplotlib](docs/8.md) 48 | + [8.1 matplotlib](docs/8.1.md) 49 | + [8.2 Matplotlib 的应用](docs/8.2.md) 50 | + [8.3 Matplotlib 可视化](docs/8.3.md) 51 | + [8.4 简单的折线图](docs/8.4.md) 52 | + [8.5 简单的散点图](docs/8.5.md) 53 | + [8.6 可视化误差](docs/8.6.md) 54 | + [8.7 密度和等高线图](docs/8.7.md) 55 | + [8.8 直方图,分箱和密度](docs/8.8.md) 56 | + [8.9 自定义图例](docs/8.9.md) 57 | + [8.10 自定义颜色条](docs/8.10.md) 58 | + [8.11 多个子图](docs/8.11.md) 59 | + [8.12 文本和注解](docs/8.12.md) 60 | + [8.13 自定义刻度](docs/8.13.md) 61 | + [8.14 自定义 Matplotlib:配置和样式表](docs/8.14.md) 62 | + [8.15 Matplotlib 中的三维绘图](docs/8.15.md) 63 | + [8.16 地理数据和 Basemap](docs/8.16.md) 64 | + [8.17 使用 Seaborn 的可视化](docs/8.17.md) 65 | + [九、NumPy](docs/9.md) 66 | + [9.1 NumPy](docs/9.1.md) 67 | + [9.2 NumPy 简介](docs/9.2.md) 68 | + [9.3 理解 Python 中的数据类型](docs/9.3.md) 69 | + [9.4 NumPy 数组的基础](docs/9.4.md) 70 | + [9.5 NumPy 数组上的计算:通用函数](docs/9.5.md) 71 | + [9.6 聚合:最小、最大和之间的任何东西](docs/9.6.md) 72 | + [9.7 数组上的计算:广播](docs/9.7.md) 73 | + [9.8 比较,掩码和布尔逻辑](docs/9.8.md) 74 | + [9.9 花式索引](docs/9.9.md) 75 | + [9.10 数组排序](docs/9.10.md) 76 | + [9.11 结构化数据:NumPy 的结构化数组](docs/9.11.md) 77 | -------------------------------------------------------------------------------- /asset/back-to-top.css: -------------------------------------------------------------------------------- 1 | #scroll-btn { 2 | position: fixed; 3 | right: 15px; 4 | bottom: 10px; 5 | width: 35px; 6 | height: 35px; 7 | background-repeat: no-repeat; 8 | background-size: cover; 9 | cursor: pointer; 10 | -webkit-user-select: none; 11 | -moz-user-select: none; 12 | -ms-user-select: none; 13 | user-select: none; 14 | background-image: url(up.svg); 15 | background-position-y: -1px; 16 | display: none; 17 | border: 2px solid; 18 | border-radius: 4px; 19 | } -------------------------------------------------------------------------------- /asset/back-to-top.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function() { 2 | var scrollBtn = document.createElement('div') 3 | scrollBtn.id = 'scroll-btn' 4 | document.body.append(scrollBtn) 5 | 6 | window.addEventListener('scroll', function() { 7 | var offset = window.document.documentElement.scrollTop; 8 | scrollBtn.style.display = offset >= 500 ? "block" : "none"; 9 | }) 10 | scrollBtn.addEventListener('click', function(e) { 11 | e.stopPropagation(); 12 | var step = window.scrollY / 15; 13 | var hdl = setInterval(function() { 14 | window.scrollTo(0, window.scrollY - step); 15 | if(window.scrollY <= 0) { 16 | clearInterval(hdl) 17 | } 18 | }, 15) 19 | }) 20 | }) -------------------------------------------------------------------------------- /asset/dark-mode.css: -------------------------------------------------------------------------------- 1 | #dark-mode-btn { 2 | position: fixed; 3 | right: 15px; 4 | top: 100px; 5 | width: 35px; 6 | height: 35px; 7 | background-repeat: no-repeat; 8 | background-size: cover; 9 | cursor: pointer; 10 | -webkit-user-select: none; 11 | -moz-user-select: none; 12 | -ms-user-select: none; 13 | user-select: none; 14 | transition: background-image .15s ease-in-out .15s; 15 | } 16 | 17 | .dark-logo { 18 | background-image: url('sun.svg'); 19 | } 20 | 21 | .light-logo { 22 | background-image: url('moon.svg'); 23 | } -------------------------------------------------------------------------------- /asset/dark-mode.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function() { 2 | var style = document.querySelector('#invert') 3 | if (style == null) { 4 | style = document.createElement('style') 5 | style.id = 'invert' 6 | document.head.append(style) 7 | } 8 | var btn = document.querySelector('#dark-mode-btn') 9 | if (btn == null) { 10 | btn = document.createElement('div') 11 | btn.id = 'dark-mode-btn' 12 | btn.classList.add('light-logo') 13 | document.body.append(btn) 14 | } 15 | 16 | var enableDarkMode = function() { 17 | style.innerText = 'html,img,pre,#dark-mode-btn{filter:invert(100%)}' 18 | btn.classList.remove('light-logo') 19 | btn.classList.add('dark-logo') 20 | localStorage.darkLight = 'dark' 21 | 22 | } 23 | var disableDarkMode = function() { 24 | style.innerText = '' 25 | btn.classList.remove('dark-logo') 26 | btn.classList.add('light-logo') 27 | localStorage.darkLight = 'light' 28 | } 29 | 30 | btn.addEventListener('click', function(){ 31 | var currMode = localStorage.darkLight || 'light' 32 | if (currMode == 'light') 33 | enableDarkMode() 34 | else 35 | disableDarkMode() 36 | }) 37 | 38 | if (localStorage.darkLight == 'dark') 39 | enableDarkMode() 40 | 41 | }) 42 | 43 | -------------------------------------------------------------------------------- /asset/docsify-apachecn-footer.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | var cnzzId = window.$docsify.cnzzId 3 | var unRepo = window.$docsify.repo || '' 4 | var [un, repo] = unRepo.split('/') 5 | var footer = ` 6 |
7 |
8 |

我们一直在努力

9 |

${unRepo}

10 |

11 | 12 | 13 | iBooker 面试求职

14 |

15 |
16 | 20 |
21 |
22 | ` 23 | var plugin = function(hook) { 24 | hook.afterEach(function(html) { 25 | return html + footer 26 | }) 27 | hook.doneEach(function() { 28 | (adsbygoogle = window.adsbygoogle || []).push({}) 29 | }) 30 | } 31 | var plugins = window.$docsify.plugins || [] 32 | plugins.push(plugin) 33 | window.$docsify.plugins = plugins 34 | })() -------------------------------------------------------------------------------- /asset/docsify-baidu-push.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | var plugin = function(hook) { 3 | hook.doneEach(function() { 4 | new Image().src = 5 | '//api.share.baidu.com/s.gif?r=' + 6 | encodeURIComponent(document.referrer) + 7 | "&l=" + encodeURIComponent(location.href) 8 | }) 9 | } 10 | var plugins = window.$docsify.plugins || [] 11 | plugins.push(plugin) 12 | window.$docsify.plugins = plugins 13 | })() -------------------------------------------------------------------------------- /asset/docsify-baidu-stat.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | var plugin = function(hook) { 3 | hook.doneEach(function() { 4 | window._hmt = window._hmt || [] 5 | var hm = document.createElement("script") 6 | hm.src = "https://hm.baidu.com/hm.js?" + window.$docsify.bdStatId 7 | document.querySelector("article").appendChild(hm) 8 | }) 9 | } 10 | var plugins = window.$docsify.plugins || [] 11 | plugins.push(plugin) 12 | window.$docsify.plugins = plugins 13 | })() -------------------------------------------------------------------------------- /asset/docsify-cnzz.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | var plugin = function(hook) { 3 | hook.doneEach(function() { 4 | var sc = document.createElement('script') 5 | sc.src = 'https://s5.cnzz.com/z_stat.php?id=' + 6 | window.$docsify.cnzzId + '&online=1&show=line' 7 | document.querySelector('article').appendChild(sc) 8 | }) 9 | } 10 | var plugins = window.$docsify.plugins || [] 11 | plugins.push(plugin) 12 | window.$docsify.plugins = plugins 13 | })() -------------------------------------------------------------------------------- /asset/docsify-copy-code.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * docsify-copy-code 3 | * v2.1.0 4 | * https://github.com/jperasmus/docsify-copy-code 5 | * (c) 2017-2019 JP Erasmus 6 | * MIT license 7 | */ 8 | !function(){"use strict";function r(o){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o})(o)}!function(o,e){void 0===e&&(e={});var t=e.insertAt;if(o&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===t&&n.firstChild?n.insertBefore(c,n.firstChild):n.appendChild(c),c.styleSheet?c.styleSheet.cssText=o:c.appendChild(document.createTextNode(o))}}(".docsify-copy-code-button,.docsify-copy-code-button span{cursor:pointer;transition:all .25s ease}.docsify-copy-code-button{position:absolute;z-index:1;top:0;right:0;overflow:visible;padding:.65em .8em;border:0;border-radius:0;outline:0;font-size:1em;background:grey;background:var(--theme-color,grey);color:#fff;opacity:0}.docsify-copy-code-button span{border-radius:3px;background:inherit;pointer-events:none}.docsify-copy-code-button .error,.docsify-copy-code-button .success{position:absolute;z-index:-100;top:50%;left:0;padding:.5em .65em;font-size:.825em;opacity:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.docsify-copy-code-button.error .error,.docsify-copy-code-button.success .success{opacity:1;-webkit-transform:translate(-115%,-50%);transform:translate(-115%,-50%)}.docsify-copy-code-button:focus,pre:hover .docsify-copy-code-button{opacity:1}"),document.querySelector('link[href*="docsify-copy-code"]')&&console.warn("[Deprecation] Link to external docsify-copy-code stylesheet is no longer necessary."),window.DocsifyCopyCodePlugin={init:function(){return function(o,e){o.ready(function(){console.warn("[Deprecation] Manually initializing docsify-copy-code using window.DocsifyCopyCodePlugin.init() is no longer necessary.")})}}},window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(o,s){o.doneEach(function(){var o=Array.apply(null,document.querySelectorAll("pre[data-lang]")),c={buttonText:"Copy to clipboard",errorText:"Error",successText:"Copied"};s.config.copyCode&&Object.keys(c).forEach(function(t){var n=s.config.copyCode[t];"string"==typeof n?c[t]=n:"object"===r(n)&&Object.keys(n).some(function(o){var e=-1',''.concat(c.buttonText,""),''.concat(c.errorText,""),''.concat(c.successText,""),""].join("");o.forEach(function(o){o.insertAdjacentHTML("beforeend",e)})}),o.mounted(function(){document.querySelector(".content").addEventListener("click",function(o){if(o.target.classList.contains("docsify-copy-code-button")){var e="BUTTON"===o.target.tagName?o.target:o.target.parentNode,t=document.createRange(),n=e.parentNode.querySelector("code"),c=window.getSelection();t.selectNode(n),c.removeAllRanges(),c.addRange(t);try{document.execCommand("copy")&&(e.classList.add("success"),setTimeout(function(){e.classList.remove("success")},1e3))}catch(o){console.error("docsify-copy-code: ".concat(o)),e.classList.add("error"),setTimeout(function(){e.classList.remove("error")},1e3)}"function"==typeof(c=window.getSelection()).removeRange?c.removeRange(t):"function"==typeof c.removeAllRanges&&c.removeAllRanges()}})})}].concat(window.$docsify.plugins||[])}(); 9 | //# sourceMappingURL=docsify-copy-code.min.js.map 10 | -------------------------------------------------------------------------------- /asset/docsify-quick-page.css: -------------------------------------------------------------------------------- 1 | #prev-page-button { 2 | position:fixed; 3 | top:140px; 4 | width: 35px; 5 | height: 35px; 6 | right: 15px; 7 | background-color: transparent; 8 | background-image: url(left.svg); 9 | background-repeat: no-repeat; 10 | background-size: cover; 11 | border:0; 12 | -webkit-user-select: none; 13 | -moz-user-select: none; 14 | -ms-user-select: none; 15 | user-select: none; 16 | outline:none; 17 | cursor: pointer; 18 | } 19 | 20 | #next-page-button { 21 | position:fixed; 22 | top:180px; 23 | width:35px; 24 | height:35px; 25 | right:15px; 26 | background-color: transparent; 27 | background-image: url(right.svg); 28 | background-repeat: no-repeat; 29 | background-size: cover; 30 | border:0; 31 | -webkit-user-select: none; 32 | -moz-user-select: none; 33 | -ms-user-select: none; 34 | user-select: none; 35 | outline:none; 36 | cursor: pointer; 37 | } -------------------------------------------------------------------------------- /asset/docsify-quick-page.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function() { 2 | var prevBtn = document.createElement("div") 3 | prevBtn.id = "prev-page-button" 4 | document.body.appendChild(prevBtn) 5 | var nextBtn = document.createElement("div"); 6 | nextBtn.id = "next-page-button" 7 | document.body.appendChild(nextBtn) 8 | 9 | var links = null 10 | var linkMap = null 11 | var getCurIdx = function() { 12 | if (!links) { 13 | links = Array 14 | .from(document.querySelectorAll(".sidebar-nav a")) 15 | .map(x => x.href) 16 | linkMap = {} 17 | links.forEach((x, i) => linkMap[x] = i) 18 | } 19 | 20 | var elem = document.querySelector(".active a") 21 | var curIdx = elem? linkMap[elem.href]: -1 22 | return curIdx 23 | } 24 | 25 | prevBtn.addEventListener('click', function () { 26 | if (!document.body.classList.contains('ready')) 27 | return 28 | var curIdx = getCurIdx() 29 | location.href = curIdx == -1? 30 | links[0]: 31 | links[(curIdx - 1 + links.length) % links.length] 32 | document.body.scrollIntoView() 33 | }, false) 34 | 35 | nextBtn.addEventListener('click', function () { 36 | if (!document.body.classList.contains('ready')) 37 | return 38 | var curIdx = getCurIdx() 39 | location.href = links[(curIdx + 1) % links.length] 40 | document.body.scrollIntoView() 41 | }, false) 42 | }) -------------------------------------------------------------------------------- /asset/docsify-sidebar-collapse.min.js: -------------------------------------------------------------------------------- 1 | !function(e){("object"!=typeof exports||"undefined"==typeof module)&&"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";function e(e,n){var t,a=(n=void 0===n?{}:n).insertAt;e&&"undefined"!=typeof document&&(t=document.head||document.getElementsByTagName("head")[0],(n=document.createElement("style")).type="text/css","top"===a&&t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e)))}var t;function a(e){e&&null!=t&&(e=e.getBoundingClientRect().top,document.querySelector(".sidebar").scrollBy(0,e-t))}function n(){requestAnimationFrame(function(){var e=document.querySelector(".app-sub-sidebar > .active");if(e)for(e.parentNode.parentNode.querySelectorAll(".app-sub-sidebar").forEach(function(e){return e.classList.remove("open")});e.parentNode.classList.contains("app-sub-sidebar")&&!e.parentNode.classList.contains("open");)e.parentNode.classList.add("open"),e=e.parentNode})}function o(e){t=e.target.getBoundingClientRect().top;var n=d(e.target,"LI",2);n&&(n.classList.contains("open")?(n.classList.remove("open"),setTimeout(function(){n.classList.add("collapse")},0)):(function(e){if(e)for(e.classList.remove("open","active");e&&"sidebar-nav"!==e.className&&e.parentNode;)"LI"!==e.parentNode.tagName&&"app-sub-sidebar"!==e.parentNode.className||e.parentNode.classList.remove("open"),e=e.parentNode}(s()),i(n),setTimeout(function(){n.classList.remove("collapse")},0)),a(n))}function s(){var e=document.querySelector(".sidebar-nav .active");return e||(e=d(document.querySelector('.sidebar-nav a[href="'.concat(decodeURIComponent(location.hash).replace(/ /gi,"%20"),'"]')),"LI",2))&&e.classList.add("active"),e}function i(e){if(e)for(e.classList.add("open","active");e&&"sidebar-nav"!==e.className&&e.parentNode;)"LI"!==e.parentNode.tagName&&"app-sub-sidebar"!==e.parentNode.className||e.parentNode.classList.add("open"),e=e.parentNode}function d(e,n,t){if(e&&e.tagName===n)return e;for(var a=0;e;){if(t<++a)return;if(e.parentNode.tagName===n)return e.parentNode;e=e.parentNode}}e(".sidebar-nav > ul > li ul {\n display: none;\n}\n\n.app-sub-sidebar {\n display: none;\n}\n\n.app-sub-sidebar.open {\n display: block;\n}\n\n.sidebar-nav .open > ul:not(.app-sub-sidebar),\n.sidebar-nav .active:not(.collapse) > ul {\n display: block;\n}\n\n/* 抖动 */\n.sidebar-nav li.open:not(.collapse) > ul {\n display: block;\n}\n\n.active + ul.app-sub-sidebar {\n display: block;\n}\n"),document.addEventListener("scroll",n);e("@media screen and (max-width: 768px) {\n /* 移动端适配 */\n .markdown-section {\n max-width: none;\n padding: 16px;\n }\n /* 改变原来按钮热区大小 */\n .sidebar-toggle {\n padding: 0 0 10px 10px;\n }\n /* my pin */\n .sidebar-pin {\n appearance: none;\n outline: none;\n position: fixed;\n bottom: 0;\n border: none;\n width: 40px;\n height: 40px;\n background: transparent;\n }\n}\n");var r,c="DOCSIFY_SIDEBAR_PIN_FLAG";function l(){var e="true"===(e=localStorage.getItem(c));localStorage.setItem(c,!e),e?(document.querySelector(".sidebar").style.transform="translateX(0)",document.querySelector(".content").style.transform="translateX(0)"):(document.querySelector(".sidebar").style.transform="translateX(300px)",document.querySelector(".content").style.transform="translateX(300px)")}768 ul"),1),a(t),n(e)}),e.ready(function(){document.querySelector(".sidebar-nav").addEventListener("click",o)})})}); -------------------------------------------------------------------------------- /asset/edit.css: -------------------------------------------------------------------------------- 1 | #edit-btn { 2 | position: fixed; 3 | right: 15px; 4 | top: 260px; 5 | width: 35px; 6 | height: 35px; 7 | background-repeat: no-repeat; 8 | background-size: cover; 9 | cursor: pointer; 10 | -webkit-user-select: none; 11 | -moz-user-select: none; 12 | -ms-user-select: none; 13 | user-select: none; 14 | background-image: url(edit.svg); 15 | } -------------------------------------------------------------------------------- /asset/edit.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function() { 2 | var editBtn = document.createElement('div') 3 | editBtn.id = 'edit-btn' 4 | document.body.append(editBtn) 5 | 6 | var repo = window.$docsify.repo 7 | editBtn.addEventListener('click', function() { 8 | if (!repo) return 9 | if (!/https?:\/\//.exec(repo)) 10 | repo = 'https://github.com/' + repo 11 | var url = repo + '/tree/master' + 12 | location.hash.slice(1) + '.md' 13 | window.open(url) 14 | }) 15 | }) -------------------------------------------------------------------------------- /asset/edit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Edit 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /asset/left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1210 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /asset/moon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /asset/prism-darcula.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Darcula theme 3 | * 4 | * Adapted from a theme based on: 5 | * IntelliJ Darcula Theme (https://github.com/bulenkov/Darcula) 6 | * 7 | * @author Alexandre Paradis 8 | * @version 1.0 9 | */ 10 | 11 | code[class*="lang-"], 12 | pre[data-lang] { 13 | color: #a9b7c6 !important; 14 | background-color: #2b2b2b !important; 15 | font-family: Consolas, Monaco, 'Andale Mono', monospace; 16 | direction: ltr; 17 | text-align: left; 18 | white-space: pre; 19 | word-spacing: normal; 20 | word-break: normal; 21 | line-height: 1.5; 22 | 23 | -moz-tab-size: 4; 24 | -o-tab-size: 4; 25 | tab-size: 4; 26 | 27 | -webkit-hyphens: none; 28 | -moz-hyphens: none; 29 | -ms-hyphens: none; 30 | hyphens: none; 31 | } 32 | 33 | pre[data-lang]::-moz-selection, pre[data-lang] ::-moz-selection, 34 | code[class*="lang-"]::-moz-selection, code[class*="lang-"] ::-moz-selection { 35 | color: inherit; 36 | background: rgba(33, 66, 131, .85); 37 | } 38 | 39 | pre[data-lang]::selection, pre[data-lang] ::selection, 40 | code[class*="lang-"]::selection, code[class*="lang-"] ::selection { 41 | color: inherit; 42 | background: rgba(33, 66, 131, .85); 43 | } 44 | 45 | /* Code blocks */ 46 | pre[data-lang] { 47 | padding: 1em; 48 | margin: .5em 0; 49 | overflow: auto; 50 | } 51 | 52 | :not(pre) > code[class*="lang-"], 53 | pre[data-lang] { 54 | background: #2b2b2b; 55 | } 56 | 57 | /* Inline code */ 58 | :not(pre) > code[class*="lang-"] { 59 | padding: .1em; 60 | border-radius: .3em; 61 | } 62 | 63 | .token.comment, 64 | .token.prolog, 65 | .token.cdata { 66 | color: #808080; 67 | } 68 | 69 | .token.delimiter, 70 | .token.boolean, 71 | .token.keyword, 72 | .token.selector, 73 | .token.important, 74 | .token.atrule { 75 | color: #cc7832; 76 | } 77 | 78 | .token.operator, 79 | .token.punctuation, 80 | .token.attr-name { 81 | color: #a9b7c6; 82 | } 83 | 84 | .token.tag, 85 | .token.tag .punctuation, 86 | .token.doctype, 87 | .token.builtin { 88 | color: #e8bf6a; 89 | } 90 | 91 | .token.entity, 92 | .token.number, 93 | .token.symbol { 94 | color: #6897bb; 95 | } 96 | 97 | .token.property, 98 | .token.constant, 99 | .token.variable { 100 | color: #9876aa; 101 | } 102 | 103 | .token.string, 104 | .token.char { 105 | color: #6a8759; 106 | } 107 | 108 | .token.attr-value, 109 | .token.attr-value .punctuation { 110 | color: #a5c261; 111 | } 112 | 113 | .token.attr-value .punctuation:first-child { 114 | color: #a9b7c6; 115 | } 116 | 117 | .token.url { 118 | color: #287bde; 119 | text-decoration: underline; 120 | } 121 | 122 | .token.function { 123 | color: #ffc66d; 124 | } 125 | 126 | .token.regex { 127 | background: #364135; 128 | } 129 | 130 | .token.bold { 131 | font-weight: bold; 132 | } 133 | 134 | .token.italic { 135 | font-style: italic; 136 | } 137 | 138 | .token.inserted { 139 | background: #294436; 140 | } 141 | 142 | .token.deleted { 143 | background: #484a4a; 144 | } 145 | 146 | code.lang-css .token.property, 147 | code.lang-css .token.property + .token.punctuation { 148 | color: #a9b7c6; 149 | } 150 | 151 | code.lang-css .token.id { 152 | color: #ffc66d; 153 | } 154 | 155 | code.lang-css .token.selector > .token.class, 156 | code.lang-css .token.selector > .token.attribute, 157 | code.lang-css .token.selector > .token.pseudo-class, 158 | code.lang-css .token.selector > .token.pseudo-element { 159 | color: #ffc66d; 160 | } -------------------------------------------------------------------------------- /asset/prism-python.min.js: -------------------------------------------------------------------------------- 1 | Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; -------------------------------------------------------------------------------- /asset/right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1209 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /asset/share.css: -------------------------------------------------------------------------------- 1 | #share-btn { 2 | position: fixed; 3 | right: 15px; 4 | top: 220px; 5 | width: 35px; 6 | height: 35px; 7 | background-repeat: no-repeat; 8 | background-size: cover; 9 | cursor: pointer; 10 | -webkit-user-select: none; 11 | -moz-user-select: none; 12 | -ms-user-select: none; 13 | user-select: none; 14 | background-image: url('share.svg'); 15 | } -------------------------------------------------------------------------------- /asset/share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Share-1 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /asset/sidebar.min.css: -------------------------------------------------------------------------------- 1 | .sidebar-nav li{position:relative;margin:0;cursor:pointer}.sidebar-nav ul:not(.app-sub-sidebar)>li:not(.file)::before{content:'';display:block;position:absolute;top:11px;left:-12px;height:6px;width:6px;border-right:1px solid #505d6b;border-bottom:1px solid #505d6b;transform:rotate(-45deg);transition:transform .1s}.sidebar-nav ul:not(.app-sub-sidebar)>li.open::before{transform:rotate(45deg)}.sidebar-nav ul:not(.app-sub-sidebar)>li.collapse::before{transform:rotate(-45deg)} -------------------------------------------------------------------------------- /asset/style.css: -------------------------------------------------------------------------------- 1 | /*隐藏头部的目录*/ 2 | #main>ul:nth-child(1) { 3 | display: none; 4 | } 5 | 6 | #main>ul:nth-child(2) { 7 | display: none; 8 | } 9 | 10 | .markdown-section h1 { 11 | margin: 3rem 0 2rem 0; 12 | } 13 | 14 | .markdown-section h2 { 15 | margin: 2rem 0 1rem; 16 | } 17 | 18 | img, 19 | pre { 20 | border-radius: 8px; 21 | } 22 | 23 | .content, 24 | .sidebar, 25 | .markdown-section, 26 | body, 27 | .search input { 28 | background-color: rgba(243, 242, 238, 1) !important; 29 | } 30 | 31 | @media (min-width:600px) { 32 | .sidebar-toggle { 33 | background-color: #f3f2ee; 34 | } 35 | } 36 | 37 | .docsify-copy-code-button { 38 | background: #f8f8f8 !important; 39 | color: #7a7a7a !important; 40 | } 41 | 42 | body { 43 | /*font-family: Microsoft YaHei, Source Sans Pro, Helvetica Neue, Arial, sans-serif !important;*/ 44 | } 45 | 46 | .markdown-section>p { 47 | font-size: 16px !important; 48 | } 49 | 50 | .markdown-section pre>code { 51 | font-family: Consolas, Roboto Mono, Monaco, courier, monospace !important; 52 | font-size: .9rem !important; 53 | 54 | } 55 | 56 | /*.anchor span { 57 | color: rgb(66, 185, 131); 58 | }*/ 59 | 60 | section.cover h1 { 61 | margin: 0; 62 | } 63 | 64 | body>section>div.cover-main>ul>li>a { 65 | color: #42b983; 66 | } 67 | 68 | .markdown-section img { 69 | box-shadow: 7px 9px 10px #aaa !important; 70 | } 71 | 72 | 73 | pre { 74 | background-color: #f3f2ee !important; 75 | } 76 | 77 | @media (min-width:600px) { 78 | pre code { 79 | /*box-shadow: 2px 1px 20px 2px #aaa;*/ 80 | /*border-radius: 10px !important;*/ 81 | padding-left: 20px !important; 82 | } 83 | } 84 | 85 | @media (max-width:600px) { 86 | pre { 87 | padding-left: 0px !important; 88 | padding-right: 0px !important; 89 | } 90 | } 91 | 92 | .markdown-section pre { 93 | padding-left: 0 !important; 94 | padding-right: 0px !important; 95 | box-shadow: 2px 1px 20px 2px #aaa; 96 | } -------------------------------------------------------------------------------- /asset/sun.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /asset/up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1211 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/3.md: -------------------------------------------------------------------------------- 1 | # 三、Theano 2 | 3 | (略) -------------------------------------------------------------------------------- /docs/5.md: -------------------------------------------------------------------------------- 1 | # 五、scikit-learn 2 | -------------------------------------------------------------------------------- /docs/7.3.md: -------------------------------------------------------------------------------- 1 | # 7.3 Pandas 数据操作 2 | 3 | > 原文:[Data Manipulation with Pandas](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/pandas/03.00-Introduction-to-Pandas.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 本节是[《Python 数据科学手册》](https://github.com/jakevdp/PythonDataScienceHandbook)(Python Data Science Handbook)的摘录。 10 | 11 | 在前一章中,我们详细介绍了 NumPy 及其``ndarray``对象,它在 Python 中提供了密集类型数组的高效存储和操作。在这里,通过详细了解 Pandas 库提供的数据结构,我们将构建这些知识。 12 | 13 | Pandas 是一个基于 NumPy 构建的新软件包,它提供了高效的``DataFrame``实现。``DataFrame``本质上是多维数组,带有附加的行和列标签,通常具有异构类型和/或缺失数据。除了为标记数据提供方便的存储接口外,Pandas 还实现了许多强大数据操作,数据库框架和电子表格程序用户都熟悉它们。 14 | 15 | 正如我们所看到的,NumPy 的``ndarray``数据结构为干净,组织良好的数据类型提供了必要的功能,它们通常出现在数值计算任务中。虽然它很好地服务于此目的,但当我们需要更多的灵活性(例如,将标签附加到数据,处理缺失数据等),以及尝试一些操作,它们不能很好地映射到逐元素广播时(例如, 分组,透视等),它的局限性就很明显了。每一项都是分析非结构化数据的重要部分,它以许多形式存在于我们周围的世界中。 16 | 17 | Pandas,特别是它的``Series``和``DataFrame``对象,建立在 NumPy 数组结构之上,可以高效访问这些占据数据科学家许多时间的“数据整理”任务。 18 | 19 | 在本章中,我们将重点介绍有效使用``Series``,``DataFrame``和相关结构的机制。我们将在适当的地方使用从真实数据集中提取的示例,但这些示例不一定是重点。 20 | 21 | ## 安装和使用 Pandas 22 | 23 | 在系统上安装 Pandas 需要安装 NumPy,如果从源代码构建库,则需要使用适当的工具,来编译 C 和 Cython 源,Pandas 构建在它上面。安装的详细信息,请参见[ Pandas 文档](http://pandas.pydata.org/)。如果你遵循了“前言”中所述的建议,并使用 Anaconda 栈,则你已经安装了 Pandas。 24 | 25 | 安装 Pandas 后,你可以导入它并检查版本: 26 | 27 | ```py 28 | import pandas 29 | pandas.__version__ 30 | 31 | # '0.18.1' 32 | ``` 33 | 34 | 正如我们通常在别名``np``下导入 NumPy 一样,我们将在别名``pd``下导入 Pandas: 35 | 36 | ```py 37 | import pandas as pd 38 | ``` 39 | 40 | 此导入约定将在本书的其余部分中使用。 41 | 42 | ## 关于内置文档的提示 43 | 44 | 在阅读本章时,不要忘记 IPython 使你能够快速浏览包的内容(通过使用制表符补全功能)以及各种函数的文档(使用``?`` 字符)。(如果你需要回顾这个,请参阅“IPython 中的帮助和文档”。) 45 | 46 | 例如,要显示 pandas 命名空间的所有内容,可以键入: 47 | 48 | ```ipython 49 | In [3]: pd. 50 | ``` 51 | 52 | 要显示 Pandas 的内置文档,你可以使用: 53 | 54 | ```ipython 55 | In [4]: pd? 56 | ``` 57 | 58 | 可以在 找到更详细的文档以及教程和其他资源。 59 | -------------------------------------------------------------------------------- /docs/7.md: -------------------------------------------------------------------------------- 1 | # 七、Pandas -------------------------------------------------------------------------------- /docs/8.1.md: -------------------------------------------------------------------------------- 1 | # 8.1 matplotlib 2 | 3 | > 原文:[matplotlib](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/matplotlib.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 致谢:派生于 Olivier Grisel 的 [sklearn 和 IPython 并行机器学习](https://github.com/ogrisel/parallel_ml_tutorial) 10 | 11 | * 设置全局参数 12 | * 基本绘图 13 | * 直方图 14 | * 相同绘图上的两个直方图 15 | * 散点图 16 | 17 | ```py 18 | %matplotlib inline 19 | import pandas as pd 20 | import numpy as np 21 | import pylab as plt 22 | import seaborn 23 | ``` 24 | 25 | ## 设置全局参数 26 | 27 | ```py 28 | # 设置 matplotlib 图形的全局默认大小 29 | plt.rc('figure', figsize=(10, 5)) 30 | 31 | # 将 seaborn 美学参数设为默认值 32 | seaborn.set() 33 | ``` 34 | 35 | ## 基本绘图 36 | 37 | ```py 38 | x = np.linspace(0, 2, 10) 39 | 40 | plt.plot(x, x, 'o-', label='linear') 41 | plt.plot(x, x ** 2, 'x-', label='quadratic') 42 | 43 | plt.legend(loc='best') 44 | plt.title('Linear vs Quadratic progression') 45 | plt.xlabel('Input') 46 | plt.ylabel('Output'); 47 | plt.show() 48 | ``` 49 | 50 | ![png](../img/8-1-1.png) 51 | 52 | 53 | ## 直方图 54 | 55 | ```py 56 | # 高斯,均值 1,标准差 0.5,1000 个元素 57 | samples = np.random.normal(loc=1.0, scale=0.5, size=1000) 58 | print(samples.shape) 59 | print(samples.dtype) 60 | print(samples[:30]) 61 | plt.hist(samples, bins=50); 62 | plt.show() 63 | 64 | ''' 65 | (1000,) 66 | float64 67 | [ 0.6806888 0.72202042 1.40490113 1.13979846 0.5729488 1.32584077 68 | 0.61635621 0.60340336 1.29453467 0.69841457 0.6975998 0.72315991 69 | 0.66912189 1.03420801 0.62283168 0.38582511 0.89488414 1.4802518 70 | 1.43819256 0.98605861 0.60402232 1.03820507 0.35598796 1.32901087 71 | 1.03194436 1.3374366 1.82526334 1.26614489 1.20061661 0.86344001] 72 | ''' 73 | ``` 74 | 75 | ![png](../img/8-1-2.png) 76 | 77 | ## 相同绘图上的两个直方图 78 | 79 | ```py 80 | samples_1 = np.random.normal(loc=1, scale=.5, size=10000) 81 | samples_2 = np.random.standard_t(df=10, size=10000) 82 | bins = np.linspace(-3, 3, 50) 83 | 84 | # 设置透明度,并使用相同的桶 85 | # 因为我们绘制两个直方图 86 | plt.hist(samples_1, bins=bins, alpha=0.5, label='samples 1') 87 | plt.hist(samples_2, bins=bins, alpha=0.5, label='samples 2') 88 | plt.legend(loc='upper left'); 89 | plt.show() 90 | ``` 91 | 92 | ![png](../img/8-1-3.png) 93 | 94 | 95 | ## 散点图 96 | 97 | ```py 98 | plt.scatter(samples_1, samples_2, alpha=0.1); 99 | plt.show() 100 | ``` 101 | 102 | ![png](../img/8-1-4.png) -------------------------------------------------------------------------------- /docs/8.11.md: -------------------------------------------------------------------------------- 1 | # 8.11 多个子图 2 | 3 | > 原文:[Multiple Subplots](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.08-Multiple-Subplots.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 本节是[《Python 数据科学手册》](https://github.com/jakevdp/PythonDataScienceHandbook)(Python Data Science Handbook)的摘录。 10 | 11 | 有时,并排比较不同的数据视图会很有帮助。为此,Matplotlib 具有子图的概念:可以在单个图形中一起存在的较小轴域分组。这些子图可能是插图,绘图网格或其他更复杂的布局。在本节中,我们将探讨在 Matplotlib 中创建子图的四个例程。 12 | 13 | ```py 14 | %matplotlib inline 15 | import matplotlib.pyplot as plt 16 | plt.style.use('seaborn-white') 17 | import numpy as np 18 | ``` 19 | 20 | ## ``plt.axes``:手动创建子图 21 | 22 | 创建轴域的最基本方法是使用``plt.axes``函数。正如我们之前看到的,默认情况下,这会创建一个填充整个图形的标准轴域对象。``plt.axes``也有一个可选参数,它是图坐标系中四个数字的列表。这些数字代表图形坐标系中的“左,底,宽,高”``,其范围从图的左下角的 0 到图的右上角的 1。 23 | 24 | 例如,我们可以通过将`x`和`y`位置设置为 0.65(也就是说,从图形宽度的 65% 和高度的 65% 开始),`x`和`y`范围为 0.2(即轴域的大小是图形宽度的 20% 和高度的 20%),在另一个轴域的右上角创建一个插入的轴域: 25 | 26 | ```py 27 | ax1 = plt.axes() # 标准轴域 28 | ax2 = plt.axes([0.65, 0.65, 0.2, 0.2]) 29 | ``` 30 | 31 | ![png](../img/8-11-1.png) 32 | 33 | 34 | 在面向对象的接口中,这个命令的等价物是``fig.add_axes()``。 让我们用它来创建两个垂直堆叠的轴: 35 | 36 | ```py 37 | fig = plt.figure() 38 | ax1 = fig.add_axes([0.1, 0.5, 0.8, 0.4], 39 | xticklabels=[], ylim=(-1.2, 1.2)) 40 | ax2 = fig.add_axes([0.1, 0.1, 0.8, 0.4], 41 | ylim=(-1.2, 1.2)) 42 | 43 | x = np.linspace(0, 10) 44 | ax1.plot(np.sin(x)) 45 | ax2.plot(np.cos(x)); 46 | ``` 47 | 48 | ![png](../img/8-11-2.png) 49 | 50 | 51 | 我们现在有两个刚刚接触的轴域(顶部没有刻度标签):上面板的底部(位置为 0.5)匹配下面板的顶部(位置为 0.1 + 0.4)。 52 | 53 | ## ``plt.subplot``:子图的简单网格 54 | 55 | 子图的对齐的列或行是一个常见的需求,Matplotlib 有几个便利例程,使它们易于创建。其中最低级别是``plt.subplot()``,它在网格中创建一个子图。如你所见,此命令接受三个整数参数 - 行数,列数和要在此图案中创建的绘图的索引,从左上角到右下角: 56 | 57 | ```py 58 | for i in range(1, 7): 59 | plt.subplot(2, 3, i) 60 | plt.text(0.5, 0.5, str((2, 3, i)), 61 | fontsize=18, ha='center') 62 | ``` 63 | 64 | ![png](../img/8-11-3.png) 65 | 66 | 命令``plt.subplots_adjust``可用于调整这些图之间的间距。下面的代码使用等效的面向对象命令``fig.add_subplot()``: 67 | 68 | ```py 69 | fig = plt.figure() 70 | fig.subplots_adjust(hspace=0.4, wspace=0.4) 71 | for i in range(1, 7): 72 | ax = fig.add_subplot(2, 3, i) 73 | ax.text(0.5, 0.5, str((2, 3, i)), 74 | fontsize=18, ha='center') 75 | ``` 76 | 77 | ![png](../img/8-11-4.png) 78 | 79 | 80 | 我们使用了``plt.subplots_adjust``的``hspace``和``wspace``参数,它们沿图的高度和宽度指定间距,以子图大小为单位(这里,间距是子图宽度和高度的 40%。 81 | 82 | ## ``plt.subplots``:一次创建整个网格 83 | 84 | 在创建大型子图网格时,刚才描述的方法会变得相当繁琐,特别是如果你想在内部绘图上隐藏`x`轴和`y`轴标签。为此,``plt.subplots()``是更容易使用的工具(注意``subplots``末尾的``s``)。 该函数不创建单个子图,而是在一行中创建完整的子图网格,并在 NumPy 数组中返回它们。参数是行数和列数,以及可选关键字``sharex``和``sharey``,它们允许你指定不同轴之间的关系。 85 | 86 | 在这里,我们将创建`2x3`子图的网格,其中同一行中的所有轴域共享其`y`轴刻度,并且同一列中的所有轴域共享其`x`轴刻度: 87 | 88 | ```py 89 | fig, ax = plt.subplots(2, 3, sharex='col', sharey='row') 90 | ``` 91 | 92 | ![png](../img/8-11-5.png) 93 | 94 | 95 | 请注意,通过指定``sharex``和``sharey``,我们会自动删除网格上的内部标签,来使绘图更清晰。生成的轴域网格实例在 NumPy 数组中返回,允许使用标准数组索引表示法,方便地指定所需的轴域: 96 | 97 | ```py 98 | # ax 是二维数组,由 [row, col] 索引 99 | for i in range(2): 100 | for j in range(3): 101 | ax[i, j].text(0.5, 0.5, str((i, j)), 102 | fontsize=18, ha='center') 103 | fig 104 | ``` 105 | 106 | ![png](../img/8-11-6.png) 107 | 108 | 109 | 与``plt.subplot()``相比,``plt.subplots()``与 Python 传统的基于 0 的索引更加一致。 110 | 111 | ## ``plt.GridSpec``:更加复杂的排列 112 | 113 | 为了超越常规网格,转向跨越多行和列的子图,``plt.GridSpec()``是最好的工具。 114 | ``plt.GridSpec()``对象本身不会创建一个图;它只是一个方便的接口,可以通过``plt.subplot()``命令识别。例如,具有指定宽度和高度间距的,两行和三列网格的`gridspec`如下所示: 115 | 116 | ```py 117 | grid = plt.GridSpec(2, 3, wspace=0.4, hspace=0.3) 118 | ``` 119 | 120 | 从这里我们可以使用熟悉的 Python 切片语法来指定子图位置和范围: 121 | 122 | ```py 123 | plt.subplot(grid[0, 0]) 124 | plt.subplot(grid[0, 1:]) 125 | plt.subplot(grid[1, :2]) 126 | plt.subplot(grid[1, 2]); 127 | ``` 128 | 129 | ![png](../img/8-11-7.png) 130 | 131 | 这种类型的灵活网格对齐具有广泛的用途。我最经常在创建多轴域直方图时使用它,如下图所示: 132 | 133 | ```py 134 | # 创建一些正态分布的数据 135 | mean = [0, 0] 136 | cov = [[1, 1], [1, 2]] 137 | x, y = np.random.multivariate_normal(mean, cov, 3000).T 138 | 139 | # 使用 gridspec 建立轴域 140 | fig = plt.figure(figsize=(6, 6)) 141 | grid = plt.GridSpec(4, 4, hspace=0.2, wspace=0.2) 142 | main_ax = fig.add_subplot(grid[:-1, 1:]) 143 | y_hist = fig.add_subplot(grid[:-1, 0], xticklabels=[], sharey=main_ax) 144 | x_hist = fig.add_subplot(grid[-1, 1:], yticklabels=[], sharex=main_ax) 145 | 146 | # 主要轴域上的散点图 147 | main_ax.plot(x, y, 'ok', markersize=3, alpha=0.2) 148 | 149 | # 附加轴域上的直方图 150 | x_hist.hist(x, 40, histtype='stepfilled', 151 | orientation='vertical', color='gray') 152 | x_hist.invert_yaxis() 153 | 154 | y_hist.hist(y, 40, histtype='stepfilled', 155 | orientation='horizontal', color='gray') 156 | y_hist.invert_xaxis() 157 | ``` 158 | 159 | ![png](../img/8-11-8.png) 160 | 161 | 162 | 这种类型的分布与其外边距一起绘制,这是很常见的,它在 Seaborn 包中有自己的绘图 API; 详细信息请参阅“使用 Seaborn 进行可视化”。 163 | -------------------------------------------------------------------------------- /docs/8.5.md: -------------------------------------------------------------------------------- 1 | # 8.5 简单的散点图 2 | 3 | > 原文:[Simple Scatter Plots](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.02-Simple-Scatter-Plots.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 本节是[《Python 数据科学手册》](https://github.com/jakevdp/PythonDataScienceHandbook)(Python Data Science Handbook)的摘录。 10 | 11 | 另一种常用的绘图类型是简单的散点图,是折线图的近亲。这里的点并不由线连接,而是单独表示的点,圆或其他形状。我们首先为绘图配置笔记本,并导入我们将使用的函数: 12 | 13 | ```py 14 | %matplotlib inline 15 | import matplotlib.pyplot as plt 16 | plt.style.use('seaborn-whitegrid') 17 | import numpy as np 18 | ``` 19 | 20 | ## 散点图和``plt.plot`` 21 | 22 | 在上一节中,我们查看了生成折线图的``plt.plot`` /``ax.plot``。事实证明,同样的函数也可以生成散点图: 23 | 24 | ```py 25 | x = np.linspace(0, 10, 30) 26 | y = np.sin(x) 27 | 28 | plt.plot(x, y, 'o', color='black'); 29 | ``` 30 | 31 | ![png](../img/8-5-1.png) 32 | 33 | 34 | 函数调用中的第三个参数是一个字符,表示用于绘图的符号类型。正如你可以指定选项,例如``'-'``,``'--'`来控制线条样式,标记样式有自己的一组短字符串代码。完整的可用符号列表,可以在``plt.plot``的文档中找到,或者在Matplotlib 的在线文档中看到。大多数选项非常直观,我们将在这里展示一些更常见的: 35 | 36 | ```py 37 | rng = np.random.RandomState(0) 38 | for marker in ['o', '.', ',', 'x', '+', 'v', '^', '<', '>', 's', 'd']: 39 | plt.plot(rng.rand(5), rng.rand(5), marker, 40 | label="marker='{0}'".format(marker)) 41 | plt.legend(numpoints=1) 42 | plt.xlim(0, 1.8); 43 | ``` 44 | 45 | ![png](../img/8-5-2.png) 46 | 47 | 48 | 为了获得更多选项,这些字符代码可以与线条和颜色代码一起使用,来绘制点以及连接它们的线: 49 | 50 | ```py 51 | plt.plot(x, y, '-ok'); 52 | ``` 53 | 54 | ![png](../img/8-5-3.png) 55 | 56 | 57 | ``plt.plot``的附加关键字参数,指定了线条和标记的各种属性: 58 | 59 | ```py 60 | plt.plot(x, y, '-p', color='gray', 61 | markersize=15, linewidth=4, 62 | markerfacecolor='white', 63 | markeredgecolor='gray', 64 | markeredgewidth=2) 65 | plt.ylim(-1.2, 1.2); 66 | ``` 67 | 68 | ![png](../img/8-5-4.png) 69 | 70 | 71 | ``plt.plot``函数的这种灵活性支持各种可能的可视化选项。可用选项的完整说明,请参阅``plt.plot``文档。 72 | 73 | ## 散点图和``plt.scatter`` 74 | 75 | 第二种更强大的创建散点图的方法是``plt.scatter``函数,它的用法与``plt.plot``函数非常相似: 76 | 77 | ```py 78 | plt.scatter(x, y, marker='o'); 79 | ``` 80 | 81 | ![png](../img/8-5-5.png) 82 | 83 | 84 | ``plt.scatter``与``plt.plot``的主要区别是,它可用于创建散点图,其中每个单独的点的属性(大小,填充颜色,边缘颜色等)可以单独控制,或映射到数据。 85 | 86 | 让我们通过创建一个随机散点图,包含多种颜色和大小的点,来展示它。为了更好地查看重叠结果,我们还将使用``alpha``关键字来调整透明度: 87 | 88 | ```py 89 | rng = np.random.RandomState(0) 90 | x = rng.randn(100) 91 | y = rng.randn(100) 92 | colors = rng.rand(100) 93 | sizes = 1000 * rng.rand(100) 94 | 95 | plt.scatter(x, y, c=colors, s=sizes, alpha=0.3, 96 | cmap='viridis') 97 | plt.colorbar(); # show color scale 98 | ``` 99 | 100 | ![png](../img/8-5-6.png) 101 | 102 | 请注意,颜色参数自动映射到颜色标度(此处由``colorbar()``命令显示),`size`参数以像素为单位。通过这种方式,点的颜色和大小可用于在可视化中传达信息,以便可视化多维数据。 103 | 104 | 例如,我们可能会使用来自 Scikit-Learn 的 Iris 数据,其中每个样本是三种类型的花朵中的一种,其花瓣和萼片的大小是仔细测量的: 105 | 106 | ```py 107 | from sklearn.datasets import load_iris 108 | iris = load_iris() 109 | features = iris.data.T 110 | 111 | plt.scatter(features[0], features[1], alpha=0.2, 112 | s=100*features[3], c=iris.target, cmap='viridis') 113 | plt.xlabel(iris.feature_names[0]) 114 | plt.ylabel(iris.feature_names[1]); 115 | ``` 116 | 117 | ![png](../img/8-5-7.png) 118 | 119 | 120 | 我们可以看到,这个散点图使我们能够同时探索数据的四个不同维度:每个点的`(x, y)`位置对应于萼片的长度和宽度,该点的大小与花瓣宽度有关,并且颜色与花的特定种类有关。像这样的多颜色和多特征散点图,对于数据探索和展示都是有用的。 121 | 122 | ## ``plot`` VS ``scatter``:效率的注解 123 | 124 | 除了``plt.plot``和``plt.scatter``中提供的不同功能之外,为什么你选择使用一个而不是另一个? 虽然对于少量数据而言并不重要,因为数据集大于几千个点,``plt.plot``可能比``plt.scatter``明显更高效。原因是``plt.scatter``能够为每个点渲染不同的大小和/或颜色,因此渲染器必须执行单独构建每个点的额外工作。 125 | 126 | 另一方面,在`plt.plot`中,点基本上总是彼此的克隆,因此确定点的外观的工作,仅对整个数据集执行一次。对于大型数据集,这两者之间的差异可能会使性能大不相同,因此,对于大型数据集,``plt.plot``应优于``plt.scatter``。 -------------------------------------------------------------------------------- /docs/8.6.md: -------------------------------------------------------------------------------- 1 | # 8.6 可视化误差 2 | 3 | > 原文:[Visualizing Errors](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.03-Errorbars.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 本节是[《Python 数据科学手册》](https://github.com/jakevdp/PythonDataScienceHandbook)(Python Data Science Handbook)的摘录。 10 | 11 | 对于任何科学测量,误差的准确计算几乎与数字本身的准确报告一样重要,甚至更重要。例如,假设我正在使用一些天体物理观测来估计哈勃常数,即宇宙膨胀率的局部测量值。我知道目前的文献显示,它是大约`71 (km/s)/Mpc`,我用我的方法测得的值为`74 (km/s)/Mpc`。这些值是否一致? 鉴于此信息,唯一正确的答案是:没有办法知道。 12 | 13 | 假设我用报告的不确定性来扩展这些信息:目前的文献显示它是`71 ± 2.5 (km/s)/Mpc`,我的方法测得的值为`74 ± 5 (km/s)/Mpc`。现在值是否一致? 这是一个可以定量回答的问题。 14 | 15 | 在数据和结果的可视化中,有效地显示这些误差,可以使图表传达更完整的信息。 16 | 17 | ## 基本的误差栏 18 | 19 | 可以使用单个 Matplotlib 函数调用,创建基本误差栏: 20 | 21 | ```py 22 | %matplotlib inline 23 | import matplotlib.pyplot as plt 24 | plt.style.use('seaborn-whitegrid') 25 | import numpy as np 26 | 27 | x = np.linspace(0, 10, 50) 28 | dy = 0.8 29 | y = np.sin(x) + dy * np.random.randn(50) 30 | 31 | plt.errorbar(x, y, yerr=dy, fmt='.k'); 32 | ``` 33 | 34 | ![png](../img/8-6-1.png) 35 | 36 | 37 | 这里``fmt``是控制线和点外观的格式代码,与``plt.plot``中使用的简写语法相同,在“简单的折线图”和“简单的散点图”中概述。 38 | 39 | 除了这些基本选项之外,``errorbar``函数还有许多选项可以微调输出。使用这些附加选项,你可以轻松自定义误差栏绘图的美感。我经常发现它有用,特别是在拥挤的绘图中,使误差栏比点本身更浅: 40 | 41 | ```py 42 | plt.errorbar(x, y, yerr=dy, fmt='o', color='black', 43 | ecolor='lightgray', elinewidth=3, capsize=0); 44 | ``` 45 | 46 | ![png](../img/8-6-2.png) 47 | 48 | 49 | 除了这些选项,你还可以指定水平误差栏(``xerr``),单侧误差栏和许多其他变体。对于可用选项的更多信息,请参阅``plt.errorbar``的文档字符串。 50 | 51 | ## 连续误差 52 | 53 | 在某些情况下,希望在连续数量上显示误差栏。虽然 Matplotlib 没有为这种类型的应用内置便利例程,但是将`plt.plot`和`plt.fill_between`之类的原语组合起来来获得有用的结果,是相对容易的。 54 | 55 | 在这里,我们将使用 Scikit-Learn API 执行简单的高斯过程回归(详细信息,请参阅“Scikit-Learn 简介”)。这是一种方法,使用不确定性的连续测量,将非常灵活的非参数函数拟合到数据。我们现在不会深入研究高斯过程回归的细节,而是专注于如何可视化这种连续误差测量: 56 | 57 | ```py 58 | from sklearn.gaussian_process import GaussianProcess 59 | 60 | # 定义模型并绘制一些数据 61 | model = lambda x: x * np.sin(x) 62 | xdata = np.array([1, 3, 5, 6, 8]) 63 | ydata = model(xdata) 64 | 65 | # 拟合高斯过程 66 | gp = GaussianProcess(corr='cubic', theta0=1e-2, thetaL=1e-4, thetaU=1E-1, 67 | random_start=100) 68 | gp.fit(xdata[:, np.newaxis], ydata) 69 | 70 | xfit = np.linspace(0, 10, 1000) 71 | yfit, MSE = gp.predict(xfit[:, np.newaxis], eval_MSE=True) 72 | dyfit = 2 * np.sqrt(MSE) # 2*sigma ~ 95% confidence region 73 | ``` 74 | 75 | 我们现在有``xfit``,``yfit``和``dyfit``,它们对数据的连续拟合进行抽样。我们可以将这些传递给上面的``plt.errorbar``函数,但是我们真的不想绘制 1000 个点和 1000 个误差栏。相反,我们可以使用浅色的``plt.fill_between``函数来显示这个连续误差: 76 | 77 | ```py 78 | # 可视化结果 79 | plt.plot(xdata, ydata, 'or') 80 | plt.plot(xfit, yfit, '-', color='gray') 81 | 82 | plt.fill_between(xfit, yfit - dyfit, yfit + dyfit, 83 | color='gray', alpha=0.2) 84 | plt.xlim(0, 10); 85 | ``` 86 | 87 | ![png](../img/8-6-3.png) 88 | 89 | 90 | 注意我们在这里使用``fill_between``函数做了什么:我们传递一个`x`值,然后是`y`下界,然后是`y`上面,结果就是之间的区域被填充了。 91 | 92 | 得到的图形可以用于非常直观地了解高斯过程回归算法正在做什么:在测量数据点附近的区域中,模型受到强烈约束,这反映在较小的模型误差中。在远离测量数据点的区域中,模型不受强烈约束,并且模型误差增加。 93 | 94 | 对于``plt.fill_between()``(以及密切相关的``plt.fill()``函数)中,可用选项的更多信息,请参阅函数的文档字符串或 Matplotlib 文档。 95 | 96 | 最后,如果这和你的品味相比,看起来有点太低了,请参考“可视化与 Seaborn”,其中我们讨论了 Seaborn 包,它有更简化的 API,用于可视化这种类型 的连续误差栏。 -------------------------------------------------------------------------------- /docs/8.7.md: -------------------------------------------------------------------------------- 1 | # 8.7 密度和等高线图 2 | 3 | > 原文:[Density and Contour Plots](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.04-Density-and-Contour-Plots.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 本节是[《Python 数据科学手册》](https://github.com/jakevdp/PythonDataScienceHandbook)(Python Data Science Handbook)的摘录。 10 | 11 | 有时,使用等高线或颜色编码的区域,在二维中显示三维数据是有用的。有三个 Matplotlib 函数可以帮助完成这个任务:`plt.contour``用于等高线图,``plt.contourf``用于填充的等高线图,``plt.imshow``用于显示图像。本节介绍使用这些的几个示例。 我们首先为绘图配置笔记本,并导入我们将使用的函数: 12 | 13 | ```py 14 | %matplotlib inline 15 | import matplotlib.pyplot as plt 16 | plt.style.use('seaborn-white') 17 | import numpy as np 18 | ``` 19 | 20 | ## 可视化三维函数 21 | 22 | 我们首先使用`z = f(x, y)`函数演示等高线图,为`f`使用以下特定选项(当我们将它用作数组广播的动机示例时,我们之前在“数组计算:广播”中看到过它们): 23 | 24 | ```py 25 | def f(x, y): 26 | return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x) 27 | ``` 28 | 29 | 可以使用``plt.contour``函数创建等高线图。它需要三个参数:`x`值的网格,`y`值的网格和`z`值的网格。`x`和`y`值表示图上的位置,`z`值将由等高线水平表示。也许准备这样的数据最直接的方法是使用``np.meshgrid``函数,它从一维数组构建二维网格: 30 | 31 | ```py 32 | x = np.linspace(0, 5, 50) 33 | y = np.linspace(0, 5, 40) 34 | 35 | X, Y = np.meshgrid(x, y) 36 | Z = f(X, Y) 37 | ``` 38 | 39 | 现在让我们看一下仅有线的标准等高线图: 40 | 41 | ```py 42 | plt.contour(X, Y, Z, colors='black'); 43 | ``` 44 | 45 | ![png](../img/8-7-1.png) 46 | 47 | 48 | 请注意,默认情况下,使用单一颜色时,负值由虚线表示,正值由实线表示。或者,可以通过``cmap``参数,指定颜色表来对线条进行颜色编码。在这里,我们还指定我们想要绘制更多的线 - 数据范围内的 20 个等距间隔: 49 | 50 | ```py 51 | plt.contour(X, Y, Z, 20, cmap='RdGy'); 52 | ``` 53 | 54 | ![png](../img/8-7-2.png) 55 | 56 | 57 | 在这里,我们选择了``RdGy``(`Red-Gray`的缩写)颜色表,这是居中数据的不错选择。Matplotlib 提供了各种各样的色彩表,你可以通过在``plt.cm``模块上的 TAB 补全,在 IPython 中轻松浏览它们: 58 | 59 | ```py 60 | plt.cm. 61 | ``` 62 | 63 | 我们的绘图看起来更好,但线条之间的空间可能有点分散。通过使用``plt.contourf()``函数(注意末尾的``f``),我们可以切换到填充的等高线图来改变它,它使用与``plt.contour()``大致相同的语法。。 64 | 65 | 另外,我们将添加一个``plt.colorbar()``命令,它会自动创建一个附加轴,带有绘图的标记的颜色信息: 66 | 67 | 68 | ```py 69 | plt.contourf(X, Y, Z, 20, cmap='RdGy') 70 | plt.colorbar(); 71 | ``` 72 | 73 | ![png](../img/8-7-3.png) 74 | 75 | 76 | 颜色条清楚地表明黑色区域是“峰值”,而红色区域是“谷值”。 77 | 78 | 这个绘图的一个潜在问题是它有些“噪点”。 也就是说,颜色阶梯是离散的而不是连续的,这并不总是所希望的。 79 | 80 | 这可以通过将等高线数设置为非常高的数量来解决,但这会使的绘图相当低效:Matplotlib必须为等高线中的每个阶梯渲染一个新的多边形。处理这个的更好方法是使用``plt.imshow()``函数,它将二维数据网格解释为图像。 81 | 82 | 以下代码显示了这一点: 83 | 84 | ```py 85 | plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower', 86 | cmap='RdGy') 87 | plt.colorbar() 88 | plt.axis(aspect='image'); 89 | ``` 90 | 91 | ![png](../img/8-7-4.png) 92 | 93 | 94 | 但是,``imshow()``有一些潜在的问题: 95 | 96 | - ``plt.imshow()``不接受`x`和`y`网格,所以你必须在绘图上手动指定图像的边界`[xmin, xmax, ymin, ymax]`。 97 | - ``plt.imshow()``默认遵循标准图像数组定义,其中原点位于左上角,而不是大多数等高线图中的左下角。 显示网格化数据时必须更改此值。 98 | - ``plt.imshow()``将自动调整轴纵横比来匹配输入数据;这可以通过设置,例如``plt.axis(aspect ='image')``来使`x`和`y`单位匹配来更改。 99 | 100 | 最后,有时可以将等高线图和图像绘图组合起来。例如,在这里我们将使用部分透明的背景图像(通过``alpha``参数设置透明度)和绘制在上面的等高线图,标签在它上面(使用``plt.clabel()``函数): 101 | 102 | ```py 103 | contours = plt.contour(X, Y, Z, 3, colors='black') 104 | plt.clabel(contours, inline=True, fontsize=8) 105 | 106 | plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower', 107 | cmap='RdGy', alpha=0.5) 108 | plt.colorbar(); 109 | ``` 110 | 111 | ![png](../img/8-7-5.png) 112 | 113 | 114 | 这三个函数的组合 -- ``plt.contour``,``plt.contourf``和``plt.imshow`` -- 提供了几乎无限的可能性,来在二维绘图中展示这种三维数据。这些函数中可用选项的更多信息,请参阅其文档字符串。如果你对此类数据的三维可视化感兴趣,请参阅“Matplotlib 中的三维绘图”。 -------------------------------------------------------------------------------- /docs/8.8.md: -------------------------------------------------------------------------------- 1 | # 8.8 直方图,分箱和密度 2 | 3 | > 原文:[Histograms, Binnings, and Density](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.05-Histograms-and-Binnings.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 本节是[《Python 数据科学手册》](https://github.com/jakevdp/PythonDataScienceHandbook)(Python Data Science Handbook)的摘录。 10 | 11 | 简单的直方图可能是理解数据集的第一步。之前,我们预览了 Matplotlib 直方图函数(参见“比较,掩码和布尔逻辑”),一旦执行了常规的导入,它在一行中创建一个基本直方图: 12 | 13 | ```py 14 | %matplotlib inline 15 | import numpy as np 16 | import matplotlib.pyplot as plt 17 | plt.style.use('seaborn-white') 18 | 19 | data = np.random.randn(1000) 20 | 21 | plt.hist(data); 22 | ``` 23 | 24 | ![png](../img/8-8-1.png) 25 | 26 | ``hist()``函数有很多调整计算和显示的选项;这是一个更加自定义的直方图的例子: 27 | 28 | ```py 29 | plt.hist(data, bins=30, normed=True, alpha=0.5, 30 | histtype='stepfilled', color='steelblue', 31 | edgecolor='none'); 32 | ``` 33 | 34 | ![png](../img/8-8-2.png) 35 | 36 | 37 | ``plt.hist``的文档字符串提供了其他可用自定义选项的更多信息。我发现``histtype='stepfilled'``和一些透明度``alpha``的组合,在比较几种分布的直方图时非常有用: 38 | 39 | ```py 40 | x1 = np.random.normal(0, 0.8, 1000) 41 | x2 = np.random.normal(-2, 1, 1000) 42 | x3 = np.random.normal(3, 2, 1000) 43 | 44 | kwargs = dict(histtype='stepfilled', alpha=0.3, normed=True, bins=40) 45 | 46 | plt.hist(x1, **kwargs) 47 | plt.hist(x2, **kwargs) 48 | plt.hist(x3, **kwargs); 49 | ``` 50 | 51 | ![png](../img/8-8-3.png) 52 | 53 | 54 | 如果你想简单地计算直方图(也就是说,计算给定桶中的点数)而不显示它,那么``np.histogram()``函数是可用的: 55 | 56 | ```py 57 | counts, bin_edges = np.histogram(data, bins=5) 58 | print(counts) 59 | 60 | # [ 12 190 468 301 29] 61 | ``` 62 | 63 | ## 二维直方图和分箱 64 | 65 | 就像我们通过将数字放入桶中,创建一维直方图一样,我们也可以通过将点放入通过二维的桶中,来创建二维直方图。我们将在这里简要介绍几种方法。我们首先定义一些数据 - 从多元高斯分布中抽取的``x``和``y``数组: 66 | 67 | ```py 68 | mean = [0, 0] 69 | cov = [[1, 1], [1, 2]] 70 | x, y = np.random.multivariate_normal(mean, cov, 10000).T 71 | ``` 72 | 73 | ### ``plt.hist2d``:二维直方图 74 | 75 | 绘制二维直方图的一种简单方法是使用 Matplotlib 的``plt.hist2d``函数: 76 | 77 | ```py 78 | plt.hist2d(x, y, bins=30, cmap='Blues') 79 | cb = plt.colorbar() 80 | cb.set_label('counts in bin') 81 | ``` 82 | 83 | ![png](../img/8-8-4.png) 84 | 85 | 86 | 就像``plt.hist``一样,``plt.hist2d``有许多微调绘图和分箱的额外选项来,这在函数的文档字符串中有很好的概述。此外,正如``plt.hist``在``np.histogram``中存在对应,``plt.hist2d``在``np.histogram2d``中也存在对应,可以按如下方式使用: 87 | 88 | ```py 89 | counts, xedges, yedges = np.histogram2d(x, y, bins=30) 90 | ``` 91 | 92 | 对于维度大于 2 的直方图分箱的推广,请参阅``np.histogramdd``函数。 93 | 94 | ### ``plt.hexbin``:六边形分箱 95 | 96 | 二维直方图创建了横跨坐标轴的正方形细分。这种细分的另一种自然形状是正六边形。为此,Matplotlib 提供了``plt.hexbin``例程,它将表示在六边形网格中分箱的二维数据集: 97 | 98 | ```py 99 | plt.hexbin(x, y, gridsize=30, cmap='Blues') 100 | cb = plt.colorbar(label='count in bin') 101 | ``` 102 | 103 | ![png](../img/8-8-5.png) 104 | 105 | 106 | ``plt.hexbin``有许多有趣的选项,包括为每个点指定权重,以及将每个桶中的输出更改为任何 NumPy 聚合(权重的平均值,权重的标准差等)。 107 | 108 | ### 核密度估计 109 | 110 | 另一种评估多维密度的常用方法是核密度估计(KDE)。这将在“深度:核密度估计”中全面讨论,但是现在我们只是提到,KDE 可以被认为是“消去”空间中的点,并将结果相加来获得平滑函数的一种方式。 111 | 112 | ``scipy.stats``包中存在非常快速和简单的 KDE 实现。以下是在此数据上使用 KDE 的快速示例: 113 | 114 | ```py 115 | from scipy.stats import gaussian_kde 116 | 117 | # 拟合大小为 [Ndim, Nsamples] 的数组 118 | data = np.vstack([x, y]) 119 | kde = gaussian_kde(data) 120 | 121 | # 在常规网格上评估 122 | xgrid = np.linspace(-3.5, 3.5, 40) 123 | ygrid = np.linspace(-6, 6, 40) 124 | Xgrid, Ygrid = np.meshgrid(xgrid, ygrid) 125 | Z = kde.evaluate(np.vstack([Xgrid.ravel(), Ygrid.ravel()])) 126 | 127 | # 将结果绘制为图像 128 | plt.imshow(Z.reshape(Xgrid.shape), 129 | origin='lower', aspect='auto', 130 | extent=[-3.5, 3.5, -6, 6], 131 | cmap='Blues') 132 | cb = plt.colorbar() 133 | cb.set_label("density") 134 | ``` 135 | 136 | ![png](../img/8-8-6.png) 137 | 138 | KDE 具有平滑长度,可以在细节和平滑度之间有效地调整(无处不在的偏差 - 方差权衡的一个例子)。有关选择合适的平滑长度的文献非常多:``gaussian_kde``使用经验法则,试图为输入数据找到近似最佳的平滑长度。 139 | 140 | SciPy 生态系统中提供了其他 KDE 实现,每个实现都有自己的优点和缺点;例如,参见``sklearn.neighbors.KernelDensity``和``statsmodels.nonparametric.kernel_density.KDEMultivariate``。对于基于 KDE 的可视化,使用 Matplotlib 往往过于冗长。在“可视化和 Seaborn”中讨论的 Seaborn 库,提供了更为简洁的 API 来创建基于 KDE 的可视化。 -------------------------------------------------------------------------------- /docs/8.9.md: -------------------------------------------------------------------------------- 1 | # 8.9 自定义图例 2 | 3 | > 原文:[Customizing Plot Legends](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/matplotlib/04.06-Customizing-Legends.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 本节是[《Python 数据科学手册》](https://github.com/jakevdp/PythonDataScienceHandbook)(Python Data Science Handbook)的摘录。 10 | 11 | 绘图的图例将意义赋予可视化,为各种绘图元素标识意义。我们以前看过如何创建简单的图例;在这里,我们将介绍如何在 Matplotlib 中自定义图例的位置和样式。 12 | 13 | 可以使用``plt.legend()``命令创建最简单的图例,该命令会自动为任何已标记的绘图元素创建图例: 14 | 15 | ```py 16 | import matplotlib.pyplot as plt 17 | plt.style.use('classic') 18 | 19 | %matplotlib inline 20 | import numpy as np 21 | 22 | x = np.linspace(0, 10, 1000) 23 | fig, ax = plt.subplots() 24 | ax.plot(x, np.sin(x), '-b', label='Sine') 25 | ax.plot(x, np.cos(x), '--r', label='Cosine') 26 | ax.axis('equal') 27 | leg = ax.legend(); 28 | ``` 29 | 30 | ![png](../img/8-9-1.png) 31 | 32 | 33 | 但是我们可能有很多方法想要定制这样一个图例。例如,我们可以指定位置并关闭边框: 34 | 35 | ```py 36 | ax.legend(loc='upper left', frameon=False) 37 | fig 38 | ``` 39 | 40 | ![png](../img/8-9-2.png) 41 | 42 | 我们可以使用``ncol``命令来指定图例中的列数: 43 | 44 | ```py 45 | ax.legend(frameon=False, loc='lower center', ncol=2) 46 | fig 47 | ``` 48 | 49 | ![png](../img/8-9-3.png) 50 | 51 | 我们可以使用圆角框(``fancybox``)或添加阴影,更改边框的透明度(`alpha`值),或更改文本周围的边距: 52 | 53 | ```py 54 | ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1) 55 | fig 56 | ``` 57 | 58 | ![png](../img/8-9-4.png) 59 | 60 | 可用图例选项的更多信息,请参阅``plt.legend``文档字符串。 61 | 62 | ## 为图例选择元素 63 | 64 | 我们已经看到,图例默认包含所有已标记的元素。如果这不是我们想要的,我们可以通过使用`plot`命令返回的对象,来微调图例中出现的元素和标签。``plt.plot()``命令可以一次创建多个线条,并返回已创建的线条实例的列表。将这些中的任何一个,以及我们想要标识的标签传递给``plt.legend()``将告诉它识别哪些: 65 | 66 | ```py 67 | y = np.sin(x[:, np.newaxis] + np.pi * np.arange(0, 2, 0.5)) 68 | lines = plt.plot(x, y) 69 | 70 | # 直线是 plt.Line2D 实例的列表 71 | plt.legend(lines[:2], ['first', 'second']); 72 | ``` 73 | 74 | ![png](../img/8-9-5.png) 75 | 76 | 我通常在实践中发现使用第一种方法更清晰,将标签应用于你想要在图例上显示的绘图元素: 77 | 78 | ```py 79 | plt.plot(x, y[:, 0], label='first') 80 | plt.plot(x, y[:, 1], label='second') 81 | plt.plot(x, y[:, 2:]) 82 | plt.legend(framealpha=1, frameon=True); 83 | ``` 84 | 85 | ![png](../img/8-9-6.png) 86 | 87 | 请注意,默认情况下,图例会忽略没有设置``label``属性的所有元素。 88 | 89 | ## 用于点的大小的图例 90 | 91 | 有时,图例默认值不足以满足给定的可视化效果。例如,你可能正在使用点的大小来标记数据的某些特征,并且想要创建反映这一点的图例。这是一个例子,我们将使用点的大小来表示加州城市的人口。我们想要一个标识点大小比例的图例,我们将通过绘制一些没有条目的标记数据来实现它: 92 | 93 | ```py 94 | import pandas as pd 95 | cities = pd.read_csv('data/california_cities.csv') 96 | 97 | # 提取我们感兴趣的数据 98 | lat, lon = cities['latd'], cities['longd'] 99 | population, area = cities['population_total'], cities['area_total_km2'] 100 | 101 | # 将点绘制为散点图,使用尺寸和颜色,但没有标签 102 | plt.scatter(lon, lat, label=None, 103 | c=np.log10(population), cmap='viridis', 104 | s=area, linewidth=0, alpha=0.5) 105 | plt.axis(aspect='equal') 106 | plt.xlabel('longitude') 107 | plt.ylabel('latitude') 108 | plt.colorbar(label='log$_{10}$(population)') 109 | plt.clim(3, 7) 110 | 111 | # 这里我们创建图例 112 | # 我们使用所需大小和标签绘制空列表 113 | for area in [100, 300, 500]: 114 | plt.scatter([], [], c='k', alpha=0.3, s=area, 115 | label=str(area) + ' km$^2$') 116 | plt.legend(scatterpoints=1, frameon=False, labelspacing=1, title='City Area') 117 | 118 | plt.title('California Cities: Area and Population'); 119 | ``` 120 | 121 | ![png](../img/8-9-7.png) 122 | 123 | 124 | 图例始终引用绘图上的某个对象,因此如果我们想要显示特定的形状,我们需要绘制它。在这种情况下,我们想要的对象(灰色圆圈)不在图上,所以我们通过绘制空列表来伪造它们。另请注意,图例仅列出了指定标签的绘图元素。 125 | 126 | 通过绘制空列表,我们创建了带标签的绘图对象,由图例拾取,现在我们的图例告诉我们一些有用的信息。此策略可用于创建更复杂的可视化。 127 | 128 | 最后,请注意,对于这样的地理数据,如果我们可以显示州边界或其他特定于地图的元素,则会更清楚。为此,一个很好的工具选择是 Matplotlib 的 Basemap 附加工具包,我们将在“地理数据和 Basemap”中探讨。 129 | 130 | ## 多个图例 131 | 132 | 有时在设计绘图时,你需要在同一轴域上添加多个图例。不幸的是,这对 Matplotlib 并不容易:通过标准的``legend``接口,只能为整个绘图创建一个图例。如果你尝试使用``plt.legend()``或``ax.legend()``创建第二个图例,它将简单地覆盖第一个。我们可以通过从头开始创建一个新的图例艺术家来解决这个问题,然后使用较低级别的``ax.add_artist()``方法,手动将第二个艺术家添加到绘图中: 133 | 134 | ```py 135 | fig, ax = plt.subplots() 136 | 137 | lines = [] 138 | styles = ['-', '--', '-.', ':'] 139 | x = np.linspace(0, 10, 1000) 140 | 141 | for i in range(4): 142 | lines += ax.plot(x, np.sin(x - i * np.pi / 2), 143 | styles[i], color='black') 144 | ax.axis('equal') 145 | 146 | # 指定第一个图例的直线和标签 147 | ax.legend(lines[:2], ['line A', 'line B'], 148 | loc='upper right', frameon=False) 149 | 150 | # 创建第二个图例,并手动添加艺术家 151 | from matplotlib.legend import Legend 152 | leg = Legend(ax, lines[2:], ['line C', 'line D'], 153 | loc='lower right', frameon=False) 154 | ax.add_artist(leg); 155 | ``` 156 | 157 | ![png](../img/8-9-8.png) 158 | 159 | 160 | 这是对构成任何 Matplotlib 绘图的,低级艺术家对象的窥视。 161 | 如果你检查一下``ax.legend()``的源代码(回想一下你可以在 IPython 笔记本中使用``ax.legend??``来实现),你会看到该函数只包含一些逻辑,创建合适的``Legend``艺术家,然后将其保存在``legend_``属性中,并在绘图时添加到图形中。 162 | -------------------------------------------------------------------------------- /docs/8.md: -------------------------------------------------------------------------------- 1 | # 八、Matplotlib -------------------------------------------------------------------------------- /docs/9.1.md: -------------------------------------------------------------------------------- 1 | ## 9.1 NumPy 2 | 3 | > 原文:[NumPy](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/numpy.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 致谢:派生于 Olivier Grisel 分享的 [scikit-learn 和 IPython 并行机器学习](https://github.com/ogrisel/parallel_ml_tutorial) 10 | 11 | * NumPy 数组,`dtype`和形状 12 | * 常见数组操作 13 | * 原地修改形状和更新 14 | * 合并数组 15 | * 创建示例数据 16 | 17 | 18 | ```py 19 | import numpy as np 20 | ``` 21 | 22 | ### NumPy 数组,`dtype`和形状 23 | 24 | 25 | ```py 26 | a = np.array([1, 2, 3]) 27 | print(a) 28 | print(a.shape) 29 | print(a.dtype) 30 | 31 | ''' 32 | [1 2 3] 33 | (3,) 34 | int64 35 | ''' 36 | 37 | b = np.array([[0, 2, 4], [1, 3, 5]]) 38 | print(b) 39 | print(b.shape) 40 | print(b.dtype) 41 | 42 | ''' 43 | [[0 2 4] 44 | [1 3 5]] 45 | (2, 3) 46 | int64 47 | ''' 48 | 49 | np.zeros(5) 50 | 51 | # array([ 0., 0., 0., 0., 0.]) 52 | 53 | 54 | np.ones(shape=(3, 4), dtype=np.int32) 55 | 56 | ''' 57 | array([[1, 1, 1, 1], 58 | [1, 1, 1, 1], 59 | [1, 1, 1, 1]], dtype=int32) 60 | ''' 61 | ``` 62 | 63 | ### 常见数组操作 64 | 65 | 66 | ```py 67 | c = b * 0.5 68 | print(c) 69 | print(c.shape) 70 | print(c.dtype) 71 | 72 | ''' 73 | [[ 0. 1. 2. ] 74 | [ 0.5 1.5 2.5]] 75 | (2, 3) 76 | float64 77 | ''' 78 | 79 | d = a + c 80 | print(d) 81 | 82 | ''' 83 | [[ 1. 3. 5. ] 84 | [ 1.5 3.5 5.5]] 85 | ''' 86 | 87 | d[0] 88 | 89 | # array([ 1., 3., 5.]) 90 | 91 | d[0, 0] 92 | 93 | # 1.0 94 | 95 | d[:, 0] 96 | 97 | # array([ 1. , 1.5]) 98 | 99 | d.sum() 100 | 101 | # 19.5 102 | 103 | d.mean() 104 | 105 | # 3.25 106 | 107 | d.sum(axis=0) 108 | 109 | # array([ 2.5, 6.5, 10.5]) 110 | 111 | d.mean(axis=1) 112 | 113 | # array([ 3. , 3.5]) 114 | ``` 115 | 116 | ### 原地修改形状和更新 117 | 118 | 119 | ```py 120 | e = np.arange(12) 121 | print(e) 122 | 123 | # [ 0 1 2 3 4 5 6 7 8 9 10 11] 124 | 125 | # f 是 e 的内容的视图 126 | f = e.reshape(3, 4) 127 | print(f) 128 | 129 | ''' 130 | [[ 0 1 2 3] 131 | [ 4 5 6 7] 132 | [ 8 9 10 11]] 133 | ''' 134 | 135 | # 将 e 从索引 5 开始的值设为 0 136 | e[5:] = 0 137 | print(e) 138 | 139 | # [0 1 2 3 4 0 0 0 0 0 0 0] 140 | 141 | # f 也更新了 142 | f 143 | 144 | ''' 145 | array([[0, 1, 2, 3], 146 | [4, 0, 0, 0], 147 | [0, 0, 0, 0]]) 148 | ''' 149 | 150 | # OWNDATA 展示了 f 并没有自己的数据 151 | f.flags 152 | 153 | ''' 154 | C_CONTIGUOUS : True 155 | F_CONTIGUOUS : False 156 | OWNDATA : False 157 | WRITEABLE : True 158 | ALIGNED : True 159 | UPDATEIFCOPY : False 160 | ''' 161 | ``` 162 | 163 | ### 合并数组 164 | 165 | 166 | ```py 167 | a 168 | 169 | # array([1, 2, 3]) 170 | 171 | b 172 | 173 | ''' 174 | array([[0, 2, 4], 175 | [1, 3, 5]]) 176 | ''' 177 | 178 | d 179 | 180 | ''' 181 | array([[ 1. , 3. , 5. ], 182 | [ 1.5, 3.5, 5.5]]) 183 | ''' 184 | 185 | np.concatenate([a, a, a]) 186 | 187 | # array([1, 2, 3, 1, 2, 3, 1, 2, 3]) 188 | 189 | # 广播在需要时自动完成 190 | np.vstack([a, b, d]) 191 | 192 | ''' 193 | array([[ 1. , 2. , 3. ], 194 | [ 0. , 2. , 4. ], 195 | [ 1. , 3. , 5. ], 196 | [ 1. , 3. , 5. ], 197 | [ 1.5, 3.5, 5.5]]) 198 | ''' 199 | 200 | # 在机器学习中,使用 hstack 201 | # 来扩充或者添加新的/交叉特征很有用 202 | np.hstack([b, d]) 203 | 204 | ''' 205 | array([[ 0. , 2. , 4. , 1. , 3. , 5. ], 206 | [ 1. , 3. , 5. , 1.5, 3.5, 5.5]]) 207 | ''' 208 | ``` 209 | 210 | ### 创建样例数据 211 | 212 | 213 | ```py 214 | %matplotlib inline 215 | 216 | import pylab as plt 217 | import seaborn 218 | 219 | seaborn.set() 220 | 221 | # 创建特定区间上的等间隔的数字 222 | x = np.linspace(0, 2, 10) 223 | plt.plot(x, 'o-'); 224 | plt.show() 225 | ``` 226 | 227 | ![png](../img/9-1-1.png) 228 | 229 | 230 | 231 | ```py 232 | # 创建样例数据,添加一些噪声 233 | x = np.random.uniform(1, 100, 1000) 234 | y = np.log(x) + np.random.normal(0, .3, 1000) 235 | 236 | plt.scatter(x, y) 237 | plt.show() 238 | ``` 239 | 240 | ![png](../img/9-1-2.png) -------------------------------------------------------------------------------- /docs/9.2.md: -------------------------------------------------------------------------------- 1 | ## 9.2 NumPy 简介 2 | 3 | > 原文:[Introduction to NumPy](https://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/numpy/02.00-Introduction-to-NumPy.ipynb) 4 | > 5 | > 译者:[飞龙](https://github.com/wizardforcel) 6 | > 7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) 8 | > 9 | > 本节是[《Python 数据科学手册》](https://github.com/jakevdp/PythonDataScienceHandbook)(Python Data Science Handbook)的摘录。 10 | 11 | 本章以及第三章概述了在 Python 中有效加载,存储和操作内存数据的技术。 12 | 13 | 主题非常广泛:数据集可能来源于广泛的来源和各种格式,包括文档集合,图像集合,声音片段集合,数值测量集合或几乎任何其他内容。尽管存在这种明显的异质性,但它将帮助我们从根本上将所有数据视为数字数组。 14 | 15 | 例如,图像 - 特别是数字图像 - 可以看做简单的二维数字数组,表示整个区域的像素亮度。声音片段可以看做是强度与时间的一维数组。文本可以以各种方式转换为数字表示,可能是表示某些单词或单词对的频率的二元数字。 16 | 17 | 无论数据是什么,使其可分析的第一步是将它们转换为数字数组(稍后我们将在特征工程中讨论此过程的一些具体示例)。因此,数值数组的有效存储和操作,对于数据科学的过程来说绝对是基础。 18 | 19 | 我们现在来看看 Python 用于处理这种数值数组的专用工具:NumPy 包和 Pandas 包(在第三章中讨论)。 20 | 21 | 本章将详细介绍 NumPy。 NumPy(Numerical Python 的缩写)提供了一个有效的接口,来存储和操作密集数据缓冲区。在某些方面,NumPy 数组类似于 Python 的内置``list``类型,但随着数组的大小增大,NumPy 数组提供了更高效的存储和数据操作。 22 | 23 | NumPy 数组构成了 Python 中几乎整个数据科学工具生态系统的核心,因此无论你对数据科学的哪些方面感兴趣,学习有效使用 NumPy 都是值得的。 24 | 25 | 如果你按照前言中列出的建议并安装了 Anaconda 技术栈,那么你已经安装了 NumPy 并准备好了。如果你更喜欢自己动手,可以访问 并按照其中的安装说明进行操作。 26 | 27 | 完成后,你可以导入 NumPy 并仔细检查版本: 28 | 29 | 30 | ```py 31 | import numpy 32 | numpy.__version__ 33 | 34 | # '1.11.1' 35 | ``` 36 | 37 | 对于这里讨论的软件包,我建议使用 NumPy 1.8 或更高版本。 38 | 39 | 照惯例,你会发现 SciPy/PyData 世界中的大多数人都会使用``np``作为别名来导入 NumPy: 40 | 41 | ```py 42 | import numpy as np 43 | ``` 44 | 45 | 在本章以及本书的其余部分中,你会发现这是我们导入和使用 NumPy 的方式。 46 | 47 | ### 关于内置文档的提醒 48 | 49 | 在阅读本章时,不要忘记 IPython 使你能够快速浏览包的内容(通过使用制表符补全功能),以及各种函数的文档(使用``?``字符 - 请参阅 IPython 中的帮助和文档)。 50 | 51 | 例如,要显示`numpy`命名空间的所有内容,可以键入: 52 | 53 | ```ipython 54 | In [3]: np. 55 | ``` 56 | 57 | 要显示 NumPy 的内置文档,你可以使用: 58 | 59 | ```ipython 60 | In [4]: np? 61 | ``` 62 | 63 | 更详细的文档以及教程和其他资源,请访问 。 -------------------------------------------------------------------------------- /docs/9.md: -------------------------------------------------------------------------------- 1 | # 九、NumPy 2 | -------------------------------------------------------------------------------- /docs/skl01.md: -------------------------------------------------------------------------------- 1 | # 5.1 Python 机器学习简介 2 | 3 | ## 什么是机器学习? 4 | 5 | 机器学习是自动从数据中提取知识的过程,通常是为了预测新的,看不见的数据。一个典型的例子是垃圾邮件过滤器,用户将传入的邮件标记为垃圾邮件或非垃圾邮件。然后,机器学习算法从数据“学习”预测模型,数据区分垃圾邮件和普通电子邮件。该模型可以预测新电子邮件是否是垃圾邮件。 6 | 7 | 机器学习的核心是根据数据来自动化决策的概念,无需用户指定如何做出此决策的明确规则。 8 | 9 | 对于电子邮件,用户不提供垃圾邮件的单词或特征列表。相反,用户提供标记为垃圾邮件和非垃圾邮件的示例。 10 | 11 | 第二个核心概念是泛化。机器学习模型的目标是预测新的,以前没见过的数据。在实际应用中,将已标记的电子邮件标记为垃圾邮件,我们不感兴趣。相反,我们希望通过自动分类新的传入邮件来使用户更轻松。 12 | 13 | ![](../img/supervised_workflow.svg) 14 | 15 | 数据通常作为数字的二维数组(或矩阵)展示给算法。 我们想要学习或做出决策的每个数据点(也称为样本或训练实例)表示为数字列表,即所谓的特征向量,其包含的特征表示这个点的属性。 16 | 17 | 稍后,我们将使用一个名为鸢尾花(Iris)的流行数据集 - 在许多其他数据集中。鸢尾花是机器学习领域的经典基准数据集,包含来自 3 种不同物种的 150 种鸢尾花的测量值:Iris-Setosa(山鸢尾),Iris-Versicolor(杂色鸢尾)和 Iris-Virginica(弗吉尼亚鸢尾)。 18 | 19 | | 物种 | 图像 | 20 | | --- | --- | 21 | | 山鸢尾 | ![](../img/iris_setosa.jpg) | 22 | | 杂色鸢尾 | ![](../img/iris_versicolor.jpg) | 23 | | 弗吉尼亚鸢尾 | ![](../img/iris_virginica.jpg) | 24 | 25 | 我们将每个花样本表示为数据阵列中的一行,列(特征)表示以厘米为单位的花测量值。 例如,我们可以用以下格式表示这个鸢尾花数据集,包括 150 个样本和 4 个特征,一个`150×4`的二维数组或矩阵: 26 | 27 | ![](../img/tex1.gif) 28 | 29 | (上标表示第`i`行,下标分别表示第`j`个特征。 30 | 31 | 我们今天将讨论两种机器学习:监督学习和无监督学习。 32 | 33 | ## 监督学习:分类和回归 34 | 35 | 在监督学习中,我们有一个数据集,由输入特征和所需输出组成的,例如垃圾邮件/非垃圾邮件示例。 任务是构建一个模型(或程序),它能够在给定特征集的情况下预测未见过的对象的所需输出。 36 | 37 | 一些更复杂的例子是: 38 | 39 | + 通过望远镜给定物体的多色图像,确定该物体是星星,类星体还是星系。 40 | + 给定一个人的照片,识别照片中的人物。 41 | + 给定一个人观看的电影列表和他们对电影的个人评价,推荐他们想要的电影列表。 42 | + 给定一个人的年龄,教育程度和职位,推断他们的薪水 43 | 44 | 这些任务的共同之处在于,存在与该对象相关联的一个或多个未知量,其需要从其他观察量确定。 45 | 46 | 监督学习进一步细分为两类,分类和回归: 47 | 48 | 在分类中,标签是离散的,例如“垃圾邮件”或“无垃圾邮件”。换句话说,它提供了类别之间的明确区分。此外,重要的是注意类标签是标称的,而不是序数变量。标称和序数变量都是类别变量的子类别。序数变量意味着顺序,例如,T 恤尺寸`XL> L> M> S`。相反,标称变量并不意味着顺序,例如,我们(通常)不能假设“橙色>蓝色>绿色”。 49 | 在回归中,标签是连续的,即浮点输出。例如,在天文学中,确定物体是星星,星系还是类星体的任务是分类问题:标签来自三个不同的类别。另一方面,我们可能希望根据这些观察来估计物体的年龄:这将是一个回归问题,因为标签(年龄)是一个连续的数量。 50 | 51 | 在监督学习中,在提供期望结果的训练集与需要根据它推断期望结果的测试集之间,总是存在区别。模型的学习使预测模型拟合训练集,我们使用测试集来评估其泛化表现。 52 | 53 | ### 无监督学习 54 | 55 | 在无监督学习中,没有与数据相关的期望输出。相反,我们有兴趣从给定的数据中提取某种形式的知识或模型。从某种意义上说,你可以将无监督学习视为从数据本身发现标签的一种手段。无监督学习通常难以理解和评估。 56 | 57 | 无监督学习包括降维,聚类和密度估计之类的任务。例如,在上面讨论的鸢尾花数据中,我们可以使用无监督方法来确定显示数据结构的最佳测量值组合。我们将在下面看到,这种数据投影可用于在二维中可视化四维数据集。更多涉及无监督学习的问题是: 58 | 59 | + 给定对遥远星系的详细观察,确定哪些特征或特征组合总结了最佳信息。 60 | + 给定两个声源的混合(例如,一个人的谈话和一些音乐),将两者分开(这称为[盲源分离问题](http://en.wikipedia.org/wiki/Blind_signal_separation))。 61 | + 给定视频,隔离移动物体并相对于已看到的其他移动物体进行分类。 62 | + 给定大量新闻文章,在这些文章中找到重复出现的主题。 63 | + 给定一组图像,将相似的图像聚集在一起(例如,在可视化集合时对它们进行分组) 64 | 65 | 有时两者甚至可以合并:例如无监督学习可用于在异构数据中找到有用的特征,然后可以在监督框架内使用这些特征。 66 | 67 | ## (简化的)机器学习分类法 68 | 69 | ![](../img/ml_taxonomy.png) 70 | -------------------------------------------------------------------------------- /docs/skl02.md: -------------------------------------------------------------------------------- 1 | # 5.2 Python 中的科学计算工具 2 | 3 | ## Jupyter Notebooks 4 | 5 | 你可以按`[shift] + [Enter]`或按菜单中的“播放”按钮来运行单元格。 6 | 7 | ![](https://nbviewer.jupyter.org/github/amueller/scipy-2018-sklearn/blob/master/notebooks/figures/ipython_run_cell.png) 8 | 9 | 在`function(`后面按`[shift] + [tab]`,可以获得函数或对象的帮助。 10 | 11 | ![](https://nbviewer.jupyter.org/github/amueller/scipy-2018-sklearn/blob/master/notebooks/figures/ipython_help-1.png) 12 | 13 | 你还可以通过执行`function?`获得帮助。 14 | 15 | ![](https://nbviewer.jupyter.org/github/amueller/scipy-2018-sklearn/blob/master/notebooks/figures/ipython_help-2.png) 16 | 17 | ## NumPy 数组 18 | 19 | 操作`numpy`数组是 Python 机器学习(或者,实际上是任何类型的科学计算)的重要部分。 对大多数人来说,这可能是一个简短的回顾。 无论如何,让我们快速浏览一些最重要的功能。 20 | 21 | ```py 22 | import numpy as np 23 | 24 | # 设置随机种子来获得可重复性 25 | rnd = np.random.RandomState(seed=123) 26 | 27 | # 生成随机数组 28 | X = rnd.uniform(low=0.0, high=1.0, size=(3, 5)) # a 3 x 5 array 29 | 30 | print(X) 31 | ``` 32 | 33 | (请注意,NumPy 数组使用从 0 开始的索引,就像 Python 中的其他数据结构一样。) 34 | 35 | ```py 36 | # 元素访问 37 | 38 | # 获取单个元素 39 | # (这里是第一行第一列的元素) 40 | print(X[0, 0]) 41 | 42 | # 获取一行 43 | # (这里是第二行) 44 | print(X[1]) 45 | 46 | # 获取一列 47 | # (这里是第二列) 48 | print(X[:, 1]) 49 | 50 | # 数组转置 51 | print(X.T) 52 | ``` 53 | 54 | ![](../img/tex2.gif) 55 | 56 | ```py 57 | # 在指定的时间间隔内创建均匀间隔的数字的行向量。 58 | y = np.linspace(0, 12, 5) 59 | print(y) 60 | 61 | # 将行向量转换为列向量 62 | print(y[:, np.newaxis]) 63 | 64 | # 获得形状或改变数组形状 65 | 66 | # 生成随机数组 67 | rnd = np.random.RandomState(seed=123) 68 | X = rnd.uniform(low=0.0, high=1.0, size=(3, 5)) # a 3 x 5 array 69 | 70 | print(X.shape) 71 | 72 | # 将 X 大小变为 (3, 5) 73 | X_reshaped = X.reshape(5, 3) 74 | print(X_reshaped) 75 | 76 | # 使用整数数组的索引(花式索引) 77 | indices = np.array([3, 1, 0]) 78 | print(indices) 79 | X[:, indices] 80 | ``` 81 | 82 | 还有很多东西要知道,但是这些操作对于我们在本教程中将要做的事情至关重要。 83 | 84 | ## SciPy 稀疏数组 85 | 86 | 我们不会在本教程中大量使用它们,但稀疏矩阵在某些情况下非常好用。 在一些机器学习任务中,尤其是与文本分析相关的任务,数据可能大多为零。 存储所有这些零是非常低效的,并且以仅包含“非零”值的方式表示可以更有效。 我们可以创建和操作稀疏矩阵,如下所示: 87 | 88 | ```py 89 | # 创建一个包含大量零的随机数组 90 | rnd = np.random.RandomState(seed=123) 91 | 92 | X = rnd.uniform(low=0.0, high=1.0, size=(10, 5)) 93 | print(X) 94 | 95 | # 将大多数元素设置为零 96 | X[X < 0.7] = 0 97 | print(X) 98 | from scipy import sparse 99 | 100 | # 将 X 转换为 CSR(压缩稀疏行)矩阵 101 | X_csr = sparse.csr_matrix(X) 102 | print(X_csr) 103 | 104 | # 将稀疏矩阵转换为密集数组 105 | print(X_csr.toarray()) 106 | ``` 107 | 108 | (你可能偶然发现了一种将稀疏表示转换为密集表示的替代方法:`numpy.todense`;`toarray`返回一个 NumPy 数组,而`todense`返回一个 NumPy 矩阵。在本教程中,我们将使用 NumPy 数组,而不是矩阵;scikit-learn 不支持后者。) 109 | 110 | CSR 表示对于计算非常有效,但它不适合添加元素。 为此,LIL(List-In-List)表示更好: 111 | 112 | ```py 113 | # 创建一个空的 LIL 矩阵并添加一些项目 114 | X_lil = sparse.lil_matrix((5, 5)) 115 | 116 | for i, j in np.random.randint(0, 5, (15, 2)): 117 | X_lil[i, j] = i + j 118 | 119 | print(X_lil) 120 | print(type(X_lil)) 121 | 122 | X_dense = X_lil.toarray() 123 | print(X_dense) 124 | print(type(X_dense)) 125 | ``` 126 | 127 | 通常,一旦创建了 LIL 矩阵,将其转换为 CSR 格式很有用(许多 scikit-learn 算法需要 CSR 或 CSC 格式) 128 | 129 | ```py 130 | X_csr = X_lil.tocsr() 131 | print(X_csr) 132 | print(type(X_csr)) 133 | ``` 134 | 135 | 可用于各种问题的可用稀疏格式包括: 136 | 137 | + `CSR`(压缩稀疏行) 138 | + `CSC`(压缩稀疏列) 139 | + `BSR`(块稀疏行) 140 | + `COO`(坐标) 141 | + `DIA`(对角线) 142 | + `DOK`(键的字典) 143 | + `LIL`(列表中的列表) 144 | 145 | [`scipy.sparse`](http://docs.scipy.org/doc/scipy/reference/sparse.html)子模块还有很多稀疏矩阵的函数,包括线性代数,稀疏求解器,图算法等等。 146 | 147 | ## Matplotlib 148 | 149 | 机器学习的另一个重要部分是数据可视化。 Python 中最常用的工具是[`matplotlib`](http://matplotlib.org/)。 这是一个非常灵活的包,我们将在这里介绍一些基础知识。 150 | 151 | 由于我们使用的是 Jupyter 笔记本,让我们使用 IPython 方便的内置“[魔术函数](https://ipython.org/ipython-doc/3/interactive/magics.html)”,即“`matoplotlib`内联”模式,它将直接在笔记本内部绘制图形。 152 | 153 | ```py 154 | %matplotlib inline 155 | 156 | import matplotlib.pyplot as plt 157 | 158 | # 绘制直线 159 | x = np.linspace(0, 10, 100) 160 | plt.plot(x, np.sin(x)); 161 | 162 | # 散点图 163 | x = np.random.normal(size=500) 164 | y = np.random.normal(size=500) 165 | plt.scatter(x, y); 166 | 167 | # 使用 imshow 展示绘图 168 | # - note that origin is at the top-left by default! 169 | 170 | x = np.linspace(1, 12, 100) 171 | y = x[:, np.newaxis] 172 | 173 | im = y * np.sin(x) * np.cos(y) 174 | print(im.shape) 175 | 176 | plt.imshow(im); 177 | 178 | # 轮廓图 179 | # - 请注意,此处的原点默认位于左下角! 180 | plt.contour(im); 181 | 182 | # 3D 绘图 183 | from mpl_toolkits.mplot3d import Axes3D 184 | ax = plt.axes(projection='3d') 185 | xgrid, ygrid = np.meshgrid(x, y.ravel()) 186 | ax.plot_surface(xgrid, ygrid, im, cmap=plt.cm.viridis, cstride=2, rstride=2, linewidth=0); 187 | ``` 188 | 189 | 有许多可用的绘图类型。 探索它们的一个实用方法是查看matplotlib库。 190 | 191 | 你可以在笔记本中轻松测试这些示例:只需复制每页上的源代码链接,然后使用`%load magic`将其放入笔记本中。 例如: 192 | 193 | ```py 194 | # %load http://matplotlib.org/mpl_examples/pylab_examples/ellipse_collection.py 195 | ``` 196 | -------------------------------------------------------------------------------- /docs/skl04.md: -------------------------------------------------------------------------------- 1 | # 5.4 训练和测试数据 2 | 3 | 为了评估我们的监督模型的泛化能力,我们可以将数据分成训练和测试集: 4 | 5 | ![](../img/train_test_split_matrix.svg) 6 | 7 | ```py 8 | from sklearn.datasets import load_iris 9 | 10 | iris = load_iris() 11 | X, y = iris.data, iris.target 12 | ``` 13 | 14 | 考虑如何正常执行机器学习,训练/测试分割的想法是有道理的。真实世界系统根据他们拥有的数据进行训练,当其他数据进入时(来自客户,传感器或其他来源),经过训练的分类器必须预测全新的数据。我们可以在训练期间使用训练/测试分割来模拟 - 测试数据是“未来数据”的模拟,它将在生产期间进入系统。 15 | 16 | 特别是对于鸢尾花,其中的 150 个标签是有序的,这意味着如果我们使用比例分割来分割数据,这将导致类分布基本上改变。例如,如果我们执行常见的 2/3 训练数据和 1/3 测试数据的分割,我们的训练数据集将仅包含类别 0 和 1(Setosa 和 Versicolor),我们的测试集将仅包含类别标签为 2 的样本(Virginica)。 17 | 18 | 假设所有样本彼此独立(而不是时间序列数据),我们希望在分割数据集之前随机打乱数据集。 19 | 20 | 现在我们需要将数据分成训练和测试集。 幸运的是,这是机器学习中常见的模式,scikit-learn 具有预先构建的函数,可以将数据分成训练和测试集。 在这里,我们使用 50% 的数据来训练,50% 来测试。 80% 和 20% 是另一种常见的分割,但没有严格的规则。 最重要的是,要在训练期间未见过的数据上,公平地评估您的系统! 21 | 22 | ```py 23 | from sklearn.model_selection import train_test_split 24 | 25 | train_X, test_X, train_y, test_y = train_test_split(X, y, 26 | train_size=0.5, 27 | test_size=0.5, 28 | random_state=123) 29 | print("Labels for training data:") 30 | print(train_y) 31 | 32 | print("Labels for test data:") 33 | print(test_y) 34 | ``` 35 | 36 | 提示:分层分割 37 | 38 | 特别是对于相对较小的数据集,最好分层分割。 分层意味着我们在测试和训练集中保持数据集的原始类比例。 例如,在我们随机拆分前面的代码示例中所示的数据集之后,我们的类比例(百分比)如下: 39 | 40 | ```py 41 | print('All:', np.bincount(y) / float(len(y)) * 100.0) 42 | print('Training:', np.bincount(train_y) / float(len(train_y)) * 100.0) 43 | print('Test:', np.bincount(test_y) / float(len(test_y)) * 100.0) 44 | ``` 45 | 46 | 因此,为了分层分割,我们可以将`label`数组作为附加选项传递给`train_test_split`函数: 47 | 48 | ```py 49 | train_X, test_X, train_y, test_y = train_test_split(X, y, 50 | train_size=0.5, 51 | test_size=0.5, 52 | random_state=123, 53 | stratify=y) 54 | 55 | print('All:', np.bincount(y) / float(len(y)) * 100.0) 56 | print('Training:', np.bincount(train_y) / float(len(train_y)) * 100.0) 57 | print('Test:', np.bincount(test_y) / float(len(test_y)) * 100.0) 58 | ``` 59 | 60 | 通过在训练过程中看到的数据上评估我们的分类器性能,我们可能对模型的预测能力产生错误的信心。 在最坏的情况下,它可能只是记住训练样本,但完全没有分类新的类似样本 - 我们真的不想将这样的系统投入生产! 61 | 62 | 不使用相同的数据集进行训练和测试(这称为“重取代评估”),为了估计训练模型对新数据的效果,使用训练/测试分割要好得多。 63 | 64 | ```py 65 | from sklearn.neighbors import KNeighborsClassifier 66 | 67 | classifier = KNeighborsClassifier().fit(train_X, train_y) 68 | pred_y = classifier.predict(test_X) 69 | 70 | print("Fraction Correct [Accuracy]:") 71 | print(np.sum(pred_y == test_y) / float(len(test_y))) 72 | ``` 73 | 74 | 我们还可以可视化正确的预测...... 75 | 76 | ```py 77 | print('Samples correctly classified:') 78 | correct_idx = np.where(pred_y == test_y)[0] 79 | print(correct_idx) 80 | ``` 81 | 82 | ...以及错误的预测。 83 | 84 | ```py 85 | print('Samples incorrectly classified:') 86 | incorrect_idx = np.where(pred_y != test_y)[0] 87 | print(incorrect_idx) 88 | 89 | # 绘制两个维度 90 | 91 | for n in np.unique(test_y): 92 | idx = np.where(test_y == n)[0] 93 | plt.scatter(test_X[idx, 1], test_X[idx, 2], label="Class %s" % str(iris.target_names[n])) 94 | 95 | plt.scatter(test_X[incorrect_idx, 1], test_X[incorrect_idx, 2], color="darkred") 96 | 97 | plt.xlabel('sepal width [cm]') 98 | plt.ylabel('petal length [cm]') 99 | plt.legend(loc=3) 100 | plt.title("Iris Classification results") 101 | plt.show() 102 | ``` 103 | 104 | 我们可以看到错误发生在绿色(类 1)和灰色(类 2)重叠的区域。 这使我们能够深入了解需要添加的特征 - 任何有助于分离类 1 和类 2 的特征都应该提高分类器的表现。 105 | 106 | > 练习 107 | > 108 | > 打印3个错误预测的真实标签,并修改我们上面使用的散点图代码,来在 2D 散点图中用不同的标记可视化和区分这三个样本。 你能解释为什么我们的分类器做出了这些错误的预测吗? 109 | 110 | ```py 111 | # %load solutions/04_wrong-predictions.py 112 | ``` 113 | -------------------------------------------------------------------------------- /docs/skl05.md: -------------------------------------------------------------------------------- 1 | # 5.5 监督学习第一部分:分类 2 | 3 | 为了可视化机器学习算法的工作原理,研究二维或一维数据(即只有一个或两个特征的数据)通常很有帮助。 实际上,数据集通常具有更多特征,很难在二维屏幕上绘制高维数据。 4 | 5 | 在我们转向更多“真实世界”的数据集之前,我们将展示一些非常简单的示例。 6 | 7 | 首先,我们将从二维来看二分类问题。 我们使用`make_blobs`函数生成人造数据。 8 | 9 | ```py 10 | from sklearn.datasets import make_blobs 11 | 12 | X, y = make_blobs(centers=2, random_state=0, cluster_std=1.5) 13 | 14 | print('X ~ n_samples x n_features:', X.shape) 15 | print('y ~ n_samples:', y.shape) 16 | 17 | print('First 5 samples:\n', X[:5, :]) 18 | 19 | print('First 5 labels:', y[:5]) 20 | ``` 21 | 22 | 由于数据是二维的,我们可以将每个样本绘制为二维坐标系中的一个点,第一个特征是`x`轴,第二个特征是`y`轴。 23 | 24 | ```py 25 | plt.figure(figsize=(8, 8)) 26 | plt.scatter(X[y == 0, 0], X[y == 0, 1], s=40, label='0') 27 | plt.scatter(X[y == 1, 0], X[y == 1, 1], s=40, label='1', 28 | marker='s') 29 | 30 | plt.xlabel('first feature') 31 | plt.ylabel('second feature') 32 | plt.legend(loc='upper right'); 33 | ``` 34 | 35 | 分类是一项监督任务,由于我们对其在未见过的数据上的表现感兴趣,因此我们将数据分为两部分: 36 | 37 | + 训练集,学习算法用它来拟合模型 38 | + 测试集,用于评估模型的泛化性能 39 | 40 | 来自`model_selection`模块的`train_test_split`函数为我们做了这个 - 我们将使用它,将数据集拆分为 75% 的训练数据和 25% 的测试数据。 41 | 42 | ![](../img/train_test_split_matrix.svg) 43 | 44 | ```py 45 | from sklearn.model_selection import train_test_split 46 | 47 | X_train, X_test, y_train, y_test = train_test_split(X, y, 48 | test_size=0.25, 49 | random_state=1234, 50 | stratify=y) 51 | ``` 52 | 53 | ## scikit-learn 估计器 API 54 | 55 | ![](../img/supervised_workflow.svg) 56 | 57 | scikit-learn 中的每个算法都通过“估计器”对象提供。 (scikit-learn 中的所有模型都具有非常一致的接口)。 例如,我们首先导入逻辑回归类。 58 | 59 | ```py 60 | from sklearn.linear_model import LogisticRegression 61 | ``` 62 | 63 | 下面,我们实例化估计器对象。 64 | 65 | ```py 66 | classifier = LogisticRegression() 67 | X_train.shape 68 | y_train.shape 69 | ``` 70 | 71 | 为了从我们的数据构建模型,即学习如何分类新的点,我们使用训练数据,以及相应的训练标签(训练数据点的所需输出)调用`fit`函数: 72 | 73 | ```py 74 | classifier.fit(X_train, y_train) 75 | ``` 76 | 77 | (默认情况下,一些估计方法如`fit`返回`self`。因此,在执行上面的代码片段之后,你将看到`LogisticRegression`的特定实例的默认参数。另一种获取估计器的初始化参数的方法是执行`classifier.get_params()`,返回参数字典。) 78 | 79 | 然后,我们可以将模型应用于未见过的数据,并使用模型使用`predict`方法预测估计的结果: 80 | 81 | ```py 82 | prediction = classifier.predict(X_test) 83 | ``` 84 | 85 | 我们可以将它们与真实标签比较: 86 | 87 | ```py 88 | print(prediction) 89 | print(y_test) 90 | ``` 91 | 92 | 通过测量预测的正确比例,我们可以定量评估我们的分类器。这称为准确度: 93 | 94 | ```py 95 | np.mean(prediction == y_test) 96 | ``` 97 | 98 | 还有一个便利函数,`score`,所有 scikit-learn 分类器必须直接从测试数据计算: 99 | 100 | ```py 101 | classifier.score(X_test, y_test) 102 | ``` 103 | 104 | 将(测试集上的)泛化表现与训练集上的表现进行比较通常很有帮助: 105 | 106 | ```py 107 | classifier.score(X_train, y_train) 108 | ``` 109 | 110 | `LogisticRegression`是一种所谓的线性模型,这意味着它将在输入空间中创建线性决策。 在 2d 中,这只是意味着它找到一条线来将蓝色与红色分开: 111 | 112 | ```py 113 | from figures import plot_2d_separator 114 | 115 | plt.scatter(X[y == 0, 0], X[y == 0, 1], s=40, label='0') 116 | plt.scatter(X[y == 1, 0], X[y == 1, 1], s=40, label='1', marker='s') 117 | 118 | plt.xlabel("first feature") 119 | plt.ylabel("second feature") 120 | plot_2d_separator(classifier, X) 121 | plt.legend(loc='upper right'); 122 | ``` 123 | 124 | 估计参数:所有估计模型的参数都是以下划线结尾的,估计器对象的属性。 这里是直线的系数和偏移量: 125 | 126 | ```py 127 | print(classifier.coef_) 128 | print(classifier.intercept_) 129 | ``` 130 | 131 | ## 另一个分类器:K 最近邻 132 | 133 | 另一种流行且易于理解的分类器是 K 最近邻(kNN)。 它有一个最简单的学习策略:给出一个新的,未知的观侧值,在你的参考数据库中查找,哪些具有最接近的特征并分配优势类别。 134 | 135 | 接口与上面的`LogisticRegression`完全相同。 136 | 137 | ```py 138 | from sklearn.neighbors import KNeighborsClassifier 139 | ``` 140 | 141 | 这次我们设置`KNeighborsClassifier`的参数,告诉它我们只想查看 30 个最近的邻居: 142 | 143 | ```py 144 | knn = KNeighborsClassifier(n_neighbors=30) 145 | ``` 146 | 147 | 我们使用训练数据拟合模型: 148 | 149 | ```py 150 | knn.fit(X_train, y_train) 151 | 152 | plt.scatter(X_train[y_train == 0, 0], X_train[y_train == 0, 1], 153 | s=40, label='0') 154 | plt.scatter(X_train[y_train == 1, 0], X_train[y_train == 1, 1], 155 | s=40, label='1', marker='s') 156 | 157 | plt.xlabel("first feature") 158 | plt.ylabel("second feature") 159 | plot_2d_separator(knn, X) 160 | plt.legend(loc='upper right'); 161 | 162 | knn.score(X_train, y_train) 163 | 164 | plt.scatter(X_test[y_test == 0, 0], X_test[y_test == 0, 1], 165 | s=40, label='0') 166 | plt.scatter(X_test[y_test == 1, 0], X_test[y_test == 1, 1], 167 | s=40, label='1', marker='s') 168 | 169 | plt.xlabel("first feature") 170 | plt.ylabel("second feature") 171 | plot_2d_separator(knn, X) 172 | plt.legend(loc='upper right'); 173 | 174 | knn.score(X_test, y_test) 175 | ``` 176 | 177 | > 练习 178 | > 179 | > 将`KNeighborsClassifier`应用于鸢尾花数据集。 玩转`n_neighbors`的不同值,观察训练和测试得分的变化情况。 180 | -------------------------------------------------------------------------------- /docs/skl06.md: -------------------------------------------------------------------------------- 1 | # 5.6 监督学习第二部分:回归分析 2 | 3 | 在回归中,我们试图预测连续输出变量 - 而不是我们在之前的分类示例中预测的标称变量。 4 | 5 | 让我们从一个简单的玩具示例开始,其中包含一个特征维度(解释性变量)和一个目标变量。 我们将使用一些噪声从正弦曲线创建数据集: 6 | 7 | ```py 8 | x = np.linspace(-3, 3, 100) 9 | print(x) 10 | 11 | rng = np.random.RandomState(42) 12 | y = np.sin(4 * x) + x + rng.uniform(size=len(x)) 13 | 14 | plt.plot(x, y, 'o'); 15 | ``` 16 | 17 | ## 线性回归 18 | 19 | 我们将介绍的第一个模型是所谓的简单线性回归。 在这里,我们想要为数据拟合一条直线。 20 | 21 | 最简单的模型之一是线性模型,它只是试图预测数据位于一条线上。 找到这样一条直线的一种方法是`LinearRegression`(也称为普通最小二乘(OLS)回归)。 `LinearRegression`的接口与之前的分类器完全相同,只是`y`现在包含浮点值而不是类别。 22 | 23 | 我们记得,scikit-learn API 要求我们将目标变量(`y`)提供为一维数组; scikit-learn 的 API 期望样本(`X`)是个二维数组 - 即使它可能只包含一个特征。 因此,让我们将 1 维 NumPy 数组`x`转换为具有 2 个轴的数组`X`: 24 | 25 | ```py 26 | print('Before: ', x.shape) 27 | X = x[:, np.newaxis] 28 | print('After: ', X.shape) 29 | ``` 30 | 31 | 同样,我们首先将数据集拆分为训练(75%)和测试集(25%): 32 | 33 | ```py 34 | from sklearn.model_selection import train_test_split 35 | 36 | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42) 37 | ``` 38 | 39 | 接下来,我们使用`LinearRegression`中实现的学习算法使回归模型拟合训练数据: 40 | 41 | ```py 42 | from sklearn.linear_model import LinearRegression 43 | 44 | regressor = LinearRegression() 45 | regressor.fit(X_train, y_train) 46 | ``` 47 | 48 | 在拟合训练数据后,我们使用以下值来参数化线性回归模型。 49 | 50 | ```py 51 | print('Weight coefficients: ', regressor.coef_) 52 | print('y-axis intercept: ', regressor.intercept_) 53 | ``` 54 | 55 | 由于我们的回归模型是线性模型,因此目标变量(`y`)和特征变量(`x`)之间的关系定义为: 56 | 57 | ``` 58 | y = weight × x + intercept 59 | ``` 60 | 61 | 将最小值和最大值插入这个公式,我们可以绘制拟合我们的训练数据的回归: 62 | 63 | ```py 64 | min_pt = X.min() * regressor.coef_[0] + regressor.intercept_ 65 | max_pt = X.max() * regressor.coef_[0] + regressor.intercept_ 66 | 67 | plt.plot([X.min(), X.max()], [min_pt, max_pt]) 68 | plt.plot(X_train, y_train, 'o'); 69 | ``` 70 | 71 | 与之前笔记本中的分类估计器类似,我们使用`predict`方法来预测目标变量。 我们希望这些预测值落在我们之前绘制的直线上: 72 | 73 | ```py 74 | y_pred_train = regressor.predict(X_train) 75 | 76 | plt.plot(X_train, y_train, 'o', label="data") 77 | plt.plot(X_train, y_pred_train, 'o', label="prediction") 78 | plt.plot([X.min(), X.max()], [min_pt, max_pt], label='fit') 79 | plt.legend(loc='best') 80 | ``` 81 | 82 | 我们在上图中看到,直线能够捕获数据的一般斜率,但没有太多细节。 83 | 84 | 接下来,让我们试试测试集: 85 | 86 | ```py 87 | y_pred_test = regressor.predict(X_test) 88 | 89 | plt.plot(X_test, y_test, 'o', label="data") 90 | plt.plot(X_test, y_pred_test, 'o', label="prediction") 91 | plt.plot([X.min(), X.max()], [min_pt, max_pt], label='fit') 92 | plt.legend(loc='best'); 93 | ``` 94 | 95 | 同样,scikit-learn 提供了一种简便方法,使用`score`方法定量评估预测。 对于回归任务,这是 R2 得分。 另一种流行的方式是均方差(MSE)。 顾名思义,MSE 只是预测和实际目标值的均方差。 96 | 97 | ![](../img/tex3.gif) 98 | 99 | ```py 100 | regressor.score(X_test, y_test) 101 | ``` 102 | 103 | > 练习 104 | > 105 | > 将(非线性)特征`sin(4x)`添加到`X`并将重新拟合`X_train`(和`X_test`)。 使用这个新的更丰富的还是线性的模型可视化预测。 106 | > 提示:你可以使用`np.concatenate(A, B, axis=1)`将两个矩阵`A`和`B`水平连接(来组合列)。 107 | 108 | ```py 109 | # %load solutions/06B_lin_with_sine.py 110 | ``` 111 | 112 | ## `KNeighborsRegression` 113 | 114 | 就像分类一样,我们也可以使用基于邻居的方法来回归。 我们可以简单地获取最近点的输出,或者我们可以平均几个最近点。 这种方法不像分类那样流行于回归,但仍然是一个很好的基线。 115 | 116 | ```py 117 | from sklearn.neighbors import KNeighborsRegressor 118 | kneighbor_regression = KNeighborsRegressor(n_neighbors=1) 119 | kneighbor_regression.fit(X_train, y_train) 120 | ``` 121 | 122 | 再次,让我们看一下训练和测试集的行为: 123 | 124 | ```py 125 | y_pred_train = kneighbor_regression.predict(X_train) 126 | 127 | plt.plot(X_train, y_train, 'o', label="data", markersize=10) 128 | plt.plot(X_train, y_pred_train, 's', label="prediction", markersize=4) 129 | plt.legend(loc='best'); 130 | ``` 131 | 132 | 在训练集上,我们做得很好:每个点都是它自己最近的邻居! 133 | 134 | ```py 135 | y_pred_test = kneighbor_regression.predict(X_test) 136 | 137 | plt.plot(X_test, y_test, 'o', label="data", markersize=8) 138 | plt.plot(X_test, y_pred_test, 's', label="prediction", markersize=4) 139 | plt.legend(loc='best'); 140 | ``` 141 | 142 | 在测试集上,我们也更好地捕捉变化,但我们的估计看起来比以前更加混乱。 我们来看看 R2 得分: 143 | 144 | ```py 145 | kneighbor_regression.score(X_test, y_test) 146 | ``` 147 | 148 | 比以前好多了! 在这里,线性模型不适合我们的问题;它缺乏复杂性,因此不适合我们的数据。 149 | 150 | > 练习 151 | > 152 | > 在波士顿住房数据集中,比较`KNeighborsRegressor`和`LinearRegression`。 你可以使用`sklearn.datasets.load_boston`加载数据集。 你可以通过阅读`DESCR`属性来了解数据集。 153 | 154 | ```py 155 | # %load solutions/06A_knn_vs_linreg.py 156 | ``` 157 | -------------------------------------------------------------------------------- /docs/skl07.md: -------------------------------------------------------------------------------- 1 | # 5.7 无监督学习第一部分:变换 2 | 3 | 许多无监督学习的实例,例如降维,流形学习和特征提取,在没有任何额外输入的情况下找到输入数据的新表示。 (与监督学习相反,如之前的分类和回归示例,无监督算法不需要或考虑目标变量)。 4 | 5 | ![](../img/unsupervised_workflow.svg) 6 | 7 | 一个非常基本的例子是我们的数据重缩放,这是许多机器学习算法的要求,因为它们不是规模不变的 - 重缩放属于数据预处理类别,几乎不能称为学习。 存在许多不同的重缩放技术,在下面的示例中,我们将看一个通常称为“标准化”的特定方法。 在这里,我们将重缩放数据,使每个特征以零(均值为 0)为中心,具有单位方差(标准差为 1)。 8 | 9 | 例如,如果我们的一维数据集的值为`[1,2,3,4,5]`,则标准化值为: 10 | 11 | + 1 -> -1.41 12 | + 2 -> -0.71 13 | + 3 -> 0.0 14 | + 4 -> 0.71 15 | + 5 -> 1.41 16 | 17 | 通过等式`z = (x - μ) / σ`计算,其中`μ`是样本均值,`σ`是标准差。 18 | 19 | ```py 20 | ary = np.array([1, 2, 3, 4, 5]) 21 | ary_standardized = (ary - ary.mean()) / ary.std() 22 | ary_standardized 23 | ``` 24 | 25 | 尽管标准化是最基本的预处理过程 - 正如我们在上面的代码中看到的那样 - scikit-learn 为此计算实现了`StandardScaler`类。 在后面的部分中,我们将了解为什么以及何时 scikit-learn 接口在我们上面执行的代码片段中派上用场。 26 | 27 | 这样的预处理具有与我们迄今为止看到的监督学习算法非常相似的接口。 要使用 scikit-learn 的`Transformer`接口做更多练习,让我们首先加载鸢尾花数据集并重缩放它: 28 | 29 | ```py 30 | from sklearn.datasets import load_iris 31 | from sklearn.model_selection import train_test_split 32 | 33 | iris = load_iris() 34 | X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0) 35 | print(X_train.shape) 36 | ``` 37 | 38 | 鸢尾花数据集不是“居中”的,即它具有非零均值,并且每个分量的标准差不同: 39 | 40 | ```py 41 | print("mean : %s " % X_train.mean(axis=0)) 42 | print("standard deviation : %s " % X_train.std(axis=0)) 43 | ``` 44 | 45 | 要使用预处理方法,我们首先导入估计器,这里是`StandardScaler`,并实例化它: 46 | 47 | ```py 48 | from sklearn.preprocessing import StandardScaler 49 | scaler = StandardScaler() 50 | ``` 51 | 52 | 与分类和回归算法一样,我们调用`fit`来从数据中学习模型。 由于这是无监督的模型,我们只传递`X`而不是`y`。 这仅仅估计平均值和标准差。 53 | 54 | ```py 55 | scaler.fit(X_train) 56 | ``` 57 | 58 | 现在我们可以通过应用`transform`(不是`predict`)方法来重缩放数据: 59 | 60 | ```py 61 | X_train_scaled = scaler.transform(X_train) 62 | ``` 63 | 64 | `X_train_scaled`具有相同数量的样本和特征,但减去了平均值,并且所有特征都被缩放,来具有单位标准差: 65 | 66 | ```py 67 | print(X_train_scaled.shape) 68 | 69 | print("mean : %s " % X_train_scaled.mean(axis=0)) 70 | print("standard deviation : %s " % X_train_scaled.std(axis=0)) 71 | ``` 72 | 73 | 总结一下:通过`fit`方法,估计器拟合我们提供的数据。 在该步骤中,估计器根据数据估计参数(这里是平均值和标准差)。 然后,如果我们转换数据,这些参数将用于转换数据集。 (请注意,`transform`方法不会更新这些参数)。 74 | 75 | 重要的是要注意,相同的转换应用于训练和测试集。 这导致通常在缩放后测试数据的平均值不为零: 76 | 77 | ```py 78 | X_test_scaled = scaler.transform(X_test) 79 | print("mean test data: %s" % X_test_scaled.mean(axis=0)) 80 | ``` 81 | 82 | 以完全相同的方式转换训练和测试数据非常重要,对于理解数据的以下处理步骤,如下图所示: 83 | 84 | ```py 85 | from figures import plot_relative_scaling 86 | plot_relative_scaling() 87 | ``` 88 | 89 | 有几种常见的方法用于缩放数据。 最常见的是我们刚刚介绍的`StandardScaler`,但是使用`MinMaxScaler`重缩放数据,来固定最小值和最大值(通常在 0 和 1 之间),或使用更鲁棒的统计量(如中位数和分位数),而不是平均值和标准差(使用`RobustScaler`),也很有用。 90 | 91 | ```py 92 | from figures import plot_scaling 93 | plot_scaling() 94 | ``` 95 | 96 | ## 主成分分析 97 | 98 | 主成分分析(PCA)是一种更有趣的无监督转换。这是一种技术,通过创建线性投影来降低数据维数。也就是说,我们寻找新的特征来表示数据,它是旧数据的线性组合(即我们旋转它)。因此,我们可以将 PCA 视为将数据投影到新的特征空间。 99 | 100 | PCA 找到这些新方向的方式,是寻找最大方差的方向。通常只保留解释数据中大部分变化的少数成分。这里,前提是减少数据集的大小(维度),同时捕获其大部分信息。降维有用的原因很多:它可以在运行学习算法时降低计算成本,减少存储空间,并可能有助于所谓的“维度灾难”,我们将在后面详细讨论。 101 | 102 | 为了说明旋转的样子,我们首先在二维数据上显示它并保留两个主成分。这是一个例子: 103 | 104 | ```py 105 | from figures import plot_pca_illustration 106 | plot_pca_illustration() 107 | ``` 108 | 109 | 现在让我们更详细地介绍所有步骤:我们创建一个旋转的高斯 blob: 110 | 111 | ```py 112 | rnd = np.random.RandomState(5) 113 | X_ = rnd.normal(size=(300, 2)) 114 | X_blob = np.dot(X_, rnd.normal(size=(2, 2))) + rnd.normal(size=2) 115 | y = X_[:, 0] > 0 116 | plt.scatter(X_blob[:, 0], X_blob[:, 1], c=y, linewidths=0, s=30) 117 | plt.xlabel("feature 1") 118 | plt.ylabel("feature 2"); 119 | ``` 120 | 121 | 与往常一样,我们实例化我们的 PCA 模型。 默认情况下,保留所有方向。 122 | 123 | ```py 124 | from sklearn.decomposition import PCA 125 | pca = PCA() 126 | ``` 127 | 128 | 然后我们使用我们的数据拟合 PCA 模型。 由于 PCA 是无监督算法,因此没有输出`y`。 129 | 130 | ```py 131 | pca.fit(X_blob) 132 | ``` 133 | 134 | 然后我们可以转换数据,投影在主成分上: 135 | 136 | ```py 137 | X_pca = pca.transform(X_blob) 138 | 139 | plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, linewidths=0, s=30) 140 | plt.xlabel("first principal component") 141 | plt.ylabel("second principal component"); 142 | 143 | pca = PCA(n_components=1).fit(X_blob) 144 | 145 | X_blob.shape 146 | 147 | pca.transform(X_blob).shape 148 | ``` 149 | 150 | 在图的左侧,你可以看到之前右上角的四个点。 PCA 发现第一个成分是沿对角线,第二个组件垂直于它。 当 PCA 发现旋转时,主成分始终彼此成直角(“正交”)。 151 | 152 | # 将 PCA 降维用于可视化 153 | 154 | 考虑数字数据集。 它无法在单个 2D 绘图中可视化,因为它具有 64 个特征。 我们将使用`sklearn`示例中的[示例](http://scikit-learn.org/stable/auto_examples/manifold/plot_lle_digits.html)提取 2 个维度用于可视化。 155 | 156 | ```py 157 | from figures import digits_plot 158 | 159 | digits_plot() 160 | ``` 161 | 162 | 请注意,此投影是在没有任何标签的信息(由颜色表示)的情况下确定的:这是无监督学习的意义。 然而,我们看到投影让我们深入了解参数空间中不同数字的分布。 163 | 164 | > 练习 165 | > 166 | > 使用前两个主成分可视化鸢尾花数据集,并将此可视化与使用两个原始特征进行比较。 167 | 168 | ```py 169 | # %load solutions/07A_iris-pca.py 170 | ``` 171 | -------------------------------------------------------------------------------- /docs/skl09.md: -------------------------------------------------------------------------------- 1 | # 5.9 sklearn 估计器接口回顾 2 | 3 | Scikit-learn 努力在为所有方法建立统一的接口。给定名为`model`的 scikit-learn 估计器对象,可以使用以下方法(并非每个模型都有): 4 | 5 | 适用于所有估计器 6 | `model.fit()`:拟合训练数据。对于监督学习应用,它接受两个参数:数据`X`和标签`y`(例如`model.fit(X, y)`)。对于无监督学习应用,`fit`仅接受单个参数,即数据`X`(例如`model.fit(X)`)。 7 | 可在监督估计器中使用 8 | `model.predict()`:给定训练好的模型,预测一组新数据的标签。此方法接受一个参数,即新数据`X_new`(例如`model.predict(X_new)`),并返回数组中每个对象的习得标签。 9 | `model.predict_proba()`:对于分类问题,一些估计器也提供此方法,该方法返回新观测值具有每个分类标签的概率。在这种情况下,`model.predict()`返回概率最高的标签。 10 | `model.decision_function()`:对于分类问题,一些估计器提供不是概率的不确定性估计。对于二分类,`decision_function >= 0`表示将预测为正类,而`<0`表示负类。 11 | `model.score()`:对于分类或回归问题,大多数(所有?)估计器实现了`score`方法。分数在 0 到 1 之间,分数越大表示拟合越好。对于分类器,分数方法计算预测的准确度。对于回归器,得分计算预测的确定系数(R^2)。 12 | `model.transform()`:对于特征选择算法,这会将数据集缩减为所选特征。对于某些分类和回归模型(如某些线性模型和随机森林),此方法可将数据集缩减为信息量最大的特征。因此,这些分类和回归模型也可以用作特征选择方法。 13 | 可在无监督的估算器中使用 14 | `model.transform()`:给定一个无监督的模型,将新数据转换为新的基。这也接受一个参数`X_new`,并根据无监督模型返回数据的新表示。 15 | `model.fit_transform()`:一些估计器实现了这个方法,它可以更有效地对相同的输入数据执行拟合和变换。 16 | `model.predict()`:对于聚类算法,`predict`方法将为新数据点生成簇标签。并非所有聚类方法都具有此函数。 17 | `model.predict_proba()`:高斯混合模型(GMM)提供给定混合成分生成每个点的概率。 18 | `model.score()`:像 KDE 和 GMM这 样的密度模型,提供了数据在模型下的似然。 19 | 20 | 除了`fit`之外,两个最重要的函数是`produce`,它产生目标变量(`y`),以及`transform`,它产生数据的新表示(`X`)。 下表展示了哪个函数适用于哪种的模型: 21 | 22 | | `model.predict` | `model.transform` | 23 | | --- | --- | 24 | | 分类 | 预处理 | 25 | | 回归 | 降维 | 26 | | 聚类 | 特征提取 | 27 | | | 特征选择 | 28 | -------------------------------------------------------------------------------- /docs/skl10.md: -------------------------------------------------------------------------------- 1 | # 5.10 案例学习:泰坦尼克幸存者 2 | 3 | ## 特征提取 4 | 5 | 在这里,我们将讨论一个重要的机器学习:从数据中提取定量特征。 到本节结束时,你将 6 | 7 | + 了解如何从现实世界数据中提取特征。 8 | + 请参阅从文本数据中提取数值特征的示例 9 | 10 | 此外,我们将介绍 scikit-learn 中的几个基本工具,可用于完成上述任务。 11 | 12 | ## 特征是什么? 13 | 14 | ## 数值特征 15 | 16 | 回想一下 scikit-learn 中的数据应该是二维数组,大小为`n_samples×n_features`。 17 | 18 | 以前,我们查看了鸢尾花数据集,它有 150 个样本和 4 个特征。 19 | 20 | ```py 21 | from sklearn.datasets import load_iris 22 | 23 | iris = load_iris() 24 | print(iris.data.shape) 25 | ``` 26 | 27 | 这些特征是: 28 | 29 | + 萼片长度,厘米 30 | + 萼片宽度,厘米 31 | + 花瓣长度,厘米 32 | + 花瓣宽度,厘米 33 | 34 | 诸如此类的数值特征非常简单:每个样本都包含对应特征的浮点数列表。 35 | 36 | ## 类别特征 37 | 38 | 如果你有类别特征怎么办? 例如,假设每个鸢尾花的颜色数据为: 39 | 40 | ``` 41 | color in [red, blue, purple] 42 | ``` 43 | 44 | > 译者注:这是个不恰当的例子,因为在计算机看来,颜色是离散的数值特征,拥有 RGB 三个分量。 45 | 46 | 你可能想为这些特征分配数字,即红色为 1,蓝色为 2,紫色为 3,但总的来说这是一个坏主意。 估计器倾向于假设,数值特征具有某些连续尺度,因此,例如,1 和 2 比 1 和 3 更相似,并且这通常不是类别特征的情况。 47 | 48 | 实际上,上面的例子是“类别”特征的子类别,即“标称”特征。 标称特征并不意味着有序,而“序数”特征是确实暗示顺序的分类特征。 序数特征的一个例子是 T 恤尺寸,例如`XL> L> M> S`。 49 | 50 | 将标称特征解析为防止分类算法断言顺序的格式的一种解决方法,是所谓的单热编码表示。 在这里,我们为每个类别提供自己的维度。 51 | 52 | 因此,在这种情况下,丰富的鸢尾花特征集是: 53 | 54 | + 萼片长度,厘米 55 | + 萼片宽度,厘米 56 | + 花瓣长度,厘米 57 | + 花瓣宽度,厘米 58 | + 颜色为紫色(1.0 或 0.0) 59 | + 颜色为红色(1.0 或 0.0) 60 | + 颜色为蓝色(1.0 或 0.0) 61 | 62 | 请注意,使用许多这些类别特征可能会产生更好表示为稀疏矩阵的数据,我们将在下面的文本分类示例中看到。 63 | 64 | ## 使用`DictVectorizer`编码分类特征 65 | 66 | 当要编码的源数据有一个`dicts`列表,其中值是类别或数值的字符串名称时,你可以使用`DictVectorizer`类计算类别特征的布尔扩展,同时保持数值特征不受影响: 67 | 68 | ```py 69 | measurements = [ 70 | {'city': 'Dubai', 'temperature': 33.}, 71 | {'city': 'London', 'temperature': 12.}, 72 | {'city': 'San Francisco', 'temperature': 18.}, 73 | ] 74 | 75 | from sklearn.feature_extraction import DictVectorizer 76 | 77 | vec = DictVectorizer() 78 | vec 79 | 80 | vec.fit_transform(measurements).toarray() 81 | 82 | vec.get_feature_names() 83 | ``` 84 | 85 | ## 衍生特征 86 | 87 | 另一个常见的特征类型是衍生特征,其中一些预处理步骤应用于数据来生成以某种方式提供更多信息的特征。 派生特征可以基于特征提取和降维(例如 PCA 或流形学习),可以是特征的线性或非线性组合(例如在多项式回归中),或者可以是特征的一些更复杂的变换。 88 | 89 | ## 组合数值和类别特征 90 | 91 | 作为如何使用分类和数字数据的一个例子,我们将为 HMS 泰坦尼克号的乘客进行生存预测。 92 | 93 | 我们将使用泰坦尼克号(`titanic3.xls`)[这里](http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.xls)的版本。 我们将`.xls`转换为`.csv`以便操作,但是数据保持不变。 94 | 95 | 我们需要读取(`titanic3.csv`)文件中的所有行,空出第一行的键,找到我们的标签(幸存或死亡)和数据(人的属性)。 让我们看看键和一些相应的示例行。 96 | 97 | ```py 98 | import os 99 | import pandas as pd 100 | 101 | titanic = pd.read_csv(os.path.join('datasets', 'titanic3.csv')) 102 | print(titanic.columns) 103 | ``` 104 | 105 | 以下是键及其含义的广泛描述: 106 | 107 | ``` 108 | pclass 乘客等级 109 | (1 = 1st; 2 = 2nd; 3 = 3rd) 110 | survival 是否幸存 111 | (0 = No; 1 = Yes) 112 | name 名称 113 | sex 性别 114 | age 年龄 115 | sibsp 船上的兄弟姐妹/配偶的数量 116 | parch 父母/孩子数量 117 | ticket 票号 118 | fare 乘客票价 119 | cabin 舱位 120 | embarked 登船港口 121 | (C = Cherbourg; Q = Queenstown; S = Southampton) 122 | boat 救生艇 123 | body 身份证号 124 | home.dest 家/目的地 125 | ``` 126 | 127 | 一般来说,`name`, `sex`, `cabin`, `embarked`, `boat`, `body`, `homedest`可能是类别特征的候选,而其余似乎是数组特征。 我们还可以查看数据集中的前几行以便更好地理解: 128 | 129 | ```py 130 | titanic.head() 131 | ``` 132 | 133 | 我们显然希望丢弃`boat`和`body`列,以便将任何人分类为幸存者和非幸存者,因为它们已经包含此信息。 `name`对每个人(可能)是唯一的,也是非信息性的。 首次尝试中,我们将使用`pclass`,`sibsp`,`parch`,`fare`和`embarked`作为我们的特征: 134 | 135 | ```py 136 | labels = titanic.survived.values 137 | features = titanic[['pclass', 'sex', 'age', 'sibsp', 'parch', 'fare', 'embarked']] 138 | 139 | features.head() 140 | ``` 141 | 142 | 数据现在仅包含有用的特征,但它们不是机器学习算法可以理解的格式。 我们需要将字符串`male`和`female`转换为表示性别的二元变量,类似于`embarked`。 我们可以使用`pandas get_dummies`函数来实现: 143 | 144 | ```py 145 | pd.get_dummies(features).head() 146 | ``` 147 | 148 | 这个转换成功编码了字符串列。 但是,有人可能会认为`pclass`也是一个类别变量。 我们可以使用`columns`参数显式列出要编码的列,并包含`pclass`: 149 | 150 | ```py 151 | features_dummies = pd.get_dummies(features, columns=['pclass', 'sex', 'embarked']) 152 | features_dummies.head(n=16) 153 | 154 | data = features_dummies.values 155 | 156 | import numpy as np 157 | np.isnan(data).any() 158 | ``` 159 | 160 | 完成了所有困难的数据加载工作,对这些数据应用分类器变得简单明了。 建立最简单的模型,我们希望使用`DummyClassifier`看到最简单的得分。 161 | 162 | ```py 163 | from sklearn.model_selection import train_test_split 164 | from sklearn.preprocessing import Imputer 165 | 166 | 167 | train_data, test_data, train_labels, test_labels = train_test_split( 168 | data, labels, random_state=0) 169 | 170 | imp = Imputer() 171 | imp.fit(train_data) 172 | train_data_finite = imp.transform(train_data) 173 | test_data_finite = imp.transform(test_data) 174 | 175 | np.isnan(train_data_finite).any() 176 | 177 | from sklearn.dummy import DummyClassifier 178 | 179 | clf = DummyClassifier('most_frequent') 180 | clf.fit(train_data_finite, train_labels) 181 | print("Prediction accuracy: %f" 182 | % clf.score(test_data_finite, test_labels)) 183 | ``` 184 | 185 | > 练习 186 | > 187 | > 尝试使用`LogisticRegression`和`RandomForestClassifier`而不是`DummyClassifier`执行上述分类 188 | > 选择不同的特征子集会有帮助吗? 189 | 190 | ```py 191 | # %load solutions/10_titanic.py 192 | ``` 193 | -------------------------------------------------------------------------------- /docs/skl11.md: -------------------------------------------------------------------------------- 1 | # 5.11 文本特征提取 2 | 3 | 在许多任务中,例如在经典的垃圾邮件检测中,你的输入数据是文本。 长度变化的自由文本与我们需要使用 scikit-learn 来做机器学习所需的,长度固定的数值表示相差甚远。 但是,有一种简单有效的方法,使用所谓的词袋模型将文本数据转换为数字表示,该模型提供了与 scikit-learn 中的机器学习算法兼容的数据结构。 4 | 5 | ![](../img/bag_of_words.svg) 6 | 7 | 假设数据集中的每个样本都表示为一个字符串,可以只是句子,电子邮件或整篇新闻文章或书籍。 为了表示样本,我们首先将字符串拆分为一个标记列表,这些标记对应于(有些标准化的)单词。 一种简单的方法,只需按空白字符分割,然后将单词变为小写。 8 | 9 | 然后,我们构建了一个所有标记(小写单词)的词汇表,标记出现在我们整个数据集中。 这通常是一个非常大的词汇表。 最后,看一下我们的单个样本,我们可以展示词汇表中每个单词出现的频率。 我们用向量表示我们的字符串,其中每个条目是词汇表中给定单词出现在字符串中的频率。 10 | 11 | 由于每个样本仅包含非常少的单词,因此大多数条目将为零,从而产生非常高维但稀疏的表示。 12 | 13 | 该方法被称为“词袋”,因为单词的顺序完全丢失。 14 | 15 | ```py 16 | X = ["Some say the world will end in fire,", 17 | "Some say in ice."] 18 | 19 | len(X) 20 | 21 | from sklearn.feature_extraction.text import CountVectorizer 22 | 23 | vectorizer = CountVectorizer() 24 | vectorizer.fit(X) 25 | 26 | vectorizer.vocabulary_ 27 | 28 | X_bag_of_words = vectorizer.transform(X) 29 | 30 | X_bag_of_words.shape 31 | 32 | X_bag_of_words 33 | 34 | X_bag_of_words.toarray() 35 | 36 | vectorizer.get_feature_names() 37 | 38 | vectorizer.inverse_transform(X_bag_of_words) 39 | ``` 40 | 41 | ## TF-IDF 编码 42 | 43 | 通常应用于词袋编码的有用变换,是所谓的“词频-逆文档频率”(tf-idf)缩放,其是单词计数的非线性变换。 44 | 45 | tf-idf 编码重缩放通常具有较少权重的单词: 46 | 47 | ```py 48 | from sklearn.feature_extraction.text import TfidfVectorizer 49 | 50 | tfidf_vectorizer = TfidfVectorizer() 51 | tfidf_vectorizer.fit(X) 52 | 53 | import numpy as np 54 | np.set_printoptions(precision=2) 55 | 56 | print(tfidf_vectorizer.transform(X).toarray()) 57 | ``` 58 | 59 | tf-idf 是一种将文档表示为特征向量的方法。 tf-idf 可以理解为原始词频(tf)的修改;tf 是给定文档中特定单词的出现频率。 tf-idf 背后的概念是。按照它们出现的文档数量,成比例减少词频的权重。 这里的想法是,对于文档分类等自然语言处理任务,许多不同文档中出现的单词可能不重要,或不包含任何有用的信息。 如果你对数学细节和方程感兴趣,请参阅[此外部 IPython Notebook](http://nbviewer.jupyter.org/github/rasbt/pattern_classification/blob/master/machine_learning/scikit-learn/tfidf_scikit-learn.ipynb),它将引导你完成计算。 60 | 61 | ## Bigram 和 N-Gram 62 | 63 | 在本笔记本开头的图中所示的示例中,我们使用了所谓的 1-gram(unigram)分词:每个标记表示关于分割标准的单个元素。 64 | 65 | 完全抛弃单词顺序并不总是一个好主意,因为复合短语通常具有特定含义,而像“not”这样的修饰语可以颠倒单词的含义。 66 | 67 | 包含一些单词顺序的简单方法是 n-gram,它不仅查看单个标记,而且查看所有相邻标记对。例如,在 2-gram(bigram)分词中,我们使用一个单词的重叠将单词组合在一起;在 3-gram(trigram)分割中,我们将创建两个单词的重叠,依此类推: 68 | 69 | + 原文:"this is how you get ants" 70 | + 1-gram:"this", "is", "how", "you", "get", "ants" 71 | + 1-gram:"this", "is", "how", "you", "get", "ants" 72 | + 2-gram:"this is", "is how", "how you", "you get", "get ants" 73 | + 3-gram:"this is how", "is how you", "how you get", "you get ants" 74 | 75 | 为了在我们的预测模型中获得最佳效果,我们选择哪个“n”用于“n-gram”分词取决于学习算法,数据集和任务。或者换句话说,我们将“n-gram”中的“n”视为需要调整的参数,在后面的笔记本中,我们将看到我们如何处理它们。 76 | 77 | 现在,让我们使用 scikit-learn 的`CountVectorizer`创建一个 bigram 的词袋模型: 78 | 79 | ```py 80 | # look at sequences of tokens of minimum length 2 and maximum length 2 81 | bigram_vectorizer = CountVectorizer(ngram_range=(2, 2)) 82 | bigram_vectorizer.fit(X) 83 | 84 | bigram_vectorizer.get_feature_names() 85 | 86 | bigram_vectorizer.transform(X).toarray() 87 | ``` 88 | 89 | 通常我们想要包括 unigram(单个标记)和 bigram,我们可以将以下元组作为参数传递给`CountVectorizer`函数的`ngram_range`参数: 90 | 91 | ```py 92 | gram_vectorizer = CountVectorizer(ngram_range=(1, 2)) 93 | gram_vectorizer.fit(X) 94 | 95 | gram_vectorizer.get_feature_names() 96 | 97 | gram_vectorizer.transform(X).toarray() 98 | ``` 99 | 100 | ## 字符 n-gram 101 | 102 | 有时不仅是查看单词,考虑单个字符也有帮助。 103 | 104 | 如果我们有非常嘈杂的数据并想要识别语言,或者我们想要预测一个单词的某些内容,那么这一点尤其有用。 我们可以通过设置`analyzer ="char"`来简单地查看字符而不是单词。 查看单个字符通常不是很有用,但是查看更长的`n`个字符可能是: 105 | 106 | ```py 107 | X 108 | 109 | char_vectorizer = CountVectorizer(ngram_range=(2, 2), analyzer="char") 110 | char_vectorizer.fit(X) 111 | 112 | print(char_vectorizer.get_feature_names()) 113 | ``` 114 | 115 | > 练习 116 | > 117 | > 从下面给出(或者通过`import this`)的“zen of python”中计算 bigrams,并找到最常见的 trigram。 我们希望将每一行视为单独的文档。 你可以通过按照换行符(`\ n`)分割字符串来实现。 计算数据的 Tf-idf 编码。 哪个词的 tf-idf 得分最高? 为什么? 如果使用`TfidfVectorizer(norm="none")`会有什么变化? 118 | 119 | ```py 120 | zen = """Beautiful is better than ugly. 121 | Explicit is better than implicit. 122 | Simple is better than complex. 123 | Complex is better than complicated. 124 | Flat is better than nested. 125 | Sparse is better than dense. 126 | Readability counts. 127 | Special cases aren't special enough to break the rules. 128 | Although practicality beats purity. 129 | Errors should never pass silently. 130 | Unless explicitly silenced. 131 | In the face of ambiguity, refuse the temptation to guess. 132 | There should be one-- and preferably only one --obvious way to do it. 133 | Although that way may not be obvious at first unless you're Dutch. 134 | Now is better than never. 135 | Although never is often better than *right* now. 136 | If the implementation is hard to explain, it's a bad idea. 137 | If the implementation is easy to explain, it may be a good idea. 138 | Namespaces are one honking great idea -- let's do more of those!""" 139 | 140 | # %load solutions/11_ngrams.py 141 | ``` 142 | -------------------------------------------------------------------------------- /docs/skl12.md: -------------------------------------------------------------------------------- 1 | # 5.12 案例学习:用于 SMS 垃圾检测的文本分类 2 | 3 | 我们首先从`dataset`目录中加载文本数据,该目录应该位于`notebooks`目录中,是我们通过从GitHub存储库的顶层运行`fetch_data.py`脚本创建的。 4 | 5 | 此外,我们执行一些简单的预处理并将数据数组拆分为两部分: 6 | 7 | `text`:列表的列表,其中每个子列表包含电子邮件的内容 8 | `y`:我们的 SPAM 与 HAM 标签,以二元形式存储;1 代表垃圾邮件,0 代表非垃圾邮件消息。 9 | 10 | ```py 11 | import os 12 | 13 | with open(os.path.join("datasets", "smsspam", "SMSSpamCollection")) as f: 14 | lines = [line.strip().split("\t") for line in f.readlines()] 15 | 16 | text = [x[1] for x in lines] 17 | y = [int(x[0] == "spam") for x in lines] 18 | 19 | text[:10] 20 | 21 | y[:10] 22 | 23 | print('Number of ham and spam messages:', np.bincount(y)) 24 | 25 | type(text) 26 | 27 | type(y) 28 | ``` 29 | 30 | 接下来,我们将数据集分为两部分,即测试和训练数据集: 31 | 32 | ```py 33 | from sklearn.model_selection import train_test_split 34 | 35 | text_train, text_test, y_train, y_test = train_test_split(text, y, 36 | random_state=42, 37 | test_size=0.25, 38 | stratify=y) 39 | ``` 40 | 41 | 现在,我们使用`CountVectorizer`将文本数据解析为词袋模型。 42 | 43 | ```py 44 | from sklearn.feature_extraction.text import CountVectorizer 45 | 46 | print('CountVectorizer defaults') 47 | CountVectorizer() 48 | 49 | vectorizer = CountVectorizer() 50 | vectorizer.fit(text_train) 51 | 52 | X_train = vectorizer.transform(text_train) 53 | X_test = vectorizer.transform(text_test) 54 | 55 | print(len(vectorizer.vocabulary_)) 56 | 57 | X_train.shape 58 | 59 | print(vectorizer.get_feature_names()[:20]) 60 | 61 | print(vectorizer.get_feature_names()[2000:2020]) 62 | 63 | print(X_train.shape) 64 | print(X_test.shape) 65 | ``` 66 | 67 | ## 为文本特征训练分类器 68 | 69 | 我们现在可以训练分类器,例如逻辑回归分类器,它是文本分类任务的快速基线: 70 | 71 | ```py 72 | from sklearn.linear_model import LogisticRegression 73 | 74 | clf = LogisticRegression() 75 | clf 76 | 77 | clf.fit(X_train, y_train) 78 | ``` 79 | 80 | 我们现在可以在测试集上评估分类器。 让我们首先使用内置得分函数,这是测试集中正确分类的比例: 81 | 82 | ```py 83 | clf.score(X_test, y_test) 84 | ``` 85 | 86 | 我们还可以计算训练集上的扥分,看看我们做得如何: 87 | 88 | ```py 89 | clf.score(X_train, y_train) 90 | ``` 91 | 92 | ## 可视化重要特征 93 | 94 | ```py 95 | def visualize_coefficients(classifier, feature_names, n_top_features=25): 96 | # get coefficients with large absolute values 97 | coef = classifier.coef_.ravel() 98 | positive_coefficients = np.argsort(coef)[-n_top_features:] 99 | negative_coefficients = np.argsort(coef)[:n_top_features] 100 | interesting_coefficients = np.hstack([negative_coefficients, positive_coefficients]) 101 | # plot them 102 | plt.figure(figsize=(15, 5)) 103 | colors = ["tab:orange" if c < 0 else "tab:blue" for c in coef[interesting_coefficients]] 104 | plt.bar(np.arange(2 * n_top_features), coef[interesting_coefficients], color=colors) 105 | feature_names = np.array(feature_names) 106 | plt.xticks(np.arange(1, 2 * n_top_features + 1), feature_names[interesting_coefficients], rotation=60, ha="right"); 107 | 108 | visualize_coefficients(clf, vectorizer.get_feature_names()) 109 | 110 | vectorizer = CountVectorizer(min_df=2) 111 | vectorizer.fit(text_train) 112 | 113 | X_train = vectorizer.transform(text_train) 114 | X_test = vectorizer.transform(text_test) 115 | 116 | clf = LogisticRegression() 117 | clf.fit(X_train, y_train) 118 | 119 | print(clf.score(X_train, y_train)) 120 | print(clf.score(X_test, y_test)) 121 | 122 | len(vectorizer.get_feature_names()) 123 | 124 | print(vectorizer.get_feature_names()[:20]) 125 | 126 | visualize_coefficients(clf, vectorizer.get_feature_names()) 127 | ``` 128 | 129 | ![](../img/supervised_scikit_learn.png) 130 | 131 | > 练习 132 | > 133 | > 使用`TfidfVectorizer`而不是`CountVectorizer`。 结果更好吗?系数如何不同? 134 | > 更改`TfidfVectorizer`和`CountVectorizer`的参数`min_df`和`ngram_range`。这如何改变重要特征? 135 | 136 | ```py 137 | # %load solutions/12A_tfidf.py 138 | 139 | # %load solutions/12B_vectorizer_params.py 140 | ``` 141 | -------------------------------------------------------------------------------- /docs/skl13.md: -------------------------------------------------------------------------------- 1 | # 5.13 交叉验证和得分方法 2 | 3 | 在前面的章节和笔记本中,我们将数据集分为两部分:训练集和测试集。 我们使用训练集来拟合我们的模型,并且我们使用测试集来评估其泛化能力 - 它对新的,没见过的数据的表现情况。 4 | 5 | ![](../img/train_test_split.svg) 6 | 7 | 然而,(标记的)数据通常是宝贵的,这种方法让我们只将约 3/4 的数据用于行训练。 另一方面,我们只会尝试将我们的 1/4 数据应用于测试。 使用更多数据来构建模型,并且获得更加鲁棒的泛化能力估计,常用方法是交叉验证。 在交叉验证中,数据被重复拆分为非重叠的训练和测试集,并为每对建立单独的模型。 然后聚合测试集的得分来获得更鲁棒的估计。 8 | 9 | 进行交叉验证的最常用方法是`k`折交叉验证,其中数据首先被分成`k`(通常是 5 或 10)个相等大小的折叠,然后对于每次迭代,使用`k`折中的一个作为测试数据,其余作为训练数据: 10 | 11 | ![](../img/cross_validation.svg) 12 | 13 | 这样,每个数据点只在测试集中一次,我们可以使用第`k`个数据之外的所有数据进行训练。 让我们应用这种技术,在鸢尾花数据集上评估`KNeighborsClassifier`算法: 14 | 15 | ```py 16 | from sklearn.datasets import load_iris 17 | from sklearn.neighbors import KNeighborsClassifier 18 | 19 | iris = load_iris() 20 | X, y = iris.data, iris.target 21 | 22 | classifier = KNeighborsClassifier() 23 | ``` 24 | 25 | 鸢尾花中的标签是有序的,这意味着如果我们像上面那样拆分数据,第一个折叠只有标签 0,而最后一个只有标签 2: 26 | 27 | ```py 28 | y 29 | ``` 30 | 31 | 为了在评估中避免这个问题,我们首先将我们的数据打乱: 32 | 33 | ```py 34 | import numpy as np 35 | rng = np.random.RandomState(0) 36 | 37 | permutation = rng.permutation(len(X)) 38 | X, y = X[permutation], y[permutation] 39 | print(y) 40 | ``` 41 | 42 | 现在实现交叉验证很简单: 43 | 44 | ```py 45 | k = 5 46 | n_samples = len(X) 47 | fold_size = n_samples // k 48 | scores = [] 49 | masks = [] 50 | for fold in range(k): 51 | # 为此折叠中的测试集生成一个布尔掩码 52 | test_mask = np.zeros(n_samples, dtype=bool) 53 | test_mask[fold * fold_size : (fold + 1) * fold_size] = True 54 | # 为可视化存储掩码 55 | masks.append(test_mask) 56 | # 使用此掩码创建训练和测试集 57 | X_test, y_test = X[test_mask], y[test_mask] 58 | X_train, y_train = X[~test_mask], y[~test_mask] 59 | # 拟合分类器 60 | classifier.fit(X_train, y_train) 61 | # 计算得分并记录 62 | scores.append(classifier.score(X_test, y_test)) 63 | ``` 64 | 65 | 让我们检查一下我们的测试掩码是否正确: 66 | 67 | ```py 68 | import matplotlib.pyplot as plt 69 | %matplotlib inline 70 | plt.matshow(masks, cmap='gray_r') 71 | ``` 72 | 73 | 现在让我们看一下我们计算出的得分: 74 | 75 | ```py 76 | print(scores) 77 | print(np.mean(scores)) 78 | ``` 79 | 80 | 正如你所看到的,得分广泛分布于 90% 正确到 100% 正确。 如果我们只进行一次分割,我们可能会得到任何答案。 81 | 82 | 由于交叉验证是机器学习中常见的模式,有个函数执行上面的操作,带有更多灵活性和更少代码。`sklearn.model_selection`模块具有交叉验证相关的所有函数。 最简单的函数是`cross_val_score`,它接受估计器和数据集,并将为你完成所有拆分: 83 | 84 | ```py 85 | from sklearn.model_selection import cross_val_score 86 | scores = cross_val_score(classifier, X, y) 87 | print('Scores on each CV fold: %s' % scores) 88 | print('Mean score: %0.3f' % np.mean(scores)) 89 | ``` 90 | 91 | 如你所见,该函数默认使用三个折叠。 你可以使用`cv`参数更改折叠数: 92 | 93 | ```py 94 | cross_val_score(classifier, X, y, cv=5) 95 | ``` 96 | 97 | 交叉验证模块中还有辅助对象,它们将为你生成各种不同交叉验证方法的索引,包括 k-fold: 98 | 99 | ```py 100 | from sklearn.model_selection import KFold, StratifiedKFold, ShuffleSplit 101 | ``` 102 | 103 | 默认情况下,`cross_val_score`将`StratifiedKFold`用于分类,这可确保数据集中的类比例反映在每个折叠中。 如果你有一个二分类数据集,其中 90% 的数据点属于类 0,那么这意味着在每个折叠中,90% 的数据点将属于类 0。如果你只是使用`KFold`交叉验证,你可能会生成一个只包含类 0 的分割。每当你进行分类时,通常最好使用`StratifiedKFold`。 104 | 105 | `StratifiedKFold`也消除了我们打乱鸢尾花的需要。 让我们看看在未打乱的鸢尾花数据集上,它生成什么类型的折叠。 每个交叉验证类都是训练和测试索引的集合的生成器: 106 | 107 | ```py 108 | cv = StratifiedKFold(n_splits=5) 109 | for train, test in cv.split(iris.data, iris.target): 110 | print(test) 111 | ``` 112 | 113 | 正如你所看到的,在每个折叠中,在开始,中间,和结束位置,都有一些样本。 这样,保留了类别比例。 让我们观察一下`split`: 114 | 115 | ```py 116 | def plot_cv(cv, features, labels): 117 | masks = [] 118 | for train, test in cv.split(features, labels): 119 | mask = np.zeros(len(labels), dtype=bool) 120 | mask[test] = 1 121 | masks.append(mask) 122 | 123 | plt.matshow(masks, cmap='gray_r') 124 | 125 | plot_cv(StratifiedKFold(n_splits=5), iris.data, iris.target) 126 | ``` 127 | 128 | 为了比较,仍旧是标准`KFold`,忽略标签: 129 | 130 | ```py 131 | plot_cv(KFold(n_splits=5), iris.data, iris.target) 132 | ``` 133 | 134 | 请记住,增加折叠数量会为你提供更大的训练数据集,但会导致更多重复,因此评估速度会变慢: 135 | 136 | ```py 137 | plot_cv(KFold(n_splits=10), iris.data, iris.target) 138 | ``` 139 | 140 | 另一个有用的交叉验证生成器是`ShuffleSplit`。 该生成器简单地重复分割数据的随机部分。 这允许用户独立指定重复次数和训练集大小: 141 | 142 | ```py 143 | plot_cv(ShuffleSplit(n_splits=5, test_size=.2), iris.data, iris.target) 144 | ``` 145 | 146 | 如果你想要更鲁棒的估计,你可以增加分割数量: 147 | 148 | ```py 149 | plot_cv(ShuffleSplit(n_splits=20, test_size=.2), iris.data, iris.target) 150 | ``` 151 | 152 | 你可以使用`cross_val_score`方法来使用所有这些交叉验证生成器: 153 | 154 | ```py 155 | cv = ShuffleSplit(n_splits=5, test_size=.2) 156 | cross_val_score(classifier, X, y, cv=cv) 157 | ``` 158 | 159 | > 练习 160 | > 161 | > 在鸢尾花数据集上,使用`KFold`类进行三折交叉验证,而不打乱数据。你能解释一下结果吗? 162 | 163 | ```py 164 | # %load solutions/13_cross_validation.py 165 | ``` 166 | -------------------------------------------------------------------------------- /docs/skl15.md: -------------------------------------------------------------------------------- 1 | # 5.15 估计器流水线 2 | 3 | 在本节中,我们将研究如何链接不同的估计器。 4 | 5 | ## 简单示例:估计器之前的特征提取和选择 6 | 7 | ## 特征提取:向量化器 8 | 9 | 对于某些类型的数据,例如文本数据,必须应用特征提取步骤将其转换为数值特征。 为了说明,我们加载我们之前使用的 SMS 垃圾邮件数据集。 10 | 11 | ```py 12 | import os 13 | 14 | with open(os.path.join("datasets", "smsspam", "SMSSpamCollection")) as f: 15 | lines = [line.strip().split("\t") for line in f.readlines()] 16 | text = [x[1] for x in lines] 17 | y = [x[0] == "ham" for x in lines] 18 | 19 | from sklearn.model_selection import train_test_split 20 | 21 | text_train, text_test, y_train, y_test = train_test_split(text, y) 22 | ``` 23 | 24 | 以前,我们手动应用了特征提取,如下所示: 25 | 26 | ```py 27 | from sklearn.feature_extraction.text import TfidfVectorizer 28 | from sklearn.linear_model import LogisticRegression 29 | 30 | vectorizer = TfidfVectorizer() 31 | vectorizer.fit(text_train) 32 | 33 | X_train = vectorizer.transform(text_train) 34 | X_test = vectorizer.transform(text_test) 35 | 36 | clf = LogisticRegression() 37 | clf.fit(X_train, y_train) 38 | 39 | clf.score(X_test, y_test) 40 | ``` 41 | 42 | 我们学习转换然后将其应用于测试数据的情况,在机器学习中非常常见。 因此 scikit-learn 有一个快捷方式,称为流水线: 43 | 44 | ```py 45 | from sklearn.pipeline import make_pipeline 46 | 47 | pipeline = make_pipeline(TfidfVectorizer(), LogisticRegression()) 48 | pipeline.fit(text_train, y_train) 49 | pipeline.score(text_test, y_test) 50 | ``` 51 | 52 | 如你所见,这使代码更短,更容易处理。 在背后,与上面完全相同。 当在水流上调用`fit`时,它将依次调用每个步骤的`fit`。 53 | 54 | 在第一步的`fit`之后,它将使用第一步的`transform `方法来创建新的表示。 然后将其用于下一步的`fit`,依此类推。 最后,在最后一步,只调用`fit`。 55 | 56 | ![](../img/pipeline.svg) 57 | 58 | 如果我们调用`score`,那么每一步都只会调用`transform` - 毕竟这可能是测试集! 然后,在最后一步,使用新的表示调用`score`。 `predict`也是如此。 59 | 60 | 流水线的构建不仅简化了代码,而且对于模型选择也很重要。 假设我们想要网格搜索`C`来调整上面的 Logistic 回归。 61 | 62 | 让我们假设我们这样做: 63 | 64 | ```py 65 | # This illustrates a common mistake. Don't use this code! 66 | from sklearn.model_selection import GridSearchCV 67 | 68 | vectorizer = TfidfVectorizer() 69 | vectorizer.fit(text_train) 70 | 71 | X_train = vectorizer.transform(text_train) 72 | X_test = vectorizer.transform(text_test) 73 | 74 | clf = LogisticRegression() 75 | grid = GridSearchCV(clf, param_grid={'C': [.1, 1, 10, 100]}, cv=5) 76 | grid.fit(X_train, y_train) 77 | ``` 78 | 79 | ## 我们哪里做错了? 80 | 81 | 在这里,我们使用`X_train`上的交叉验证进行了网格搜索。 然而,当应用`TfidfVectorizer`时,它看到了所有的`X_train`,而不仅仅是训练折叠! 因此,它可以使用测试折叠中单词频率的知识。 这被称为测试集的“污染”,并且使泛化性能或错误选择的参数的估计过于乐观。 我们可以通过流水线解决这个问题: 82 | 83 | ```py 84 | from sklearn.model_selection import GridSearchCV 85 | 86 | pipeline = make_pipeline(TfidfVectorizer(), 87 | LogisticRegression()) 88 | 89 | grid = GridSearchCV(pipeline, 90 | param_grid={'logisticregression__C': [.1, 1, 10, 100]}, cv=5) 91 | 92 | grid.fit(text_train, y_train) 93 | grid.score(text_test, y_test) 94 | ``` 95 | 96 | 请注意,我们需要告诉流水线我们要在哪一步设置参数`C`。我们可以使用特殊的`__`语法来完成此操作。 `__`之前的名称只是类的名称,`__`之后的部分是我们想要使用网格搜索设置的参数。 97 | 98 | ![](../img/pipeline_cross_validation.svg) 99 | 100 | 使用流水线的另一个好处是,我们现在还可以使用`GridSearchCV`搜索特征提取的参数: 101 | 102 | ```py 103 | from sklearn.model_selection import GridSearchCV 104 | 105 | pipeline = make_pipeline(TfidfVectorizer(), LogisticRegression()) 106 | 107 | params = {'logisticregression__C': [.1, 1, 10, 100], 108 | "tfidfvectorizer__ngram_range": [(1, 1), (1, 2), (2, 2)]} 109 | grid = GridSearchCV(pipeline, param_grid=params, cv=5) 110 | grid.fit(text_train, y_train) 111 | print(grid.best_params_) 112 | grid.score(text_test, y_test) 113 | ``` 114 | 115 | > 练习 116 | > 117 | > 使用`StandardScaler`和`RidgeRegression`创建流水线,并将其应用于波士顿住房数据集(使用`sklearn.datasets.load_boston`加载)。 尝试添加`sklearn.preprocessing.PolynomialFeatures`变换器作为第二个预处理步骤,并网格搜索多项式的次数(尝试 1,2 和 3)。 118 | 119 | ```py 120 | # %load solutions/15A_ridge_grid.py 121 | ``` 122 | -------------------------------------------------------------------------------- /docs/skl18.md: -------------------------------------------------------------------------------- 1 | # 5.18 深入:决策树与森林 2 | 3 | 在这里,我们将探索一类基于决策树的算法。 最基本决策树非常直观。 它们编码一系列`if`和`else`选项,类似于一个人如何做出决定。 但是,从数据中完全可以了解要问的问题以及如何处理每个答案。 4 | 5 | 例如,如果你想创建一个识别自然界中发现的动物的指南,你可能会问以下一系列问题: 6 | 7 | + 动物是大于还是小于一米? 8 | + 较大:动物有角吗? 9 | + 是的:角长是否超过十厘米? 10 | + 不是:动物有项圈吗? 11 | + 较小:动物有两条腿还是四条腿? 12 | + 二:动物有翅膀吗? 13 | + 四:动物有浓密的尾巴吗? 14 | 15 | 等等。 这种问题的二元分裂是决策树的本质。 16 | 17 | 基于树的模型的主要好处之一是它们几乎不需要数据预处理。 它们可以处理不同类型的变量(连续和离散),并且对特征的缩放不变。 18 | 19 | 另一个好处是基于树的模型被称为“非参数”,这意味着他们没有一套固定的参数需要学习。 相反,如果给出更多数据,树模型可以变得越来越灵活。 换句话说,自由参数的数量随着样本量而增长并且不是固定的,例如在线性模型中。 20 | 21 | ## 决策树回归 22 | 23 | 决策树是一种简单的二元分类树,类似于最近邻分类。 它可以这样使用: 24 | 25 | ```py 26 | from figures import make_dataset 27 | x, y = make_dataset() 28 | X = x.reshape(-1, 1) 29 | 30 | plt.figure() 31 | plt.xlabel('Feature X') 32 | plt.ylabel('Target y') 33 | plt.scatter(X, y); 34 | 35 | from sklearn.tree import DecisionTreeRegressor 36 | 37 | reg = DecisionTreeRegressor(max_depth=5) 38 | reg.fit(X, y) 39 | 40 | X_fit = np.linspace(-3, 3, 1000).reshape((-1, 1)) 41 | y_fit_1 = reg.predict(X_fit) 42 | 43 | plt.figure() 44 | plt.plot(X_fit.ravel(), y_fit_1, color='tab:blue', label="prediction") 45 | plt.plot(X.ravel(), y, 'C7.', label="training data") 46 | plt.legend(loc="best"); 47 | ``` 48 | 49 | 单个决策树允许我们以非参数方式估计标签,但显然存在一些问题。 在某些地区,该模型表现出高偏差并且对数据欠拟合。 (请见不遵循数据轮廓的长扁形线条),而在其他区域,模型表现高方差并且过拟合数据(反映为受单点噪声影响的窄峰形)。 50 | 51 | ## 决策树分类 52 | 53 | 决策树分类原理非常相似,通过将叶子中的多数类分配给叶子中的所有点: 54 | 55 | ```py 56 | from sklearn.datasets import make_blobs 57 | from sklearn.model_selection import train_test_split 58 | from sklearn.tree import DecisionTreeClassifier 59 | from figures import plot_2d_separator 60 | from figures import cm2 61 | 62 | 63 | X, y = make_blobs(centers=[[0, 0], [1, 1]], random_state=61526, n_samples=100) 64 | X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) 65 | 66 | clf = DecisionTreeClassifier(max_depth=5) 67 | clf.fit(X_train, y_train) 68 | 69 | plt.figure() 70 | plot_2d_separator(clf, X, fill=True) 71 | plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm2, s=60, alpha=.7, edgecolor='k') 72 | plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm2, s=60, edgecolor='k'); 73 | ``` 74 | 75 | 有许多参数可以控制树的复杂性,但最容易理解的是最大深度。这限制了树可以对输入空间进行划分的精确度,或者在决定样本所在的类之前,可以询问多少`if-else`问题。 76 | 77 | 此参数对于调整树和基于树的模型非常重要。下面的交互式图表显示了该模型的欠拟合和过拟合。 `max_depth`为 1 显然是一个欠拟合的模型,而 7 或 8 的深度明显过拟合。对于该数据集,树可以生长的最大深度是 8,此时每个叶仅包含来自单个类的样本。这被称为所有叶子都是“纯的”。 78 | 79 | 在下面的交互式图中,区域被指定为蓝色和红色,来表明该区域的预测类。颜色的阴影表示该类的预测概率(较暗为较高概率),而黄色区域表示任一类的预测概率相等。 80 | 81 | ```py 82 | from figures import plot_tree 83 | max_depth = 3 84 | plot_tree(max_depth=max_depth) 85 | ``` 86 | 87 | 决策树训练快,易于理解,并且经常产生可解释的模型。 但是,单个树通常倾向于过拟合训练数据。 使用上面的滑块,你可能会注意到,即使在类之间有良好的分隔之前,模型也会开始过拟合。 88 | 89 | 因此,在实践中,更常见的是组合多个树来产生更好泛化的模型。 组合树的最常用方法是随机森林和梯度提升树。 90 | 91 | ## 随机森林 92 | 93 | 随机森林只是许多树,建立在数据的不同随机子集(带放回抽样)上,并对于每个分裂,使用特征的不同随机子集(无放回抽样)。 这使得树彼此不同,并使它们过拟合不同的方面。 然后,他们的预测被平均,产生更平稳的估计,更少过拟合。 94 | 95 | ```py 96 | from figures import plot_forest 97 | max_depth = 3 98 | plot_forest(max_depth=max_depth) 99 | ``` 100 | 101 | ## 通过交叉验证选择最优估计 102 | 103 | ```py 104 | from sklearn.model_selection import GridSearchCV 105 | from sklearn.datasets import load_digits 106 | from sklearn.ensemble import RandomForestClassifier 107 | 108 | digits = load_digits() 109 | X, y = digits.data, digits.target 110 | 111 | X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) 112 | 113 | rf = RandomForestClassifier(n_estimators=200) 114 | parameters = {'max_features':['sqrt', 'log2', 10], 115 | 'max_depth':[5, 7, 9]} 116 | 117 | clf_grid = GridSearchCV(rf, parameters, n_jobs=-1) 118 | clf_grid.fit(X_train, y_train) 119 | 120 | clf_grid.score(X_train, y_train) 121 | 122 | clf_grid.score(X_test, y_test) 123 | ``` 124 | 125 | ## 另一个选项:梯度提升 126 | 127 | 可能有用的另一种集合方法是提升:在这里,我们构建了一个由 200 个估计器组成的链,它迭代地改进了先前估计器的结果,而不是查看(比方说)200 个并行估计器。 我们的想法是,通过顺序应用非常快速,简单的模型,我们可以获得比任何单个部分更好的总模型误差。 128 | 129 | ```py 130 | from sklearn.ensemble import GradientBoostingRegressor 131 | clf = GradientBoostingRegressor(n_estimators=100, max_depth=5, learning_rate=.2) 132 | clf.fit(X_train, y_train) 133 | 134 | print(clf.score(X_train, y_train)) 135 | print(clf.score(X_test, y_test)) 136 | ``` 137 | 138 | > 练习:梯度提升的交叉验证 139 | > 140 | > 使用网格搜索在数字数据集上优化梯度提升树`learning_rate`和`max_depth`。 141 | 142 | ```py 143 | from sklearn.datasets import load_digits 144 | from sklearn.ensemble import GradientBoostingClassifier 145 | 146 | digits = load_digits() 147 | X_digits, y_digits = digits.data, digits.target 148 | 149 | # split the dataset, apply grid-search 150 | 151 | # %load solutions/18_gbc_grid.py 152 | ``` 153 | 154 | ## 特征的重要性 155 | 156 | `RandomForest`和`GradientBoosting`对象在拟合之后都会提供`feature_importances_`属性。 此属性是这些模型最强大的功能之一。 它们基本上量化了在不同树的节点中,每个特征对表现的贡献程度。 157 | 158 | ```py 159 | X, y = X_digits[y_digits < 2], y_digits[y_digits < 2] 160 | 161 | rf = RandomForestClassifier(n_estimators=300, n_jobs=1) 162 | rf.fit(X, y) 163 | print(rf.feature_importances_) # one value per feature 164 | 165 | plt.figure() 166 | plt.imshow(rf.feature_importances_.reshape(8, 8), cmap=plt.cm.viridis, interpolation='nearest') 167 | ``` 168 | -------------------------------------------------------------------------------- /docs/skl19.md: -------------------------------------------------------------------------------- 1 | # 5.19 自动特征选择 2 | 3 | 我们经常收集许多可能与监督预测任务相关的特征,但我们不知道它们中的哪一个实际上是预测性的。 为了提高可解释性,有时还提高泛化表现,我们可以使用自动特征选择来选择原始特征的子集。 有几种可用的特征选择方法,我们将按照复杂性的升序来解释。 4 | 5 | 对于给定的监督模型,最佳特征选择策略是尝试每个可能的特征子集,并使用该子集评估泛化表现。 但是,特征子集是指数级,因此这种详尽的搜索通常是不可行的。 下面讨论的策略可以被认为是这种不可行计算的替代。 6 | 7 | ## 单变量统计 8 | 9 | 选择要素的最简单方法是使用单变量统计,即通过单独查看每个特征并运行统计检验,来查看它是否与目标相关。 这种检验也称为方差分析(ANOVA)。 10 | 11 | 我们创建了一个人造数据集,其中包含乳腺癌数据和另外 50 个完全随机的特征。 12 | 13 | ```py 14 | from sklearn.datasets import load_breast_cancer, load_digits 15 | from sklearn.model_selection import train_test_split 16 | 17 | cancer = load_breast_cancer() 18 | 19 | # get deterministic random numbers 20 | rng = np.random.RandomState(42) 21 | noise = rng.normal(size=(len(cancer.data), 50)) 22 | # add noise features to the data 23 | # the first 30 features are from the dataset, the next 50 are noise 24 | X_w_noise = np.hstack([cancer.data, noise]) 25 | 26 | X_train, X_test, y_train, y_test = train_test_split(X_w_noise, cancer.target, 27 | random_state=0, test_size=.5) 28 | ``` 29 | 30 | 我们必须在统计检验的 p 值上定义一个阈值,来决定要保留多少特征。 在 scikit-learn 中实现了几种策略,一种直接的策略是`SelectPercentile`,它选择原始特征的百分位数(下面我们选择 50%): 31 | 32 | ```py 33 | from sklearn.feature_selection import SelectPercentile 34 | 35 | # use f_classif (the default) and SelectPercentile to select 50% of features: 36 | select = SelectPercentile(percentile=50) 37 | select.fit(X_train, y_train) 38 | # transform training set: 39 | X_train_selected = select.transform(X_train) 40 | 41 | print(X_train.shape) 42 | print(X_train_selected.shape) 43 | ``` 44 | 45 | 我们还可以直接使用检验统计量,来查看每个特征的相关性。 由于乳腺癌数据集是一项分类任务,我们使用`f_classif`,F 检验用于分类。 下面我们绘制 p 值,与 80 个特征中的每一个相关(30 个原始特征和 50 个噪声特征)。 低 p 值表示信息性特征。 46 | 47 | ```py 48 | from sklearn.feature_selection import f_classif, f_regression, chi2 49 | 50 | F, p = f_classif(X_train, y_train) 51 | 52 | plt.figure() 53 | plt.plot(p, 'o') 54 | ``` 55 | 56 | 显然,前 30 个特征中的大多数具有非常小的 p 值。 57 | 58 | 回到`SelectPercentile`转换器,我们可以使用`get_support`方法获得所选特征: 59 | 60 | ```py 61 | mask = select.get_support() 62 | print(mask) 63 | # 展示掩码。黑色是真,白色是假 64 | plt.matshow(mask.reshape(1, -1), cmap='gray_r') 65 | ``` 66 | 67 | 几乎所有最初的 30 个特征都被还原了。 我们还可以通过在数据上训练监督模型,来分析特征选择的效果。 仅在训练集上学习特征选择非常重要! 68 | 69 | ```py 70 | from sklearn.linear_model import LogisticRegression 71 | 72 | # 转换测试数据 73 | X_test_selected = select.transform(X_test) 74 | 75 | lr = LogisticRegression() 76 | lr.fit(X_train, y_train) 77 | print("Score with all features: %f" % lr.score(X_test, y_test)) 78 | lr.fit(X_train_selected, y_train) 79 | print("Score with only selected features: %f" % lr.score(X_test_selected, y_test)) 80 | ``` 81 | 82 | ## 基于模型的特征选择 83 | 84 | 用于特征选择的稍微复杂的方法,是使用监督机器学习模型,并基于模型认为它们的重要性来选择特征。 这要求模型提供某种方法,按重要性对特征进行排名。 这适用于所有基于树的模型(实现`get_feature_importances`)和所有线性模型,系数可用于确定特征对结果的影响程度。 85 | 86 | 任何这些模型都可以制作成变换器,通过使用`SelectFromModel`类包装它,用于特征选择: 87 | 88 | ```py 89 | from sklearn.feature_selection import SelectFromModel 90 | from sklearn.ensemble import RandomForestClassifier 91 | select = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=42), threshold="median") 92 | 93 | select.fit(X_train, y_train) 94 | X_train_rf = select.transform(X_train) 95 | print(X_train.shape) 96 | print(X_train_rf.shape) 97 | 98 | mask = select.get_support() 99 | # 展示掩码。黑色是真,白色是假 100 | plt.matshow(mask.reshape(1, -1), cmap='gray_r') 101 | 102 | X_test_rf = select.transform(X_test) 103 | LogisticRegression().fit(X_train_rf, y_train).score(X_test_rf, y_test) 104 | ``` 105 | 106 | 此方法构建单个模型(在本例中为随机森林)并使用此模型中的特征重要性。 我们可以通过在数据子集上训练多个模型,来进行更精细的搜索。 一种特殊的策略是递归特征消除: 107 | 108 | ## 递归特征消除 109 | 110 | 递归特征消除在整个特征集上构建模型,类似于上述方法,选择模型认为最重要的特征子集。 但是,通常只会从数据集中删除单个要素,并使用其余要素构建新模型。 重复删除特征和模型构建的过程,直到只剩下预定数量的特征: 111 | 112 | ```py 113 | from sklearn.feature_selection import RFE 114 | select = RFE(RandomForestClassifier(n_estimators=100, random_state=42), n_features_to_select=40) 115 | 116 | select.fit(X_train, y_train) 117 | # 可视化所选特征 118 | mask = select.get_support() 119 | plt.matshow(mask.reshape(1, -1), cmap='gray_r') 120 | 121 | X_train_rfe = select.transform(X_train) 122 | X_test_rfe = select.transform(X_test) 123 | 124 | LogisticRegression().fit(X_train_rfe, y_train).score(X_test_rfe, y_test) 125 | 126 | select.score(X_test, y_test) 127 | ``` 128 | 129 | > 练习 130 | > 131 | > 创建“XOR”数据集,如下面的第一个单元格: 132 | > 添加随机特征,并使用随机森林,在还原原始特征时,比较单变量选择与基于模型的选择。 133 | 134 | ```py 135 | import numpy as np 136 | 137 | rng = np.random.RandomState(1) 138 | 139 | # 在 [0,1] 范围内生成 400 个随机整数 140 | X = rng.randint(0, 2, (200, 2)) 141 | y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0) # XOR creation 142 | 143 | plt.scatter(X[:, 0], X[:, 1], c=plt.cm.tab10(y)) 144 | 145 | # %load solutions/19_univariate_vs_mb_selection.py 146 | ``` 147 | -------------------------------------------------------------------------------- /docs/skl20.md: -------------------------------------------------------------------------------- 1 | # 5.20 无监督学习:层次和基于密度的聚类算法 2 | 3 | 在第八章中,我们介绍了一种必不可少且广泛使用的聚类算法 K-means。 K-means 的一个优点是它非常容易实现,并且与其他聚类算法相比,它在计算上也非常有效。 然而,我们已经看到 K-Means 的一个缺点是它只有在数据可以分组为球形时才能正常工作。 此外,我们必须事先指定簇的数量`k` - 如果我们没有我们期望找到多少个簇的先验知识,这可能是一个问题。 4 | 5 | 在本笔记本中,我们将介绍两种可选的聚类方法,层次聚类和基于密度的聚类。 6 | 7 | ## 层次聚类 8 | 9 | 层次聚类的一个很好的特性是,我们可以将结果可视化为树状图,即层次树。 使用可视化,我们可以通过设置“深度”阈值来决定我们希望数据集的簇有多“深”。 或者换句话说,我们不需要预先决定簇的数量。 10 | 11 | ## 聚合和分裂的层次聚类 12 | 13 | 此外,我们可以区分两种主要的层次聚类方法:分裂聚类和聚合聚类。 在聚合聚类中,我们从数据集中的单个样本开始,并迭代地将其与其他样本合并以形成簇 - 我们可以将其视为构建簇的树状图的自底向上的方法。 14 | 然而,在分裂聚类中,我们从作为一个簇的整个数据集开始,并且我们迭代地将其拆分成更小的子簇 - 自顶向下的方法。 15 | 16 | 在这个笔记本中,我们将使用聚合聚类。 17 | 18 | ## 单个和完整链接 19 | 20 | 现在,下一个问题是我们如何测量样本之间的相似性。 一种方法是我们已经在 K-Means 算法中使用的,熟悉的欧几里德距离度量。 作为回顾,两个`m`维向量`p`和`q`之间的距离可以计算为: 21 | 22 | ![](../img/tex7.gif) 23 | 24 | 然而,这是两个个样本之间的距离。 现在,我们如何计算样本子集之间的相似性,以便在构建树状图时决定合并哪些簇? 即,我们的目标是迭代地合并最相似的一对簇,直到只剩下一个大簇。 有许多不同的方法,例如单个和完整链接。 25 | 26 | 在单个链接中,我们在每两个簇中选取一对最相似的样本(例如,基于欧几里德距离),并将具有最相似的两个成员的两个簇合并为一个新的更大的簇。 27 | 28 | 在完整链接中,我们比较每两个簇的两个最不相似的成员,并且我们合并两个簇,其中两个最不相似的成员之间的距离最小。 29 | 30 | > 译者注:还有比较两个簇形心的方法,算是一种折中。 31 | 32 | ![](../img/clustering-linkage.png) 33 | 34 | 为了看到实际的聚合层次聚类方法,让我们加载熟悉的鸢尾花数据集 - 我们假装不知道真正的类标签,并想要找出它包含多少不同的物种: 35 | 36 | ```py 37 | from sklearn.datasets import load_iris 38 | from figures import cm3 39 | 40 | iris = load_iris() 41 | X = iris.data[:, [2, 3]] 42 | y = iris.target 43 | n_samples, n_features = X.shape 44 | 45 | plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cm3) 46 | ``` 47 | 48 | 首先,我们从一些探索性聚类开始,使用 SciPy 的`linkage`和`dendrogram`函数来可视化簇的树状图: 49 | 50 | ```py 51 | from scipy.cluster.hierarchy import linkage 52 | from scipy.cluster.hierarchy import dendrogram 53 | 54 | clusters = linkage(X, 55 | metric='euclidean', 56 | method='complete') 57 | 58 | dendr = dendrogram(clusters) 59 | 60 | plt.ylabel('Euclidean Distance') 61 | ``` 62 | 63 | 接下来,让我们使用来自 scikit-learn 的`AgglomerativeClustering`估计器,并将数据集划分为 3 个簇。你能猜出它会重现的树状图中有哪 3 个簇吗? 64 | 65 | ```py 66 | from sklearn.cluster import AgglomerativeClustering 67 | 68 | ac = AgglomerativeClustering(n_clusters=3, 69 | affinity='euclidean', 70 | linkage='complete') 71 | 72 | prediction = ac.fit_predict(X) 73 | print('Cluster labels: %s\n' % prediction) 74 | 75 | plt.scatter(X[:, 0], X[:, 1], c=prediction, cmap=cm3) 76 | ``` 77 | 78 | ## 基于密度的聚类 - DBSCAN 79 | 80 | 另一种有用的聚类方法是“具有噪声的基于密度的聚类方法”(DBSCAN)。 本质上,我们可以将 DBSCAN 视为一种算法,该算法根据密集的点区域将数据集划分为子分组。 81 | 82 | 在 DBSCAN 中,我们区分了 3 种不同的“点”: 83 | 84 | + 核心点:核心点是一个点,在其半径`epsilon`内,至少具有最小数量(`MinPts`)的其他点。 85 | + 边界点:边界点是一个点,它不是核心点,因为它的邻域中没有足够的`MinPts`,但位于核心点的半径`epsilon`内。 86 | + 噪点:所有其他的点,既不是核心点也不是边界点。 87 | 88 | ![](../img/dbscan.png) 89 | 90 | DBSCAN 的一个很好的特性是我们不必预先指定多少个簇。 但是,它需要设置其他超参数,例如`MinPts`的值和半径`epsilon`。 91 | 92 | ```py 93 | from sklearn.datasets import make_moons 94 | X, y = make_moons(n_samples=400, 95 | noise=0.1, 96 | random_state=1) 97 | plt.scatter(X[:,0], X[:,1]) 98 | plt.show() 99 | from sklearn.cluster import DBSCAN 100 | 101 | db = DBSCAN(eps=0.2, 102 | min_samples=10, 103 | metric='euclidean') 104 | prediction = db.fit_predict(X) 105 | 106 | print("Predicted labels:\n", prediction) 107 | 108 | plt.scatter(X[:, 0], X[:, 1], c=prediction, cmap=cm3) 109 | ``` 110 | 111 | > 练习 112 | > 113 | > 使用以下玩具数据集,两个同心圆,尝试我们到目前为止使用的三种不同的聚类算法:`KMeans`,`AgglomerativeClustering`和`DBSCAN`。 哪种聚类算法能够最好地再现或发现隐藏的结构(假装我们不知道`y`)? 你能解释为什么这个特殊的算法是一个不错的选择,而另外两个“失败”了? 114 | 115 | ```py 116 | from sklearn.datasets import make_circles 117 | 118 | X, y = make_circles(n_samples=1500, 119 | factor=.4, 120 | noise=.05) 121 | 122 | plt.scatter(X[:, 0], X[:, 1], c=y); 123 | 124 | # %load solutions/20_clustering_comparison.py 125 | ``` 126 | -------------------------------------------------------------------------------- /docs/skl21.md: -------------------------------------------------------------------------------- 1 | # 5.21 无监督学习:非线性降维 2 | 3 | ## 流形学习 4 | 5 | PCA 的一个弱点是它无法检测到非线性特征。 已经开发了一组称为流形学习的算法,来解决这个缺陷。流形学习中使用的规范数据集是 S 曲线: 6 | 7 | ```py 8 | from sklearn.datasets import make_s_curve 9 | X, y = make_s_curve(n_samples=1000) 10 | 11 | from mpl_toolkits.mplot3d import Axes3D 12 | ax = plt.axes(projection='3d') 13 | 14 | ax.scatter3D(X[:, 0], X[:, 1], X[:, 2], c=y) 15 | ax.view_init(10, -60); 16 | ``` 17 | 18 | 这是一个嵌入三维的二维数据集,但它以某种方式嵌入,PCA 无法发现底层数据方向: 19 | 20 | ```py 21 | from sklearn.decomposition import PCA 22 | X_pca = PCA(n_components=2).fit_transform(X) 23 | plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y); 24 | ``` 25 | 26 | 然而,`sklearn.manifold`子模块中可用的流形学习算法能够还原底层的二维流形: 27 | 28 | ```py 29 | from sklearn.manifold import Isomap 30 | 31 | iso = Isomap(n_neighbors=15, n_components=2) 32 | X_iso = iso.fit_transform(X) 33 | plt.scatter(X_iso[:, 0], X_iso[:, 1], c=y); 34 | ``` 35 | 36 | ## 数字数据上的流形学习 37 | 38 | 我们可以将流形学习技术应用于更高维度的数据集,例如我们之前看到的数字数据: 39 | 40 | ```py 41 | from sklearn.datasets import load_digits 42 | digits = load_digits() 43 | 44 | fig, axes = plt.subplots(2, 5, figsize=(10, 5), 45 | subplot_kw={'xticks':(), 'yticks': ()}) 46 | for ax, img in zip(axes.ravel(), digits.images): 47 | ax.imshow(img, interpolation="none", cmap="gray") 48 | ``` 49 | 50 | 我们可以使用线性技术(例如 PCA)可视化数据集。 我们看到这已经提供了一些数据的直觉: 51 | 52 | ```py 53 | # 构建 PCA 模型 54 | pca = PCA(n_components=2) 55 | pca.fit(digits.data) 56 | # 将数字数据转换为前两个主成分 57 | digits_pca = pca.transform(digits.data) 58 | colors = ["#476A2A", "#7851B8", "#BD3430", "#4A2D4E", "#875525", 59 | "#A83683", "#4E655E", "#853541", "#3A3120","#535D8E"] 60 | plt.figure(figsize=(10, 10)) 61 | plt.xlim(digits_pca[:, 0].min(), digits_pca[:, 0].max() + 1) 62 | plt.ylim(digits_pca[:, 1].min(), digits_pca[:, 1].max() + 1) 63 | for i in range(len(digits.data)): 64 | # 实际上将数字绘制为文本而不是使用散点图 65 | plt.text(digits_pca[i, 0], digits_pca[i, 1], str(digits.target[i]), 66 | color = colors[digits.target[i]], 67 | fontdict={'weight': 'bold', 'size': 9}) 68 | plt.xlabel("first principal component") 69 | plt.ylabel("second principal component"); 70 | ``` 71 | 72 | 但是,使用更强大的非线性技术可以提供更好的可视化效果。 在这里,我们使用 t-SNE 流形学习方法: 73 | 74 | ```py 75 | from sklearn.manifold import TSNE 76 | tsne = TSNE(random_state=42) 77 | # 使用 fit_transform 而不是 fit,因为 TSNE 没有 fit 方法 78 | digits_tsne = tsne.fit_transform(digits.data) 79 | 80 | plt.figure(figsize=(10, 10)) 81 | plt.xlim(digits_tsne[:, 0].min(), digits_tsne[:, 0].max() + 1) 82 | plt.ylim(digits_tsne[:, 1].min(), digits_tsne[:, 1].max() + 1) 83 | for i in range(len(digits.data)): 84 | # 实际上将数字绘制为文本而不是使用散点图 85 | plt.text(digits_tsne[i, 0], digits_tsne[i, 1], str(digits.target[i]), 86 | color = colors[digits.target[i]], 87 | fontdict={'weight': 'bold', 'size': 9}) 88 | ``` 89 | 90 | t-SNE 比其他流形学习算法运行时间更长,但结果非常惊人。 请记住,此算法纯粹是无监督的,并且不知道类标签。 它仍然能够很好地分离类别(尽管类 4 和 类 9 已被分成多个分组)。 91 | 92 | > 练习 93 | > 94 | > 将 isomap 应用于数字数据集的结果与 PCA 和 t-SNE 的结果进行比较。 你认为哪个结果看起来最好? 95 | 鉴于 t-SNE 很好地将类别分开,人们可能会试图将这个处理过程用于分类。 尝试在使用 t-SNE 转换的数字数据上,训练 K 最近邻分类器,并与没有任何转换的数据集上的准确性比较。 96 | 97 | ```py 98 | # %load solutions/21A_isomap_digits.py 99 | 100 | # %load solutions/21B_tsne_classification.py 101 | ``` 102 | -------------------------------------------------------------------------------- /img/1-10-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/1-10-1.png -------------------------------------------------------------------------------- /img/1-10-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/1-10-2.png -------------------------------------------------------------------------------- /img/1-10-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/1-10-3.png -------------------------------------------------------------------------------- /img/1-11-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/1-11-1.png -------------------------------------------------------------------------------- /img/1-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/1-2-1.png -------------------------------------------------------------------------------- /img/10-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-1.png -------------------------------------------------------------------------------- /img/10-1-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-10.png -------------------------------------------------------------------------------- /img/10-1-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-11.png -------------------------------------------------------------------------------- /img/10-1-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-12.png -------------------------------------------------------------------------------- /img/10-1-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-13.png -------------------------------------------------------------------------------- /img/10-1-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-14.png -------------------------------------------------------------------------------- /img/10-1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-2.png -------------------------------------------------------------------------------- /img/10-1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-3.png -------------------------------------------------------------------------------- /img/10-1-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-4.png -------------------------------------------------------------------------------- /img/10-1-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-5.png -------------------------------------------------------------------------------- /img/10-1-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-6.png -------------------------------------------------------------------------------- /img/10-1-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-7.png -------------------------------------------------------------------------------- /img/10-1-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-8.png -------------------------------------------------------------------------------- /img/10-1-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-1-9.png -------------------------------------------------------------------------------- /img/10-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-1.png -------------------------------------------------------------------------------- /img/10-2-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-10.png -------------------------------------------------------------------------------- /img/10-2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-2.png -------------------------------------------------------------------------------- /img/10-2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-3.png -------------------------------------------------------------------------------- /img/10-2-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-4.png -------------------------------------------------------------------------------- /img/10-2-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-5.png -------------------------------------------------------------------------------- /img/10-2-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-6.png -------------------------------------------------------------------------------- /img/10-2-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-7.png -------------------------------------------------------------------------------- /img/10-2-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-8.png -------------------------------------------------------------------------------- /img/10-2-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/10-2-9.png -------------------------------------------------------------------------------- /img/2-5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/2-5-1.png -------------------------------------------------------------------------------- /img/4-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/4-1-1.png -------------------------------------------------------------------------------- /img/4-1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/4-1-2.png -------------------------------------------------------------------------------- /img/4-1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/4-1-3.png -------------------------------------------------------------------------------- /img/4-1-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/4-1-4.png -------------------------------------------------------------------------------- /img/4-6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/4-6-1.png -------------------------------------------------------------------------------- /img/4-6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/4-6-2.png -------------------------------------------------------------------------------- /img/4-7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/4-7-1.png -------------------------------------------------------------------------------- /img/4-9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/4-9-1.png -------------------------------------------------------------------------------- /img/4-9-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/4-9-2.png -------------------------------------------------------------------------------- /img/6-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-1-1.png -------------------------------------------------------------------------------- /img/6-1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-1-2.png -------------------------------------------------------------------------------- /img/6-1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-1-3.png -------------------------------------------------------------------------------- /img/6-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-1.png -------------------------------------------------------------------------------- /img/6-2-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-10.png -------------------------------------------------------------------------------- /img/6-2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-2.png -------------------------------------------------------------------------------- /img/6-2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-3.png -------------------------------------------------------------------------------- /img/6-2-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-4.png -------------------------------------------------------------------------------- /img/6-2-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-5.png -------------------------------------------------------------------------------- /img/6-2-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-6.png -------------------------------------------------------------------------------- /img/6-2-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-7.png -------------------------------------------------------------------------------- /img/6-2-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-8.png -------------------------------------------------------------------------------- /img/6-2-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-2-9.png -------------------------------------------------------------------------------- /img/6-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-3-1.png -------------------------------------------------------------------------------- /img/6-3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/6-3-2.png -------------------------------------------------------------------------------- /img/7-11-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-11-1.png -------------------------------------------------------------------------------- /img/7-12-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-12-1.png -------------------------------------------------------------------------------- /img/7-12-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-12-2.png -------------------------------------------------------------------------------- /img/7-12-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-12-3.png -------------------------------------------------------------------------------- /img/7-14-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-1.png -------------------------------------------------------------------------------- /img/7-14-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-10.png -------------------------------------------------------------------------------- /img/7-14-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-11.png -------------------------------------------------------------------------------- /img/7-14-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-12.png -------------------------------------------------------------------------------- /img/7-14-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-13.png -------------------------------------------------------------------------------- /img/7-14-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-2.png -------------------------------------------------------------------------------- /img/7-14-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-3.png -------------------------------------------------------------------------------- /img/7-14-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-4.png -------------------------------------------------------------------------------- /img/7-14-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-5.png -------------------------------------------------------------------------------- /img/7-14-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-6.png -------------------------------------------------------------------------------- /img/7-14-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-7.png -------------------------------------------------------------------------------- /img/7-14-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-8.png -------------------------------------------------------------------------------- /img/7-14-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-14-9.png -------------------------------------------------------------------------------- /img/7-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/7-2-1.png -------------------------------------------------------------------------------- /img/8-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-1-1.png -------------------------------------------------------------------------------- /img/8-1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-1-2.png -------------------------------------------------------------------------------- /img/8-1-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-1-3.png -------------------------------------------------------------------------------- /img/8-1-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-1-4.png -------------------------------------------------------------------------------- /img/8-10-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-1.png -------------------------------------------------------------------------------- /img/8-10-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-10.png -------------------------------------------------------------------------------- /img/8-10-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-2.png -------------------------------------------------------------------------------- /img/8-10-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-3.png -------------------------------------------------------------------------------- /img/8-10-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-4.png -------------------------------------------------------------------------------- /img/8-10-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-5.png -------------------------------------------------------------------------------- /img/8-10-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-6.png -------------------------------------------------------------------------------- /img/8-10-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-7.png -------------------------------------------------------------------------------- /img/8-10-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-8.png -------------------------------------------------------------------------------- /img/8-10-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-10-9.png -------------------------------------------------------------------------------- /img/8-11-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-11-1.png -------------------------------------------------------------------------------- /img/8-11-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-11-2.png -------------------------------------------------------------------------------- /img/8-11-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-11-3.png -------------------------------------------------------------------------------- /img/8-11-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-11-4.png -------------------------------------------------------------------------------- /img/8-11-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-11-5.png -------------------------------------------------------------------------------- /img/8-11-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-11-6.png -------------------------------------------------------------------------------- /img/8-11-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-11-7.png -------------------------------------------------------------------------------- /img/8-11-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-11-8.png -------------------------------------------------------------------------------- /img/8-12-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-12-1.png -------------------------------------------------------------------------------- /img/8-12-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-12-2.png -------------------------------------------------------------------------------- /img/8-12-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-12-3.png -------------------------------------------------------------------------------- /img/8-12-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-12-4.png -------------------------------------------------------------------------------- /img/8-12-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-12-5.png -------------------------------------------------------------------------------- /img/8-12-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-12-6.png -------------------------------------------------------------------------------- /img/8-13-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-13-1.png -------------------------------------------------------------------------------- /img/8-13-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-13-2.png -------------------------------------------------------------------------------- /img/8-13-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-13-3.png -------------------------------------------------------------------------------- /img/8-13-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-13-4.png -------------------------------------------------------------------------------- /img/8-13-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-13-5.png -------------------------------------------------------------------------------- /img/8-13-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-13-6.png -------------------------------------------------------------------------------- /img/8-13-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-13-7.png -------------------------------------------------------------------------------- /img/8-13-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-13-8.png -------------------------------------------------------------------------------- /img/8-14-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-1.png -------------------------------------------------------------------------------- /img/8-14-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-10.png -------------------------------------------------------------------------------- /img/8-14-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-11.png -------------------------------------------------------------------------------- /img/8-14-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-2.png -------------------------------------------------------------------------------- /img/8-14-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-3.png -------------------------------------------------------------------------------- /img/8-14-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-4.png -------------------------------------------------------------------------------- /img/8-14-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-5.png -------------------------------------------------------------------------------- /img/8-14-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-6.png -------------------------------------------------------------------------------- /img/8-14-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-7.png -------------------------------------------------------------------------------- /img/8-14-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-8.png -------------------------------------------------------------------------------- /img/8-14-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-14-9.png -------------------------------------------------------------------------------- /img/8-15-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-1.png -------------------------------------------------------------------------------- /img/8-15-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-10.png -------------------------------------------------------------------------------- /img/8-15-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-2.png -------------------------------------------------------------------------------- /img/8-15-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-3.png -------------------------------------------------------------------------------- /img/8-15-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-4.png -------------------------------------------------------------------------------- /img/8-15-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-5.png -------------------------------------------------------------------------------- /img/8-15-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-6.png -------------------------------------------------------------------------------- /img/8-15-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-7.png -------------------------------------------------------------------------------- /img/8-15-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-8.png -------------------------------------------------------------------------------- /img/8-15-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-15-9.png -------------------------------------------------------------------------------- /img/8-16-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-16-1.png -------------------------------------------------------------------------------- /img/8-16-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-16-2.png -------------------------------------------------------------------------------- /img/8-16-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-16-3.png -------------------------------------------------------------------------------- /img/8-16-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-16-4.png -------------------------------------------------------------------------------- /img/8-16-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-16-5.png -------------------------------------------------------------------------------- /img/8-16-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-16-6.png -------------------------------------------------------------------------------- /img/8-16-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-16-7.png -------------------------------------------------------------------------------- /img/8-16-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-16-8.png -------------------------------------------------------------------------------- /img/8-16-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-16-9.png -------------------------------------------------------------------------------- /img/8-17-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-1.png -------------------------------------------------------------------------------- /img/8-17-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-10.png -------------------------------------------------------------------------------- /img/8-17-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-11.png -------------------------------------------------------------------------------- /img/8-17-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-12.png -------------------------------------------------------------------------------- /img/8-17-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-13.png -------------------------------------------------------------------------------- /img/8-17-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-14.png -------------------------------------------------------------------------------- /img/8-17-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-15.png -------------------------------------------------------------------------------- /img/8-17-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-16.png -------------------------------------------------------------------------------- /img/8-17-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-17.png -------------------------------------------------------------------------------- /img/8-17-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-18.png -------------------------------------------------------------------------------- /img/8-17-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-19.png -------------------------------------------------------------------------------- /img/8-17-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-2.png -------------------------------------------------------------------------------- /img/8-17-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-20.png -------------------------------------------------------------------------------- /img/8-17-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-21.png -------------------------------------------------------------------------------- /img/8-17-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-22.png -------------------------------------------------------------------------------- /img/8-17-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-3.png -------------------------------------------------------------------------------- /img/8-17-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-4.png -------------------------------------------------------------------------------- /img/8-17-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-5.png -------------------------------------------------------------------------------- /img/8-17-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-6.png -------------------------------------------------------------------------------- /img/8-17-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-7.png -------------------------------------------------------------------------------- /img/8-17-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-8.png -------------------------------------------------------------------------------- /img/8-17-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-17-9.png -------------------------------------------------------------------------------- /img/8-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-2-1.png -------------------------------------------------------------------------------- /img/8-2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-2-2.png -------------------------------------------------------------------------------- /img/8-2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-2-3.png -------------------------------------------------------------------------------- /img/8-2-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-2-4.png -------------------------------------------------------------------------------- /img/8-2-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-2-5.png -------------------------------------------------------------------------------- /img/8-2-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-2-6.png -------------------------------------------------------------------------------- /img/8-2-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-2-7.png -------------------------------------------------------------------------------- /img/8-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-3-1.png -------------------------------------------------------------------------------- /img/8-3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-3-2.png -------------------------------------------------------------------------------- /img/8-3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-3-3.png -------------------------------------------------------------------------------- /img/8-3-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-3-4.png -------------------------------------------------------------------------------- /img/8-4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-1.png -------------------------------------------------------------------------------- /img/8-4-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-10.png -------------------------------------------------------------------------------- /img/8-4-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-11.png -------------------------------------------------------------------------------- /img/8-4-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-12.png -------------------------------------------------------------------------------- /img/8-4-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-13.png -------------------------------------------------------------------------------- /img/8-4-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-14.png -------------------------------------------------------------------------------- /img/8-4-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-15.png -------------------------------------------------------------------------------- /img/8-4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-2.png -------------------------------------------------------------------------------- /img/8-4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-3.png -------------------------------------------------------------------------------- /img/8-4-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-4.png -------------------------------------------------------------------------------- /img/8-4-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-5.png -------------------------------------------------------------------------------- /img/8-4-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-6.png -------------------------------------------------------------------------------- /img/8-4-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-7.png -------------------------------------------------------------------------------- /img/8-4-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-8.png -------------------------------------------------------------------------------- /img/8-4-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-4-9.png -------------------------------------------------------------------------------- /img/8-5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-5-1.png -------------------------------------------------------------------------------- /img/8-5-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-5-2.png -------------------------------------------------------------------------------- /img/8-5-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-5-3.png -------------------------------------------------------------------------------- /img/8-5-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-5-4.png -------------------------------------------------------------------------------- /img/8-5-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-5-5.png -------------------------------------------------------------------------------- /img/8-5-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-5-6.png -------------------------------------------------------------------------------- /img/8-5-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-5-7.png -------------------------------------------------------------------------------- /img/8-6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-6-1.png -------------------------------------------------------------------------------- /img/8-6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-6-2.png -------------------------------------------------------------------------------- /img/8-6-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-6-3.png -------------------------------------------------------------------------------- /img/8-7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-7-1.png -------------------------------------------------------------------------------- /img/8-7-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-7-2.png -------------------------------------------------------------------------------- /img/8-7-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-7-3.png -------------------------------------------------------------------------------- /img/8-7-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-7-4.png -------------------------------------------------------------------------------- /img/8-7-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-7-5.png -------------------------------------------------------------------------------- /img/8-8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-8-1.png -------------------------------------------------------------------------------- /img/8-8-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-8-2.png -------------------------------------------------------------------------------- /img/8-8-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-8-3.png -------------------------------------------------------------------------------- /img/8-8-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-8-4.png -------------------------------------------------------------------------------- /img/8-8-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-8-5.png -------------------------------------------------------------------------------- /img/8-8-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-8-6.png -------------------------------------------------------------------------------- /img/8-9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-9-1.png -------------------------------------------------------------------------------- /img/8-9-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-9-2.png -------------------------------------------------------------------------------- /img/8-9-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-9-3.png -------------------------------------------------------------------------------- /img/8-9-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-9-4.png -------------------------------------------------------------------------------- /img/8-9-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-9-5.png -------------------------------------------------------------------------------- /img/8-9-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-9-6.png -------------------------------------------------------------------------------- /img/8-9-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-9-7.png -------------------------------------------------------------------------------- /img/8-9-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/8-9-8.png -------------------------------------------------------------------------------- /img/9-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-1-1.png -------------------------------------------------------------------------------- /img/9-1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-1-2.png -------------------------------------------------------------------------------- /img/9-10-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-10-1.png -------------------------------------------------------------------------------- /img/9-10-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-10-2.png -------------------------------------------------------------------------------- /img/9-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-3-1.png -------------------------------------------------------------------------------- /img/9-3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-3-2.png -------------------------------------------------------------------------------- /img/9-6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-6-1.png -------------------------------------------------------------------------------- /img/9-7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-7-1.png -------------------------------------------------------------------------------- /img/9-7-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-7-2.png -------------------------------------------------------------------------------- /img/9-8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-8-1.png -------------------------------------------------------------------------------- /img/9-9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-9-1.png -------------------------------------------------------------------------------- /img/9-9-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-9-2.png -------------------------------------------------------------------------------- /img/9-9-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/9-9-3.png -------------------------------------------------------------------------------- /img/ConvNet LeNet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/ConvNet LeNet.png -------------------------------------------------------------------------------- /img/LSTM3-chain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/LSTM3-chain.png -------------------------------------------------------------------------------- /img/MLP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/MLP.png -------------------------------------------------------------------------------- /img/MaxPool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/MaxPool.png -------------------------------------------------------------------------------- /img/Perceptron and MLP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/Perceptron and MLP.png -------------------------------------------------------------------------------- /img/Perceptron.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/Perceptron.png -------------------------------------------------------------------------------- /img/RNN-rolled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/RNN-rolled.png -------------------------------------------------------------------------------- /img/RNN-unrolled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/RNN-unrolled.png -------------------------------------------------------------------------------- /img/Table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/Table.png -------------------------------------------------------------------------------- /img/autoencoder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/autoencoder.png -------------------------------------------------------------------------------- /img/average-per-class.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/average-per-class.png -------------------------------------------------------------------------------- /img/backprop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/backprop.png -------------------------------------------------------------------------------- /img/bkwd_step_net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/bkwd_step_net.png -------------------------------------------------------------------------------- /img/check_env-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/check_env-1.png -------------------------------------------------------------------------------- /img/cluster_comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/cluster_comparison.png -------------------------------------------------------------------------------- /img/clustering-linkage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/clustering-linkage.png -------------------------------------------------------------------------------- /img/clustering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/clustering.png -------------------------------------------------------------------------------- /img/cnn1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/cnn1.png -------------------------------------------------------------------------------- /img/cnn2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/cnn2.png -------------------------------------------------------------------------------- /img/cnn3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/cnn3.png -------------------------------------------------------------------------------- /img/cnn4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/cnn4.png -------------------------------------------------------------------------------- /img/cnn5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/cnn5.png -------------------------------------------------------------------------------- /img/cnn6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/cnn6.png -------------------------------------------------------------------------------- /img/conv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/conv.png -------------------------------------------------------------------------------- /img/convnets_cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/convnets_cover.png -------------------------------------------------------------------------------- /img/dbscan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/dbscan.png -------------------------------------------------------------------------------- /img/dl_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/dl_overview.png -------------------------------------------------------------------------------- /img/fwd_step.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/fwd_step.png -------------------------------------------------------------------------------- /img/fwd_step_net.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/fwd_step_net.png -------------------------------------------------------------------------------- /img/gru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/gru.png -------------------------------------------------------------------------------- /img/ipython_help-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/ipython_help-1.png -------------------------------------------------------------------------------- /img/ipython_help-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/ipython_help-2.png -------------------------------------------------------------------------------- /img/ipython_run_cell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/ipython_run_cell.png -------------------------------------------------------------------------------- /img/iris_setosa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/iris_setosa.jpg -------------------------------------------------------------------------------- /img/iris_versicolor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/iris_versicolor.jpg -------------------------------------------------------------------------------- /img/iris_virginica.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/iris_virginica.jpg -------------------------------------------------------------------------------- /img/keDyv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/keDyv.png -------------------------------------------------------------------------------- /img/keras_rank.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/keras_rank.jpg -------------------------------------------------------------------------------- /img/keras_rank_details.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/keras_rank_details.jpg -------------------------------------------------------------------------------- /img/logistic_function.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/logistic_function.png -------------------------------------------------------------------------------- /img/ml_taxonomy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/ml_taxonomy.png -------------------------------------------------------------------------------- /img/mlp_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/mlp_details.png -------------------------------------------------------------------------------- /img/mnist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/mnist.png -------------------------------------------------------------------------------- /img/multi-layers-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/multi-layers-1.png -------------------------------------------------------------------------------- /img/multi-layers-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/multi-layers-2.png -------------------------------------------------------------------------------- /img/multi_input_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/multi_input_model.png -------------------------------------------------------------------------------- /img/overfitting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/overfitting.png -------------------------------------------------------------------------------- /img/parallel_text_clf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/parallel_text_clf.png -------------------------------------------------------------------------------- /img/parallel_text_clf_average.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/parallel_text_clf_average.png -------------------------------------------------------------------------------- /img/petal_sepal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/petal_sepal.jpg -------------------------------------------------------------------------------- /img/plot_kneigbors_regularization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/plot_kneigbors_regularization.png -------------------------------------------------------------------------------- /img/qr_alipay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/qr_alipay.png -------------------------------------------------------------------------------- /img/randomized_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/randomized_search.png -------------------------------------------------------------------------------- /img/resnet34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/resnet34.png -------------------------------------------------------------------------------- /img/resnet_bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/resnet_bb.png -------------------------------------------------------------------------------- /img/rnn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/rnn.png -------------------------------------------------------------------------------- /img/rnn2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/rnn2.png -------------------------------------------------------------------------------- /img/sigmoid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/sigmoid.png -------------------------------------------------------------------------------- /img/single_layer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/single_layer.png -------------------------------------------------------------------------------- /img/supervised_scikit_learn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/supervised_scikit_learn.png -------------------------------------------------------------------------------- /img/tex1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/tex1.gif -------------------------------------------------------------------------------- /img/tex2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/tex2.gif -------------------------------------------------------------------------------- /img/tex3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/tex3.gif -------------------------------------------------------------------------------- /img/tex4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/tex4.gif -------------------------------------------------------------------------------- /img/tex5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/tex5.gif -------------------------------------------------------------------------------- /img/tex6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/tex6.gif -------------------------------------------------------------------------------- /img/tex7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/tex7.gif -------------------------------------------------------------------------------- /img/vgg16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/vgg16.png -------------------------------------------------------------------------------- /img/vgg19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/apachecn/ds-ipynb-zh/bd5f78676f135a71aea44e37e0c19baf57bdc10a/img/vgg19.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
now loading...
31 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /update.sh: -------------------------------------------------------------------------------- 1 | git add -A 2 | git commit -am "$(date "+%Y-%m-%d %H:%M:%S")" 3 | git push --------------------------------------------------------------------------------