From 709ca71d09ccfd2b0ebbad1d6ec132a2bdbf7da1 Mon Sep 17 00:00:00 2001 From: Shuhui Bu Date: Thu, 13 Sep 2018 15:14:46 +0800 Subject: [PATCH] Reorginze the program structure --- References_notes.md | 14 +++ exercise/{exercise.ipynb => 1_python.ipynb} | 66 ++-------- exercise/1_python.py | 74 +++++++++++ exercise/2_numpy.ipynb | 82 ++++++++++++ exercise/2_numpy.py | 70 +++++++++++ exercise/3_matplotlib.ipynb | 37 ++++++ exercise/3_matplotlib.py | 26 ++++ knn/digital classification.ipynb | 82 ------------ knn/knn_classification.ipynb | 139 +++++++++++++++++++++ knn/knn_classification.py | 73 +++++++++++ matplotlib/stinkbug.webp | Bin 55656 -> 0 bytes .../example.png | Bin .../matplotlib_ani1.ipynb | 0 .../matplotlib_ani1.py | 0 .../matplotlib_ani2.ipynb | 0 .../matplotlib_ani2.py | 0 .../matplotlib_full.ipynb | 0 .../matplotlib_simple_tutorial.ipynb | 0 .../numpy.ipynb | 0 .../scipy.ipynb | 0 .../stockholm_td_adj.dat | 0 .../sympy.ipynb | 0 python/tips/README.md | 16 +++ python/tips/pip.md | 66 ++++++++++ python/tips/virtualenv.md | 59 +++++++++ python/tips/virtualenv_wrapper.md | 59 +++++++++ 26 files changed, 724 insertions(+), 139 deletions(-) create mode 100644 References_notes.md rename exercise/{exercise.ipynb => 1_python.ipynb} (66%) create mode 100644 exercise/1_python.py create mode 100644 exercise/2_numpy.ipynb create mode 100644 exercise/2_numpy.py create mode 100644 exercise/3_matplotlib.ipynb create mode 100644 exercise/3_matplotlib.py delete mode 100644 knn/digital classification.ipynb create mode 100644 knn/knn_classification.ipynb create mode 100644 knn/knn_classification.py delete mode 100644 matplotlib/stinkbug.webp rename {matplotlib => numpy_matplotlib_scipy_sympy}/example.png (100%) rename {matplotlib => numpy_matplotlib_scipy_sympy}/matplotlib_ani1.ipynb (100%) rename {matplotlib => numpy_matplotlib_scipy_sympy}/matplotlib_ani1.py (100%) rename {matplotlib => numpy_matplotlib_scipy_sympy}/matplotlib_ani2.ipynb (100%) rename {matplotlib => numpy_matplotlib_scipy_sympy}/matplotlib_ani2.py (100%) rename matplotlib/Lecture-4-Matplotlib.ipynb => numpy_matplotlib_scipy_sympy/matplotlib_full.ipynb (100%) rename matplotlib/tutorial matplotlib.ipynb => numpy_matplotlib_scipy_sympy/matplotlib_simple_tutorial.ipynb (100%) rename numpy_scipy_sympy/Numpy.ipynb => numpy_matplotlib_scipy_sympy/numpy.ipynb (100%) rename numpy_scipy_sympy/Scipy.ipynb => numpy_matplotlib_scipy_sympy/scipy.ipynb (100%) rename {numpy_scipy_sympy => numpy_matplotlib_scipy_sympy}/stockholm_td_adj.dat (100%) rename numpy_scipy_sympy/Sympy.ipynb => numpy_matplotlib_scipy_sympy/sympy.ipynb (100%) create mode 100644 python/tips/README.md create mode 100644 python/tips/pip.md create mode 100644 python/tips/virtualenv.md create mode 100644 python/tips/virtualenv_wrapper.md diff --git a/References_notes.md b/References_notes.md new file mode 100644 index 0000000..50eb9d0 --- /dev/null +++ b/References_notes.md @@ -0,0 +1,14 @@ +## Notebooks: + +machineLearning/10_digits_classification.ipynb + +MachineLearningNotebooks/05.%20Logistic%20Regression.ipynb + +MachineLearningNotebooks/08.%20Practical_NeuralNets.ipynb + + +## Exercise +http://sofasofa.io/competitions.php?type=practice +https://www.kaggle.com/competitions + +https://github.com/wmpscc/DataMiningNotesAndPractice/blob/master/2.KMeans%E7%AE%97%E6%B3%95%E4%B8%8E%E4%BA%A4%E9%80%9A%E4%BA%8B%E6%95%85%E7%90%86%E8%B5%94%E5%AE%A1%E6%A0%B8%E9%A2%84%E6%B5%8B.md \ No newline at end of file diff --git a/exercise/exercise.ipynb b/exercise/1_python.ipynb similarity index 66% rename from exercise/exercise.ipynb rename to exercise/1_python.ipynb index 79151af..baa1375 100644 --- a/exercise/exercise.ipynb +++ b/exercise/1_python.ipynb @@ -34,10 +34,15 @@ "* 高于 100 万元时, 超过 100 万元的部分按 1%提成, \n", "从键盘输入当月利润 I,求应发放奖金总数?\n", "\n", + "\n", "### (4)循环\n", "输出9x9的乘法口诀表\n", "\n", - "### (5)算法\n", + "\n", + "### (5)使用while循环实现输出2-3+4-5+6.....+100的和\n", + "\n", + "\n", + "### (6)算法\n", "给一个数字列表,将其按照由大到小的顺序排列\n", "\n", "例如\n", @@ -45,72 +50,19 @@ "1, 10, 4, 2, 9, 2, 34, 5, 9, 8, 5, 0\n", "```\n", "\n", - "### (6)应用1\n", + "### (7)应用1\n", "做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?\n", "\n", "需要考虑什么是激活码?有什么特性?例如`KR603guyVvR`是一个激活码\n", "\n", - "### (7)应用2\n", + "### (8)应用2\n", "需要把某个目录下面所有的某种类型的文件找到。\n", "例如把`c:`下面所有的`.dll`文件找到\n", "\n", - "### (8)应用3\n", + "### (9)应用3\n", "你有个目录,里面是程序(假如是C或者是Python),统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。\n", "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 数值计算\n", - "\n", - "\n", - "### (1)对于一个存在在数组,如何添加一个用0填充的边界?\n", - "例如对一个二维矩阵\n", - "```\n", - "10, 34, 54, 23\n", - "31, 87, 53, 68\n", - "98, 49, 25, 11\n", - "84, 32, 67, 88\n", - "```\n", - "\n", - "变换成\n", - "```\n", - " 0, 0, 0, 0, 0, 0\n", - " 0, 10, 34, 54, 23, 0\n", - " 0, 31, 87, 53, 68, 0\n", - " 0, 98, 49, 25, 11, 0\n", - " 0, 84, 32, 67, 88, 0\n", - " 0, 0, 0, 0, 0, 0\n", - "```\n", - "\n", - "### (2) 创建一个 5x5的矩阵,并设置值1,2,3,4落在其对角线下方位置\n", - "\n", - "\n", - "### (3) 创建一个8x8 的矩阵,并且设置成棋盘样式\n", - "\n", - "\n", - "### (4)求解线性方程组\n", - "\n", - "给定一个方程组,如何求出其的方程解。有多种方法,分析各种方法的优缺点(最简单的方式是消元方)。\n", - "\n", - "例如\n", - "```\n", - "3x + 4y + 2z = 10\n", - "5x + 3y + 4z = 14\n", - "8x + 2y + 7z = 20\n", - "```\n", - "\n", - "编程写出求解的程序\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/exercise/1_python.py b/exercise/1_python.py new file mode 100644 index 0000000..393c30b --- /dev/null +++ b/exercise/1_python.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# --- +# jupyter: +# jupytext_format_version: '1.2' +# kernelspec: +# display_name: Python 3 +# language: python +# name: python3 +# language_info: +# codemirror_mode: +# name: ipython +# version: 3 +# file_extension: .py +# mimetype: text/x-python +# name: python +# nbconvert_exporter: python +# pygments_lexer: ipython3 +# version: 3.5.2 +# --- + +# # Python & Machine Learning Exercises + +# ## Python +# +# ### (1)字符串 +# 给定一个文章,找出每个单词的出现次数 +# +# ``` +# One is always on a strange road, watching strange scenery and listening to strange music. Then one day, you will find that the things you try hard to forget are already gone. +# ``` +# +# ### (2)组合 +# 有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? +# +# +# ### (3) 判断 +# 企业发放的奖金根据利润提成。利润(I): +# * 低于或等于 10 万元时,奖金可提 10%; +# * 高于 10 万元,低于 20 万元时,低于 10 万元的部分按 10%提成,高于 10 万元的部分,可提成 7.5%; +# * 20 万到 40 万之间时,高于 20 万元的部分,可提成 5%; +# * 40 万到 60 万之间时,高于 40 万元的部分,可提成 3%; +# * 60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5%, +# * 高于 100 万元时, 超过 100 万元的部分按 1%提成, +# 从键盘输入当月利润 I,求应发放奖金总数? +# +# +# ### (4)循环 +# 输出9x9的乘法口诀表 +# +# +# ### (5)使用while循环实现输出2-3+4-5+6.....+100的和 +# +# +# ### (6)算法 +# 给一个数字列表,将其按照由大到小的顺序排列 +# +# 例如 +# ``` +# 1, 10, 4, 2, 9, 2, 34, 5, 9, 8, 5, 0 +# ``` +# +# ### (7)应用1 +# 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)? +# +# 需要考虑什么是激活码?有什么特性?例如`KR603guyVvR`是一个激活码 +# +# ### (8)应用2 +# 需要把某个目录下面所有的某种类型的文件找到。 +# 例如把`c:`下面所有的`.dll`文件找到 +# +# ### (9)应用3 +# 你有个目录,里面是程序(假如是C或者是Python),统计一下你写过多少行代码。包括空行和注释,但是要分别列出来。 +# +# diff --git a/exercise/2_numpy.ipynb b/exercise/2_numpy.ipynb new file mode 100644 index 0000000..2a7a643 --- /dev/null +++ b/exercise/2_numpy.ipynb @@ -0,0 +1,82 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 数值计算\n", + "\n", + "\n", + "### (1)对于一个存在在数组,如何添加一个用0填充的边界?\n", + "例如对一个二维矩阵\n", + "```\n", + "10, 34, 54, 23\n", + "31, 87, 53, 68\n", + "98, 49, 25, 11\n", + "84, 32, 67, 88\n", + "```\n", + "\n", + "变换成\n", + "```\n", + " 0, 0, 0, 0, 0, 0\n", + " 0, 10, 34, 54, 23, 0\n", + " 0, 31, 87, 53, 68, 0\n", + " 0, 98, 49, 25, 11, 0\n", + " 0, 84, 32, 67, 88, 0\n", + " 0, 0, 0, 0, 0, 0\n", + "```\n", + "\n", + "### (2) 创建一个 5x5的矩阵,并设置值1,2,3,4落在其对角线下方位置\n", + "\n", + "\n", + "### (3) 创建一个8x8 的矩阵,并且设置成国际象棋棋盘样式(黑可以用0, 白可以用1)\n", + "\n", + "\n", + "### (4)求解线性方程组\n", + "\n", + "给定一个方程组,如何求出其的方程解。有多种方法,分析各种方法的优缺点(最简单的方式是消元方)。\n", + "\n", + "例如\n", + "```\n", + "3x + 4y + 2z = 10\n", + "5x + 3y + 4z = 14\n", + "8x + 2y + 7z = 20\n", + "```\n", + "\n", + "编程写出求解的程序\n", + "\n", + "\n", + "### (5) 翻转一个数组(第一个元素变成最后一个)\n", + "\n", + "\n", + "### (6) 产生一个十乘十随机数组,并且找出最大和最小值\n", + "\n", + "\n", + "## Reference\n", + "* [100 numpy exercises](https://github.com/rougier/numpy-100)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + }, + "main_language": "python" + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/exercise/2_numpy.py b/exercise/2_numpy.py new file mode 100644 index 0000000..0b53cd7 --- /dev/null +++ b/exercise/2_numpy.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# --- +# jupyter: +# jupytext_format_version: '1.2' +# kernelspec: +# display_name: Python 3 +# language: python +# name: python3 +# language_info: +# codemirror_mode: +# name: ipython +# version: 3 +# file_extension: .py +# mimetype: text/x-python +# name: python +# nbconvert_exporter: python +# pygments_lexer: ipython3 +# version: 3.5.2 +# --- + +# ## 数值计算 +# +# +# ### (1)对于一个存在在数组,如何添加一个用0填充的边界? +# 例如对一个二维矩阵 +# ``` +# 10, 34, 54, 23 +# 31, 87, 53, 68 +# 98, 49, 25, 11 +# 84, 32, 67, 88 +# ``` +# +# 变换成 +# ``` +# 0, 0, 0, 0, 0, 0 +# 0, 10, 34, 54, 23, 0 +# 0, 31, 87, 53, 68, 0 +# 0, 98, 49, 25, 11, 0 +# 0, 84, 32, 67, 88, 0 +# 0, 0, 0, 0, 0, 0 +# ``` +# +# ### (2) 创建一个 5x5的矩阵,并设置值1,2,3,4落在其对角线下方位置 +# +# +# ### (3) 创建一个8x8 的矩阵,并且设置成国际象棋棋盘样式(黑可以用0, 白可以用1) +# +# +# ### (4)求解线性方程组 +# +# 给定一个方程组,如何求出其的方程解。有多种方法,分析各种方法的优缺点(最简单的方式是消元方)。 +# +# 例如 +# ``` +# 3x + 4y + 2z = 10 +# 5x + 3y + 4z = 14 +# 8x + 2y + 7z = 20 +# ``` +# +# 编程写出求解的程序 +# +# +# ### (5) 翻转一个数组(第一个元素变成最后一个) +# +# +# ### (6) 产生一个十乘十随机数组,并且找出最大和最小值 +# +# +# ## Reference +# * [100 numpy exercises](https://github.com/rougier/numpy-100) diff --git a/exercise/3_matplotlib.ipynb b/exercise/3_matplotlib.ipynb new file mode 100644 index 0000000..71b36e5 --- /dev/null +++ b/exercise/3_matplotlib.ipynb @@ -0,0 +1,37 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Matplotlib\n", + "\n", + "\n", + "## (1) 画出一个二次函数,同时画出梯形法求积分时的各个梯形\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + }, + "main_language": "python" + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/exercise/3_matplotlib.py b/exercise/3_matplotlib.py new file mode 100644 index 0000000..9c0d808 --- /dev/null +++ b/exercise/3_matplotlib.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# --- +# jupyter: +# jupytext_format_version: '1.2' +# kernelspec: +# display_name: Python 3 +# language: python +# name: python3 +# language_info: +# codemirror_mode: +# name: ipython +# version: 3 +# file_extension: .py +# mimetype: text/x-python +# name: python +# nbconvert_exporter: python +# pygments_lexer: ipython3 +# version: 3.5.2 +# --- + +# # Matplotlib +# +# +# ## (1) 画出一个二次函数,同时画出梯形法求积分时的各个梯形 +# +# diff --git a/knn/digital classification.ipynb b/knn/digital classification.ipynb deleted file mode 100644 index 720ea6b..0000000 --- a/knn/digital classification.ipynb +++ /dev/null @@ -1,82 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Digitial Classification\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Automatically created module for IPython interactive environment\n", - "KNN score: 0.953661\n", - "LogisticRegression score: 0.908248\n" - ] - } - ], - "source": [ - "print(__doc__)\n", - "\n", - "from sklearn import datasets, neighbors, linear_model\n", - "\n", - "digits = datasets.load_digits()\n", - "X_digits = digits.data\n", - "y_digits = digits.target\n", - "\n", - "n_samples = len(X_digits)\n", - "n_train = int(0.4 * n_samples)\n", - "\n", - "X_train = X_digits[:n_train]\n", - "y_train = y_digits[:n_train]\n", - "X_test = X_digits[n_train:]\n", - "y_test = y_digits[n_train:]\n", - "\n", - "knn = neighbors.KNeighborsClassifier()\n", - "logistic = linear_model.LogisticRegression()\n", - "\n", - "print('KNN score: %f' % knn.fit(X_train, y_train).score(X_test, y_test))\n", - "print('LogisticRegression score: %f' % logistic.fit(X_train, y_train).score(X_test, y_test))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## References\n", - "* [Supervised learning: predicting an output variable from high-dimensional observations](http://scikit-learn.org/stable/tutorial/statistical_inference/supervised_learning.html)\n", - "* [Digits Classification Exercise](http://scikit-learn.org/stable/auto_examples/exercises/plot_digits_classification_exercise.html)\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/knn/knn_classification.ipynb b/knn/knn_classification.ipynb new file mode 100644 index 0000000..be5c04e --- /dev/null +++ b/knn/knn_classification.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# KNN Classification\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Feature dimensions: (1797, 64)\n", + "Label dimensions: (1797,)\n" + ] + } + ], + "source": [ + "% matplotlib inline\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from sklearn import datasets, neighbors, linear_model\n", + "\n", + "# load data\n", + "digits = datasets.load_digits()\n", + "X_digits = digits.data\n", + "y_digits = digits.target\n", + "\n", + "print(\"Feature dimensions: \", X_digits.shape)\n", + "print(\"Label dimensions: \", y_digits.shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# plot sample images\n", + "nplot = 10\n", + "fig, axes = plt.subplots(nrows=1, ncols=nplot)\n", + "\n", + "for i in range(nplot):\n", + " img = X_digits[i].reshape(8, 8)\n", + " axes[i].imshow(img)\n", + " axes[i].set_title(y_digits[i])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# split train / test data\n", + "n_samples = len(X_digits)\n", + "n_train = int(0.4 * n_samples)\n", + "\n", + "X_train = X_digits[:n_train]\n", + "y_train = y_digits[:n_train]\n", + "X_test = X_digits[n_train:]\n", + "y_test = y_digits[n_train:]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "KNN score: 0.953661\n", + "LogisticRegression score: 0.908248\n" + ] + } + ], + "source": [ + "# do KNN classification\n", + "knn = neighbors.KNeighborsClassifier()\n", + "logistic = linear_model.LogisticRegression()\n", + "\n", + "print('KNN score: %f' % knn.fit(X_train, y_train).score(X_test, y_test))\n", + "print('LogisticRegression score: %f' % logistic.fit(X_train, y_train).score(X_test, y_test))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References\n", + "* [Digits Classification Exercise](http://scikit-learn.org/stable/auto_examples/exercises/plot_digits_classification_exercise.html)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/knn/knn_classification.py b/knn/knn_classification.py new file mode 100644 index 0000000..b0a1732 --- /dev/null +++ b/knn/knn_classification.py @@ -0,0 +1,73 @@ +# --- +# jupyter: +# jupytext_format_version: '1.2' +# kernelspec: +# display_name: Python 3 +# language: python +# name: python3 +# language_info: +# codemirror_mode: +# name: ipython +# version: 3 +# file_extension: .py +# mimetype: text/x-python +# name: python +# nbconvert_exporter: python +# pygments_lexer: ipython3 +# version: 3.5.2 +# --- + +# # KNN Classification +# +# +# + +# + +% matplotlib inline + +import matplotlib.pyplot as plt +from sklearn import datasets, neighbors, linear_model + +# load data +digits = datasets.load_digits() +X_digits = digits.data +y_digits = digits.target + +print("Feature dimensions: ", X_digits.shape) +print("Label dimensions: ", y_digits.shape) + + +# + +# plot sample images +nplot = 10 +fig, axes = plt.subplots(nrows=1, ncols=nplot) + +for i in range(nplot): + img = X_digits[i].reshape(8, 8) + axes[i].imshow(img) + axes[i].set_title(y_digits[i]) + + +# + +# split train / test data +n_samples = len(X_digits) +n_train = int(0.4 * n_samples) + +X_train = X_digits[:n_train] +y_train = y_digits[:n_train] +X_test = X_digits[n_train:] +y_test = y_digits[n_train:] + + +# + +# do KNN classification +knn = neighbors.KNeighborsClassifier() +logistic = linear_model.LogisticRegression() + +print('KNN score: %f' % knn.fit(X_train, y_train).score(X_test, y_test)) +print('LogisticRegression score: %f' % logistic.fit(X_train, y_train).score(X_test, y_test)) +# - + +# ## References +# * [Digits Classification Exercise](http://scikit-learn.org/stable/auto_examples/exercises/plot_digits_classification_exercise.html) +# diff --git a/matplotlib/stinkbug.webp b/matplotlib/stinkbug.webp deleted file mode 100644 index 08f02e08fe6655c419314f6c5349699b81fc066f..0000000000000000000000000000000000000000 GIT binary patch literal 0 KcmV+b0RR6000031 literal 55656 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

