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 HcmV?d00001 literal 55656 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