FP&V?8V$zP#Z!wi?-^=z|%hwuh%{y!C z3(N>JisrpXO-!vpT5GRnG9^?Bn@D9MEoE$;ZB3-Q)bzp_n_q+F zYb<=zGVj&GUdu8p>f6RrLEoko%cw`bHh&w*i{6qM8|?La8uDJ6iH3QO+4C8z8$F9k z-9s@LJ=b*Zy34ADZCM`SuIN;aV7`{!jlEFxld|WtnYw2Tmf0khaCcSSNxoM4{SFTm zQL!0nt}SGBzwt7)sJUVCKAM%0E3vRvU&GGDtY4EefkeN_q0 zdpqBgbSlNZEHgR_ZVa)>1UoV_l&5VWo@O}4XhbE&v~@O&NC{?^H4_@NUdYM3hnbAN>@Ax;Tc|sXq?CkTzW3$pUX$;e zceda1euDX%1;MhKSgh?fwIP|9?)pm2|ztq6&TM%gjUGOUxK4V;>XS7xWf0Gv@0erZwxu&DbK?lGs9vqEHTsRMB^TIc9#n zqFVc+$a|O|&w`%5VG*oBR!>GIlMoV}?mAWSd-D6VZ|h5u`_ixezAwSHeQCl*Ynpf7 zR}*)2d1)r)m8p}cQm|P|j8%~^%GVE!*=9~jF~hJlgdSvS-j8j&&KD|8UZ=`^?b4U@ z{RNX@v&|Y&O<2C>%NVx2mzG(ReFryI=eRF6HZGK&?uktsH{Y7E+ zG8lQ6HMBr~-nO~=geHmKbJ*}a}Xrv-v z6I12uzIZ8#y*AtP5+$jTP0@?mnlby*V%}}S=*!mzZ9%9_Aqv&y9n8ieUt4C`FUYS$ zFWHxkEwwLM`RfW>ER)~wvT}-`^1Ux<+0YEKna7|Rrmj*^6m0Vo#!uhJgyz>6tl4K+ zmWd!MA^M`WY}+@)OE&MpHkN#m1kF~^B*=W9Ok>T>ugmW-vF$XHHI{@*1(Cf>G6WOT fUaS2Lg@pM!8@$e?`(@