diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c13ccf89 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# Deployed apps should consider commenting this line out: +# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git +node_modules + +_book/ +book.pdf +book.epub +book.mobi diff --git a/README.html b/README.html new file mode 100644 index 00000000..31ed3782 --- /dev/null +++ b/README.html @@ -0,0 +1,226 @@ + + + + +机器学习课程简介 + + +

斯坦福大学2014机器学习教程中文笔记

课程目录:目录

课程地址:https://www.coursera.org/course/ml

Machine Learning(机器学习)是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演译。在过去的十年中,机器学习帮助我们自动驾驶汽车,有效的语音识别,有效的网络搜索,并极大地提高了人类基因组的认识。机器学习是当今非常普遍,你可能会使用这一天几十倍而不自知。很多研究者也认为这是最好的人工智能的取得方式。在本课中,您将学习最有效的机器学习技术,并获得实践,让它们为自己的工作。更重要的是,你会不仅得到理论基础的学习,而且获得那些需要快速和强大的应用技术解决问题的实用技术。最后,你会学到一些硅谷利用机器学习和人工智能的最佳实践创新。

本课程提供了一个广泛的介绍机器学习、数据挖掘、统计模式识别的课程。主题包括:(一)监督学习(参数/非参数算法,支持向量机,核函数,神经网络)。(二)无监督学习(聚类,降维,推荐系统,深入学习推荐)。(三)在机器学习的最佳实践(偏差/方差理论;在机器学习和人工智能创新过程)。本课程还将使用大量的案例研究,您还将学习如何运用学习算法构建智能机器人(感知,控制),文本的理解(Web搜索,反垃圾邮件),计算机视觉,医疗信息,音频,数据挖掘,和其他领域。

本课程需要10周共18节课,相对以前的机器学习视频,这个视频更加清晰,而且每课都有ppt课件,推荐学习。

本人2014年下半年开始翻译本课程字幕,并写了课程的中文笔记。笔记被下载了几万次,应该帮助了不少人,也有很多人一直在帮助我,现在我把笔记的word原稿和markdown原稿分享给大家。

markdown的笔记和课程中英文字幕我将放在github和码云,希望大家能继续完善。为方便数学公式的在线显示,在线观看的是html文件,公式已经被转为图片,公式源码在markdown文件。

最后想对各位朋友说: +赠人玫瑰,手有余香! +在人工智能的道路上,你不是一个人在战斗!

黄海广

2017-11-3 夜

我的知乎


文件夹说明:

docx:笔记的word版本

media:笔记的图片

ppt:课程的原版课件

srt:课程的中英文字幕(mp4文件需要在百度云下载)

code:课程的python代码(有一部分是国外大牛写的)

机器学习视频下载链接:http://pan.baidu.com/s/1dFCQvxZ 密码:dce8

包含mp4视频和字幕

笔记在线阅读

笔记pdf版本下载

机器学习qq群:554839127

+ + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..7095c290 --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +**斯坦福大学2014机器学习教程中文笔记** + +课程目录:[目录](index.html) + +课程地址: + +Machine Learning(机器学习)是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演译。在过去的十年中,机器学习帮助我们自动驾驶汽车,有效的语音识别,有效的网络搜索,并极大地提高了人类基因组的认识。机器学习是当今非常普遍,你可能会使用这一天几十倍而不自知。很多研究者也认为这是最好的人工智能的取得方式。在本课中,您将学习最有效的机器学习技术,并获得实践,让它们为自己的工作。更重要的是,你会不仅得到理论基础的学习,而且获得那些需要快速和强大的应用技术解决问题的实用技术。最后,你会学到一些硅谷利用机器学习和人工智能的最佳实践创新。 + +本课程提供了一个广泛的介绍机器学习、数据挖掘、统计模式识别的课程。主题包括:(一)监督学习(参数/非参数算法,支持向量机,核函数,神经网络)。(二)无监督学习(聚类,降维,推荐系统,深入学习推荐)。(三)在机器学习的最佳实践(偏差/方差理论;在机器学习和人工智能创新过程)。本课程还将使用大量的案例研究,您还将学习如何运用学习算法构建智能机器人(感知,控制),文本的理解(Web搜索,反垃圾邮件),计算机视觉,医疗信息,音频,数据挖掘,和其他领域。 + +本课程需要10周共18节课,相对以前的机器学习视频,这个视频更加清晰,而且每课都有ppt课件,推荐学习。 + +本人2014年下半年开始翻译本课程字幕,并写了课程的中文笔记。笔记被下载了几万次,应该帮助了不少人,也有很多人一直在帮助我,现在我把笔记的word原稿和markdown原稿分享给大家。 + +markdown的笔记和课程中英文字幕我将放在github和码云,希望大家能继续完善。为方便数学公式的在线显示,在线观看的是html文件,公式已经被转为图片,公式源码在markdown文件。 + +**最后想对各位朋友说:** +**赠人玫瑰,手有余香!** +**在人工智能的道路上,你不是一个人在战斗!** + +黄海广 + +2017-11-3 夜 + +[我的知乎](https://www.zhihu.com/people/fengdu78/activities) + +----------------------- + +文件夹说明: + +docx:笔记的word版本 + +media:笔记的图片 + +ppt:课程的原版课件 + +srt:课程的中英文字幕(mp4文件需要在百度云下载) + +code:课程的python代码(有一部分是国外大牛写的) + +机器学习视频下载链接:http://pan.baidu.com/s/1dFCQvxZ 密码:dce8 + +包含mp4视频和字幕 + +[笔记在线阅读](http://www.ai-start.com/ml2014) + +[笔记pdf版本下载](http://fengdu78.gitee.io/coursera-ml-andrewng-notes/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B8%AA%E4%BA%BA%E7%AC%94%E8%AE%B0%E5%AE%8C%E6%95%B4%E7%89%88v5.pdf) + +机器学习qq群:554839127 + diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 00000000..7cd2c786 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,297 @@ +# 斯坦福大学2014机器学习教程中文笔记目录 + +* [第一周](week1.md) + +一、 引言(Introduction) + +1.1 欢迎 + +1.2 机器学习是什么? + +1.3 监督学习 + +1.4 无监督学习 + +二、单变量线性回归(Linear Regression with One Variable) + +2.1 模型表示 + +2.2 代价函数 + +2.3 代价函数的直观理解I + +2.4 代价函数的直观理解II + +2.5 梯度下降 + +2.6 梯度下降的直观理解 + +2.7 梯度下降的线性回归 + +2.8 接下来的内容 + +三、线性代数回顾(Linear Algebra Review) + +3.1 矩阵和向量 + +3.2 加法和标量乘法 + +3.3 矩阵向量乘法 + +3.4 矩阵乘法 + +3.5 矩阵乘法的性质 + +3.6 逆、转置 + +* [第二周](week2.md) + +四、多变量线性回归(Linear Regression with Multiple Variables) + +4.1 多维特征 + +4.2 多变量梯度下降 + +4.3 梯度下降法实践1-特征缩放 + +4.4 梯度下降法实践2-学习率 + +4.5 特征和多项式回归 + +4.6 正规方程 + +4.7 正规方程及不可逆性(选修) + +五、Octave教程(Octave Tutorial) + +5.1 基本操作 + +5.2 移动数据 + +5.3 计算数据 + +5.4 绘图数据 + +5.5 控制语句:for,while,if语句 + +5.6 向量化 88 + +5.7 工作和提交的编程练习 + +* [第三周](week3.md) + +六、逻辑回归(Logistic Regression) + +6.1 分类问题 + +6.2 假说表示 + +6.3 判定边界 + +6.4 代价函数 + +6.5 简化的成本函数和梯度下降 + +6.6 高级优化 + +6.7 多类别分类:一对多 + +七、正则化(Regularization) + +7.1 过拟合的问题 + +7.2 代价函数 + +7.3 正则化线性回归 + +7.4 正则化的逻辑回归模型 + +* [第四周](week4.md) + +第八、神经网络:表述(Neural Networks: Representation) + +8.1 非线性假设 + +8.2 神经元和大脑 + +8.3 模型表示1 + +8.4 模型表示2 + +8.5 样本和直观理解1 + +8.6 样本和直观理解II + +8.7 多类分类 + +* [第五周](week5.md) + +九、神经网络的学习(Neural Networks: Learning) + +9.1 代价函数 + +9.2 反向传播算法 + +9.3 反向传播算法的直观理解 + +9.4 实现注意:展开参数 + +9.5 梯度检验 + +9.6 随机初始化 + +9.7 综合起来 + +9.8 自主驾驶 + +* [第六周](week6.md) + +十、应用机器学习的建议(Advice for Applying Machine Learning) + +10.1 决定下一步做什么 + +10.2 评估一个假设 + +10.3 模型选择和交叉验证集 + +10.4 诊断偏差和方差 + +10.5 正则化和偏差/方差 + +10.6 学习曲线 + +10.7 决定下一步做什么 + +十一、机器学习系统的设计(Machine Learning System Design) + +11.1 首先要做什么 + +11.2 误差分析 + +11.3 类偏斜的误差度量 + +11.4 查准率和查全率之间的权衡 + +11.5 机器学习的数据 + +[第7周](week7.md) + +十二、支持向量机(Support Vector Machines) + +12.1 优化目标 + +12.2 大边界的直观理解 + +12.3 数学背后的大边界分类(选修) + +12.4 核函数1 + +12.5 核函数2 + +12.6 使用支持向量机 + +* [第八周](week8.md) + +十三、聚类(Clustering) + +13.1 无监督学习:简介 + +13.2 K-均值算法 + +13.3 优化目标 + +13.4 随机初始化 + +13.5 选择聚类数 + +十四、降维(Dimensionality Reduction) + +14.1 动机一:数据压缩 + +14.2 动机二:数据可视化 + +14.3 主成分分析问题 + +14.4 主成分分析算法 + +14.5 选择主成分的数量 + +14.6 重建的压缩表示 + +14.7 主成分分析法的应用建议 + +* [第九周](week9.md) + +十五、异常检测(Anomaly Detection) + +15.1 问题的动机 + +15.2 高斯分布 + +15.3 算法 + +15.4 开发和评价一个异常检测系统 + +15.5 异常检测与监督学习对比 + +15.6 选择特征 + +15.7 多元高斯分布(选修) + +15.8 使用多元高斯分布进行异常检测(选修) + +十六、推荐系统(Recommender Systems) + +16.1 问题形式化 + +16.2 基于内容的推荐系统 + +16.3 协同过滤 + +16.4 协同过滤算法 + +16.5 向量化:低秩矩阵分解 + +16.6 推行工作上的细节:均值归一化 + +* [第十周](week10.md) + +十七、大规模机器学习(Large Scale Machine Learning) + +17.1 大型数据集的学习 + +17.2 随机梯度下降法 + +17.3 小批量梯度下降 + +17.4 随机梯度下降收敛 + +17.5 在线学习 + +17.6 映射化简和数据并行 + +十八、应用实例:图片文字识别(Application Example: Photo OCR) + +18.1 问题描述和流程图 + +18.2 滑动窗口 + +18.3 获取大量数据和人工数据 + +18.4 上限分析:哪部分管道的接下去做 + +十九、总结(Conclusion) + +19.1 总结和致谢 + +--------------- + +**机器学习视频下载链接:http://pan.baidu.com/s/1dFCQvxZ 密码:dce8** + +**包含mp4视频和字幕** + +**[笔记在线阅读](index.html)** + +**[笔记pdf版本下载](机器学习个人笔记完整版v4.7.pdf)** + +**机器学习qq群:554839127** \ No newline at end of file diff --git a/code/ex1-linear regression/1.linear_regreesion_v1.ipynb b/code/ex1-linear regression/1.linear_regreesion_v1.ipynb new file mode 100644 index 00000000..a793d0e7 --- /dev/null +++ b/code/ex1-linear regression/1.linear_regreesion_v1.ipynb @@ -0,0 +1,1645 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# linear regreesion(线性回归)\n", + "注意:python版本为3.6,\n", + "安装TensorFlow的方法:pip install tensorflow" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import seaborn as sns\n", + "sns.set(context=\"notebook\", style=\"whitegrid\", palette=\"dark\")\n", + "import matplotlib.pyplot as plt\n", + "import tensorflow as tf\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "df = pd.read_csv('ex1data1.txt', names=['population', 'profit'])#读取数据并赋予列名" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
populationprofit
06.110117.5920
15.52779.1302
28.518613.6620
37.003211.8540
45.85986.8233
\n", + "
" + ], + "text/plain": [ + " population profit\n", + "0 6.1101 17.5920\n", + "1 5.5277 9.1302\n", + "2 8.5186 13.6620\n", + "3 7.0032 11.8540\n", + "4 5.8598 6.8233" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()#看前五行" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 97 entries, 0 to 96\n", + "Data columns (total 2 columns):\n", + "population 97 non-null float64\n", + "profit 97 non-null float64\n", + "dtypes: float64(2)\n", + "memory usage: 1.6 KB\n" + ] + } + ], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "***\n", + "# 看下原始数据" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nPfPMM1qwYIEt/g4atr+2tlaHDx9Wz549Tf87oLgqAMAS2uSQHQDAfggkAIAlEEgAAEsgkAAAlkAg\nAQAsgUACLGDy5Mn+61RCPcZnzJgxZjcJiDoCCbCJ//u///P//7vvvhvDlgDmsNYVfIBF7dy5U4sX\nL1Z8fLxOnjypb33rW3ruuee0adMmrV69Wi6XS/3799ezzz6rjh07auDAgRoyZIj27t2rjh07atGi\nRerVq5fuuOMO/fa3v1WvXr20c+dOLVmyRGvWrPHvp6amRvPmzdPhw4dVUlKi9PR0LVmyRIsWLZIk\n3XvvvdqwYYOuu+46HTp0SOfPn9ecOXN06NAhuVwuTZs2TWPHjtXbb7+tDz74QF999ZX+9re/6R/+\n4R80b968GP30gPDQQwLCtGfPHv3sZz/T5s2bVVVVpZUrV2rFihVas2aNNm3apA4dOmjJkiWSpDNn\nzujWW2/Vpk2b9IMf/EALFiwIax9FRUVq166d1q1bp//5n/9RVVWVCgsLNWfOHEnShg0bAh6/ePFi\npaam6ve//71+85vfaPHixTp48KD/tX71q19p48aNev/993Xo0KEI/jSAyCOQgDDdcsstysjIkMvl\n0pgxY7Rs2TINGTJEqampkqScnBzt2LFDkpSYmKixY8dKqlu4rLnzQ/X3cd999+m1117Tc889p6NH\nj6qysrLJx+/YscNfb6xLly4aOnSof2gvKytLycnJ6tChg3r37q2vvvqq1ccORAOBBISpfqVpwzDk\n9XoD7jcMw19yPy4uzr/cgNfrbfRcSUHL82/ZskWPP/642rdvr3vuuUe33HKLQlX3anifYRiqra2V\npIA1a1wuV8jXAayAQALC5PF4dOrUKXm9Xr3zzjt6+umntXXrVp09e1aStH79et12222SpPPnz2vr\n1q2S6pak91WqTk1NVXFxsaS68Glo+/bt+v73v69x48apW7du+vjjj/0BE2yNnIEDB+rNN9+UJJWW\nlmrLli3+heAAuyGQgDBdddVVevLJJzVy5Eh1795dDzzwgKZPn67JkyfrzjvvVFlZmWbNmuV//ObN\nmzV69Gh98MEHmj17tiTpkUce0XPPPadx48YFXYfr3nvv1X/+539q7NixevjhhzVgwAAdP35ckjR0\n6FCNGTNGVVVV/sfPnDlTZ8+e1ejRo/XAAw/ooYcearS8BGAXVPsGwhBsRlwovllwAMJHDwkAYAn0\nkAAAlkAPCQBgCQQSAMASCCQAgCUQSAAASyCQAACWQCABACzh/wMhRpknft8FaQAAAABJRU5ErkJg\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.lmplot('population', 'profit', df, size=6, fit_reg=False)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def get_X(df):#读取特征\n", + "# \"\"\"\n", + "# use concat to add intersect feature to avoid side effect\n", + "# not efficient for big dataset though\n", + "# \"\"\"\n", + " ones = pd.DataFrame({'ones': np.ones(len(df))})#ones是m行1列的dataframe\n", + " data = pd.concat([ones, df], axis=1) # 合并数据,根据列合并\n", + " return data.iloc[:, :-1].as_matrix() # 这个操作返回 ndarray,不是矩阵\n", + "\n", + "\n", + "def get_y(df):#读取标签\n", + "# '''assume the last column is the target'''\n", + " return np.array(df.iloc[:, -1])#df.iloc[:, -1]是指df的最后一列\n", + "\n", + "\n", + "def normalize_feature(df):\n", + "# \"\"\"Applies function along input axis(default 0) of DataFrame.\"\"\"\n", + " return df.apply(lambda column: (column - column.mean()) / column.std())#特征缩放" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "多变量的假设 h 表示为:\\\\[{{h}_{\\theta }}\\left( x \\right)={{\\theta }_{0}}+{{\\theta }_{1}}{{x}_{1}}+{{\\theta }_{2}}{{x}_{2}}+...+{{\\theta }_{n}}{{x}_{n}}\\\\] \n", + "这个公式中有n+1个参数和n个变量,为了使得公式能够简化一些,引入${{x}_{0}}=1$,则公式转化为: \n", + "此时模型中的参数是一个n+1维的向量,任何一个训练实例也都是n+1维的向量,特征矩阵X的维度是 m*(n+1)。 因此公式可以简化为:${{h}_{\\theta }}\\left( x \\right)={{\\theta }^{T}}X$,其中上标T代表矩阵转置。\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def linear_regression(X_data, y_data, alpha, epoch, optimizer=tf.train.GradientDescentOptimizer):# 这个函数是旧金山的一个大神Lucas Shen写的\n", + " # placeholder for graph input\n", + " X = tf.placeholder(tf.float32, shape=X_data.shape)\n", + " y = tf.placeholder(tf.float32, shape=y_data.shape)\n", + "\n", + " # construct the graph\n", + " with tf.variable_scope('linear-regression'):\n", + " W = tf.get_variable(\"weights\",\n", + " (X_data.shape[1], 1),\n", + " initializer=tf.constant_initializer()) # n*1\n", + "\n", + " y_pred = tf.matmul(X, W) # m*n @ n*1 -> m*1\n", + "\n", + " loss = 1 / (2 * len(X_data)) * tf.matmul((y_pred - y), (y_pred - y), transpose_a=True) # (m*1).T @ m*1 = 1*1\n", + "\n", + " opt = optimizer(learning_rate=alpha)\n", + " opt_operation = opt.minimize(loss)\n", + "\n", + " # run the session\n", + " with tf.Session() as sess:\n", + " sess.run(tf.global_variables_initializer())\n", + " loss_data = []\n", + "\n", + " for i in range(epoch):\n", + " _, loss_val, W_val = sess.run([opt_operation, loss, W], feed_dict={X: X_data, y: y_data})\n", + " loss_data.append(loss_val[0, 0]) # because every loss_val is 1*1 ndarray\n", + "\n", + " if len(loss_data) > 1 and np.abs(loss_data[-1] - loss_data[-2]) < 10 ** -9: # early break when it's converged\n", + " # print('Converged at epoch {}'.format(i))\n", + " break\n", + "\n", + " # clear the graph\n", + " tf.reset_default_graph()\n", + " return {'loss': loss_data, 'parameters': W_val} # just want to return in row vector format" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
populationprofit
06.110117.5920
15.52779.1302
28.518613.6620
37.003211.8540
45.85986.8233
\n", + "
" + ], + "text/plain": [ + " population profit\n", + "0 6.1101 17.5920\n", + "1 5.5277 9.1302\n", + "2 8.5186 13.6620\n", + "3 7.0032 11.8540\n", + "4 5.8598 6.8233" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv('ex1data1.txt', names=['population', 'profit'])#读取数据,并赋予列名\n", + "\n", + "data.head()#看下数据前5行" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 计算代价函数\n", + "$$J\\left( \\theta \\right)=\\frac{1}{2m}\\sum\\limits_{i=1}^{m}{{{\\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}} \\right)}^{2}}}$$\n", + "其中:\\\\[{{h}_{\\theta }}\\left( x \\right)={{\\theta }^{T}}X={{\\theta }_{0}}{{x}_{0}}+{{\\theta }_{1}}{{x}_{1}}+{{\\theta }_{2}}{{x}_{2}}+...+{{\\theta }_{n}}{{x}_{n}}\\\\] " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(97, 2) \n", + "(97,) \n" + ] + } + ], + "source": [ + "X = get_X(data)\n", + "print(X.shape, type(X))\n", + "\n", + "y = get_y(data)\n", + "print(y.shape, type(y))\n", + "#看下数据维度" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "theta = np.zeros(X.shape[1])#X.shape[1]=2,代表特征数n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def lr_cost(theta, X, y):\n", + "# \"\"\"\n", + "# X: R(m*n), m 样本数, n 特征数\n", + "# y: R(m)\n", + "# theta : R(n), 线性回归的参数\n", + "# \"\"\"\n", + " m = X.shape[0]#m为样本数\n", + "\n", + " inner = X @ theta - y # R(m*1),X @ theta等价于X.dot(theta)\n", + "\n", + " # 1*m @ m*1 = 1*1 in matrix multiplication\n", + " # but you know numpy didn't do transpose in 1d array, so here is just a\n", + " # vector inner product to itselves\n", + " square_sum = inner.T @ inner\n", + " cost = square_sum / (2 * m)\n", + "\n", + " return cost" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "32.072733877455676" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lr_cost(theta, X, y)#返回theta的值" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# batch gradient decent(批量梯度下降)\n", + "$${{\\theta }_{j}}:={{\\theta }_{j}}-\\alpha \\frac{\\partial }{\\partial {{\\theta }_{j}}}J\\left( \\theta \\right)$$" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradient(theta, X, y):\n", + " m = X.shape[0]\n", + "\n", + " inner = X.T @ (X @ theta - y) # (m,n).T @ (m, 1) -> (n, 1),X @ theta等价于X.dot(theta)\n", + "\n", + " return inner / m" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def batch_gradient_decent(theta, X, y, epoch, alpha=0.01):\n", + "# 拟合线性回归,返回参数和代价\n", + "# epoch: 批处理的轮数\n", + "# \"\"\"\n", + " cost_data = [lr_cost(theta, X, y)]\n", + " _theta = theta.copy() # 拷贝一份,不和原来的theta混淆\n", + "\n", + " for _ in range(epoch):\n", + " _theta = _theta - alpha * gradient(_theta, X, y)\n", + " cost_data.append(lr_cost(_theta, X, y))\n", + "\n", + " return _theta, cost_data\n", + "#批量梯度下降函数" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "epoch = 500\n", + "final_theta, cost_data = batch_gradient_decent(theta, X, y, epoch)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-2.28286727, 1.03099898])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_theta\n", + "#最终的theta" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[32.072733877455676,\n", + " 6.7371904648700109,\n", + " 5.9315935686049563,\n", + " 5.9011547070813881,\n", + " 5.8952285864442207,\n", + " 5.8900949431173304,\n", + " 5.8850041584436461,\n", + " 5.8799324804914175,\n", + " 5.8748790947625729,\n", + " 5.8698439118063854,\n", + " 5.8648268653129305,\n", + " 5.8598278899321805,\n", + " 5.8548469205722897,\n", + " 5.849883892376587,\n", + " 5.8449387407220339,\n", + " 5.8400114012183613,\n", + " 5.8351018097072282,\n", + " 5.8302099022613882,\n", + " 5.825335615183862,\n", + " 5.8204788850070992,\n", + " 5.8156396484921542,\n", + " 5.8108178426278689,\n", + " 5.8060134046300451,\n", + " 5.8012262719406298,\n", + " 5.7964563822268991,\n", + " 5.7917036733806526,\n", + " 5.7869680835173956,\n", + " 5.7822495509755392,\n", + " 5.7775480143155962,\n", + " 5.7728634123193823,\n", + " 5.7681956839892123,\n", + " 5.7635447685471197,\n", + " 5.7589106054340471,\n", + " 5.7542931343090782,\n", + " 5.7496922950486287,\n", + " 5.7451080277456841,\n", + " 5.7405402727090138,\n", + " 5.7359889704623814,\n", + " 5.7314540617437917,\n", + " 5.7269354875047016,\n", + " 5.7224331889092568,\n", + " 5.7179471073335293,\n", + " 5.7134771843647494,\n", + " 5.7090233618005488,\n", + " 5.7045855816481987,\n", + " 5.7001637861238557,\n", + " 5.6957579176518154,\n", + " 5.6913679188637518,\n", + " 5.6869937325979798,\n", + " 5.6826353018987072,\n", + " 5.6782925700152918,\n", + " 5.6739654804015052,\n", + " 5.6696539767147964,\n", + " 5.6653580028155526,\n", + " 5.6610775027663793,\n", + " 5.6568124208313595,\n", + " 5.6525627014753335,\n", + " 5.6483282893631808,\n", + " 5.6441091293590917,\n", + " 5.6399051665258559,\n", + " 5.6357163461241351,\n", + " 5.6315426136117717,\n", + " 5.6273839146430547,\n", + " 5.6232401950680257,\n", + " 5.6191114009317777,\n", + " 5.6149974784737404,\n", + " 5.6108983741269842,\n", + " 5.6068140345175319,\n", + " 5.602744406463648,\n", + " 5.5986894369751594,\n", + " 5.5946490732527598,\n", + " 5.5906232626873233,\n", + " 5.5866119528592151,\n", + " 5.5826150915376234,\n", + " 5.5786326266798527,\n", + " 5.5746645064306781,\n", + " 5.5707106791216434,\n", + " 5.5667710932704031,\n", + " 5.5628456975800509,\n", + " 5.558934440938442,\n", + " 5.5550372724175441,\n", + " 5.5511541412727547,\n", + " 5.5472849969422562,\n", + " 5.5434297890463515,\n", + " 5.5395884673868077,\n", + " 5.5357609819462041,\n", + " 5.5319472828872751,\n", + " 5.5281473205522715,\n", + " 5.5243610454623058,\n", + " 5.5205884083167129,\n", + " 5.5168293599924025,\n", + " 5.5130838515432252,\n", + " 5.5093518341993333,\n", + " 5.5056332593665385,\n", + " 5.5019280786256992,\n", + " 5.4982362437320651,\n", + " 5.4945577066146658,\n", + " 5.490892419375677,\n", + " 5.4872403342898046,\n", + " 5.483601403803652,\n", + " 5.479975580535112,\n", + " 5.476362817272741,\n", + " 5.472763066975153,\n", + " 5.4691762827703982,\n", + " 5.465602417955358,\n", + " 5.462041425995138,\n", + " 5.4584932605224585,\n", + " 5.4549578753370467,\n", + " 5.451435224405051,\n", + " 5.4479252618584244,\n", + " 5.4444279419943333,\n", + " 5.4409432192745655,\n", + " 5.4374710483249329,\n", + " 5.4340113839346866,\n", + " 5.4305641810559191,\n", + " 5.4271293948029848,\n", + " 5.4237069804519171,\n", + " 5.4202968934398381,\n", + " 5.4168990893643816,\n", + " 5.4135135239831227,\n", + " 5.4101401532129882,\n", + " 5.4067789331296936,\n", + " 5.4034298199671653,\n", + " 5.4000927701169754,\n", + " 5.3967677401277676,\n", + " 5.3934546867046969,\n", + " 5.3901535667088618,\n", + " 5.3868643371567471,\n", + " 5.3835869552196609,\n", + " 5.3803213782231776,\n", + " 5.3770675636465821,\n", + " 5.3738254691223171,\n", + " 5.37059505243543,\n", + " 5.3673762715230238,\n", + " 5.364169084473712,\n", + " 5.3609734495270676,\n", + " 5.3577893250730844,\n", + " 5.3546166696516337,\n", + " 5.3514554419519165,\n", + " 5.3483056008119441,\n", + " 5.345167105217981,\n", + " 5.3420399143040287,\n", + " 5.3389239873512837,\n", + " 5.3358192837876031,\n", + " 5.3327257631869891,\n", + " 5.329643385269053,\n", + " 5.3265721098984988,\n", + " 5.3235118970845869,\n", + " 5.3204627069806296,\n", + " 5.3174244998834608,\n", + " 5.3143972362329235,\n", + " 5.3113808766113557,\n", + " 5.3083753817430726,\n", + " 5.3053807124938608,\n", + " 5.3023968298704647,\n", + " 5.2994236950200815,\n", + " 5.2964612692298516,\n", + " 5.2935095139263604,\n", + " 5.2905683906751291,\n", + " 5.2876378611801176,\n", + " 5.2847178872832314,\n", + " 5.2818084309638111,\n", + " 5.2789094543381534,\n", + " 5.2760209196590013,\n", + " 5.2731427893150702,\n", + " 5.2702750258305437,\n", + " 5.267417591864592,\n", + " 5.2645704502108854,\n", + " 5.2617335637971108,\n", + " 5.2589068956844836,\n", + " 5.2560904090672738,\n", + " 5.2532840672723218,\n", + " 5.250487833758565,\n", + " 5.2477016721165555,\n", + " 5.2449255460679938,\n", + " 5.2421594194652528,\n", + " 5.2394032562909016,\n", + " 5.2366570206572511,\n", + " 5.2339206768058695,\n", + " 5.2311941891071285,\n", + " 5.2284775220597366,\n", + " 5.2257706402902713,\n", + " 5.2230735085527291,\n", + " 5.2203860917280558,\n", + " 5.2177083548236967,\n", + " 5.2150402629731367,\n", + " 5.2123817814354494,\n", + " 5.2097328755948435,\n", + " 5.2070935109602079,\n", + " 5.2044636531646722,\n", + " 5.2018432679651498,\n", + " 5.1992323212418956,\n", + " 5.1966307789980615,\n", + " 5.1940386073592597,\n", + " 5.1914557725731072,\n", + " 5.1888822410088018,\n", + " 5.1863179791566756,\n", + " 5.1837629536277587,\n", + " 5.1812171311533488,\n", + " 5.1786804785845755,\n", + " 5.1761529628919671,\n", + " 5.1736345511650219,\n", + " 5.1711252106117822,\n", + " 5.168624908558404,\n", + " 5.1661336124487311,\n", + " 5.1636512898438749,\n", + " 5.1611779084217888,\n", + " 5.1587134359768489,\n", + " 5.1562578404194337,\n", + " 5.1538110897755045,\n", + " 5.1513731521861974,\n", + " 5.1489439959073957,\n", + " 5.1465235893093233,\n", + " 5.1441119008761387,\n", + " 5.1417088992055149,\n", + " 5.1393145530082336,\n", + " 5.1369288311077792,\n", + " 5.1345517024399312,\n", + " 5.1321831360523653,\n", + " 5.1298231011042379,\n", + " 5.1274715668657986,\n", + " 5.1251285027179803,\n", + " 5.1227938781520068,\n", + " 5.1204676627689922,\n", + " 5.1181498262795433,\n", + " 5.1158403385033679,\n", + " 5.1135391693688836,\n", + " 5.1112462889128247,\n", + " 5.1089616672798481,\n", + " 5.1066852747221496,\n", + " 5.1044170815990766,\n", + " 5.1021570583767355,\n", + " 5.0999051756276197,\n", + " 5.0976614040302106,\n", + " 5.0954257143686092,\n", + " 5.0931980775321497,\n", + " 5.09097846451502,\n", + " 5.0887668464158873,\n", + " 5.0865631944375176,\n", + " 5.0843674798864011,\n", + " 5.0821796741723864,\n", + " 5.079999748808298,\n", + " 5.0778276754095675,\n", + " 5.0756634256938717,\n", + " 5.0735069714807555,\n", + " 5.0713582846912679,\n", + " 5.0692173373475962,\n", + " 5.0670841015727053,\n", + " 5.0649585495899681,\n", + " 5.0628406537228097,\n", + " 5.0607303863943418,\n", + " 5.0586277201270109,\n", + " 5.0565326275422313,\n", + " 5.0544450813600363,\n", + " 5.0523650543987193,\n", + " 5.0502925195744792,\n", + " 5.0482274499010735,\n", + " 5.0461698184894566,\n", + " 5.0441195985474412,\n", + " 5.0420767633793417,\n", + " 5.0400412863856268,\n", + " 5.038013141062577,\n", + " 5.0359923010019392,\n", + " 5.0339787398905793,\n", + " 5.0319724315101411,\n", + " 5.0299733497367072,\n", + " 5.0279814685404549,\n", + " 5.025996761985323,\n", + " 5.0240192042286669,\n", + " 5.0220487695209268,\n", + " 5.0200854322052928,\n", + " 5.018129166717368,\n", + " 5.0161799475848339,\n", + " 5.0142377494271289,\n", + " 5.0123025469551052,\n", + " 5.0103743149707087,\n", + " 5.0084530283666435,\n", + " 5.0065386621260481,\n", + " 5.0046311913221766,\n", + " 5.00273059111806,\n", + " 5.0008368367661991,\n", + " 4.9989499036082261,\n", + " 4.9970697670745947,\n", + " 4.9951964026842566,\n", + " 4.9933297860443435,\n", + " 4.9914698928498451,\n", + " 4.9896166988833013,\n", + " 4.9877701800144782,\n", + " 4.9859303122000602,\n", + " 4.9840970714833324,\n", + " 4.9822704339938717,\n", + " 4.9804503759472336,\n", + " 4.978636873644648,\n", + " 4.9768299034726979,\n", + " 4.9750294419030316,\n", + " 4.9732354654920341,\n", + " 4.9714479508805409,\n", + " 4.9696668747935222,\n", + " 4.967892214039785,\n", + " 4.9661239455116677,\n", + " 4.9643620461847444,\n", + " 4.9626064931175193,\n", + " 4.9608572634511301,\n", + " 4.9591143344090529,\n", + " 4.9573776832968033,\n", + " 4.9556472875016393,\n", + " 4.9539231244922703,\n", + " 4.9522051718185605,\n", + " 4.9504934071112396,\n", + " 4.9487878080816099,\n", + " 4.9470883525212574,\n", + " 4.9453950183017596,\n", + " 4.9437077833743981,\n", + " 4.9420266257698762,\n", + " 4.9403515235980295,\n", + " 4.9386824550475357,\n", + " 4.9370193983856412,\n", + " 4.9353623319578688,\n", + " 4.9337112341877427,\n", + " 4.9320660835764993,\n", + " 4.9304268587028188,\n", + " 4.9287935382225347,\n", + " 4.9271661008683632,\n", + " 4.925544525449622,\n", + " 4.9239287908519627,\n", + " 4.9223188760370791,\n", + " 4.9207147600424523,\n", + " 4.9191164219810677,\n", + " 4.9175238410411399,\n", + " 4.9159369964858524,\n", + " 4.9143558676530761,\n", + " 4.9127804339551107,\n", + " 4.9112106748784097,\n", + " 4.9096465699833125,\n", + " 4.9080880989037841,\n", + " 4.9065352413471484,\n", + " 4.904987977093815,\n", + " 4.903446285997032,\n", + " 4.9019101479826102,\n", + " 4.9003795430486665,\n", + " 4.8988544512653656,\n", + " 4.897334852774657,\n", + " 4.8958207277900163,\n", + " 4.894312056596192,\n", + " 4.8928088195489439,\n", + " 4.8913109970747897,\n", + " 4.8898185696707479,\n", + " 4.8883315179040903,\n", + " 4.8868498224120795,\n", + " 4.8853734639017246,\n", + " 4.8839024231495243,\n", + " 4.8824366810012201,\n", + " 4.8809762183715479,\n", + " 4.8795210162439853,\n", + " 4.8780710556705085,\n", + " 4.8766263177713407,\n", + " 4.8751867837347129,\n", + " 4.8737524348166099,\n", + " 4.8723232523405349,\n", + " 4.8708992176972616,\n", + " 4.869480312344594,\n", + " 4.8680665178071223,\n", + " 4.8666578156759863,\n", + " 4.8652541876086328,\n", + " 4.863855615328573,\n", + " 4.8624620806251588,\n", + " 4.8610735653533252,\n", + " 4.8596900514333718,\n", + " 4.858311520850715,\n", + " 4.8569379556556642,\n", + " 4.8555693379631784,\n", + " 4.8542056499526396,\n", + " 4.8528468738676169,\n", + " 4.8514929920156389,\n", + " 4.8501439867679608,\n", + " 4.8487998405593355,\n", + " 4.8474605358877847,\n", + " 4.8461260553143699,\n", + " 4.8447963814629684,\n", + " 4.8434714970200456,\n", + " 4.8421513847344286,\n", + " 4.8408360274170814,\n", + " 4.8395254079408829,\n", + " 4.8382195092404041,\n", + " 4.8369183143116823,\n", + " 4.8356218062120035,\n", + " 4.8343299680596772,\n", + " 4.8330427830338261,\n", + " 4.8317602343741575,\n", + " 4.8304823053807446,\n", + " 4.8292089794138171,\n", + " 4.8279402398935405,\n", + " 4.8266760702997979,\n", + " 4.8254164541719788,\n", + " 4.8241613751087611,\n", + " 4.8229108167678989,\n", + " 4.8216647628660114,\n", + " 4.8204231971783704,\n", + " 4.819186103538688,\n", + " 4.8179534658389018,\n", + " 4.8167252680289776,\n", + " 4.8155014941166856,\n", + " 4.8142821281674033,\n", + " 4.8130671543039014,\n", + " 4.8118565567061413,\n", + " 4.8106503196110664,\n", + " 4.809448427312395,\n", + " 4.8082508641604242,\n", + " 4.8070576145618169,\n", + " 4.8058686629794032,\n", + " 4.8046839939319756,\n", + " 4.8035035919940903,\n", + " 4.8023274417958657,\n", + " 4.8011555280227798,\n", + " 4.7999878354154761,\n", + " 4.7988243487695552,\n", + " 4.7976650529353906,\n", + " 4.7965099328179184,\n", + " 4.795358973376449,\n", + " 4.7942121596244665,\n", + " 4.7930694766294364,\n", + " 4.7919309095126117,\n", + " 4.790796443448837,\n", + " 4.7896660636663553,\n", + " 4.7885397554466147,\n", + " 4.7874175041240843,\n", + " 4.7862992950860539,\n", + " 4.7851851137724477,\n", + " 4.7840749456756351,\n", + " 4.7829687763402395,\n", + " 4.7818665913629541,\n", + " 4.7807683763923503,\n", + " 4.7796741171286952,\n", + " 4.7785837993237585,\n", + " 4.7774974087806346,\n", + " 4.7764149313535507,\n", + " 4.7753363529476918,\n", + " 4.7742616595190066,\n", + " 4.773190837074031,\n", + " 4.7721238716697076,\n", + " 4.7710607494131958,\n", + " 4.770001456461701,\n", + " 4.7689459790222868,\n", + " 4.7678943033516976,\n", + " 4.7668464157561825,\n", + " 4.7658023025913154,\n", + " 4.7647619502618133,\n", + " 4.7637253452213626,\n", + " 4.7626924739724474,\n", + " 4.7616633230661636,\n", + " 4.7606378791020525,\n", + " 4.7596161287279255,\n", + " 4.7585980586396799,\n", + " 4.7575836555811408,\n", + " 4.7565729063438775,\n", + " 4.755565797767038,\n", + " 4.7545623167371724,\n", + " 4.7535624501880669,\n", + " 4.7525661851005694,\n", + " 4.7515735085024247,\n", + " 4.7505844074680983,\n", + " 4.7495988691186195,\n", + " 4.7486168806214,\n", + " 4.7476384291900784,\n", + " 4.7466635020843446,\n", + " 4.745692086609786,\n", + " 4.7447241701177063,\n", + " 4.7437597400049727,\n", + " 4.7427987837138508,\n", + " 4.7418412887318322,\n", + " 4.7408872425914828,\n", + " 4.7399366328702737,\n", + " 4.7389894471904226,\n", + " 4.7380456732187284,\n", + " 4.7371052986664157,\n", + " 4.7361683112889716,\n", + " 4.7352346988859892,\n", + " 4.7343044493010051,\n", + " 4.7333775504213413,\n", + " 4.7324539901779517,\n", + " 4.7315337565452618,\n", + " 4.7306168375410103,\n", + " 4.7297032212260985,\n", + " 4.7287928957044265,\n", + " 4.7278858491227513,\n", + " 4.7269820696705187,\n", + " 4.7260815455797172,\n", + " 4.7251842651247218,\n", + " 4.7242902166221432,\n", + " 4.7233993884306775,\n", + " 4.7225117689509464,\n", + " 4.7216273466253593,\n", + " 4.7207461099379495,\n", + " 4.7198680474142325,\n", + " 4.7189931476210534,\n", + " 4.7181213991664395,\n", + " 4.7172527906994519,\n", + " 4.7163873109100365,\n", + " 4.7155249485288744,\n", + " 4.7146656923272445,\n", + " 4.7138095311168664]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost_data\n", + "# 看下代价数据" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4.7138095311168664" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 计算最终的代价\n", + "lr_cost(final_theta, X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# visualize cost data(代价数据可视化)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = sns.tsplot(cost_data, time=np.arange(epoch+1))\n", + "ax.set_xlabel('epoch')\n", + "ax.set_ylabel('cost')\n", + "plt.show()\n", + "#可以看到从第二轮代价数据变换很大,接下来平稳了" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nS0uDUqmEr68v3nrrLTRs2FDveFM/666u+rmePn0aL7zwApo1awYAGDlyJAYOHKg71p3e15deegnX\nrl0DABQUFKBz585YvHix3vFyfF/v3LmDWbNmoaCgACqVChMnTkTLli3d8vdV7FwjIiIc//squLDb\nt28LCQkJom0qlUp49NFHhZs3bwqVlZXCU089JVy9elXiHjpGamqqsGHDBr3HXnnlFeHEiRNO6pF9\nrF69Whg8eLAwbNgwQRAE4YUXXhAOHDggCIIgJCcnC5mZmXrHf/fdd8KMGTMEQRCE3377TfjXv/4l\nbYdtUPNcn332WeH06dOCIAjCZ599JqSnp+sdb+pn3dXVPNeNGzcKH3zwgdHj3el91bp586bwxBNP\nCEVFRXqPy/V93bx5szB//nxBEAThxo0bQp8+fdz291XsXKX4fXXpaeezZ8+ioqICiYmJGDt2LI4e\nPapru3DhAqKjoxEcHAxfX1/Exsbi8OHDTuytfZw4cQJ//PEHnnnmGb3HT506hdWrV2PkyJFYtWqV\nk3pnm+joaCxdulT39alTp9CjRw8AQO/evbFv3z6947OysvDQQw8BALp06YKTJ09K11kb1TzXRYsW\noV27dgCAqqoq+Pn56R1v6mfd1dU815MnT+Knn37Cs88+i1mzZqG0tFTveHd6X7WWLl2K0aNHo1Gj\nRnqPy/V9jY+Px9SpUwEAgiBAqVS67e+r2LlK8fvq0uHr7++P8ePH44MPPsDcuXMxbdo0qNVqAEBp\naSnq1aunO7Zu3boGv+RytGrVKkyaNMng8UGDBiE1NRUfffQRsrKysHv3bif0zjYDBgyAt/e9Kx2C\nIEChUAC4+/7dunVL7/jS0lLdtA4AKJVK3fvv6mqeq/aP8n//+1+sX78e48aN0zve1M+6q6t5rp06\ndcL06dPxySefICoqCsuWLdM73p3eVwD466+/sH//fjz11FMGx8v1fa1bty4CAwNRWlqKKVOmICkp\nyW1/X8XOVYrfV5cO35iYGDzxxBNQKBSIiYlBSEgIrl69CgAIDAxEWVmZ7tiysjK9MJajkpISZGdn\no1evXnqPC4KAf/zjH6hfvz58fX3Rp08fnD592km9tJ/q14vKysp017e1ar7HGo3G4A+fnHzzzTdI\nSUnB6tWrddfutUz9rMtN//790bFjR93/1/xZdbf39dtvv8XgwYOhVCoN2uT8vhYWFmLs2LFISEjA\n448/7ta/rzXPFXD876tLh+/mzZuxYMECAEBRURFKS0tx3333AQBatGiBS5cu4ebNm1CpVDhy5Age\neOABZ3bXZocPH8aDDz5o8HhpaSkGDx6MsrIyCIKAgwcP6v64yVn79u1x8OBBAMCePXvQrVs3vfau\nXbtiz549AICjR4+idevWkvfRXrZt24b169dj3bp1iIqKMmg39bMuN+PHj8fx48cBAPv370eHDh30\n2t3pfQXunmPv3r1F2+T6vl67dg2JiYl49dVXMXToUADu+/sqdq5S/L669MeSoUOH4rXXXsPIkSOh\nUCiQnp6OnTt3ory8HM888wxmzpyJ8ePHQxAEPP300wgLC3N2l22SnZ2NyMhI3ddfffWV7lxfeukl\njB07Fr6+vnjwwQfRp08fJ/bUPmbMmIHk5GQsWrQIzZs3x4ABAwAA06dPR1JSEvr374+9e/dixIgR\nEAQB6enpTu6xdaqqqvDGG28gPDwckydPBgB0794dU6ZM0Z2r2M+6XEYNNaWmpiItLQ0+Pj5o2LAh\n0tLSALjf+6qVnZ1t8Ada7u/rypUrUVJSguXLl2P58uUAgNdffx3z5893u9/XmudaVVWF8+fPIyIi\nwqG/r9xYgYiISGIuPe1MRETkjhi+REREEmP4EhERSYzhS0REJDGGLxERkcQYvkRERBJj+BIREUmM\n4UtERCSx/wPoZQvAj9MoxgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "b = final_theta[0] # intercept,Y轴上的截距\n", + "m = final_theta[1] # slope,斜率\n", + "\n", + "plt.scatter(data.population, data.profit, label=\"Training data\")\n", + "plt.plot(data.population, data.population*m + b, label=\"Prediction\")\n", + "plt.legend(loc=2)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3- 选修章节" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
squarebedroomsprice
021043399900
116003329900
224003369000
314162232000
430004539900
\n", + "
" + ], + "text/plain": [ + " square bedrooms price\n", + "0 2104 3 399900\n", + "1 1600 3 329900\n", + "2 2400 3 369000\n", + "3 1416 2 232000\n", + "4 3000 4 539900" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "raw_data = pd.read_csv('ex1data2.txt', names=['square', 'bedrooms', 'price'])\n", + "raw_data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# 标准化数据\n", + "最简单的方法是令:\n", + "\n", + " \n", + "\n", + "其中 是平均值,sn 是标准差。\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def normalize_feature(df):\n", + "# \"\"\"Applies function along input axis(default 0) of DataFrame.\"\"\"\n", + " return df.apply(lambda column: (column - column.mean()) / column.std())" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
squarebedroomsprice
00.130010-0.2236750.475747
1-0.504190-0.223675-0.084074
20.502476-0.2236750.228626
3-0.735723-1.537767-0.867025
41.2574761.0904171.595389
\n", + "
" + ], + "text/plain": [ + " square bedrooms price\n", + "0 0.130010 -0.223675 0.475747\n", + "1 -0.504190 -0.223675 -0.084074\n", + "2 0.502476 -0.223675 0.228626\n", + "3 -0.735723 -1.537767 -0.867025\n", + "4 1.257476 1.090417 1.595389" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = normalize_feature(raw_data)\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. multi-var batch gradient decent(多变量批量梯度下降)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(47, 3) \n", + "(47,) \n" + ] + } + ], + "source": [ + "X = get_X(data)\n", + "print(X.shape, type(X))\n", + "\n", + "y = get_y(data)\n", + "print(y.shape, type(y))#看下数据的维度和类型" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "alpha = 0.01#学习率\n", + "theta = np.zeros(X.shape[1])#X.shape[1]:特征数n\n", + "epoch = 500#轮数" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "final_theta, cost_data = batch_gradient_decent(theta, X, y, epoch, alpha=alpha)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nauz23882GYaBxWIBICQkhMOHD+N2uwkNDfVuExISgtvtrvFa66KQkBCcTidut5t7772X++67T2Ps\nI3a7nYcffpinnnqK/v37a5yr2fvvv0+jRo28f5iB/r2obkFBQdx+++289tprPPnkkzz44IPVNsb1\nMhQ4nU5yc3O9yx6Pp9wXmpw5q/X3/3Ryc3MJCws7btxzc3PL/QcpFfv1118ZOXIkN9xwA/3799cY\n+9CMGTNYvnw5jz/+OIWFhd71Guczt2jRIlavXs2IESPYsGEDDz/8MDk5Od52jfGZa9OmDddffz0W\ni4U2bdoQERHBvn37vO1nMsb1MhTEx8eTmpoKQFpaGrGxsSZXVP+cd955fPvttwCkpqaSkJDA+eef\nj8vlorCwkMOHD/PLL79o7E/R3r17GTVqFH/7298YNGgQoDH2hQ8++ICXXnoJgODgYCwWC506ddI4\nV6N///vfvP322yQnJ9OhQwdmzJhB9+7dNcbVaOHChUyfPh2ArKws3G43l112WbWMcb387YOjVx9s\n2rQJwzCYOnUqMTExZpdV5+3atYsHHniA9957j61bt/L4449z5MgR2rZty5QpU7DZbLz33nukpKRg\nGAZjx47l6quvNrvsOmHKlCksXbqUtm3betc9+uijTJkyRWNcjfLy8pgwYQJ79+6luLiY0aNHExMT\no/+WfWTEiBFMmjQJq9WqMa5GRUVFTJgwgczMTCwWCw8++CANGzasljGul6FAREREqq5enj4QERGR\nqlMoEBEREUChQERERMooFIiIiAigUCAiIiJlFApEpNbp2bMnI0aMMLsMEb+jUCAiIiKAQoGIiIiU\nUSgQERERQKFAxO99//333HbbbXTt2pWuXbsyatQofvjhB297z549efTRR1mwYAFXXXUVcXFxDBky\nhG+++ea4fX333Xf86U9/8u5r5MiRrFmz5rjt1q1bx+jRo0lISOCiiy5izJgxZGRkHLfdhx9+yHXX\nXUenTp24+uqreffdd6v3w4tIObrNsYgfW7VqFWPHjqV9+/b069ePoqIi3n//fXbv3s0bb7xBQkIC\nPXv2xDAM9u7dy4gRI4iMjOTdd98lMzOT119/3fsb7p999hn33HMPrVq14qabbgJgwYIFZGZm8sIL\nL3DVVVcBvweHJk2acPPNNxMUFMS8efPIzc1l0aJFtGjRgp49e5KTk0NgYCDDhw+nUaNGzJ8/n02b\nNjF79mx69epl2piJ1GcKBSJ+yuPx0KdPHyIjI3n77bex2WxA6Y8G3XjjjTRo0IAPPviAnj17snv3\n7nJfxjk5OVx99dW0bduWlJQUiouLueqqq7BYLHz00Uc4nU4ADh06RL9+/YDS0BAQEMDgwYP59ddf\nWbx4MQ0bNgRg69at9O3bl9tuu42HHnqInj17kpmZyaJFi+jYsSMAu3fv5qqrruL666/nmWeeqenh\nEvELOn0g4qd++ukndu7cSa9evTh48CA5OTnk5ORQUFDAlVdeyYYNG8jKygKgbdu25f46b9SoETfc\ncAPr1q1j3759/PTTT/z2228MGzbMGwgAwsLCGD58OFlZWaSnp7Nv3z5++OEH+vfv7w0EUPr78IsW\nLWL06NHeda1bt/YGAoDmzZvTqFEj9u7d68thEfFrdrMLEBFz7NixA4BnnnnmpH95Z2ZmAnDOOecc\n1xYdHY1hGOzevZtdu3YBpV/uf3T056AzMzO9RyOio6OP2+68884rt9y4cePjtgkKCuLIkSMn/Uwi\ncmYUCkT8lMfjAeCvf/0rcXFxJ9zm6Bd6QEDAcW0lJSUA2Gw2KjoLebQtICDA+54Wi6XS+qxWHcgU\nqWkKBSJ+qnnz5gA0aNCASy+9tFzbDz/8wMGDBwkKCgJ+P6pwrO3bt2Oz2WjRooX3r/ctW7Yct93W\nrVsBaNasGU2bNj3p/p599lnCw8MZM2bMGXwqETkTiuIifqpTp05ERkaSnJxMbm6ud73b7ea+++5j\nwoQJ3sP969evJy0tzbvN3r17+fDDD7n44osJDw+nY8eO3qsS3G53uX298847REZG0qlTJ5o2bUr7\n9u1ZsmRJue127tzJvHnzNF9AxGQ6UiDipwICAnjssce4//77GThwIIMGDSIwMNB7GeFzzz2H3V76\nT4TD4WD06NHceuutBAUF8c477+DxeHjooYeO29dNN93EoEGDAFi4cCF79uzhhRde8J4OmDBhAn/+\n85+56aabGDx4MFarlbfffpuwsLByEw1FpOYpFIj4sWuuuYbw8HDmzp3LnDlzsFqttGvXjrlz53Ll\nlVd6t4uLi+O6665jzpw5HD58mISEBMaNG0f79u2P29ecOXOYPXs2drudLl268PTTT5OQkODd7uKL\nL+att97ihRdeYPbs2QQGBnLBBRfwt7/9jcjIyBr9/CJSnu5TICIV6tmzJ82bNyc5OdnsUkTExzSn\nQERERACFAhERESmjUCAiIiKA5hSIiIhIGR0pEBEREUChQERERMooFIiIiAigUCAiIiJlFApEREQE\nUCgQERGRMv8PrJcV17eQ2PMAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.tsplot(time=np.arange(len(cost_data)), data = cost_data)\n", + "plt.xlabel('epoch', fontsize=18)\n", + "plt.ylabel('cost', fontsize=18)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ -1.20848957e-16, 8.30383883e-01, 8.23982853e-04])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_theta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3. learning rate(学习率)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1.00000000e-05 3.00000000e-05 2.15443469e-04 6.46330407e-04\n", + " 4.64158883e-03 1.39247665e-02 1.00000000e-01 3.00000000e-01]\n" + ] + } + ], + "source": [ + "base = np.logspace(-1, -5, num=4)\n", + "candidate = np.sort(np.concatenate((base, base*3)))\n", + "print(candidate)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nYwXYfhhtHH/2OZzXzzIWjnE4Q1vTtgDO+BmNYxv7z7Z+Wt9pY+C0fq79Xkqb82fjjP2nbnsp/Wcb\nd7FjL2Q7ACg4uB97pIXn2f7czvv5/6K+CyX2X9wvxzH86xpa+VUH+4r24ZDyIl4HLwCQ26czkNkn\n1UXU0OyrEgCpfWo5VqsFZgtgsVhgccytMFussJitsFitsFissFhsYZCl2XTqusVihcVq24+52f6s\nVpwypmmfjWOtVjjarc3GmC1WWC2w79dq31ezmq2A1WKF1dp8v7afOxr7LY39jv0612Xb1r6N2QoL\nrE37tNjqcmxvscIK22daLFYYrFbA2jgGjtqtVmvT/pvV1LhPKxqPE2iQJbTo/3Mid8eQhogIth/k\nbVe0KKFV+7T455vMJhjMBhibzY0WIwwmI4wWo3O72QiD2dg0b9ZvtlhgspjskxkmswnGxnWzva15\nv8UEk7mxzQizxQKzxQyz1Wxbtppt6xYzzFaLY9nkGOPcZ7FaYLZa7D942ra3WC228RaD7YdYq+2v\npU3LZvuyFSaLCTgKRx+RaDaKXQCR3TqxC6DLrvFi1FZyN/QxbT6A58Qug8htMKQhInIBMqkMMim/\nJGdmZjpdUu34q561KdSxwur4i+VpbdbGv3ZaHNtZYT1luam/cTvnZTi2ccybLzvmOGM7gNO2cxzL\nKds4jW3e1qzPeb3Zf5fT+s69fsYxTn047/jmbWf6rFPHntp3Yf04o1O3O9O25xp7Ids1OnjwICIi\nIi55+3/7+efb/kKc7zOutMtwCP++BpH/G1wOhYWFCA8PF+3zL8e5SK2fttZT7BKI3Ap/IyAiIpfV\neFuQBHwGDrWcTHkmn79ALuHU4JpIDJmZmWKXQORW+FMvEREREREREZELYEhDREREREREROQCGNIQ\nEREREREREbkAhjRERERERERERC6AIQ0RERERERERkQtgSENERERERERE5AIY0hARERERERERuQCG\nNERERERERERELoAhDRERERERERGRC2BIQ0RERERERETkAhjSEBERERERERG5AIY0REREREREREQu\ngCENEREREREREZELYEhDREREREREROQCGNIQEREREREREbkAhjRERERERERERC6AIQ0RERERERER\nkQtgSENERERERERE5AIY0hARERERERERuQCGNERERERERERELkCwWq1WsYu4kjIzM8UugYiIiIiI\niK6gTp06iV0C0WXR5kMaIiIiIiIiIqLWgLc7EREREREREVLuLYIAAAnXSURBVBG5AIY0RERERERE\nREQugCENEREREREREZELYEhDREREREREROQCGNIQEREREREREbkAmdgFuCuLxYLJkycjPz8fCoUC\nU6ZMQWRkpNhlkRvJzs7Gu+++i+nTp+PgwYN45plnIAgC4uPj8fLLL0MiYYZLV5bRaMRzzz2H4uJi\nGAwGPPDAA4iLi+O5SC3KbDbjhRdeQEFBAQRBwCuvvAKlUsnzkERRVVWFoUOH4rvvvoNMJuN5SKK4\n9dZbodFoAABhYWG4//77eS4StSD+6xLJ8uXLYTAYMHv2bDz++ON46623xC6J3Mg333yDF154AQ0N\nDQCAN998ExMnTsTMmTNhtVqxYsUKkSskd7Bw4UJotVrMnDkT3377LV577TWei9TiVq5cCQCYNWsW\nJk6ciA8++IDnIYnCaDTipZdegkqlAsDvzSSOhoYGWK1WTJ8+HdOnT8ebb77Jc5GohTGkEUlmZiZ6\n9eoFAEhPT8fOnTtFrojcSUREBD755BPHem5uLq666ioAQO/evbF+/XqxSiM3MnDgQDz66KMAAKvV\nCqlUynORWtx1112H1157DQBQUlICb29vnockirfffhsjRoxAUFAQAH5vJnHk5eWhrq4O48aNw+jR\no5GVlcVzkaiFMaQRSXV1teMyQgCQSqUwmUwiVkTu5Prrr4dM1nS3o9VqhSAIAABPT0+cPHlSrNLI\njXh6ekKj0aC6uhqPPPIIJk6cyHORRCGTyfD000/jtddew80338zzkFrcvHnz4Ofn5/gDHsDvzSQO\nlUqFe+65B1OnTsUrr7yCJ554guciUQtjSCMSjUaDmpoax7rFYnH6pZmoJTW/r7impgbe3t4iVkPu\npLS0FKNHj8bgwYNx880381wk0bz99ttYunQpXnzxRcetoADPQ2oZc+fOxfr16zFq1Cjs2rULTz/9\nNI4cOeLo53lILSU6Ohq33HILBEFAdHQ0tFotqqqqHP08F4muPIY0IunYsSNWr14NAMjKykJCQoLI\nFZE7a9++PTZt2gQAWL16NTp37ixyReQOKisrMW7cODz55JMYNmwYAJ6L1PIWLFiAr776CgCgVqsh\nCAJSUlJ4HlKLmjFjBn766SdMnz4dSUlJePvtt9G7d2+eh9Tifv31V8ezMsvLy1FdXY0ePXrwXCRq\n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\nE7bDgwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "epoch=50\n", + "\n", + "fig, ax = plt.subplots(figsize=(16, 9))\n", + "\n", + "for alpha in candidate:\n", + " _, cost_data = batch_gradient_decent(theta, X, y, epoch, alpha=alpha)\n", + " ax.plot(np.arange(epoch+1), cost_data, label=alpha)\n", + "\n", + "ax.set_xlabel('epoch', fontsize=18)\n", + "ax.set_ylabel('cost', fontsize=18)\n", + "ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\n", + "ax.set_title('learning rate', fontsize=18)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. normal equation(正规方程)\n", + "正规方程是通过求解下面的方程来找出使得代价函数最小的参数的:$\\frac{\\partial }{\\partial {{\\theta }_{j}}}J\\left( {{\\theta }_{j}} \\right)=0$ 。\n", + " 假设我们的训练集特征矩阵为 X(包含了${{x}_{0}}=1$)并且我们的训练集结果为向量 y,则利用正规方程解出向量 $\\theta ={{\\left( {{X}^{T}}X \\right)}^{-1}}{{X}^{T}}y$ 。\n", + "上标T代表矩阵转置,上标-1 代表矩阵的逆。设矩阵$A={{X}^{T}}X$,则:${{\\left( {{X}^{T}}X \\right)}^{-1}}={{A}^{-1}}$\n", + "\n", + "梯度下降与正规方程的比较:\n", + "\n", + "梯度下降:需要选择学习率α,需要多次迭代,当特征数量n大时也能较好适用,适用于各种类型的模型\t\n", + "\n", + "正规方程:不需要选择学习率α,一次计算得出,需要计算${{\\left( {{X}^{T}}X \\right)}^{-1}}$,如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为O(n3),通常来说当n小于10000 时还是可以接受的,只适用于线性模型,不适合逻辑回归模型等其他模型\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# 正规方程\n", + "def normalEqn(X, y):\n", + " theta = np.linalg.inv(X.T@X)@X.T@y#X.T@X等价于X.T.dot(X)\n", + " return theta" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ -1.14491749e-16, 8.84765988e-01, -5.31788197e-02])" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_theta2=normalEqn(X, y)#感觉和批量梯度下降的theta的值有点差距\n", + "final_theta2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# run the tensorflow graph over several optimizer" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(47, 3) \n", + "(47, 1) \n" + ] + } + ], + "source": [ + "X_data = get_X(data)\n", + "print(X_data.shape, type(X_data))\n", + "\n", + "y_data = get_y(data).reshape(len(X_data), 1) # special treatment for tensorflow input data\n", + "print(y_data.shape, type(y_data))" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "epoch = 2000\n", + "alpha = 0.01" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "optimizer_dict={'GD': tf.train.GradientDescentOptimizer,\n", + " 'Adagrad': tf.train.AdagradOptimizer,\n", + " 'Adam': tf.train.AdamOptimizer,\n", + " 'Ftrl': tf.train.FtrlOptimizer,\n", + " 'RMS': tf.train.RMSPropOptimizer\n", + " }\n", + "results = []\n", + "for name in optimizer_dict:\n", + " res = linear_regression(X_data, y_data, alpha, epoch, optimizer=optimizer_dict[name])\n", + " res['name'] = name\n", + " results.append(res)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 画图" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABDIAAAIxCAYAAAC/7Zi0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8VPW9//H3zJzZsgFhUSuyBYMVCZsUULkoAqUUFwIY\nFIJWr4J1uS6gotUiKqKIy0WN1muhF3sREVBcQBBR/KFgjcYCFVAEFFQIJiFMttnO748xI2nYAknO\nCXk9H48+Mmf/TL780bz9fL/HYZqmKQAAAAAAgAbAaXUBAAAAAAAAR4sgAwAAAAAANBgEGQAAAAAA\noMEgyAAAAAAAAA0GQQYAAAAAAGgwCDIAAAAAAECDQZABADhhDBgwQNnZ2fHt7OxsDRgwoMo5c+bM\n0XnnnaeMjAw99thjh9xnN4FAQAUFBfX+3GAwqN27d8e3Fy1apE6dOmndunXHfe/avBcAAGg8CDIA\nACesCRMm6O67745vb968WQ8//LBOPfVU3Xvvvfrtb3970H12s2HDBv3ud7/TV199Va/P3bVrly66\n6CKtWbMmvq9Xr1569NFHlZaWdtz3r817AQCAxsOwugAAAOrKueeeW2V7y5YtkqTx48fHOzXeeOON\navvsZsuWLdqzZ0+9P3fnzp3avn17lX2nnXaaTjvttFq5f23eCwAANB50ZAAAGo1QKCRJSkxMPOw+\nAAAA2BdBBgCgQXr77bd1ySWXKCMjQ8OGDdPKlSurnXPgGhnZ2dmaPHmyJGncuHHq1KnTQfdV+vrr\nr3XDDTfo7LPPVteuXTV69Gh9+OGH1e5/zTXX6IknnlD37t3Vt29fbd68ucbXr169WpmZmerSpYv6\n9++vWbNmKRqNSpJmzZpVpcYjdY3s2rVLkyZNUp8+fdSlSxddfPHFeuWVV6qcc9ddd2nQoEH6/PPP\nlZmZqYyMDA0ZMkTz5s2Ln7No0SKNGzdOkjR58uT47+bf17Wo3N60aZNuvvlmde/eXX369NEjjzyi\nSCSixYsX67e//a26deum0aNHa9OmTVWeceC9srOz1alTp4P+78DvXVFRoSeeeEIDBgzQWWedpQsv\nvFBPPfWUgsFgtXu/8847GjBggLp27apZs2Yd9ncHAAAaBqaWAAAanEWLFmny5Mnq3r27Jk2apB07\nduiWW26Rw+HQqaeeetBrJkyYoPbt22v+/PmaMGGCOnTooBYtWlTbJ8XW0rjiiivUokULjR8/Xm63\nW2+++aauu+46zZw5U0OHDo3f97PPPtN3332nSZMmaefOnerYsWONrt+yZYtuueUWZWVlKSsrS2++\n+aaefvpppaamasyYMRo0aJDy8/PjNXbp0uWQv5fvvvtOl112mSoqKjR27Fi1bNlSy5cv17333qvt\n27frjjvuiJ9bVFSk//zP/1T//v2VmZmp5cuXa8qUKSouLtb48ePVq1cvTZgwQc8995yysrLUs2fP\nw47Jddddp549e+quu+7S8uXL9de//lVbtmzR5s2bdeWVV8o0TeXk5Ojmm2/W22+/LcOo/n9BJkyY\noJEjR1bZ9/HHH2vx4sW64IILJEmRSETjx4/XZ599pssuu0xpaWnasGGDnnvuOX355ZfKycmRw+GI\nX3/PPfdo7NixSkpKUrdu3Q77HQAAQANhAgDQgITDYbNv377miBEjzGAwGN+/cOFCMz093Rw7dmx8\n39ixY80LLrig2jlr16497L6xY8eaAwcONEtKSuL7QqGQecUVV5jnnHOOWVFRET8vPT3dzMvLq1Jj\nTa9fuXJl/Lzy8nKzV69eZlZW1mFrPJhbbrnFPOOMM8wNGzbE90UiEXP8+PFmp06dzC1btpimaZp3\n3nmnmZ6ebj744INVfq9jxowxMzIyzKKiItM0TXPt2rVmenq6uXDhwkPWUrl90003xc8pLi42O3fu\nbJ5xxhnxZ5qmaT7++ONmenq6uW3btqP6Xtu2bTPPPvtsMysrKz7WldesXr26yrkvv/yymZ6ebq5Y\nsaLKeffdd99hf2cAAKDhYWoJAKBB2bhxo3766SdlZmbK7XbH919yySVq0qTJcd+/sLBQn3zyifr3\n76/y8nIVFBSooKBAxcXFGjRokPbu3av169fHz/f5fFW6JGp6vd/v1/nnnx/f9nq9at++vfbu3Vuj\nuiORiN5//32dd9556ty5c3y/0+nUhAkTZJqm3nvvvSrXjB8/Pv7Z5XJp3LhxKi8v10cffVSjZ0vS\nwIED45+Tk5OVmpqqdu3a6fTTT4/vb926tSQpPz//iPcLBAL64x//KI/Ho6eeeio+1suXL1dqaqo6\nd+4c/90WFBSof//+crlcev/996vcp1evXjX+LgAAwN6YWgIAaFB27dolSWrTpk2V/S6XS23btj3u\n+3/33XeSpLlz52ru3LkHPeeHH36If27atKmczl/+u8DxXi9JHo8nvkbG0SosLFRpaanat29f7Vjl\n600rf3eVz23RokWV8yp/fweed7T+/V6GYah58+ZV9rlcLkk64nczTVMTJ07Ujh07NGfOHJ100knx\nY99++60KCgrUt2/fg1574O9WUrUaAABAw0eQAQBoUCrXPygvL692rKZ//B9MJBKRJI0ZM6ZKl8GB\nOnbsGP9c+cf5sV7/7yHGsTJN85DHKn8vHo8nvu/AbpZ/P+/fv9PRONg1B65VURNPPvmkVq1apcmT\nJ1frqIhEImrXrp3+/Oc/H/TalJSUKtu19fsFAAD2QZABAGhQTjvtNEnSjh07quw3TVO7du2qMpXh\nWFQuFupyuXTOOedUOfb1119r586d8vv9dXb9sUpNTVVCQoK++eabase2bdsmSTr55JPj+/bu3auS\nkpIqr53dvn27JNVKZ8uxWrZsmZ577jkNHTpUV111VbXjrVu31oYNG9SnT58qIUUoFNKKFSuqfEcA\nAHBi4j9TAAAalDPPPFOnnnqq5s2bp7Kysvj+t956S4WFhcd9/1atWumss87S4sWLtXv37vj+UCik\nu+++WzfffLPC4XCdXX8wlX+wH67jxOVyqV+/flqzZo02btwY32+apl544QU5HI4qa3GYpqm///3v\n8e1wOKy//e1vSk5Ojk/bONqpILVl06ZNmjx5stLT0/XQQw8d9JwBAwaoqKioyqtiJenll1/Wrbfe\nqo8//rg+SgUAABaiIwMA0KA4HA7de++9uuGGG5SVlaURI0Zo9+7d+vvf/66mTZvWyjP+9Kc/6cor\nr9SIESN0+eWXq2nTpnrrrbf0xRdf6Pbbb1ezZs3q9Pp/l5qaKkmaN2+e9u7dq4suuuig502cOFHr\n1q1Tdna2srOz1bJlS61YsUJr167VH/7whypTWiTp2WefjXexLF26VJ9//rkeeuiheMdIZZ1LliyR\naZoaPnx4jequidLSUt1www2qqKjQZZddplWrVlULfAYNGqRRo0Zp8eLFeuCBB7Rx40ZlZGRoy5Yt\nmj9/vjp37qzMzMw6qxEAANgDQQYAoMG54IIL9Pzzz2vWrFl6/PHHddJJJ+mhhx6q0mFwPLp37655\n8+Zp1qxZmj17tsLhsNq3b6/p06cf1R/zx3v9v+vbt69+97vfadWqVVq7dq0GDx4sr9db7bw2bdro\nlVde0ZNPPqmXX35Z5eXlSktL00MPPaSRI0dWO//FF1/UlClTtHjxYnXs2FFPP/20Bg0aFD+elpam\n7OxsLVq0SOvXr1fv3r1rXPvRKigo0M6dOyVJDz744EHPWblypVq3bq05c+bomWee0TvvvKMlS5ao\nVatWuvzyy3XDDTfUybQdAABgLw7zcKuDAQCAE85dd92lxYsXa/PmzVaXAgAAUGOskQEAAAAAABoM\nggwAAAAAANBgEGQAAAAAAIAGgzUyAAAAAABAg0FHBgAAAAAAaDBO+Nev5ubmWl0CAAAAAKAO9ezZ\n0+oSUI9O+CBDsvc/6tzcXFvX11gxLvbDmNgT42I/jIk9MS72w5jYE+NiPw1hTPiP140PU0sAAAAA\nAECDQZABAAAAAAAajEYxtQQAAAAAAPziu+++04wZM/Tjjz/K5/PJ5/Np0qRJWrZsmd588021atVK\nkUhEPp9PEydO1Jlnnml1yXEEGQAAAAAANCJlZWW6/vrr9cADD6h79+6SpH/+85+aOnWqfvOb3+iq\nq67S5ZdfLknaunWrbrjhBr3++uvyer1Wlh1nWZARjUY1ZcoUbd68WR6PRw8++KDatm0bPz5nzhwt\nWLBAqampkqT7779f7dq1O+w1AAAAAAA0FJMeXK4Fb22s1XuO+n1nzfjT4MOes2rVKvXp0yceYkhS\nRkaG/vd//1dPP/10lXPT0tLUuXNn5ebm6pxzzqnVWo+VZUHGu+++q2AwqPnz5ysvL0/Tp09XTk5O\n/PiGDRv0yCOP6KyzzorvW758+WGvAQAAAAAAh7dz5061adMmvn399dcrEAhoz549Ovvss9WiRYsq\n5zdv3lyFhYX1XeYhWRZk5Obmql+/fpKkbt26acOGDVWOb9y4UX/5y1+Un5+v888/X+PHjz/iNQAA\nAAAANBQz/jT4iN0TdeHkk0+u8vd0ZYPAZZddpkgkUu3877//XoMH13+dh2JZkBEIBJSUlBTfdrlc\nCofDMoxYSb///e91xRVXKCkpSTfeeKNWrVp1xGsOxe7vFbZ7fY0V42I/jIk9MS72w5jYE+NiP4yJ\nPTEu9sOYnHguvPBCvfDCC8rLy1O3bt0kSTt27NCPP/6otLS0Kud+9dVX+vrrr+Pn2YFlQUZSUpJK\nSkri29FoNB5ImKapK6+8UsnJyZKk/v3761//+tdhrzmcnj171nL1tSc3N9fW9TVWjIv9MCb2xLjY\nD2NiT4yL/TAm9sS42E9DGBOClppLTExUTk6OZs6cqccee0zhcFgul0uTJ0/W119/rTlz5ujtt9+W\n0+mUYRj67//+76P627u+WFZJjx49tGrVKg0dOlR5eXlKT0+PHwsEAho2bJjefvttJSQkaN26dRox\nYoTKy8sPeQ0AAAAAADg6rVu31hNPPHHQYzfddFM9V1MzlgUZgwYN0po1azR69GiZpqlp06bpjTfe\nUGlpqbKysnTrrbdq3Lhx8ng86tu3r/r3769oNFrtGgAAAAAA0HhYFmQ4nU5NnTq1yr4D5+Jceuml\nuvTSS494DQAAAAAAaDycVhcAAAAAAABwtAgyAAAAAABAg0GQAQAAAAAAGgyCDAAAAAAA0GAQZAAA\nAAAA0Ai98MILOu+881RRUVHt2Lx58zRr1qw6r+Gxxx7TokWLanQNQQYAAAAAAI3QkiVLNHToUL31\n1ltWl1Ijlr1+FTGB/futLgEAAAAAYIFJb96vV9e/Uav3HNnlIs0Y9ucjnrdu3Tq1adNGo0eP1qRJ\nk5SZmalPP/1U06ZNU0pKilwul7p16yZJmjlzpjZs2KCioiKdccYZevjhh1VQUKCJEycqGAyqffv2\nWrt2rVasWKFhw4apXbt2crvduvPOOzVlyhRVVFQoPz9ft9xyiwYOHKh33nlHOTk5Sk1NVSgUUocO\nHWr0HenIsNDjV45WyQfD9fKTT1hdCgAAAACgEVmwYIFGjRqlDh06yOPx6IsvvtD999+vmTNnas6c\nOWrdurUkKRAIKCUlRbNnz9bChQuVl5en3bt367nnntOFF16ol156SUOGDFEkEpEklZaW6o9//KOe\neOIJffPNN/rDH/6g2bNna+rUqfr73/+uUCik6dOna/bs2XrxxRfl8/lqXDsdGRZyluyWyxPSD//8\nh9WlAAAAAADq2Yxhfz6q7onatm/fPq1evVoFBQWaO3euAoGAXnrpJe3du1ft27eXJPXo0UPffvut\nvF6vCgoKdNtttykhIUGlpaUKhULaunWrhg8fLkk6++yzq9y/8h4tW7ZUTk6OXn31VTkcDoXDYRUU\nFKhJkyZq1qyZJKl79+41rp+ODAtFf86RzFC5xZUAAAAAABqLJUuWaMSIEfrrX/+qF198Ua+88orW\nrFkjv9+vrVu3SpLWr18vSVq9erV++OEHPf7447rttttUXl4u0zSVnp6uzz//XJKUl5dX5f5OZyxq\neOqpp3TJJZdoxowZ6t27t0zTVPPmzVVcXKyCgoIqz6kJOjIsZDo9sQ+R6ivEAgAAAABQFxYsWKBH\nH300vu33+zV48GC1aNFCd9xxh5KSkpSYmKgmTZooIyNDzz77rMaMGSOHw6HTTjtNe/bs0bXXXqs7\n7rhDS5cuVatWrWQY1eOFIUOG6NFHH9Vf/vIXnXzyySosLJRhGLrvvvt0zTXXqEmTJge97kgIMqxU\nGWREg9bWAQAAAABoNJYsWVJt35QpUyRJN954Y7VjCxcurLbvgw8+0M0336yMjAx99NFHys/PlyS9\n99578XOGDRumYcOGVbv2/PPP1/nnn3+M1RNkWMrhigUZToUsrgQAAAAAgKPXunVr3X333XK5XIpG\no7rnnnvq7dkEGRZyemKrszoVtrgSAAAAAACOXlpamubPn2/Js1ns00IuT4IkyekgyAAAAAAA4GgQ\nZFjI40+UJLkIMgAAAAAAOCoEGRZyJyZLklyuiMWVAAAAAADQMBBkWCgh+ecgw0mQAQAAAADA0SDI\nsFBik2aSJMNgagkAAAAAoH698MILOu+881RRUVHt2Lx58zRr1iwLqjoyggwLpTRvLklyuqIWVwIA\nAAAAaGyWLFmioUOH6q233rK6lBrh9asWSm7eXOVb6cgAAAAAgMbog7snacuiBbV6z/TMUeo/bcYR\nz1u3bp3atGmj0aNHa9KkScrMzNSnn36qadOmKSUlRS6XS926dZMkzZw5Uxs2bFBRUZHOOOMMPfzw\nw5o1a5Z27NihwsJCFRUVacyYMVq+fLm2bdumRx55JH5tXaAjw0IpzVIUCXrkMlgjAwAAAABQfxYs\nWKBRo0apQ4cO8ng8+uKLL3T//fdr5syZmjNnjlq3bi1JCgQCSklJ0ezZs7Vw4ULl5eVp9+7dkiSf\nz6cXX3xRv/3tb/XBBx/oueee03XXXVfnHR50ZFioafOmioTcchJkAAAAAECj03/ajKPqnqht+/bt\n0+rVq1VQUKC5c+cqEAjopZde0t69e9W+fXtJUo8ePfTtt9/K6/WqoKBAt912mxISElRaWqpQKCRJ\nOvPMMyVJycnJ6tixoySpSZMmB11zozYRZFgoObWpoiEPU0sAAAAAAPVmyZIlGjFihO68805JUllZ\nmS688EL5/X5t3bpVaWlpWr9+vZo0aaLVq1frhx9+0JNPPqmCggKtWLFCpmlKkhwOhyX1E2RYyO33\nKxIyZPjrNq0CAAAAAKDSggUL9Oijj8a3/X6/Bg8erBYtWuiOO+5QUlKSEhMT1aRJE2VkZOjZZ5/V\nmDFj5HA4dNppp2nPnj0WVk+QYSmnYSgaMuRKpiMDAAAAAFA/lixZUm3flClTJEk33nhjtWMLFy6s\ntq9nz57xz5dffnn888CBAzVw4MBaqPLQWOzTYtGQS053WJEIr2AFAAAAAOBICDIsFg275HRFVVJS\nanUpAAAAAADYHkGGxSIhlyQpsH+fxZUAAAAAAGB/BBkWi4RiQ7A339rFUgAAAAAAaAgIMiwWDceG\nIP9HggwAAAAAAI6EIMNikXDsvbtFBXstrgQAAAAAAPvj9asWi0ZiQUZxUZHFlQAAAAAAGoOdO3fq\n4osvVufOneP7evfuraZNm2rs2LHVzj/33HO1Zs2a+izxsAgyLBb5Ocgo20+QAQAAAACoHx07dtTc\nuXOr7Dv33HMPGmTYDUGGxaLRWJBRESi2uBIAAAAAQH16a9KnWr9gR63es8uotvr9jLNrfF1OTo72\n7dunKVOmKCMjQwsXLlQ0GtXNN99cq/XVBoIMi1V2ZIQIMgAAAAAA9eTrr79WdnZ2fPuxxx7TSy+9\npClTpmjRokVKSUlRTk6OhRUeGkGGxaJmbL3VSEWJxZUAAAAAAOrT72ecfUzdE7XhYFNLDtS+fft6\nrKZmeGuJxUzFOjJUUWZtIQAAAACARs00zfhnp9O+cYF9K2skoj8PgSNcYXElAAAAAIDGLC0tTRMn\nTrS6jCNiaonVHLEhcEYJMgAAAAAAda9169Z65ZVXqu0/1FQTO716VaIjw3JOwyVJckXDFlcCAAAA\nAID9EWRYzOVxx34qZHElAAAAAADYH0GGxdw+T+ynI2JxJQAAAAAA2B9BhsX8iX5JkkGQAQAAAADA\nERFkWMznT5QkGU6CDAAAAAAAjoQgw2Ief4IkyXBGLa4EAAAAAAD74/WrFnN5fw4yDDoyAAAAAAB1\nb926dbrlllvUsWNHSVJJSYlat26tW2+9VUOGDNHtt9+u6667Ln7+hAkTVFJSorlz52rHjh166KGH\nFA6HFQgE1KtXL91+++1yOuuvT4KODIs53X5FI04ZBq9fBQAAAADUjz59+mju3LmaO3euFi1aJLfb\nrffee09t2rTRO++8Ez+vsLBQO3bsiG8//vjjGjt2rP76179q/vz52r59u1auXFmvtdORYTGnx6No\nmUsuI6ySklIlJiZYXRIAAAAAoB5sfu8e/bhpca3e8+QzhqvTgIdqdE0wGNSePXvUp08fNWvWTE2b\nNtXWrVuVlpampUuXasiQIfr0008lSS1atNDixYuVmJiojIwMPfnkkzKM+o0W6MiwmNPtVjTkktMd\nVP6eAqvLAQAAAAA0AmvXrlV2draGDh2qzMxMDRo0SH379pUk/f73v9dbb70lSVq5cqUGDhwYv+7O\nO+9U165d9fjjj+ucc87R5MmTtX///nqtnY4MizncHkXDLrncIeXvLlK79q2tLgkAAAAAUA86DXio\nxt0TtaVPnz564oknVFhYqKuvvlqtW//yt+jAgQM1ZswYZWZmqmXLlvL5fPFja9eu1VVXXaWrrrpK\nJSUleuSRR/Tss8/qrrvuqrfa6ciwmNPjVjTkkNMd1N49RVaXAwAAAABoRJo1a6YZM2boT3/6k/Lz\n8yVJiYmJat++vWbMmKFhw4ZVOX/GjBn65JNPqpzn8XjqtWaCDIs53R5FQw653EH99OM+q8sBAAAA\nADQyHTt2VHZ2tmbPnh3fd9FFFyk3Nzc+3aTSk08+qZycHGVmZmr06NHauHFjlTec1AemllgsFmRI\nLk9I+T/QkQEAAAAAqFu9e/dW7969q+y7/vrrq2wPGDBAAwYMkCSlpaVp7ty58c8HBh5WsCzIiEaj\nmjJlijZv3iyPx6MHH3xQbdu2rXbevffeqyZNmmjixImSpOHDhyspKUmS1Lp1az388MP1Wndtc3jc\nMkOmJGnfnkKLqwEAAAAAwN4sCzLeffddBYNBzZ8/X3l5eZo+fbpycnKqnPPyyy9ry5Yt6tWrlySp\noqJCpmnGk6ATgdPtkRmOSJJK99bvSq8AAAAAADQ0lq2RkZubq379+kmSunXrpg0bNlQ5/tlnn+mL\nL75QVlZWfN+mTZtUVlamq6++WuPGjVNeXl691lwXYot9xoKMUHGpxdUAAAAAAGBvlnVkBAKB+BQR\nSXK5XAqHwzIMQ3v27NEzzzyjp59+WkuXLo2f4/P5dM0112jUqFHavn27rr32Wi1btkyGcfivkZub\nW2ff43jFOjJCkqRwcYmta21sGAv7YUzsiXGxH8bEnhgX+2FM7IlxsR/GBHZjWZCRlJSkkpKS+HY0\nGo0HEsuWLVNhYaGuu+465efnq7y8XB06dNCwYcPUtm1bORwOtW/fXk2bNlV+fr5OOeWUwz6rZ8+e\ndfpdjsfHK1fKDIUkGfKE7V1rY5Kbm8tY2AxjYk+Mi/0wJvbEuNgPY2JPjIv9NIQxIWhpfCwLMnr0\n6KFVq1Zp6NChysvLU3p6evzYuHHjNG7cOEnSokWL9M033ygzM1P/93//py1btmjKlCnavXu3AoGA\nWrZsadVXqBVOj1tmOCpJcldELa4GAAAAAAB7syzIGDRokNasWaPRo0fLNE1NmzZNb7zxhkpLS6us\ni3GgkSNHavLkybr88svlcDg0bdq0I04rsbvK169Kki/isLYYAAAAAABszrIUwOl0aurUqVX2paWl\nVTsvMzMz/tnj8WjmzJl1Xlt9chiGzHDsszcSm2LjdFq2BisAAAAAALbGX8wWczgcMqMuSZLHiKqo\nkFewAgAAAABwKAQZNmCascYYpxHSzu9+tLgaAAAAAADsiyDDFmJBhssT1I87f7K4FgAAAAAA7Isg\nwxbckiSnO6j8H4ssrgUAAAAAAPsiyLABp8MjSXK5Qyr4sdjiagAAAAAAsC+CDBtwuryxn+6gineX\nWFwNAAAAAAD2RZBhAy7DJym22Of+/HKLqwEAAAAAwL4IMmygsiPD5QmqbE/Q4moAAAAAALAvggwb\nqOzIcLmDCuVHLa4GAAAAAAD7IsiwAafLH/vgKZdZ6LK2GAAAAAAAbIwgwwZc7p+DDF+Z3Pu81hYD\nAAAAAICNEWTYQDzI8FTIW+JXKBSytiAAAAAAAGyKIMMGXF6fomFTTneFnKZTO7b9YHVJAAAAAADY\nEkGGDbg8XkVDktMd68TYvvV7iysCAAAAAMCeCDJswOX1ygyZchmxIOP7HfkWVwQAAAAAgD0RZNiA\n4Y11ZBhGWJKU/22RxRUBAAAAAGBPBBk24PJ6ZYZ/CTKKfiixuCIAAAAAAOyJIMMGYmtkmHIbEUlS\n4MdyiysCAAAAAMCeCDJswFU5tcQVlRxRBfMjVpcEAAAAAIAtEWTYgOHzyQybkiTTV6boXofFFQEA\nAAAAYE8EGTbg8voUjb2wRMFmhTIKfNYWBAAAAACATRFk2IDh8ykainVkhFMDStifpJKSUourAgAA\nAADAfggybMDl+6UjQ6llkqSvNn1rXUEAAAAAANgUQYYNGF6fzJ+DDFdK7MM3m3dZWBEAAAAAAPZE\nkGEDB04tcaVEJUk7v95jZUkAAAAAANgSQYYNHDi1xJUQCzT2bt9nYUUAAAAAANgTQYYNHNiR4fTG\n9hXvLLOwIgAAAAAA7IkgwwZcB6yR4TAckqTgD1ELKwIAAAAAwJ4IMmzgwI4MKawKX5mUb1haEwAA\nAAAAdkSQYQOGz6doMPbZDJcq2KxM3sIERaN0ZQAAAAAAcCCCDBtweX/pyDDDZVKriDxBr/bsLrC4\nMgAAAABWQA73AAAgAElEQVQA7IUgwwaMA95aomi5vKe4JElbvtxhXVEAAAAAANgQQYYNuA5YI8Nh\nlqtJ6wRJ0vYt31tZFgAAAAAAtkOQYQOG1xt/a4nTLFerDk0lSbu27LWwKgAAAAAA7IcgwwYcTqcc\nckuSnKpQh86/kiT99PV+K8sCAAAAAMB2CDJswuHySpI8rqDSz2ovSSr9LnS4SwAAAAAAaHQIMmzC\n6fJJkrxGWMlNmqjCWy79YFhcFQAAAAAA9kKQYRMuj1/RsOQzQiopDamiZYn8PyUpHI5YXRoAAAAA\nALZBkGEThs8XCzLcIe0PBOX6VVRG2K2tX31rdWkAAAAAANgGQYZNGD6foiHJa4S0v6RCiW1ja2Zs\n/PwbiysDAAAAAMA+CDJswuX1yQyZ8hlh7Q8E1apjE0nSji9/sLgyAAAAAADsgyDDJgyfT9FgVF53\nrCOjXedTJEm7v9pncWUAAAAAANgHQYZNGD6/oqHYYp/791fo111jr2AN7Ci3uDIAAAAAAOyDIMMm\nXD6fzKDkcpoKlASUfkY7hV0hRXYxRAAAAAAAVOKvZJuIvbXElCSVBPbLMFwqax6QNz/B4soAAAAA\nALAPggybiK2REftcVloc+/CrsLzlfn27gwU/AQAAAACQCDJsw+X1KRqKdWSUlQQkSUkdPJKkz9Z+\naVldAAAAAADYCUGGTRg+n6Kh2OeK8v2SpFM6p0qSvs7bZVVZAAAAAADYCkGGTbh8Ppk/d2QEy0sk\nSendTpMk7f6y0LK6AAAAAACwE4IMmzC8v3RkhCpiQUa333SSJJV8E7KqLAAAAAAAbIUgwyZcvl/W\nyAgFSyVJp7Y+SWWJJXLs9FhZGgAAAAAAtkGQYRMHvrUkEiqJ7w/9qlSJhckqLg5YVBkAAAAAAPZB\nkGEThtenaDjWkRENl8X3e9u55JBTn/9jk1WlAQAAAABgGwQZNuE6oCPDPCDIaNkpWZL0Ze42K8oC\nAAAAAMBWLAsyotGo7rvvPmVlZSk7O1s7duw46Hn33nuvHnvssRpd0xAZPp/MyjU9o+UyzVh3Rruu\np0iSdm7ca1FlAAAAAADYh2VBxrvvvqtgMKj58+fr9ttv1/Tp06ud8/LLL2vLli01uqahcnl/WezT\n6wqprDyWanT9zemSpKLNpZbVBgAAAACAXVgWZOTm5qpfv36SpG7dumnDhg1Vjn/22Wf64osvlJWV\nddTXNGSG75fXr3rdIe0PxOaZnHlWmiq85YpuMyysDgAAAAAAe7Dsr+NAIKCkpKT4tsvlUjgclmEY\n2rNnj5555hk9/fTTWrp06VFdczi5ubm1/wVqUW5urgq/3RHvyPAZIX287jOddkqiJKn0lH1qsqOF\nPvxwjRISfFaW2qjY/d9NY8SY2BPjYj+MiT0xLvbDmNgT42I/jAnsxrIgIykpSSUlv7xmNBqNxgOJ\nZcuWqbCwUNddd53y8/NVXl6uDh06HPaaw+nZs2ftf4Fakpubq549e+r7SEj/+rkjw+cOqU3bjurR\n5VeSpMROH8q53aVQqaGe/ez7XU4kleMC+2BM7IlxsR/GxJ4YF/thTOyJcbGfhjAmBC2Nj2VTS3r0\n6KHVq1dLkvLy8pSenh4/Nm7cOC1atEhz587Vddddp2HDhikzM/Ow1zR0htenaPDnNTKMcHxqiSSd\n3KWpJGn9x1stqQ0AAAAAALuwrCNj0KBBWrNmjUaPHi3TNDVt2jS98cYbKi0trbIuxpGuOVG4Dlgj\nw2eEtL+kIn7s173baY2+1c483lwCAAAAAGjcLAsynE6npk6dWmVfWlpatfMyMzMPe82JwvD5ZEYk\n05S8RqhKR0bv87pojb5VYEvoMHcAAAAAAODEZ9nUElRleGOLeJoRl3zuqh0ZJ53cXCVNi+X+LsGq\n8gAAAAAAsAWCDJtw+WJBRjTirLZGhiRF21XIH0jU9m07rSgPAAAAAABbIMiwCcNX2ZHhqNaRIUkp\nnWLHP1n9r3qvDQAAAAAAuyDIsAmX1ytJMsOOamtkSFLb7q0kSVv+8W291wYAAAAAgF0QZNiEw+GI\ndWWEHdXeWiJJ3c6JvWp2z/piK8oDAAAAAMAWCDJsxOXzKRqWPEZEgUB5lWM9fvNrhdxBhb9iyAAA\nAAAAjRd/FduI4fXJDJmSpLLS/VWOeb0elZ1WrMQfm2pfEV0ZAAAAAIDGiSDDRlw+n6LBWJBRURao\ndjzhTJecplP/7728+i4NAAAAAABbIMiwEcPnUzQYlSRVVFQPMtr2ii34+c8Pv67XugAAAAAAsAuC\nDBtxeX2KlEckSaHykmrHe11wpiTph8+K6rUuAAAAAADsgiDDRgy/X+GysCQpHKoeZJzd58zYgp+b\nXfVdGgAAAAAAtkCQYSNuv1+RilhHRiRYVv24262ytsVK3NNEhYX76rs8AAAAAAAsR5BhI4bPH1/s\nU9EyhcORauckdjbkNJ36cOXn9VwdAAAAAADWI8iwESMhQWYo9tlrhFS8v6LaOe3OPkmStP7Db+qz\nNAAAAAAAbIEgw0YMv1/Rn4MMnzukfQcJMn4zILbg548s+AkAAAAAaIQIMmzE8PkVDcWmlviMsPbt\nL692To/fnKkKX5miXxr1XR4AAAAAAJYjyLCRAzsyvEZI+4qrd2QYhkvBjgEl/dRUO7btqucKAQAA\nAACwFkGGjbj9CTIrOzLcoYN2ZEhSao8ESdJ7b31ab7UBAAAAAGAHBBk2Yvj9igZjn33GwdfIkKQu\nF3SQJG1a/V19lQYAAAAAgC0QZNhIbGpJrCPDe5iOjAFDe8lUVMWfHzzoAAAAAADgREWQYSOxxT5j\nn/3ug6+RIUktW6UqcEqR/NubqLycMAMAAAAA0HgQZNiIkZCgaLDyrSWH7siQJM9Zkjvs0ep3c+ur\nPAAAAAAALEeQYSMHrpHhdx96jQxJ6nDuSZKk3JWb6qM0AAAAAABsgSDDRgyfX2ZEkumQzx3UvuJD\nd2ScMyRDkrRrbWE9VQcAAAAAgPUIMmzE8Pt//uT5+fWrh+7I6NHr1ypLKpFjo1/RaLR+CgQAAAAA\nwGIEGTbiTkiQJDlk/Dy15NAdGU6nU9GzSpWwP0mf/ePL+ioRAAAAAABLEWTYiOH7uSMjaijBc/iO\nDEk67bzmkqT3X/usrksDAAAAAMAWCDJspHJqiRl1xaaWHGaNDEn6j4u7S5J2rM6v89oAAAAAALAD\nggwbiQcZYac8rpCKDzO1RJJ6n9tFZYkl0nof62QAAAAAABoFggwbcftja2SYYYecDlPBihJFIocO\nKFgnAwAAAADQ2BBk2EhlR0Y0FNv2uUMqPtI6Gf1i62R88DrrZAAAAAAATnwEGTby70HGkd5cIkn9\nLuoqSdrOOhkAAAAAgEaAIMNGnIYhp2EoUhGbThILMg7fkdHnvK4qSyiR1ntZJwMAAAAAcMIjyLAZ\nIyFB0fJYIOEzjvzmkvg6GcXJrJMBAAAAADjhEWTYjOHzK1wekST53MEjdmRIUrsLWkqS3n3lkzqt\nDQAAAAAAqxFk2Izh9ytSHpZ0dGtkSNLg0b0lSd++V1CntQEAAAAAYDWCDJsx/H6FS2OrffrdQe0r\nPnJHRka3Tgq0KJL3XykqLS2r6xIBAAAAALAMQYbNuP0JCpfEggzvUXZkSJKvtylP0Ktlr31Ul+UB\nAAAAAGApggybMfx+hUpiXRhH89aSSl2HdZAkffI6C34CAAAAAE5cBBk2Y/j98beW+N3Bo+7IGDbq\nPxRxhrXv41BdlgcAAAAAgKUIMmzG8PkV/TmL8BkhFR9lR0Zq8yYqOb1Qyd81045tu+qwQgAAAAAA\nrEOQYTNGQoKiQVOS5KvB1BJJOuk/kuSQU2/O+391VR4AAAAAAJYiyLAZw+dXNBj7nOA5+sU+Jan/\nyO6SpE1L6cgAAAAAAJyYCDJsxvD7FQ3FOjKSfJGjev1qpf4Dz1Zpyn45cxNVURGsqxIBAAAAALAM\nQYbNGP5fOjKSfOEadWQ4nU4ZfYLylfm19DWmlwAAAAAATjwEGTbj9ifIjEhyuJTgDddojQxJ6jki\nXZL00fwNdVAdAAAAAADWIsiwGcPvlyQ5nV753bG3lkQi0aO+/pLLz1fIHVSAhgwAAAAAwAmIIMNm\nKoMMh8MrnxF7D+u+4qOfXpKcnKiKjH1Kzm+qf6ylKwMAAAAAcGIhyLAZw1cZZHjkNWLTSgr3HX2Q\nIUkdh54sSVr2vx/XbnEAAAAAAFiMIMNm3AkJkiSH6ZbhiK36WbivrEb3GP6H/jIV1fcrimu9PgAA\nAAAArESQYTOVU0tkumU4yuWQWeOOjHbtW2t/+wIlbW2uHdt21UGVAAAAAABYgyDDZiqnlsg0JEle\nI1TjjgxJ+tWQZDlNpxY8v7I2ywMAAAAAwFIEGTZT2ZFhRmJD43OHVFBU8yBj+ITzJUlbl+TXWm0A\nAAAAAFiNIMNmjJ/XyKgMMvzuUI2nlkjSWRmnq7jtXiVtStW3O36o1RoBAAAAALCKZUFGNBrVfffd\np6ysLGVnZ2vHjh1Vjr/zzjsaMWKERo4cqb/97W/x/cOHD1d2drays7M1efLk+i67zlVOLTFDDkmS\nzx08pqklknTK75LlNF1a8Py7tVYfAAAAAABWMqx68LvvvqtgMKj58+crLy9P06dPV05OjiQpEolo\n5syZWrhwoRISEjR06FBddNFFSkxMlGmamjt3rlVl1zl3YqIkKRo0JX9sasmxdGRI0qXj/0N/f26d\ntr6+R5pWm1UCAAAAAGANyzoycnNz1a9fP0lSt27dtGHDhvgxl8ult99+W8nJySoqKlI0GpXH49Gm\nTZtUVlamq6++WuPGjVNeXp5V5dcZd0IsyIgEo5Iqp5YcW0dGRrdOKm7zkxK/TNXOb3+stRoBAAAA\nALCKZR0ZgUBASUlJ8W2Xy6VwOCzDiJVkGIaWL1+uqVOnqn///vL7/fL5fLrmmms0atQobd++Xdde\ne62WLVsWv+ZQcnNz6/S7HK8D6wsHApKkQGGJmrSU/O6gvv0u/5i/Q8I5ETlfdinn4ZeV+Z/9aqXe\nxsLu/24aI8bEnhgX+2FM7IlxsR/GxJ4YF/thTGA3lgUZSUlJKikpiW9Ho9FqgcTgwYM1cOBA3XXX\nXXrttdd00UUXqW3btnI4HGrfvr2aNm2q/Px8nXLKKYd9Vs+ePevkO9SG3NzcKvVFw2H9P0keuSVJ\nTRKi+j5qHPN3MO5I1P+9/IkKV0fUM8e+vwe7+fdxgfUYE3tiXOyHMbEnxsV+GBN7YlzspyGMCUFL\n42PZ1JIePXpo9erVkqS8vDylp6fHjwUCAY0dO1bBYFBOp1N+v19Op1Ovvvqqpk+fLknavXu3AoGA\nWrZsaUn9dcVpGHJ5PAqXhiRJqSk65qklktS1+xkqbrtXiV+m6putO2urTAAAAAAALGFZR8agQYO0\nZs0ajR49WqZpatq0aXrjjTdUWlqqrKwsXXTRRRozZowMw1CnTp108cUXKxKJaPLkybr88svlcDg0\nbdq0I04raYjciYnxIKNZknnMi31WajO8qYqedGnek+/onlnX1EaJAAAAAABYwrIUwOl0aurUqVX2\npaWlxT9nZWUpKyurynGXy6WZM2fWS31WMhISFQpUSJJSEqMq3l+hSCQql+vYGmiuuPm3mvXfy7Xz\ntWJpVm1WCgAAAABA/bJsagkOzZ34S5CR7I9IkoqKj70ro237U1XapUApO5vro9Wf10qNAAAAAABY\ngSDDhtz+BAX3x9bFSPbGppgUFh37OhmSlHFFG0nS60+vOb7iAAAAAACwEEGGDbkTExX8eYHPBG9Y\nklRwnEHGFRN+pwpvuUqWOxQOR467RgAAAAAArECQYUPuhERFyqOSJL87KEnHveBnSkqSzHNLlLgv\nWa+9/N5x1wgAAAAAgBUIMmzInZioaCy/kNcVWyvjeF7BWqn/NRmSpA//Z/1x3wsAAAAAACsQZNiQ\nOzFRMiWnyy+3MxZgHG9HhiRdfNn5CjTbJ9dHKcrfU3Dc9wMAAAAAoL4RZNiQOyFRkuQ0/HKpMsg4\n/o4Mw3Cp+aVuuUMezX7sjeO+HwAAAAAA9Y0gw4aMhARJsY4MpxkLMI53sc9KY+8Yoqgjom3z6MgA\nAAAAADQ8BBk2FO/IcPikSImk2plaIknpZ7RTSdcCpexsrneXrq2VewIAAAAAUF8IMmzInRgLMhwO\nj8xwqRwya2VqSaXe154uSXrryY9r7Z4AAAAAANQHggwbquzIkOmRFHsFa211ZEjS6GuGqDRlv/R+\nkgoL99XafQEAAAAAqGsEGTZU2ZGhqCFJatm0dhb7rOT1epQ8TPIEvZrzxJu1dl8AAAAAAOoaQYYN\nVS72aUZckqSTUh212pEhSVfcOVhRR1Rb5uxRNBqt1XsDAAAAAFBXCDJsqHJqiRmJDU+rZrX31pJK\nZ2WcrtIePynlu+Z6e/GHtXpvAAAAAADqCkGGDVVOLTFDseFpkWIqUBJUKBSp1edccEuGJGnZY5/W\n6n0BAAAAAKgrBBk2VNmREQ3GtpunmJJqvysj84oLtf/kAvk+SdXmL7fV6r0BAAAAAKgLBBk2VNmR\nEamIrV2Rmhz7ubegtFaf43Q61eGq5nJFXZrzwNu1em8AAAAAAOoCQYYNxYOM8liA0SQx9vOnwtoN\nMiTp2jsvUbmvTCWvO7V/f0mt3x8AAAAAgNpEkGFDbn/srSWRsrAkKcUfkiTtrYMgo0nTFPl+H5S/\nNFF/nfl6rd8fAAAAAIDaRJBhQ5UdGaGSWJCR6I39rO2pJZWy7xuiqCOqTf/Dq1gBAAAAAPZGkGFD\nht8vSQqXxFb7TPDEftZVkHFWxukq+81PStmVqvlz3qmTZwAAAAAAUBsIMmzI4XTKSEhQKBALMHxG\nhSTpp8LafWvJgS7987mSpNWP/qvOngEAAAAAwPEiyLApd2KiQvvLY58dsZ91sUZGpYG/66PiX+cr\nZXNLLX/zozp7DgAAAAAAx4Mgw6bcCYkK7ot1YBiO2M+6mlpS6YI7u0iSlkz9uE6fAwAAAADAsSLI\nsCl3QoKC+0vkcLhkRkrk8bjqPMgYmT1Qxaf9pIR/NNen6zbW6bMAAAAAADgWBBk25U5IVKikVC5v\nsiLBgFo0S9BPdTi1RJKcTqe63XyaHHLqpXuW1+mzAAAAAAA4FgQZNuVOTFSkokKGJ1nhYEDNm/nr\ndI2MSlf/1yUKNC+S6/0m2vzltjp/HgAAAAAANUGQYVPuhERJkstIUKQioBapCdpXXKFQKFK3z3W7\n1fH6VBkRQ8/f/nqdPgsAAAAAgJoiyLApIzEWZDhdfoWD+9UiNUGS6nx6iSRdf88oBVL3ybE8Rf/a\nsLXOnwcAAAAAwNGq9SAjGAzW9i0bJbc/Flw4nD6Z0ZBaNnVLkn4qLKvzZ/t8Xp1+Y6wr44WJb9T5\n8wAAAAAAOFo1CjIuvPBCrVy58pDH33zzTfXr1++4i4LkTkqSJDkcXklSq2YOSXX/CtZK1989KrZW\nxooUbVz/db08EwAAAACAIzEOd7CgoEBbt/4ytWDXrl1av369UlJSqp0bjUa1YsUKOjJqiacyyDA9\nkqSWTaOSVC8LfkqS1+tRp5taateUkF64/U09ufyWenkuAAAAAACHc9ggw+v16vbbb1d+fr4kyeFw\n6Pnnn9fzzz9/0PNN09TQoUNrv8pGyJOUHPsQjQ1RarIpqf46MiRp/F0jdNvTz8m/MkX/zNusjG6d\n6u3ZAAAAAAAczGGDjMTEROXk5GjLli0yTVN33323LrvsMnXv3r3auU6nU6mpqerbt2+dFduYuJNj\nQYYZic3+aZoQe1tJfSz2Wcnr9ejX/3WSvru3Qv/zX2/pvz8gyAAAAAAAWOuwQYYkde7cWZ07d5Yk\nff/99xo8eLDS09PrvLDGrrIjIxqKBRkpCWFJ9duRIUkT7hqpm3JmKXl1qt5f8Q+dP6hXvT4fAAAA\nAIAD1WixzxtvvLFaiBEKhfT+++9r9erVCofDtVpcY+ap7MgIxbaT/D8HGfXYkSFJhuFSv/vT5ZBT\nr9y2ul6fDQAAAADAv6tRkBEMBnXffffp6quvjm9fdtlluv766zV+/Hhdeuml+umnn+qk0MamsiMj\nUh5b5DPRE0s06rsjQ5JGXz1ExZ3ylbyhpV59aUW9Px8AAAAAgEo1CjKefvppvfLKKzrllFMkSa+9\n9pq+/PJLZWdna9q0acrPz9dTTz1VJ4U2NpUdGZVBhktl8nhc+qmwrN5rcTqdGv5YbO2TlXdvUDgc\nqfcaAAAAAACQahhkLF26VCNHjtRDDz0kSXrnnXeUnJysO+64Q8OHD9eYMWO0atWqOim0sansyAiX\nxjoxIsGAWjRLsKQjQ5IGDztHJX3ylfJdc70wc5ElNQAAAAAAUKMg48cff1S3bt0kSWVlZfrHP/6h\nvn37yjBia4aecsopKi4urv0qG6HKjoxQSSzICAcDapGaUO9rZBzomllDFXGGtXH6bu0rYpwBAAAA\nAPWvRkFGixYttHfvXknShx9+qGAwqPPPPz9+fPPmzWrVqlWtFthYuX/uyAgFKiRJ4WCxWqQmqHh/\nhYJBaxZV7X72r+UaXqLEohTNuPklS2oAAAAAADRuNQoyevfurb/97W+aPXu2Hn30Ufn9fg0cOFDF\nxcWaPXu2XnnlFV1wwQV1VWujEu/IKC6XJIUr9qtFswRJ1iz4WWlSzliVJgVUOs+jjeu/tqwOAAAA\nAEDjVKMg4+6779YZZ5yhRx55RAUFBXrggQeUkpKir776So888oi6du2qG2+8sa5qbVRcbrdcXq+C\nRbHFPSMV+3VSy0RJ0u69JZbV1aJlM50+sZncYY9yrn3dsjoAAAAAAI2TUZOTU1JSNHv2bBUUFCgp\nKUkej0eS9Otf/1rz589X165d66TIxsqTnKyKfSWSw6lQxT6d1CJJkrTHwiBDkv54z2W6ac5TSlnX\nUov+b6Uyr7jQ0noAAAAAAI1HjToyKjVp0kRffvml3n77bb377rv65ptvCDHqgCcpWcH9ARneFIUr\nitWqRWVHRsDSugzDpUue+o0k6d2J61VREbS0HgAAAABA41GjjgxJWrVqle6//37t3r1bpmnK4XBI\nklq1aqU///nPGjBgQK0X2Vh5kpO1b8d2Gd5TFa4o1kltrJ9aUmnIxedpaf9PlPxBCz12x0u656mr\nrS4JAAAAANAI1Kgj49NPP9VNN90k0zR166236plnntGsWbN06623yuFw6Oabb9Znn31WV7U2Ou6k\nZIUCARmeqh0ZVk8tqXTb7CyV+8u097mI/rVhq9XlAAAAAAAagRp1ZMyaNUunnnqqXn31VSX//FaN\nSldccYVGjBihnJwcvfDCC7VaZGPlSUqWGY3K5U6MBRnNY28tsXpqSaW27U9Vu4lJ+vGBiJ4Z95qe\n+ex2q0sCAAAAAJzgatSR8c9//lOjRo2qFmJIUlJSkkaOHKkvvvii1opr7Cpfwep0Jkgy1TzFlGSf\njgxJ+q8pl6v49Hwlfd5SLz612OpyAAAAAAAnuGNa7PNQHA6HQqFQbd6yUfMkVQYZvti2q1yJCW5b\nrJFRyel06srZgxR2hZV33/fK31NgdUkAAAAAgBNYjYKMrl276tVXX1VpaWm1Y4FAQAsWLFCXLl1q\nrbjGrrIjQ6ZXkhSpKNZJLZJs1ZEhSX3OzZDv8nIlFCfr4T/Mtbqc/8/efcZXXd7/H3+dnXWyB0kI\nIYQsNoSlgODAgUrrKrir3Wqtq1b7a2mr1q3Fbf9Vq+JCrdXiQEQQEBkSCSMQAiRAEkZCEjJPzsg5\n/xuHYCmgoJBzTvJ+3iHnu/h8ucCHeee6PpeIiIiIiIh0Y8cUZNxwww3s2LGD8847jxdeeIEFCxaw\nYMECnnvuOaZOnUpVVRXXXXfdiaq1x+mckYHPAoB7f8PPmrpWvF5vACs71O+f/THNSfswfxjDv99Y\nEOhyREREREREpJs6pmafI0eO5IknnuDuu+/mwQcfPLD1qs/nIykpiUcffZSxY8eekEJ7IkvnjAyP\nf5g8ziZSEiPxeLw0NLaTEBcRwOoOFhkZwXl/H87Ci7Yy//oSJp1VSFxcTKDLEhERERERkW7mmIIM\ngIKCAs455xzOOeccqqqqAKiqqqK+vp6RI0ce9wJ7ss4ZGV6Pf+KMx9lISlIU4G/4GUxBBsCUCyaw\n6MJiov4Vw91XvMijH/wm0CWJiIiIiIhIN3NMS0vKysq44IILePnll7FarUyZMoUpU6bQ1NTEa6+9\nxg9/+EMqKyuP6ller5cZM2Ywbdo0rrzySrZv337Q+Y8//piLLrqIiy++mJdeeumo7uluOntk+Fz+\nz/4tWCOB4NmC9X/94Z/X0pzcgOXDOP716vxAlyMiIiIiIiLdzDEFGY888giRkZF88MEH5OfnHzh+\n22238cEHH2CxWHj44YeP6lnz58/H5XIxe/Zsbr31Vu6///4D5zo6OnjkkUd48cUXmT17Nq+99hr1\n9fXfeE931Dkjo8Pp33bV42wiJckfZARbw89OdnskU/9RiNfgZeGvN1Jf1xjokkRERERERKQbOaYg\no7i4mB//+Mf07dv3kHMZGRlcccUVfPnll0f1rKKiIiZMmADAsGHDWL9+/YFzJpOJDz/8ELvdzr59\n+/B6vVit1m+8pzvqnJHhafM39vQ4G0lJ9C8tCaYtWP/X2VPHY7qkhciGGP4y7YVAlyMiIiIiIiLd\nyDH1yPB6vbS3tx/xvM/n+8bz/62lpYWoqKgDn00mEx6PB7PZX5LZbGbevHncddddTJw4kfDw8G+9\n50iKioqOqqZAOVJ9Tft7kOyp3EN0X9hZuZWGDv+x4nVbKCo65hYnXea8X49g1pLlxH6ayN23P82U\naWMCXdIxC/a/Nz2RxiQ4aVyCj8YkOGlcgo/GJDhpXIKPxkSCzTF9Jzxs2DBmz57N9OnTiY6OPuhc\na2srb731FkOHDj2qZ0VFRdHa+vWsAq/Xe0ggceaZZ3LGGWdwxx138O677x7VPYdTWFh4VDUFQlFR\n0fG2xcYAACAASURBVBHrq4uK5Csg2ub/s46PCeOUghHAMkwWe1C/F4D5rSjenLSSuidMhF8Vy4BB\n2YEu6ah907hIYGhMgpPGJfhoTIKTxiX4aEyCk8Yl+ITCmCho6XmOaWnJDTfcQE1NDeeddx4PPfQQ\nb775Jm+99RaPPPII559/PtXV1dx4441H9awRI0awePFiwL9kJTc398C5lpYWrrjiClwuF0ajkfDw\ncIxG4zfe0x119shwNzv9v/53s8/a4F1a0mnsuCGk3WbD1h7OExe8i9vtDnRJIiIiIiIiEuKOaUbG\n0KFD+ec//8kDDzzA888/f9C5/Px87rvvPoYPH35Uz5o8eTJLly5l+vTp+Hw+7r33XubMmUNbWxvT\npk3j/PPP5/LLL8dsNpOXl8fUqVMxGAyH3NOddfbIcDc6sODvkREXG47FYqSmLviDDIBb/no5v/70\nb0R/mcRdP3+eu//5y0CXJCIiIiIiIiHsmJssjBw5krfeeov6+nqqq6vxer2kpqaSnJx8TM8xGo3c\nddddBx3Lzv566cG0adOYNm3aIff97z3dmXV/PxBXSwt2qx2PswmDwUByQmTQbr/6v4xGI79/5wru\nG/g23pcieP+8RZx30cRAlyUiIiIiIiIh6piWlvy3+Ph4Bg8ezNChQ485xJCjYzAasURG4mpuxmKL\nxuNsAiA5MTIklpZ0Su+dwul/LwAMzL12PdsrqgNdkoiIiIiIiISo7xxkSNewRcfgbGrEZLPjafcH\nGSmJUbQ53LS0OgNc3dG7YPpphF/jJLLJzv3nvqF+GSIiIiIiIvKdKMgIctYYf5BhscXgcTbi8/no\nleRfchJKszIAZvz9pzQPrSV6YxJ/+vH/C3Q5IiIiIiIiEoIUZAQ5W0wszn37MNmi8fk66HC3kZbi\nbwK6c09zgKs7NmaziT9+cCUtcY10vGbn5WfnBLokERERERERCTEKMoKcLToGX0cHJlMEAB2u5pAN\nMgBS05O56PXReExuim7eyZrVpYEuSUREREREREKIgowgZ4uNBcBAGABuZ2NIBxkAp501hvQ7bIS1\nh/PseXOpr2sMdEkiIiIiIiISIhRkBDlbdIz/C58FAE97E6kp/h4ZoRpkANxyzxW4zqwnemc8fzz7\nOTyejkCXJCIiIiIiIiFAQUaQ65yRgXd/kNENZmR0uu+9X9GUW0vUqiT++ONnA12OiIiIiIiIhAAF\nGUGuc0aGz20CwN3ecGDXklAPMsLCbPx+3uW0xjXifdXOsw++FeiSREREREREJMgpyAhythj/jAyv\nywCAu30fVquZpISIkA8yADIye3Hpv8fjsjop+79GPvngi0CXJCIiIiIiIkFMQUaQs8X4Z2R0OHwA\neNr3AZCWYu8WQQbAuInDGf63Xpg9Zv5zaTEla7cEuiQREREREREJUgoyglzn0hJPmxfwz8gAf5DR\n0uqiucUZsNqOp6uuOx/7DR4imqN4avIH7NpZG+iSREREREREJAgpyAhync0+3S0u/6/t/q1KOxt+\n7qrpHrMyAP7w+E/wTG3AXhPHXZNm0dLSGuiSREREREREJMgoyAhynTMyXI3+IMPT3gBAanL32Lnk\nvxkMBu7/1/W0jqolenMid5zxrLZlFRERERERkYMoyAhync0+XY0O4OClJQA7d3efIAPAYjZz36e/\npCl7L5ErkrjjR08FuiQREREREREJIgoyglxns0/nviZMlshDg4xuNCOjk90eyR8+u5zm5AZM/47l\nL7/4R6BLEhERERERkSChICPIWaKiMBiNOJsasYTFHrRrCXTPIAMgvXcK130yhdaYJtr+n42Hbn85\n0CWJiIiIiIhIEFCQEeQMBgO2mBicjfswh8X2iBkZnQYNyeHKD0/BEdFK7UNenrjnjUCXJCIiIiIi\nIgGmICME2GJicTbun5HhbMLn85KSFInB0L2DDIAxJw/hgncLcYU52THDwQuPvxvokkRERERERCSA\nFGSEAGt0DK6mRixhcYAPT3sjZrOJlKSobh9kAJw6eTSTXx1Ah7mDklvqeeOfcwNdkoiIiIiIiASI\ngowQEBYbi6u5GZPVv5ykc3lJanIUu2pa8Pl8gSyvS5x74QROei4T8PHlz6t588V5gS5JRERERERE\nAkBBRgiwxcYBYDREAAdvwdrmcNPU7AxYbV3pkqsmM/yZXuCDFT+t5PXnPwp0SSIiIiIiItLFFGSE\ngLC4eP8XPgvAgZ1L0ntFA1C5szEgdQXCFT87l8JnUwFY9YudvPrchwGuSERERERERLqSgowQEBbv\nDzJ8bjMA7vYGAPqkxQBQuaspMIUFyGU/ncLof/QGA3z1y93MenZOoEsSERERERGRLqIgIwR0zsjw\n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\niIhIu6EgQ0RERERERETaDQUZIiIiIiIiItJuKMgQERERERERkXZDQYaIiIiIiIiItBsKMkRERERE\nRESk3VCQISIiIiIiIiLthoIMEREREREREWk3FGSIiIiIiIiISLuhIENERERERERE2g0FGSIiIiIi\nIiLSbhimaZq+rkRrSk9P93UVREREREREpBWlpaX5ugrShk75IENERERERERETh26tERERERERERE\n2g0FGSIiIiIiIiLSbijIEBEREREREZF2Q0GGiIiIiIiIiLQbCjJEREREREREpN2w+boCHZXX6+W+\n++5j69atOBwO5s+fT3Jysq+r1WHU1dXxhz/8gczMTGpra7nxxhuJi4vj+uuvp3PnzgBMmTKFiy++\nmGXLlvHaa69hs9m48cYbOf/8831b+VPY+PHjcTqdACQmJnLDDTdwxx13YBgG3bt3595778VisahN\n2tCbb77JihUrAHC73fzwww8sXbpU54qPrF+/nieeeILFixezZ8+e4z4/ampqmDt3LoWFhQQFBfHo\no48SHh7u64dzyji0XX744QceeOABrFYrDoeDRx99lMjISObPn8+aNWsICgoCYOHChdjtdrVLKzm0\nTTZv3nzcr1k6V1rXoe1y6623UlBQAEBmZib9+/fn6aef1rnSRo70Wbhbt256X5H2wxSf+PDDD815\n8+aZpmmaa9euNW+44QYf16hjWb58uTl//nzTNE2zuLjYPPfcc81ly5aZf/vb35qUy8vLM8eOHWu6\n3W6zrKyscVpaXk1NjTlu3Lgmy66//nrzq6++Mk3TNO+55x7zo48+Upv40H333We+9tprOld85Pnn\nnzfHjh1rTpo0yTTNEzs/XnjhBfOZZ54xTdM033vvPfOBBx7w2eM41RzeLlOnTjU3b95smqZpvvrq\nq+ZDDz1kmqZpTp482SwsLGyyrdqldRzeJifymqU2aT2Ht8sBJSUl5mWXXWbm5uaapqlzpa0c6bOw\n3lekPdGlJT6Snp7OOeecA8CAAQP4/vvvfVyjjmXMmDHcfPPNAJimidVq5fvvv+fzzz9n6tSp/OEP\nf6CiooINGzYwcOBAHA4HwcHBJCUlsWXLFh/X/tS0ZcsWqqurmTVrFjNmzGDdunVs2rSJ008/HYDh\nw4fz5Zdfqk18ZOPGjWzfvp2rrrpK54qPJCUl8eyzzzbOn8j5ceh7zvDhw1m9erVPHsOp6PB2eeqp\np+jduzcAHo8HPz8/vF4ve/bs4Y9//COTJ09m+fLlAGqXVnJ4m5zIa5bapPUc3i4HPPvss0ybNo3o\n6GidK23oSJ+F9b4i7YkuLfGRioqKxi70AFarlfr6emw2NUlbONBdsaKigptuuolbbrmF2tpaJk2a\nRGpqKosWLWLBggX06tWL4ODgJttVVFT4qtqnNH9/f2bPns2kSZPYvXs3c+bMwTRNDMMAGp778vJy\nKioq1CY+8Nxzz/HrX/8agH79+ulc8YHRo0eTkZHROH8i58ehyw+UlZZxeLtER0cDsGbNGpYsWcIr\nr7xCVVUV06ZNY+bMmXg8HmbMmEFqaqrapZUc3iYn8pqlNmk9h7cLQGFhIatXr+bOO+8E0LnSho70\nWfjRRx/V+4q0G+qR4SNOp5PKysrGea/XqxCjjWVnZzNjxgzGjRvHpZdeyqhRo0hNTQVg1KhRbN68\nuVk7VVZWNnkxl5aTkpLCZZddhmEYpKSkEBoaSmFhYeP6yspKQkJC1CY+UFZWxq5duxg2bBiAzpWT\nhMVy8C38WOfHocsPlJXW889//pN7772X559/nvDwcAICApgxYwYBAQE4nU6GDRvGli1b1C5t5ERe\ns9QmbeuDDz5g7NixWK1WAJ0rbezwz8J6X5H2REGGjwwaNIiVK1cCsG7dOnr06OHjGnUsBQUFzJo1\ni7lz5zJx4kQAZs+ezYYNGwBYvXo1ffv2pV+/fqSnp+N2uykvL2fHjh1qq1ayfPlyHnnkEQByc3Op\nqKjgrLPO4uuvvwZg5cqVDB48WG3iA99++y1nnHFG47zOlZNDnz59jvv8GDRoEP/5z38ay6alpfmy\n6qe0t99+myVLlrB48WI6deoEwO7du5kyZQoej4e6ujrWrFlD37591S5t5ERes9QmbWv16tUMHz68\ncV7nSts50mdhva9Ie6IuAD4yatQoVq1axeTJkzFNk4ceesjXVepQ/vznP1NWVsbChQtZuHAhAHfc\ncQcPPfQQdrudyMhIHnjgAZxOJ9OnT+fqq6/GNE1uvfVW/Pz8fFz7U9PEiRO58847mTJlCoZh8NBD\nDxEWFsY999zDU089RZcuXRg9ejRWq1Vt0sZ27dpFYmJi4/x9993HAw88oHPFx+bNm3fc58eUKVOY\nN28eU6ZMwW638+STT/q6+qckj8fDgw8+SFxcHL/97W8BGDJkCDfddBPjxo3jyiuvxG63M27cOLp3\n705iYqLapQ2cyGuWzpW2tWvXrsbAD6Br1646V9rIkT4L33XXXcyfP1/vK9IuGC3tAg4AAAXRSURB\nVKZpmr6uhIiIiIiIiIjI8dClJSIiIiIiIiLSbijIEBEREREREZF2Q0GGiIiIiIiIiLQbCjJERERE\nREREpN1QkCEiIiIiIiIi7YaCDBEREQFgxIgRTJ8+3dfVEBERETkqBRkiIiIiIiIi0m4oyBARERER\nERGRdkNBhoiIiIiIiIi0GwoyREREfGDt2rXMnDmTgQMHMnDgQGbNmsWGDRsa148YMYK77rqL119/\nnZEjRzJgwAAmT57MV1991Wxf3333Hddee23jvmbMmMG3337brNz69euZM2cOgwcPZujQoVx33XVs\n3bq1Wbl33nmHSy65hNTUVEaPHs2rr77asg9eRERE5BcwTNM0fV0JERGRjmTVqlVcf/319OrVi7Fj\nx1JbW8ubb75JZmYmL774IoMHD2bEiBGYpklBQQHTp08nKiqKV199laysLF544QVOP/10AD755BN+\n85vfkJSUxIQJEwB4/fXXycrK4plnnmHkyJHAwbAjOjqaK6+8En9/f15++WUqKyt54403SExMZMSI\nERQVFeHn58e0adMIDw/ntddeY9u2bSxYsIALLrjAZ8+ZiIiIyAEKMkRERNqQ1+vlwgsvJCoqiiVL\nlmC1WgGoqqri8ssvJzAwkLfeeosRI0aQmZnZJEAoKipi9OjRdOnShaVLl1JfX8/IkSMxDIP33nsP\np9MJQFlZGWPHjgUagg673c6kSZPIzs7m3XffJSwsDIBdu3Zx8cUXM3PmTG6//XZGjBhBVlYWb7zx\nBn379gUgMzOTkSNHctlll/HYY4+19dMlIiIi0owuLREREWlDmzdvZt++fVxwwQWUlpZSVFREUVER\nNTU1nH/++fzwww/k5uYC0KVLlya9IMLDwxk3bhzr16+nsLCQzZs3k5OTw9SpUxtDDICQkBCmTZtG\nbm4u33//PYWFhWzYsIFLL720McQASElJ4Y033mDOnDmNyzp37twYYgAkJCQQHh5OQUFBaz4tIiIi\nIsfN5usKiIiIdCR79+4F4LHHHvvJHg5ZWVkAdOvWrdm65ORkTNMkMzOTjIwMoCGQOFyXLl0a93Wg\n10dycnKzcn369GkyHxER0ayMv78/dXV1P/mYRERERNqSggwREZE25PV6Abj55psZMGDAEcscCCHs\ndnuzdR6PBwCr1crRrg49sM5utzce0zCMY9bPYlFnTRERETm5KcgQERFpQwkJCQAEBgZy5plnNlm3\nYcMGSktL8ff3Bw723jjUnj17sFqtJCYmNvaS2LlzZ7Nyu3btAiA2NpaYmJif3N/jjz+Oy+Xiuuuu\n+wWPSkRERKTt6N8uIiIibSg1NZWoqCgWL15MZWVl4/KKigpuueUW7rzzzsZLQTZu3Mi6desayxQU\nFPDOO+8wbNgwXC4Xffv2bfw1k4qKiib7+sc//kFUVBSpqanExMTQq1cv3n///Sbl9u3bx8svv6zx\nL0RERKRdUY8MERGRNmS327n77ru59dZbueKKK5g4cSJ+fn6NP5n6xBNPYLM1vD07HA7mzJnDNddc\ng7+/P//4xz/wer3cfvvtzfY1YcIEJk6cCMDy5cvJy8vjmWeeabxU5M477+RXv/oVEyZMYNKkSVgs\nFpYsWUJISEiTwT5FRERETnYKMkRERNrYmDFjcLlcLFq0iIULF2KxWOjevTuLFi3i/PPPbyw3YMAA\nLrnkEhYuXEh5eTmDBw/mtttuo1evXs32tXDhQhYsWIDNZqN///48+OCDDB48uLHcsGHDeOmll3jm\nmWdYsGABfn5+DBkyhLlz5xIVFdWmj19ERETklzDMo40UJiIiIj4xYsQIEhISWLx4sa+rIiIiInJS\n0RgZIiIiIiIiItJuKMgQERERERERkXZDQYaIiIiIiIiItBsaI0NERERERERE2g31yBARERERERGR\ndkNBhoiIiIiIiIi0GwoyRERERERERKTdUJAhIiIiIiIiIu2GggwRERERERERaTcUZIiIiIiIiIhI\nu/H/ARJpLmwFFE2UAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(16, 9))\n", + "\n", + "for res in results: \n", + " loss_data = res['loss']\n", + " \n", + "# print('for optimizer {}'.format(res['name']))\n", + "# print('final parameters\\n', res['parameters'])\n", + "# print('final loss={}\\n'.format(loss_data[-1]))\n", + " ax.plot(np.arange(len(loss_data)), loss_data, label=res['name'])\n", + "\n", + "ax.set_xlabel('epoch', fontsize=18)\n", + "ax.set_ylabel('cost', fontsize=18)\n", + "ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\n", + "ax.set_title('different optimizer', fontsize=18)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/code/ex1-linear regression/ML-Exercise1.ipynb b/code/ex1-linear regression/ML-Exercise1.ipynb new file mode 100644 index 00000000..5298a8a4 --- /dev/null +++ b/code/ex1-linear regression/ML-Exercise1.ipynb @@ -0,0 +1,1187 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 机器学习练习 1 - 线性回归" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这个是另一位大牛写的,作业内容在根目录: [作业文件](ex1.pdf)\n", + "\n", + "代码修改并注释:黄海广,haiguang2000@qq.com" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 单变量线性回归" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PopulationProfit
06.110117.5920
15.52779.1302
28.518613.6620
37.003211.8540
45.85986.8233
\n", + "
" + ], + "text/plain": [ + " Population Profit\n", + "0 6.1101 17.5920\n", + "1 5.5277 9.1302\n", + "2 8.5186 13.6620\n", + "3 7.0032 11.8540\n", + "4 5.8598 6.8233" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "path = 'ex1data1.txt'\n", + "data = pd.read_csv(path, header=None, names=['Population', 'Profit'])\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PopulationProfit
count97.00000097.000000
mean8.1598005.839135
std3.8698845.510262
min5.026900-2.680700
25%5.7077001.986900
50%6.5894004.562300
75%8.5781007.046700
max22.20300024.147000
\n", + "
" + ], + "text/plain": [ + " Population Profit\n", + "count 97.000000 97.000000\n", + "mean 8.159800 5.839135\n", + "std 3.869884 5.510262\n", + "min 5.026900 -2.680700\n", + "25% 5.707700 1.986900\n", + "50% 6.589400 4.562300\n", + "75% 8.578100 7.046700\n", + "max 22.203000 24.147000" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "看下数据长什么样子" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\na6eTRiJEt6WUcrHWeqrtdowr/Tt4+niw9O/g6ePB0r+Dp48Hr60+Vs4BAAANCdEAANCQEL29N7bd\ngDGnfwdPHw+W/h08fTxY+nfw9PHgtdLHaqIBAKAhI9EAANCQEA0AAA0d+BBdSnm4lPLBUsqlUsrF\nTa4vpZT/vZTy8VLKQinlb7fRzlFVSvmbvb5d//pMKeV1t5zz0lLKpzec88/bau+oKKW8pZTyqVLK\nQxuOfUEp5XdKKR/rfZ/Z4rbfUEr5s95z+gf3r9WjY4v+/alSykd7rwNvL6U8c4vbbvuawpot+vj1\npZTLG14LXr7FbT2Hd7BF//6bDX37cCnl0ha39RzuQynluaWUd5dSPlxK+VAp5Qd6x70W74Ft+ndo\nXosPfE10KeXhJKdqrZsu0t17Ef/+JC9P8uIk/6rW+uL9a+H4KKUcSnI5yYtrrZ/YcPylSf5ZrfUV\nbbVt1JRSvibJcpJfrbV+We/YhSR/XWv9yd4L8kyt9fwttzuU5D8k+W+TLCb5kySvqrV+eF//AUNu\ni/79+iT311qvl1LuSZJb+7d33sPZ5jWFNVv08euTLNdaf3qb23kO92Gz/r3l+p9J8ula649vct3D\n8RzeUSnlOUmeU2v9QCnlriQPJPmWJN8Vr8W7tk3/zmVIXosP/Eh0H745ay9Ctdb6viTP7D2wNPd1\nSf58Y4Dm9tRa/zDJX99y+JuTvLV3+a1Ze7G51YuSfLzW+h9rrU8m+fXe7dhgs/6ttf5/tdbrvR/f\nl7UXcm7TFs/hfngO92G7/i2llCTfmuTX9rVRY6bW+mit9QO9y08k+UiSY/FavCe26t9hei0WopOa\n5HdLKQ+UUl67yfXHkjyy4efF3jGa+7Zs/aL9lb2PZv5dKeVL97NRY+TZtdZHe5f/MsmzNznH83lv\n/IMk/26L63Z6TWF73997LXjLFh+Dew7v3lcn+WSt9WNbXO853FAp5e4kX57k/fFavOdu6d+NWn0t\nFqKTr6q1nkzyjUm+t/cRGHuslHJHkjNJfmOTqz+Q5Hm11hNJfj7Jb+9n28ZRXavTOti1WgNSSvnh\nJNeTvG2LU7ym3L5fTPL8JCeTPJrkZ9ptzth6VbYfhfYcbqCUMp1kPsnraq2f2Xid1+Ld26p/h+G1\n+MCH6Frr5d73TyV5e9Y+YtnocpLnbvh5rneMZr4xyQdqrZ+89Ypa62dqrcu9y+9KMlFKObrfDRwD\nn1wvNep9/9Qm53g+70Ip5buSvCLJq+sWE0r6eE1hC7XWT9Zab9Rau0l+OZv3nefwLpRSDif5H5L8\nm63O8RzuXyllImsB72211t/qHfZavEe26N+heS0+0CG6lHJnr1g9pZQ7k3x9koduOe2+JH+/rHlJ\n1iZiPBqa2nLko5TyX/Rq9FJKeVHWnpdL+9i2cXFfktf0Lr8myb2bnPMnSb6klPI3ep8OfFvvduyg\nlPINSc4lOVNr/c9bnNPPawpbuGW+ySuzed95Du/Of5Pko7XWxc2u9BzuX+/v1puTfKTW+rMbrvJa\nvAe26t+hei2utR7Yr6x9bPhg7+tDSX64d/x7knxP73JJ8oYkf57kg1mb6dl620fpK8mdWQvFz9hw\nbGMff1+v/x/M2iSBr2y7zcP+lbU3JI8mWc1aLd13J5lN8ntJPpbkd5N8Qe/cL0ryrg23fXnWZoX/\n+fpz3ldf/fvxrNUwXup9/dKt/bvVa4qvvvv4/+y9zi5kLVA859Y+7v3sOXwb/ds7/ivrr70bzvUc\nvr0+/qqslWosbHhdeLnX4oH379C8Fh/4Je4AAKCpA13OAQAAt0OIBgCAhoRoAABoSIgGAICGhGgA\nAGhIiAbYZ6WUG6WUS6WUh0opv1FK+bw9/v3fVUr5hR3OeWkp5Ss3/Pw9pZS/v5ftABhnQjTA/rta\naz1Za/2yJE9mbd30/fbSJE+F6FrrL9Vaf7WFdgCMJCEaoF1/lOR4kpRS/klvdPqhUsrresfuLqV8\ntJTytlLKR0opv7k+cl1KebiUcrR3+VQp5fdv/eWllG8qpby/lPKnpZTfLaU8u5Ryd9aC+//cGxH/\n6lLK60sp/6x3m5OllPeVUhZKKW8vpcz0jv9+KeWeUsofl1L+QynlqwffPQDDSYgGaEkp5XCSb0zy\nwVLK30nyPyZ5cZKXJPlHpZQv7536N5P861rrf5XkM0n+pwZ3854kL6m1fnmSX09yrtb6cJJfSvJz\nvRHxP7rlNr+a5Hyt9UTWdhD80Q3XHa61vijJ6245DnCgCNEA+2+qlHIpycUkf5HkzVnb4vbttdbP\n1lqXk/xWkvWR3kdqre/tXf6/euf2ay7Jvy+lfDDJ/5LkS7c7uZTyjCTPrLX+Qe/QW5N8zYZTfqv3\n/YEkdzdoB8BYOdx2AwAOoKu11pMbD5RStju/bvHz9XxuMOTIFrf9+SQ/W2u9r5Ty0iSvb9TSp1vp\nfb8Rf0OAA8xINMBw+KMk31JK+bxSyp1JXtk7liTPK6V8Re/yt2etRCNJHk7yd3qXz27xe5+R5HLv\n8ms2HH8iyV23nlxr/XSSKxvqnb8zyR/ceh7AQSdEAwyBWusHkvxKkj9O8v4kb6q1/mnv6j9L8r2l\nlI8kmUnyi73jP5bkX5VSLmZtZHgzr0/yG6WUB5L81Ybj70jyyvWJhbfc5jVJfqqUspDkZJIf382/\nDWAclVpv/ZQQgGHRW0njnb3l8AAYEkaiAQCgISPRAADQkJFoAABoSIgGAICGhGgAAGhIiAYAgIaE\naAAAaOj/Bx2CAHZLVRXDAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在让我们使用梯度下降来实现线性回归,以最小化成本函数。 以下代码示例中实现的方程在“练习”文件夹中的“ex1.pdf”中有详细说明。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "首先,我们将创建一个以参数θ为特征函数的代价函数\n", + "$$J\\left( \\theta \\right)=\\frac{1}{2m}\\sum\\limits_{i=1}^{m}{{{\\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}} \\right)}^{2}}}$$\n", + "其中:\\\\[{{h}_{\\theta }}\\left( x \\right)={{\\theta }^{T}}X={{\\theta }_{0}}{{x}_{0}}+{{\\theta }_{1}}{{x}_{1}}+{{\\theta }_{2}}{{x}_{2}}+...+{{\\theta }_{n}}{{x}_{n}}\\\\] " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def computeCost(X, y, theta):\n", + " inner = np.power(((X * theta.T) - y), 2)\n", + " return np.sum(inner) / (2 * len(X))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "让我们在训练集中添加一列,以便我们可以使用向量化的解决方案来计算代价和梯度。" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "data.insert(0, 'Ones', 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在我们来做一些变量初始化。" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# set X (training data) and y (target variable)\n", + "cols = data.shape[1]\n", + "X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列\n", + "y = data.iloc[:,cols-1:cols]#X是所有行,最后一列" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "观察下 X (训练集) and y (目标变量)是否正确." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OnesPopulation
016.1101
115.5277
218.5186
317.0032
415.8598
\n", + "
" + ], + "text/plain": [ + " Ones Population\n", + "0 1 6.1101\n", + "1 1 5.5277\n", + "2 1 8.5186\n", + "3 1 7.0032\n", + "4 1 5.8598" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.head()#head()是观察前5行" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Profit
017.5920
19.1302
213.6620
311.8540
46.8233
\n", + "
" + ], + "text/plain": [ + " Profit\n", + "0 17.5920\n", + "1 9.1302\n", + "2 13.6620\n", + "3 11.8540\n", + "4 6.8233" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "代价函数是应该是numpy矩阵,所以我们需要转换X和Y,然后才能使用它们。 我们还需要初始化theta。" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X = np.matrix(X.values)\n", + "y = np.matrix(y.values)\n", + "theta = np.matrix(np.array([0,0]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "theta 是一个(1,2)矩阵" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[0, 0]])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "theta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "看下维度" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((97, 2), (1, 2), (97, 1))" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.shape, theta.shape, y.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "计算代价函数 (theta初始值为0)." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "32.072733877455676" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "computeCost(X, y, theta)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# batch gradient decent(批量梯度下降)\n", + "$${{\\theta }_{j}}:={{\\theta }_{j}}-\\alpha \\frac{\\partial }{\\partial {{\\theta }_{j}}}J\\left( \\theta \\right)$$" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradientDescent(X, y, theta, alpha, iters):\n", + " temp = np.matrix(np.zeros(theta.shape))\n", + " parameters = int(theta.ravel().shape[1])\n", + " cost = np.zeros(iters)\n", + " \n", + " for i in range(iters):\n", + " error = (X * theta.T) - y\n", + " \n", + " for j in range(parameters):\n", + " term = np.multiply(error, X[:,j])\n", + " temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))\n", + " \n", + " theta = temp\n", + " cost[i] = computeCost(X, y, theta)\n", + " \n", + " return theta, cost" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "初始化一些附加变量 - 学习速率α和要执行的迭代次数。" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "alpha = 0.01\n", + "iters = 1000" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在让我们运行梯度下降算法来将我们的参数θ适合于训练集。" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[-3.24140214, 1.1272942 ]])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g, cost = gradientDescent(X, y, theta, alpha, iters)\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "最后,我们可以使用我们拟合的参数计算训练模型的代价函数(误差)。" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4.5159555030789118" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "computeCost(X, y, g)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在我们来绘制线性模型以及数据,直观地看出它的拟合。" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nshtj+gH9AFq0aOH/IkVERESCTVaW63eeOdN93aePC88nnuhtXeLXdg4AjDH1gdeAAdbanSW/Z621\ngC3tdtbaKdbaJGttUpMmTfxdpoiIiEjw+PRTSElxYfnVV12f89q1MGOGAnSQ8OtKtDEmGhegZ1pr\n5/oObzbGHGut3WSMORbY4s8aREREREKCtfDOO26DlA8+cKPpHn4Y7r0XjjrK6+rkIP6czmGA54CV\n1trRJb71BnCj7/KNwH/8VYOIiIhI0Nu3z42pS0yESy6B775z/c8bNsAjjyhAByl/rkT3APoCmcaY\nFb5jDwHDgVeMMbcC64HefqxBREREJDjl58O0aZCWBj/8AO3awQsvuCkbhx/udXVSAX9O51gKmDK+\nfb6/HldEREQkqOXlweTJMHYsbNkCp53mVp579oRafj9dTWqIhgmKiIiIBMKmTS44T54Mu3ZBcjIM\nHQpnnw2mrHVHCVYK0SIiIiL+tHata9mYNs31P/fuDYMHux5oCVkK0SIiIiL+sHy5m7Tx2msQHQ23\n3AKDBkGbNl5XJjVAIVpERESkplgLixfD8OGwYAEccYRbdb7/fjjmGK+rkxqkEC0iIiJyqIqKID3d\nhecvvnCBecQIuOMOaNjQ6+rEDxSiRURERKrr99/dltwjR0J2tmvVeOYZuOEGqFPH6+rEjxSiRURE\nRKpq1y6YMsWNpsvNhS5d4JVXoFcviIryujoJAIVoERERkcrauhWeegomTHDzns87z03duOACjamL\nMArRIiIiIhVZtw5GjYLnn4fffnMrzkOGwCmneF2ZeEQhWkRERKQsmZnuBMF//9vtJnjDDZCaCgkJ\nXlcmHlOIFhERETnY0qVu0sZbb0G9ejBgAAwcCPHxXlcmQUIhWkRERATcmLp581x4/ugjaNwYHnsM\n7rkHGjXyujoJMgrRIiIiEtkKCly7xogR8O230LIljB/vdhisW9fr6iRIKUSLiIhIZNqzB557zp0w\nuGEDdOwIL74I11zjtukWKYdCtIiIiESWn392I+rGj4dt26BHD5g4ES69VGPqpNIUokVERCQybNzo\nNkeZMgV+/RX+/Gc3pu6MM7yuTEKQQrSIiIiEt1Wr3LbcL73kTh689loYPNi1b4hUk0K0iIiIhKfP\nP3eTNtLToU4duPNOeOABaNXK68okDChEi4iISPiwFhYscOF58WI48kj429+gf39o0sTr6iSMKESL\n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\nAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = np.linspace(data.Population.min(), data.Population.max(), 100)\n", + "f = g[0, 0] + (g[0, 1] * x)\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.plot(x, f, 'r', label='Prediction')\n", + "ax.scatter(data.Population, data.Profit, label='Traning Data')\n", + "ax.legend(loc=2)\n", + "ax.set_xlabel('Population')\n", + "ax.set_ylabel('Profit')\n", + "ax.set_title('Predicted Profit vs. Population Size')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "由于梯度方程式函数也在每个训练迭代中输出一个代价的向量,所以我们也可以绘制。 请注意,代价总是降低 - 这是凸优化问题的一个例子。" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.plot(np.arange(iters), cost, 'r')\n", + "ax.set_xlabel('Iterations')\n", + "ax.set_ylabel('Cost')\n", + "ax.set_title('Error vs. Training Epoch')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 多变量线性回归" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "练习1还包括一个房屋价格数据集,其中有2个变量(房子的大小,卧室的数量)和目标(房子的价格)。 我们使用我们已经应用的技术来分析数据集。" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SizeBedroomsPrice
021043399900
116003329900
224003369000
314162232000
430004539900
\n", + "
" + ], + "text/plain": [ + " Size Bedrooms Price\n", + "0 2104 3 399900\n", + "1 1600 3 329900\n", + "2 2400 3 369000\n", + "3 1416 2 232000\n", + "4 3000 4 539900" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "path = 'ex1data2.txt'\n", + "data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])\n", + "data2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "对于此任务,我们添加了另一个预处理步骤 - 特征归一化。 这个对于pandas来说很简单" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SizeBedroomsPrice
00.130010-0.2236750.475747
1-0.504190-0.223675-0.084074
20.502476-0.2236750.228626
3-0.735723-1.537767-0.867025
41.2574761.0904171.595389
\n", + "
" + ], + "text/plain": [ + " Size Bedrooms Price\n", + "0 0.130010 -0.223675 0.475747\n", + "1 -0.504190 -0.223675 -0.084074\n", + "2 0.502476 -0.223675 0.228626\n", + "3 -0.735723 -1.537767 -0.867025\n", + "4 1.257476 1.090417 1.595389" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data2 = (data2 - data2.mean()) / data2.std()\n", + "data2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在我们重复第1部分的预处理步骤,并对新数据集运行线性回归程序。" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.13070336960771892" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# add ones column\n", + "data2.insert(0, 'Ones', 1)\n", + "\n", + "# set X (training data) and y (target variable)\n", + "cols = data2.shape[1]\n", + "X2 = data2.iloc[:,0:cols-1]\n", + "y2 = data2.iloc[:,cols-1:cols]\n", + "\n", + "# convert to matrices and initialize theta\n", + "X2 = np.matrix(X2.values)\n", + "y2 = np.matrix(y2.values)\n", + "theta2 = np.matrix(np.array([0,0,0]))\n", + "\n", + "# perform linear regression on the data set\n", + "g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)\n", + "\n", + "# get the cost (error) of the model\n", + "computeCost(X2, y2, g2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们也可以快速查看这一个的训练进程。" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.plot(np.arange(iters), cost2, 'r')\n", + "ax.set_xlabel('Iterations')\n", + "ax.set_ylabel('Cost')\n", + "ax.set_title('Error vs. Training Epoch')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们也可以使用scikit-learn的线性回归函数,而不是从头开始实现这些算法。 我们将scikit-learn的线性回归算法应用于第1部分的数据,并看看它的表现。" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn import linear_model\n", + "model = linear_model.LinearRegression()\n", + "model.fit(X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "scikit-learn model的预测表现" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\ndNttt6XdJ9Pj/LbDDjts/bqmpkabN28uew0AAACVgG2/fTZr1iw9+uijeu655yRJb7/9tp555hlN\nnTpVa9as0fPPPy9Jw0J2yrHHHqvrrrtOkjQwMKA333xT48eP14YNGzLe/6ijjtItt9wiSXrmmWf0\n4osvqrGxsdQvCwAAoKoRon02ceJE3XjjjTr77LN18MEHb23lGDt2rK6//nqdeOKJmjlzpnbfffeM\nj7/22mv14IMPavr06Tr00EO1atUq7brrrpo9e7amTZumtra2tPv/y7/8i7Zs2aLp06frrLPO0o03\n3pg2Aw0AAIDRM+dc0DXk1dzc7Do7O9PGnn76aR1wwAEBVYRM+J4AAICoM7PlzrnmfPdjJhoAAAAo\nkp+rcwAAAAA5tXfFtaijR719CdXXxdTW0qjWpoagy8qLEA0AAIBAtHfFNW9JtxL9A5KkeF9C85Z0\nS1LogzTtHAAAAAjEoo6erQE6JdE/oEUdPQFVVDhCNAAAAALR25coajxMCNEAAAAIRH1drKjxMCFE\nj9D69es1Y8YMzZgxQ3vuuacaGhq2/nnTpk2jOvadd96pRYsWlaTOc889V1OmTNEhhxyi/fffX+ed\nd556e3vzPm7x4sV69913S1IDAABAJm0tjYrV1qSNxWpr1NYS/o3iuLBwhHbdddetW3fPnz9f48aN\n0yWXXJJ2H+ecnHMaM6a49yqnnXZayeqUpGuuuUatra3asmWLFi9erGOOOUbd3d2qra3N+pjFixfr\nn/7pnzR27NiS1gIAAJCSungwiqtzVM1MdHtXXLMXLtOUufdo9sJlau+K+/I8zz33nA488ECdc845\nOuigg7R27VpdcMEFam5u1kEHHaRvf/vbW++79957a/78+WpqatLBBx+sZ555RpL04x//WBdddJEk\nbyb5a1/7mj74wQ/qfe97n+68805J3hbgX/ziFzV16lQdf/zxOuGEE9Te3p6ztjFjxuiSSy7RLrvs\novvvv1+SMtZ2zTXX6NVXX9VRRx2lj370o1nvBwAAMFqtTQ16dO4x+tvCE/Xo3GMiEaClKgnRqeVT\n4n0JOW1bPsWvIL169WpdfPHFWrVqlRoaGrRw4UJ1dnbqiSee0NKlS7Vq1aqt991jjz3U1dWlz3/+\n81q8eHHG47366qt69NFH1d7ernnz5kmSbr/9dsXjca1atUo33nij/vjHPxZc38yZM7V69WpJyljb\nxRdfrN13310PP/ywfvvb32a9HwAAQLWqihBd7uVT3v/+96u5edtukbfddptmzpypmTNn6umnn04L\noHPmzJEkHXrooVqzZk3G47W2tsrMdPDBByse94L/I488ojPPPFNjxoxRfX29jj766ILrG7zVe67a\nBiv0fgAAANWgKnqiy718yo477rj162effVbXXnut/vznP6uurk7nnntu2gV7O+ywgySppqZGmzdv\nzni81H2k9AA8UitWrNCJJ56Yt7ZCXwMAAEC1qYqZ6CCXT3nrrbc0fvx47bTTTlq7dq06OjpKctzZ\ns2frjjvukHNOa9eu1UMPPZT3Mc45XXPNNVq/fr2OO+64nLWNHz9eGzZs8PU1AAAARFVVzES3tTSm\nbSkplW/5lJkzZ+rAAw/U1KlTNWnSJM2ePbskxz3zzDO1bNkyHXDAAZo0aZKampo0YcKEjPe9+OKL\n9a1vfUuJREJHHHGEli1bptra2py1XXDBBfroRz+qffbZR0uXLvXlNQAAAESVlaI9wG/Nzc2us7Mz\nbezpp5/WAQccUPAx2rvikVw+JZeNGzdq3LhxWrdunQ4//HA99thjmjhxYmD1FPs9AQAACBszW+6c\na853v6qYiZa85VOiHpqH+tjHPqa33npL/f39uuKKKwIN0AAAANWkakJ0JXr44YeDLgEAAKAqVcWF\nhQAAAEApRTpER6Gfu1rwvQAAANUksiF67NixWr9+PeEtBJxzWr9+vcaOHRt0KQAAAGUR2Z7ovffe\nWy+//LLWrVsXdCmQ96Zm7733DroMAACAsohsiK6trdWUKVOCLgMAAABVKLLtHAAAAEBQIjsTDQAA\nqlslbqSG6CBEAwCAyGnvimvekm4l+gckSfG+hOYt6ZYkgjTKgnYOAAAQOYs6erYG6JRE/4AWdfQE\nVBFG5e23pb6+oKsoCiEaAABETm9foqhxhNT69dLkydK4cdLOOwddTVEI0QAAIHLq62JFjSNk1q2T\nGhqk3XaTXnjBG7vuumBrKhIhGgAARE5bS6NitTVpY7HaGrW1NAZUEQryyivSHntIu+8u9fZ6Y1de\nKTknffGLwdZWJC4sBAAAkZO6eJDVOSJi7VrpwAPT+56vukq69NLgaholQjQAAIik1qYGQnPYxePS\n1KnSxo3bxhYvli6+OLiaSoQQDQAAgNJ68UVpv/2kTZu2jX33u9KFFwZXU4kRogEAAFAaa9ZI73+/\ntGXLtrHrrotcv3MhCNEAAAAYnb/+1QvPg/3oR9LnPx9MPWVAiAYAAMDIPPustP/+6WM33iidd14g\n5ZQTIRoAAADF6enxLhgc7Oc/l845J5h6AkCIBgAAKKP2rnh0l+ZbtUo66KD0sf/5H+mss4KpJ0CE\naAAAgDJp74pr3pJuJfoHJEnxvoTmLemWpHAH6e5u6eCD08fuuEP6xCeCqScE2LEQAACgTBZ19GwN\n0CmJ/gEt6ugJqKI8VqyQzNIDdHu7t8NgFQdoiZloAACAsuntSxQ1Hpjly6Xm5vSx3/xGOumkYOoJ\nIWaiAQAAyqS+LlbUeNn9+c/ezPPgAH3ffd7MMwE6DSEaAACgTNpaGhWrrUkbi9XWqK2lMaCKkh59\n1AvPhx++bez++73wfMIJwdUVYoRoAACAMmltatCCOdPVUBeTSWqoi2nBnOnBXVS4YIEXno88ctvY\nsmVeeD7uuGBqigh6ogEAAMqotakh+JU45s+Xrrgifezuu6UTTwyknChiJhoAAKBazJvnzTwPDtBX\nX+3NPBOgi8JMNAAAQKX7+tela65JH/ve96SvfCWYeioAIRoAAKBSffnL0ve/nz72wx9KF1wQTD0V\nhBANAAAQEN+2AD//fOknP0kf++lPpc9+dvTHhiRCNAAAQCB82QL8nHOkW29NH7vlFulTnxpNqciA\nCwsBAAACUNItwE8/3btgcHCAvv1274JBArQvmIkGAAAIQEm2AD/pJOmee9LH2tulU08dRWUoBDPR\nAAAAARjVFuAf/ag38zw4QN97rzfzTIAuC0I0AABAAEa0Bfjs2V54fuCBbWNLl3rh+WMf86lSZEI7\nBwAAQABSFw8WtDrHoYdKjz+ePva730lHH+1/ociIEA0AABCQvFuAH3CAtHp1+tijj0of/KC/hSEv\nQjQAAEDYTJ4svfBC+thjj0mHHRZIORiOEA0AABAWu+8urVuXPvb441JTUzD1ICtCNAAAQNDGj5c2\nbkwfe/JJafr0YOpBXoRoAACAoJgNH1u5UjrwwPLXgqIQogEAAMrJOWlMhlWGe3qk/fcvfz0YEdaJ\nBgAAKAfnvJnnoQG6s9O7jQAdKb6FaDPbx8weNLNVZrbSzL6WHN/FzJaa2bPJ/+/sVw0AAACB27Il\nc3h++GEvPB96aDB1YVT8nIneLOn/OOcOlDRL0pfN7EBJcyU94JzbT9IDyT8DAABUloEBLzzXpO9K\nqMce88LzkUcGUxdKwrcQ7Zxb65x7PPn1BklPS2qQdKqkm5J3u0lSq181AAAAlF1/vxeetxty6dmK\nFV54Zq3nilCWnmgzmyypSdJjkvZwzq1N3vR3SXtkecwFZtZpZp3rhq6XCAAAEDb/+IcXnrffPn18\n5UovPB9ySDB1wRe+h2gzGyfpV5Iucs69Nfg255yT5DI9zjl3vXOu2TnXPHHiRL/LBAAAGJlEwgvP\nY8emjz/7rBeeWa6uIvkaos2sVl6AvsU5tyQ5/IqZ7ZW8fS9Jr/pZAwAAgC82bvTC83vekz6+Zo0X\nnvfdN5CyUB5+rs5hkm6Q9LRzbvGgm+6SdF7y6/Mk/dqvGgAAAEruzTe98Dx+fPp4PO6F50mTgqkL\nZeXnZiuzJX1aUreZrUiOfUPSQkm/NLPzJb0g6UwfawAAACiN9eul3XYbPv7KK9Luu5e/HgTKtxDt\nnHtEUoa9LCVJx/r1vAAAACX1yivSnnsOH1+/Xtpll/LXg1Bg228AAIBM4nFp772Hj/f1SRMmlL8e\nhArbfgMAAAy2Zo3X8zw0QG/Y4PU8E6AhQjQAAIDn2We98DxlSvr4O+944XncuGDqQigRogEAQHVb\nudILz/vvnz7+7rteeI7FgqkLoUaIBgAA1WnFCi88T5uWPr5pkxeed9ghmLoQCYRoAABQXR57zAvP\nTU3p45s3e+G5tjaYuhAphGgAAFAdHn7YC8+zZqWPDwx44bmmJpi6EEmEaAAAUNmWLvXC84c+lD6+\nZYsXnscQh1A8/tYAAIDKdM89Xng+/vj08VR4tmx7wgH5EaIBAEBlueMOLyCfdFL6uHOEZ5QMIRoA\nAFSGW27xAvIZZ6SPp8IzUEKEaAAAEG033OCF53PPTR8nPMNH2wVdAAAAwIh85jPSz342fJzgjDIg\nRAMAgGhpbZV+/evh44RnlBEhGgAARMMxx0gPPjh8nPCMABCiAQBAuB16qPT448PHCc8IECEaAACE\n0777Ss8/P3yc8IwQIEQDAIBw2XVX6fXXh48TnhEihGgAABAO220nDQwMHyc8I4QI0QAAIFjZdhAk\nPCPECNEAACAYhGdEGCEaAACUF+EZFYAQDQAAyoPwHErtXXEt6uhRb19C9XUxtbU0qrWpIeiyQo8Q\nDQAA/EV4Dq32rrjmLelWot+7oDPel9C8Jd2SRJDOY0zQBQAAgAplljlAO0eADolFHT1bA3RKon9A\nizp6AqooOpiJBgAApcXMc2T09iWKGsc2hOiIon8JABA6hOfIqa+LKZ4hMNfXxQKoJlpo54igVP9S\nvC8hp239S+1d8aBLAwBUI9o2IqutpVGx2pq0sVhtjdpaGgOqKDoI0RFE/xIAIBQIz5HX2tSgBXOm\nq6EuJpPUUBfTgjnT+XS7ALRzRBD9SwCAQNG2UVFamxoIzSPATHQEZetTon8JAOArZp6BrQjREUT/\nEgCgrDKF57FjCc+oarRzRFDqIxdW5wAA+CrTrPNee0m9veWvBQgZQnRE0b8EAPBNpvA8dar09NPl\nrwUIKUI0AADwZArPs2ZJf/xj+WspAHsmIEiEaAAAql2m8Hz88VJHR/lrKVBqz4TUkq+pPRMkEaRR\nFlxYCABAtcp0weDpp3sXC4Y4QEvsmYDgEaIBAKg2mcLzP/2TF55vvz2YmorEngkIGiEaAIBqkSk8\nf/WrXni+4YZgahoh9kxA0AjRAABUukzh+fLLvfB87bXB1DRK7JmAoHFhIQAAlSrTBYMLFkhz55a/\nlhJjzwQEjRANAEAlcU4ak+GD5muv9Vo3Kgh7JiBIhGgAACrBli1STc3w8Rtu8C4aBFBShGgAAKJs\nYEDaLsOv89tukz75yfLXA1QJQjQAAFHU3y9tv/3w8V//WjrllPLXA1QZQjQAAFHy7rtSLMMybvff\nLx13XPnrAaoUIRoAgCh4+21p3Ljh4w8/LB15ZPnrAaocIRoAgDB76y1pwoTh43/+s/SBD5S/HgCS\nCNEAAITT+vXSbrsNH3/ySWn69PLXAyANIRoAgDB55RVpzz2Hj/f0SPvvX/56AGREiAYAIAxeekl6\n73uHj//tb9LkyWUvB0BuhGgAAIL0/PPSvvsOH4/Hpfr68tcDoCAZ9gUFAAC+W7VKMhseoF991du6\nmwANhBohGgCAcurq8sLzQQelj7/+uheeJ04Mpi4ARSFEAwBQDn/8oxeeZ85MH3/rLS8877xzMHUB\nGBFCNAAAfnrwQS88f/CD6ePvvOOF5/Hjg6kLwKgQogEA8MO993rh+Zhj0sf/8Q8vPGfauhtAZLA6\nBwAgq/auuBZ19Ki3L6H6upjaWhrV2tQQdFnh9qtfSaefPny8v1/ajl+7QKXgXzMAIKP2rrjmLelW\non9AkhTvS2jekm5JIkhncvPN0nnnDR8fGJDG8MEvUGn4Vw0AyGhRR8/WAJ2S6B/Qoo6egCoKqR/8\nwGvbGBqgt2zx2jYI0EBF4l82ACCj3r5EUeNV5+qrvfD8pS+lj6fCs1kwdQEoC0I0ACCj+rrMF75l\nG68aV1yRC2L9AAAgAElEQVThBeS2tvRx5wjPQBUhRAMAMmpraVSstiZtLFZbo7aWxoAqCtill3oB\nef789PFUeAZQVXwL0Wb2EzN71cyeGjQ238ziZrYi+d/H/Xp+AMDotDY1aMGc6Wqoi8kkNdTFtGDO\n9Oq7qPBLX/LC86JF6eOEZ6Cq+bk6x42S/kvSzUPGr3HOXe3j8wIASqS1qaH6QnPKuedKt9wyfJzg\nDEA+hmjn3ENmNtmv4wMA4ItTT5Xuumv4OOEZwCBB9ERfaGZPJts9dg7g+QEAGO7oo722jaEBmrYN\nABmUO0RfJ+l9kmZIWivpO9nuaGYXmFmnmXWuW7euXPUBAKpNU5MXnh96KH2c8Awgh7KGaOfcK865\nAefcFkk/knRYjvte75xrds41T5w4sXxFAgCqw+TJXnhesSJ9nPAMoABl3fbbzPZyzq1N/vE0SU/l\nuj8AVKP2rrgWdfSoty+h+rqY2loaq/fiPj/U1Ulvvjl8nOAMoAi+hWgzu03ShyXtZmYvS/qWpA+b\n2QxJTtIaSf/s1/MDQBS1d8U1b0n31u22430JzVvSLUkE6dHKtgkK4RnACPi5OsfZGYZv8Ov5AKAS\nLOro2RqgUxL9A1rU0UOIHinCMwAflLWdAwCQW29foqhx5EB4BuAjtv0GgBCpr4sVNY4MzDIHaC4Y\nBFBChGgACJG2lkbFamvSxmK1NWpraQyoogghPAMoI9o5ACBEUn3PrM5RBNo2AASAEA0AIdPa1EBo\nLgThGUCACNEAgGghPAMIAUI0ACAaCM8AQoQQDQAIN8IzgBAiRAMAwonwDCDECNEAgHAhPAOIAEI0\nACAcCM8AIoTNVgAAwcq0Scp73sMmKQBCjZloIKm9K84GF0A5ZZp5PvJI6eGHy18LABSJEA3IC9Dz\nlnQr0T8gSYr3JTRvSbckEaSBUssUnk8+WbrrrvLXAgAjRDsHIG+L5VSATkn0D2hRR09AFaGStHfF\nNXvhMk2Ze49mL1ym9q540CUFI1PbxjnneC0bBGgAEcNMNCCpty9R1DhQKD7lUOaZ5wsukH74w/LX\nAgAlwkw0IKm+LlbUOFCoqv6UI9PM89e/7s08E6ABRBwhGpDU1tKoWG1N2listkZtLY0BVYRKUZWf\ncmQKz9/8pheev/OdYGoCgBKjnQPQto/VWZ0DpVZfF1M8Q2CuyE85MrVtXHWVdOml5a8FAHxGiAaS\nWpsaCM0oubaWxrSeaKkCP+XIFJ6/9z3pK18pfy0AUCaEaADwUcV+yuGcNCZDR+CPfyydf3756wGA\nMiNEA4DPKupTjmzh+dZbpbPPLn89ABAQQjQAIL8tW6SamuHjS5ZIp51W/noAIGCEaABAdgMD0nYZ\nflXcd590wgnlrwcAQoIQDQAYrr9f2n774eMPPih9+MNlLwcAwoZ1ogEA27z7rrfaxtAAvXSp1w9N\ngAYAScxEAwAk6e23pXHjho8/8og0e3b56wGAkCNEA0A1e/NNqa5u+Phf/iI1N5e/HgCICEI0AFSj\n9eul3XYbPt7dLU2bVv56ACBiCNEAUE3+/ndpr72Gj/f0SPvvX/56ACCiCNEAUA1efFGaNGn4+Jo1\nmccBADkRogGgkj33nLTffsPH43Gpvr789QBAhWCJOwCoRCtXekvVDQ3Qr77qLVVHgAaAUSFEA0Al\nefxxLzwPvTjwjTe88DxxYjB1AUCFoZ0DKLP2rrgWdfSoty+h+rqY2loa1drUEHRZiLo//CHzes4b\nNmRe/xkAMCqEaKCM2rvimrekW4n+AUlSvC+heUu6JYkgjZFZtkw69tjh4++8I8Vi5a9nhHhzCSBq\nCNHAEH7+Ml/U0bM1QKck+ge0qKOHwIDi3HOPdNJJw8f/8Y/hW3aHHG8uAUQRPdHAIKlf5vG+hJy2\n/TJv74qX5Pi9fYmixoFhbrjB63keGqD7+72e54gFaCn3m0sACCtmojEiUf/oNVv9fs8U19fFFM8Q\nmOvrovOxOwJy7bXSRRcNHx8YkMZEez6EN5cAoijaP3kRCL9na/2Wq36/f5m3tTQqVluTNharrVFb\nS2NJjo8K9O//7s08Dw3QW7Z4M88RD9BS9jeRvLkEEGbR/+mLsov6R6+56vf7l3lrU4MWzJmuhrqY\nTFJDXUwL5kyP1Cw+ymTuXC88X355+ngqPJsFU5cPeHMJIIpo50DRov7Ra676rzlrRtoFTlLpf5m3\nNjUQmpHdl78sff/7w8edK38tZZL69xDlFjEA1YcQjaJFva83V/38MkdgPv1p6ec/Hz5eweF5MN5c\nAogaQjSK1tbS6PtsrZ/y1c8vc5TVKadIv/nN8PEqCc8AEFWEaBQt6rO1Ua8fFeLoo6WHHho+TngG\ngEgwF4Ef2M3Nza6zszPoMgBg9A4+WOruHj4egZ/FAFANzGy5c6453/0KWp3DzGYXMgYAyMLM+29o\ngHaOAA0AEVToEnffK3AMADBYKjwPRXgGgEjL2RNtZkdI+qCkiWb29UE37SSpJvOjAABZ13EmOANA\nRch3YeH2ksYl7zd+0Phbkk73qygAiCzCMwBUhZwh2jn3e0m/N7MbnXMvlKkmAIgewjMAVJV87Rz/\n6Zy7SNJ/mdmw3wTOuVN8qwwAooDwDABVKV87x83J/1/tdyEAECmEZwCoavlC9CJJx0r6uHPusjLU\nAwDhRngGACh/iN7LzD4o6RQz+x9Jab89nHOP+1YZAIQJ4RkAMEi+EP2vkr4paW9Ji4fc5iQd40dR\nABAahGcAQAb5Vue4Q9IdZvZN59y/lakmAAge4RkAkEO+mWhJknPu38zsFEkfSg79zjl3t39lAUBA\nCM8AgAIUtO23mS2Q9DVJq5L/fc3M/p+fhQFAWbE9NwCgCAXNREs6UdIM59wWSTKzmyR1SfqGX4UB\nQFkw8wwAGIGCZqKT6gZ9PaHUhQBAWTHzDAAYhUJnohdI6jKzB+Utc/chSXN9qwoA/MLMMwCgBPKG\naDMzSY9ImiXpA8nhy5xzf/ezMAAoKcIzAKCE8oZo55wzs3udc9Ml3VWGmgCgdEIQntu74lrU0aPe\nvoTq62Jqa2lUa1ND2Z4fAFB6hfZEP25mH8h/t23M7Cdm9qqZPTVobBczW2pmzyb/v3NR1QJAoULS\n89zeFde8Jd2K9yXkJMX7Epq3pFvtXfGy1QAAKL1CQ/Thkv5kZs+b2ZNm1m1mT+Z5zI2SThgyNlfS\nA865/SQ9IPqqAZRaSMJzyqKOHiX6B9LGEv0DWtTRU/ZaAAClU+iFhS3FHtg595CZTR4yfKqkDye/\nvknS7yRdVuyxAWCYELRtZNLblyhqHAAQDTlDtJmNlfRFSftK6pZ0g3Nu8yiebw/n3Nrk13+XtMco\njgUAmcPzTjtJb75Z/loyqK+LKZ4hMNfXxQKoBgBQKvnaOW6S1CwvQH9M0ndK9cTOOScp6xSRmV1g\nZp1m1rlu3bpSPS2ASpGrbSMkAVqS2loaFautSRuL1daoraUxoIoAAKWQr53jwOSqHDKzGyT9eZTP\n94qZ7eWcW2tme0l6NdsdnXPXS7pekpqbm1mDCoAnpG0b2aRW4WB1DgCoLPlCdH/qC+fcZsv2y6tw\nd0k6T9LC5P9/PdoDAqgSmX7+TJwovZr1vXhotDY1EJoBoMLkC9GHmNlbya9NUiz5Z5PXkbFTtgea\n2W3yLiLczcxelvQteeH5l2Z2vqQXJJ05yvoBVLpM4fnAA6WVK8tfCwAASTlDtHOuJtfteR57dpab\njh3pMQFUCeekMRku2TjySOnhh8tfDwAAQxS6TjQA+M85b+Z5aIA+9VTvNgI0ACAkCNEAgjcwkDk8\nf/azXnhubw+kLAAAsiFEAwjOpk1eeN5uSGfZ17/uheef/jSYugAAyIMQDaD83nnHC8877JA+fsUV\nXnj+TsmWpAcAwBeFbvsNAKP31lvShAnDx6+9VvrqV8tfDwAAI0SILpP2rjibLaB6vfaat6bzUD/9\nqdf3DABAxBCiy6C9K655S7qV6B+QJMX7Epq3pFuSCNKobK+8Iu255/Dx22+XTj+9/PVUCN6UA0Dw\n6Ikug0UdPVsDdEqif0CLOnoCqgjw2Ysvej3PQwP0ffd5Pc8E6BFLvSmP9yXktO1NeXtXPOjSAKCq\nEKLLoLcvUdQ4EFnPPOOF50mT0scfe8wLzyecEExdFYQ35QAQDoToMqivixU1DkTOE0944bmxMX38\nySe98HzYYcHUVYF4Uw4A4UCILoO2lkbFatN3UI/V1qitpTHLI4CIeOwxLzzPmJE+/swzXniePj2Y\nuioYb8oBIBwI0WXQ2tSgBXOmq6EuJpPUUBfTgjnTuRAI0bVsmReeZ81KH3/hBS8877dfMHVVAd6U\nA0A4sDpHmbQ2NRCaEX2/+Y10yinDx//+d2mPPcpfTxVK/RxhdQ4ACBYhGkB+t90mfepTw8dff13a\neefy11PleFMOAMGjnQNAdtdf77VtDA3QGzZ4bRsEaABAlSJEAxju6qu98PzP/5w+nkh44XncuGDq\nAgAgJAjRALb513/1wnNbW/r4pk1eeB47Npi6AAAIGXqiAUhf+5r03e8OH9+8WaqpGT4OAECVI0QD\n1ezYY73l6obassWbkQYAABkRooFq1NjobYgylHPlrwUAgAgiRAPVZLfdpPXrh48TngEAKAohGqgG\n2VozKig8t3fF2YAEAFA2hGigklVBeJa8AD1vSbcS/QOSpHhfQvOWdEsSQRoA4AuWuAMqkVnmAO1c\nxQVoydsCOxWgUxL9A1rU0RNQRQCASsdMNFBJiph5rqT2h96+RFHjAACMFjPRQCUocuY51f4Q70vI\naVv7Q3tX3P9afVBfFytqHACA0SJEA1E2wraNSmt/aGtpVKw2fVOYWG2N2loaA6oIAFDpaOcAomiU\nFwxWWvtDqg2lUtpTAADhR4gGoiRLeJ694AEvNBZ4mPq6mOIZAnOU2x9amxoIzQCAsiFEA1GQJTxP\nvuxu74sil3Rra2lMWxJOov0BAIBiEKKBMMsx8zx0JjnV01xIiKb9AQCA0SFEA2GUp+e5d+49GW8u\npqeZ9gcAAEaOEI2qFcp1kgu8YLASe5oBAIgSlrgLqfauuGYvXKYpc+/R7IXLIrt+b1iFbp3kIpeq\nY0k3AACCRYgOodAFvAoUmnWSR7jOc2tTgxbMma6GuphMUkNdTAvmTA9+Jh0AgCpBO0cI5Qp4hKTS\nCHyd5FGu8yxFo6c5lC0zAACUADPRIRR4wKsCgW0TPcKZ5yjiExUAQCUjRIdQYAGvipS9p7iKwnNK\naFpmAADwASE6hNpaGlVbkx64amuMi8ZKqGw9xVUYnlP4RAUAUMnoiQ6rofmqgvNWUH2zvvYUZ+l5\nnnLZ3d5r7IqHpjfYr/PPMnwAgEpGiA6hRR096t+Snpr7t7iKvLAw1Teb+tg/nmP76khcpJYlPB9w\n+X0FvUa/DT2HH5k6Ub9aHvelNrYWBwBUMto5QqiaPgYvtG829Bep5WjbmL3ggVD0Bmc6h7f86UXf\namMZPgBAJWMmOoT8/Bg8bLO5hb5hGOmyf76/3gKWqgvLm6JM5zBbl1CpaovCMnwAAIwEM9Eh5NfK\nEWGczS10JZKRBFFfX28RFwyGZbWVYoIxfcsAAORGiA4hvz4GD+OSY4W+YRhJEPXl9Y5gtY2wbNGd\n7VwNfTX0LQMAkB/tHCHlx8fgYWkrGCz1GvO1XIzkIrWSvt5R7DBY6Gv0W7Zz+IlDG/Tg6nWhafEB\nACAKCNFVJKxLjhXyhmEkQbQkr7cE23NL4egNDkuYBwCgEhCiq0jUlxwrNoiO6vWWKDyHTRjCPAAA\nlYAQXUWqbSZyRK+3QsMzAAAoLXMRCAfNzc2us7Mz6DJQyQjPAABAkpktd84157sfM9FVLGxrRgeC\n8AwAAEaAEF2litluu+I4J43Jsroj4RkAABSAdaKrVBjXjPbdwIA385wpQOdY5xkAAGAoQnSVCuOa\n0b7ZtMkLz9tl+OCF8AwAAEaAEF2lwrIVta82bvTC8w47DLtp9oIH1P74ywEUBQAAKgE90QWoxAvw\nor5mdE6vvSZNnDhseP17JujQC2/x/lBNPeAAAKDkCNF5VOoFeBW5ZvQLL0iTJw8f339/zf7cdcN2\nL0z1gEf6NQMAgEAQovPIdQFe1MNXxexet3KlNG3a8PFjj5V++1tJUu/cezI+tCJ7wAEAgO8I0XlE\n+QK8SmxDSfPYY9KsWcPHP/EJ6Y470obq62LDZqJT4wAAAMUiROcR1fBVrjaUQIL60qXS8ccPH7/w\nQum73834kKj0gFf8Gx8fce4AAOVEiM4jKuFrqHzrQJcibJS9X/znP5c+/enh41deKf3f/5vzoVHo\nAa/U/vty4NwBAMrNXATWyG1ubnadnZ2BPX8UZ7gmZ+kBlrw3AUPfFCyYM73o1zR74bKMs/QNdTE9\nOveYoo6V07XXShddNHz8Jz+RPve50j1PwMp2PisQ5w4AUCpmttw515zvfsxEFyCKF+CZZd9DpFQX\nSvreL/6Nb0gLFgwfb2+XTj21NM8xQn68sYpy/33QOHcAgHIjRBcoSrPR7V3xojfhG0nY8K1f/Pzz\nvVnmoZYtkz7ykdEduwT8ah2Iav99GHDuAADlFsiOhWa2xsy6zWyFmQXXp1GgVGiK9yXktC00tXfF\ngy4to1TfcyY1ZhnHRxI22loaFautSRsbVb/4YYd5U+hDA/Ty5d60eggCtJS/33ykSn4+qwjnDgBQ\nbkFu+/0R59yMQnpOguZXaPJLrlnlsw/fp2Rho7WpQQvmTFdDXUwmr/90JL3V2m47Lzz/5S9pw0vb\nH/LC88yZRdfmJ79aB0p2PqsQ5w4AUG60cxQgav2W2T7a3vk9tbqydbqaJ+1SstaUUfWLZ5kVP+JL\nP9XanSYq1vm2Frw3Hrog5GfrQBT778OCcwcAKKegQrST9FszG5D0Q+fc9QHVUZCo9VtmW5bvWycf\nJMn/sJG3fzxLeJ7x1VvVF9tp65/DujNkVJc9BAAApRNUO8eRzrkZkj4m6ctm9qGhdzCzC8ys08w6\n161bV/4KB4lav2WQH23n7B83yxygN2zQlMvuTgvQKWGc7ad1AAAABL5OtJnNl7TROXd1tvsEvU60\nFK3VOYKUab3eNVedlPnOmzZJtbVZHyexzi8AACiv0K4TbWY7ShrjnNuQ/Pp4Sd8udx3Fot+yMINn\njrOG54EBaUz6hyC0SAAAgCgJoid6D0l3mvex/naSbnXO/W8AdQSqUme26+tienTesZlvzPGpR7Hb\nclfq+QMAANEQeDtHIcLQzlFKQzfrkEa+9XaoZLlg8IDL7yvpa6vY8wcAAAJXaDtHkOtEV62orTud\nV5YLBqdcdrdmL3ig5OG24s4fAACIHNaJDkDU1p3OKsvMc6pt4285HjqadoyKOX8AACCyCNEBiNq6\n08PkCc+5tHfFdcVvVuqNd/q3jqWWwUvJF64jf/4AAEDkEaLLYOis60emTtSvlsejtxLFKMKzlLmX\nOSXRP6D5d63UPzZv2Xr74HA9OEj7tZIHFysCAIBC0RPts0ybj/xqeVyfOLQhOpt1ZNskxbmCA7SU\nuZd5sL5Ef0G9zn5sdpJzkxgAAIAhmIn2WbaL4B5cvS78m4iMcuZ5qJH2LGd6XLZ1u0c6m5zrYsXQ\nvrkBAACBIUT7LJIXwZU4PKeCba5Hx2prNLZ2TFqvdEqhvc5D20WytYNkEsnvEwAACAztHD7LFgBD\neRFcido2BhvcJpFNXaxWC+ZM17dOPkix2pq024rpdR7N0ndBfJ/au+KavXCZpsy9R7MXLqN1BACA\nCGEm2meR2M46z8zzaC64y9UH3ZA8Vup+vX0JTYjVamztGPW901/Wpe/K/X0azaw5AAAIHiG6AKMJ\nkcVuZ11WBbRtjDbsZQuwJunRuccMO35fol+x2hpdc9aMos/RaJa+K/f3iR5sAACijRCdRylmDLNd\nBBeYInqeRxv28gXbUobJ0c4ml/P7RA82AADRRk90HhW1xfQIep5HG/baWhpz9jmXMkz6sfSdXyLV\nKw8AAIZhJjqPipgxHMVqG6PdHTBfm0Spdx8M3ax/FpHolQcAAFkRovOI9BbTWcLz5MvuVqy2Rgu6\n4nkDZynCXq5gW61hMtS98gAAIC9CdB4jCXmBbx+dIzynFNp37HfYq+YwGZVZcwAAMJy5Ea7/W07N\nzc2us7MzsOcvJhQPvRBR8kL34N5c30J2lvA85bK7M250YpL+tvDE0T8vAABAhTCz5c655nz3Yya6\nAMXMGOZbbcKX9YHz9DzXL1xW9paUwGfjAQAAfMTqHCWW70LEbCH7ol+sKH7XugJX28i3QkapDd6l\n0GnbGwV25AMAAJWCEF1i+ZYuy7WqR8Fhs8il6sq99FtFLQsIAACQAe0cJZbvQsRsq32kJPoHNP+u\nlZkDbpa2jfbHX/ZaJ+bek7V1go1EAAAASoeZ6BLLNevb3hXX2//YnPcYfYn+9NnoHDPP7Y+/HLrW\nCTYSAQAAlY6ZaB9kmvXNtGpHLos6etQ6c+/MNw5q2SjlttmlUq1rPwMAgOpBiC6TTGE3mzVXnZT5\nhgz9zmFsnajmtZ8BAEB1IESXSSGhtpjwnBLWHRXZSAQAAFQyQnQBSrHmcbawu/N7atX1rZbMDypg\nIxxaJwAAAMqPCwvzKNWax5nWal5z1UkZA3T74y8XFKCl8i9fBwAAALb9zmt2lt3+GupienTuMUUd\nKzWj/ei8YzPfIQLfCwAAgErGtt8lUsoL91pn7q3WTDcQngEAACKFdo48SrLmcZE7DAIAACDcmInO\nY1QX7mXZYTBbcC7FBYylOAYAAAByI0TnUfSax85JY7JM8OeYdR66GUvqAsbBNeRTimMAAAAgP0J0\nAQpa83jLFqmmZvj4hAlSX1/e5yjFzoNh3L0QAACgEtETPVoDA17bxtAAffzx3sxzAQFaKs0FjGHc\nvRAAAKASEaJHqr/fC8/bDZnMb2vzwnNHR1GHK8UFjCW5CBIAAAB5EaKLtWmTF5633z59/NprvfD8\nH/8xosNm2oyl2J0HS3EMAAAA5EdPdKE2b5Zqa4eP//KX0hlnjPrwRV/A6NMxAAAAkB87Fhait1dq\nSA+ip517tVZPPmjrFtssLQcAABB97FhYSq+/vvXLo/75x3qpbk/vD8mVLySxtBwAAEAVIUQXYto0\nTbnsbmWas+/tS4xqabmhM9gfmTpRD65ep96+hOreUyvnpDcT/cxuAwAAhAghukD1dTHFMywVl21c\nUtbxlEybo/z8Ty9uvf2Nd/rTjsXsNgAAQDiwOkeBcq18UZNle+9s4ymZZrBzSQxqHwEAAEBwCNEF\nam1q0II509VQF5NJaqiLbb2ocCDLxZnZxlNGsgkKG6cAAAAEj3aOImTb/rshS0tHQ55NTnK1guR6\nDAAAAILFTHQJjHSTk0yPy4WNUwAAAMKBmegSGOkmJ5keV6rVOVi3GgAAwD9stlKBhq76IXmz2Kke\nbgAAAGTGZisVqNDZ5dGsWw0AAID8CNERkWlN6WzrRmdbwYOVPQAAAEqDCwsjItfs8lDZVvBgZQ8A\nAIDSIERHRDGzyyNdLWSk2rvimr1wmabMvUezFy5Te1fcl+cBAAAIC9o5yqC9K64rfrNy6zbedbFa\nzT/loKL6k3NtOz7USFcLGYli2kwAAAAqBSHaZ+1dcbXd8YT6B7atgtKX6Ffb7U9IKjxotrU0qu32\nJ9S/ZdtxasdY1tnlbBvDlBoXMQIAgGpEO4fPFnX0pAXolP4tLmM/c06W588B4CJGAABQjQjRPssV\nJosJmpnCeP/ACIJ4iXERIwAAqEaEaJ/lCpNjzAq+GC+sM77lvogRAAAgDAjRPmtraVRtTea+iwHn\n5LTtYrxcQXokM77lWDWjtalBC+ZMV0NdTCapoS7GzogAAKDicWGhj1I7DPYPOI0xKXVNoEka2iWd\n72K8tpbGjFt5Z5vxLeeqGeW6iBEAACAsmIkuUqGzu5e3d+viX6zYuizdFueF3v88a0bWY+dqzSh2\nxreYzVkAAABQHGaii1Do7G57V1y3/OnFrLPN2dZ8dpJmL1yWdU3nYmZ8w9pDDQAAUAmYiS5CobO7\nizp6hgXolN6+RMaL8VIK6Y8uBKtmAAAA+IcQXYRCZ3dzzfbW18XSWjMyKUXbRb5VM9iqGwAAYOQI\n0UUodHY32/1M2hpiW5sa9OjcY7LulzLatotcPdSptpR4X6Lg1UEAAACwDSG6CNnaMN7ZtDktgGa6\nn0k6Z9Z7h/U0+9l2kQrqf1t4oh6de8zW5+aiQwAAgNEhRBchNbtbF6tNG3/jnf60mdxMs8DnzHqv\nHly9blj7RBCblVTrRYe0sAAAgFIJJESb2Qlm1mNmz5nZ3CBqGKnWpgbtuMPwRU2GzuQOngVua2nU\nr5bHM7ZPBLFZSTVedEgLCwAAKKWyL3FnZjWS/lvScZJelvQXM7vLObeq3LWMVLEzubnaJ1LL1pVz\ns5JiN26pBPm+BwAAAMUIYib6MEnPOef+6pzbJOl/JJ0aQB0jVuxMbtjaJ6pxq+6wfQ8AAEC0BbHZ\nSoOklwb9+WVJhwdQx4gVO5ObbXOVINsnqm2r7jB+DwAAQHSF9sJCM7vAzDrNrHPdunVBl5Om2Jnc\nIC4eRDq+BwAAoJSCmImOS9pn0J/3To6lcc5dL+l6SWpubs62AWBgipnJHby0XG9fQvV1saxbe8Mf\nfA8AAEApmXPlzadmtp2kZyQdKy88/0XSp5xzK7M9prm52XV2dpapQgAAAFQrM1vunGvOd7+yz0Q7\n5zab2VckdUiqkfSTXAEaAAAACJsg2jnknLtX0r1BPDcAAAAwWqG9sBAAAAAIK0I0AAAAUCRCNAAA\nAFCkQHqiK0F7V5zl0gAAAKoUIXoE2rviaTsWxvsSmrekW5II0gAAAFWAdo4RWNTRk7bltyQl+ge0\nqKMnoIoAAABQToToEejtSxQ1DgAAgMpCiB6B+rpYUeMAAACoLIToEWhraVSstiZtLFZbo7aWxoAq\nApV3TTkAAAojSURBVAAAQDlxYeEIpC4eXNTRo3hfQjVmaT3RXFwIAABQ2ZiJHqHWpoatM9IDzkna\ntkpHe1c84OoAAADgJ0L0KLBKBwAAQHWinWMUwr5KBxvCAAAA+IOZ6FEI8yodqQ1h4n0JOdFqAgAA\nUEqE6FEI8yodtJoAAAD4h3aOURi8SkfYWibC3moCAAAQZYToUWptaghFaB6qvi6meIbAHIZWEwAA\ngKijnaNChbnVBAAAIOqYia5QYW41AQAAiDpCdAULa6sJAABA1NHOAQAAABSJEA0AAAAUiRANAAAA\nFIkQDQAAABSJEA0AAAAUiRANAAAAFIkQDQAAABSJEA0AAAAUiRANAAAAFIkQDQAAABSJEA0AAAAU\nabugCwi79q64FnX0qLcvofq6mNpaGtXa1BB0WQAAAAgQITqH9q645i3pVqJ/QJIU70to3pJuSSJI\nAwAAVDHaOXJY1NGzNUCnJPoHtKijJ6CKAAAAEAaE6Bx6+xJFjQMAAKA6EKJzqK+LFTUOAACA6kCI\nzqGtpVGx2pq0sVhtjdpaGgOqCAAAAGHAhYU5pC4eZHUOAAAADEaIzqO1qYHQDAAAgDS0cwAAAABF\nIkQDAAAARSJEAwAAAEUiRAMAAABFIkQDAAAARSJEAwAAAEUiRAMAAABFIkQDAAAARSJEAwAAAEUi\nRAMAAABFIkQDAAAARSJEAwAAAEUiRAMAAABFIkQDAAAARSJEAwAAAEUiRAMAAABFIkQDAAAARTLn\nXNA15GVm6yS9EGAJu0l6LcDnr3ScX39xfv3F+fUP59ZfnF9/cX795ef5neScm5jvTpEI0UEzs07n\nXHPQdVQqzq+/OL/+4vz6h3PrL86vvzi//grD+aWdAwAAACgSIRoAAAAoEiG6MNcHXUCF4/z6i/Pr\nL86vfzi3/uL8+ovz66/Azy890QAAAECRmIkGAAAAikSIHsTM1phZt5mtMLPODLebmX3XzJ4zsyfN\nbGYQdUaRmTUmz2vqv7fM7KIh9/mwmb056D7/GlS9UWBmPzGzV83sqUFju5jZUjN7Nvn/nbM89gQz\n60n+XZ5bvqqjI8v5XWRmq5P//u80s7osj835s6TaZTm3880sPujf/8ezPJa/u3lkOb+/GHRu15jZ\niiyP5e9uDma2j5k9aGarzGylmX0tOc7P3hLIcX5D+bOXdo5BzGyNpGbnXMZ1B5M/1C+U9HFJh0u6\n1jl3ePkqrAxmViMpLulw59wLg8Y/LOkS59xJQdUWJWb2IUkbJd3snJuWHPsPSa875xYmf0Dv7Jy7\nbMjjaiQ9I+k4SS9L+ouks51zq8r6AkIuy/k9XtIy59xmM7tKkoae3+T91ijHz5Jql+Xczpe00Tl3\ndY7H8Xe3AJnO75DbvyPpTefctzPctkb83c3KzPaStJdz7nEzGy9puaRWSZ8VP3tHLcf53Vsh/NnL\nTHRxTpX3Q8k55/4kqS75DUdxjpX0/OAAjeI55x6S9PqQ4VMl3ZT8+iZ5P3yGOkzSc865v/7/9u4o\nxI6rjuP49wepaKPEaiFqa4lFEamUDZUaQyN5EDFFi1GQqthURQlWIYrWhz4YfROxIlUb0EqtBivR\nRKO0VCK0RKGpTZomkVRrIdiGmKKIabVYE/8+zFm9ve7N7rib3ZvN9wPDnTlz5u7Zw9n//vfMmbtV\n9SxwZ7tOA6bq36r6eVWdbIf30wV29TRi7M6EY3cGTte/SQK8B/j+vDZqkaiqY1W1r+0/BRwGLsLY\nOydG9e+4xl6T6OcqYFeSvUk+OsX5i4DHB46faGXq51pGB/DV7XbN3Ukum89GLRLLq+pY2/8jsHyK\nOo7jufEh4O4R56aLJZraJ9rP/7dH3A537M7eGuB4VT064rxjd4aSrABWAnsw9s65of4dNDax1yT6\nua6qqglgHXBDuyWmOZTkecA1wLYpTu8DLqmqy4FbgB/PZ9sWm+rWarle6wxIchNwEtg6ooqxpL9b\ngUuBCeAY8OWFbc6i9V5OPwvt2J2BJC8EfgRsqqoTg+eMvbM3qn/HLfaaRA+oqqPt9UlgB92tl0FH\ngVcOHF/cyjRz64B9VXV8+ERVnaiqp9v+XcB5SS6c7wae5Y5PLjFqr09OUcdxPAtJrgfeDry/RjxU\nMoNYoiFVdbyqTlXVv4BvMnWfOXZnIckS4F3AD0bVcexOL8l5dAne1qra3oqNvXNkRP+OZew1iW6S\nLG2L2EmyFHgrcGio2k7gunRW0T2YcQz1MXIWJMnL2no9klxJNz7/PI9tWwx2Ahva/gbgJ1PU+TXw\nmiSvancGrm3XaRpJ3gbcCFxTVX8fUWcmsURDhp4vWc/UfebYnZ23AI9U1RNTnXTsTq/9jroNOFxV\nNw+cMvbOgVH9O7axt6rcuj9oLgUebttvgJta+UZgY9sP8HXgMeAg3ROgC972s2UDltIlxcsGygb7\n9+Ot7x+me3Bg9UK3eZw3uj9GjgH/pFtb92HgpcAvgEeBXcBLWt1XAHcNXHs13VPij02OdbcZ9e/v\n6dY07m/bluH+HRVL3Kbt2++2uHqALrF4+XDftmPH7v/Rv6389sl4O1DXsduvb6+iW6pxYCAOXG3s\nPeP9O5ax14+4kyRJknpyOYckSZLUk0m0JEmS1JNJtCRJktSTSbQkSZLUk0m0JEmS1JNJtCTNsySn\nkuxPcijJtiTnz/H7X5/ka9PUWZtk9cDxxiTXzWU7JGkxM4mWpPn3TFVNVNXrgWfpPi99vq0F/pNE\nV9WWqrpjAdohSWclk2hJWli7gVcDJPlUm50+lGRTK1uR5JEkW5McTvLDyZnrJEeSXNj235Dk3uE3\nT/KOJHuSPJRkV5LlSVbQJe6fbDPia5JsTvLpds1EkvuTHEiyI8kFrfzeJF9M8kCS3yVZc+a7R5LG\nk0m0JC2QJEuAdcDBJFcAHwTeCKwCPpJkZav6WuAbVfU64ATwsR5f5pfAqqpaCdwJ3FhVR4AtwFfa\njPjuoWvuAD5bVZfT/RfBzw2cW1JVVwKbhsol6ZxiEi1J8+8FSfYDDwJ/AG6j+3e3O6rqb1X1NLAd\nmJzpfbyqftX2v9fqztTFwD1JDgKfAS47XeUky4AXV9V9reg7wJsHqmxvr3uBFT3aIUmLypKFboAk\nnYOeqaqJwYIkp6tfI45P8t/JkOePuPYW4Oaq2plkLbC5V0v/1z/a6yn8HSLpHOZMtCSNh93AO5Oc\nn2QpsL6VAVyS5E1t/310SzQAjgBXtP13j3jfZcDRtr9hoPwp4EXDlavqr8BfBtY7fwC4b7ieJJ3r\nTKIlaQxU1T7gduABYA/wrap6qJ3+LXBDksPABcCtrfzzwFeTPEg3MzyVzcC2JHuBPw2U/xRYP/lg\n4dA1G4AvJTkATABfmM33JkmLUaqG7xJKksZF+ySNn7WPw5MkjQlnoiVJkqSenImWJEmSenImWpIk\nSerJJFqSJEnqySRakiRJ6skkWpIkSerJJFqSJEnqySRakiRJ6unf8KCUlWjHoSQAAAAASUVORK5C\nYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = np.array(X[:, 1].A1)\n", + "f = model.predict(X).flatten()\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.plot(x, f, 'r', label='Prediction')\n", + "ax.scatter(data.Population, data.Profit, label='Traning Data')\n", + "ax.legend(loc=2)\n", + "ax.set_xlabel('Population')\n", + "ax.set_ylabel('Profit')\n", + "ax.set_title('Predicted Profit vs. Population Size')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. normal equation(正规方程)\n", + "正规方程是通过求解下面的方程来找出使得代价函数最小的参数的:$\\frac{\\partial }{\\partial {{\\theta }_{j}}}J\\left( {{\\theta }_{j}} \\right)=0$ 。\n", + " 假设我们的训练集特征矩阵为 X(包含了${{x}_{0}}=1$)并且我们的训练集结果为向量 y,则利用正规方程解出向量 $\\theta ={{\\left( {{X}^{T}}X \\right)}^{-1}}{{X}^{T}}y$ 。\n", + "上标T代表矩阵转置,上标-1 代表矩阵的逆。设矩阵$A={{X}^{T}}X$,则:${{\\left( {{X}^{T}}X \\right)}^{-1}}={{A}^{-1}}$\n", + "\n", + "梯度下降与正规方程的比较:\n", + "\n", + "梯度下降:需要选择学习率α,需要多次迭代,当特征数量n大时也能较好适用,适用于各种类型的模型\t\n", + "\n", + "正规方程:不需要选择学习率α,一次计算得出,需要计算${{\\left( {{X}^{T}}X \\right)}^{-1}}$,如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为$O(n3)$,通常来说当$n$小于10000 时还是可以接受的,只适用于线性模型,不适合逻辑回归模型等其他模型" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# 正规方程\n", + "def normalEqn(X, y):\n", + " theta = np.linalg.inv(X.T@X)@X.T@y#X.T@X等价于X.T.dot(X)\n", + " return theta" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[-3.89578088],\n", + " [ 1.19303364]])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_theta2=normalEqn(X, y)#感觉和批量梯度下降的theta的值有点差距\n", + "final_theta2" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#梯度下降得到的结果是matrix([[-3.24140214, 1.1272942 ]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在练习2中,我们将看看分类问题的逻辑回归。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/code/ex1-linear regression/ex1.pdf b/code/ex1-linear regression/ex1.pdf new file mode 100644 index 00000000..dda3e963 Binary files /dev/null and b/code/ex1-linear regression/ex1.pdf differ diff --git a/code/ex1-linear regression/ex1data1.txt b/code/ex1-linear regression/ex1data1.txt new file mode 100644 index 00000000..0f88ccb6 --- /dev/null +++ b/code/ex1-linear regression/ex1data1.txt @@ -0,0 +1,97 @@ +6.1101,17.592 +5.5277,9.1302 +8.5186,13.662 +7.0032,11.854 +5.8598,6.8233 +8.3829,11.886 +7.4764,4.3483 +8.5781,12 +6.4862,6.5987 +5.0546,3.8166 +5.7107,3.2522 +14.164,15.505 +5.734,3.1551 +8.4084,7.2258 +5.6407,0.71618 +5.3794,3.5129 +6.3654,5.3048 +5.1301,0.56077 +6.4296,3.6518 +7.0708,5.3893 +6.1891,3.1386 +20.27,21.767 +5.4901,4.263 +6.3261,5.1875 +5.5649,3.0825 +18.945,22.638 +12.828,13.501 +10.957,7.0467 +13.176,14.692 +22.203,24.147 +5.2524,-1.22 +6.5894,5.9966 +9.2482,12.134 +5.8918,1.8495 +8.2111,6.5426 +7.9334,4.5623 +8.0959,4.1164 +5.6063,3.3928 +12.836,10.117 +6.3534,5.4974 +5.4069,0.55657 +6.8825,3.9115 +11.708,5.3854 +5.7737,2.4406 +7.8247,6.7318 +7.0931,1.0463 +5.0702,5.1337 +5.8014,1.844 +11.7,8.0043 +5.5416,1.0179 +7.5402,6.7504 +5.3077,1.8396 +7.4239,4.2885 +7.6031,4.9981 +6.3328,1.4233 +6.3589,-1.4211 +6.2742,2.4756 +5.6397,4.6042 +9.3102,3.9624 +9.4536,5.4141 +8.8254,5.1694 +5.1793,-0.74279 +21.279,17.929 +14.908,12.054 +18.959,17.054 +7.2182,4.8852 +8.2951,5.7442 +10.236,7.7754 +5.4994,1.0173 +20.341,20.992 +10.136,6.6799 +7.3345,4.0259 +6.0062,1.2784 +7.2259,3.3411 +5.0269,-2.6807 +6.5479,0.29678 +7.5386,3.8845 +5.0365,5.7014 +10.274,6.7526 +5.1077,2.0576 +5.7292,0.47953 +5.1884,0.20421 +6.3557,0.67861 +9.7687,7.5435 +6.5159,5.3436 +8.5172,4.2415 +9.1802,6.7981 +6.002,0.92695 +5.5204,0.152 +5.0594,2.8214 +5.7077,1.8451 +7.6366,4.2959 +5.8707,7.2029 +5.3054,1.9869 +8.2934,0.14454 +13.394,9.0551 +5.4369,0.61705 diff --git a/code/ex1-linear regression/ex1data2.txt b/code/ex1-linear regression/ex1data2.txt new file mode 100644 index 00000000..79e9a807 --- /dev/null +++ b/code/ex1-linear regression/ex1data2.txt @@ -0,0 +1,47 @@ +2104,3,399900 +1600,3,329900 +2400,3,369000 +1416,2,232000 +3000,4,539900 +1985,4,299900 +1534,3,314900 +1427,3,198999 +1380,3,212000 +1494,3,242500 +1940,4,239999 +2000,3,347000 +1890,3,329999 +4478,5,699900 +1268,3,259900 +2300,4,449900 +1320,2,299900 +1236,3,199900 +2609,4,499998 +3031,4,599000 +1767,3,252900 +1888,2,255000 +1604,3,242900 +1962,4,259900 +3890,3,573900 +1100,3,249900 +1458,3,464500 +2526,3,469000 +2200,3,475000 +2637,3,299900 +1839,2,349900 +1000,1,169900 +2040,4,314900 +3137,3,579900 +1811,4,285900 +1437,3,249900 +1239,3,229900 +2132,4,345000 +4215,4,549000 +2162,4,287000 +1664,2,368500 +2238,3,329900 +2567,4,314000 +1200,3,299000 +852,2,179900 +1852,4,299900 +1203,3,239500 diff --git a/code/ex2-logistic regression/1. logistic_regression_v1.ipynb b/code/ex2-logistic regression/1. logistic_regression_v1.ipynb new file mode 100644 index 00000000..f1c36cde --- /dev/null +++ b/code/ex2-logistic regression/1. logistic_regression_v1.ipynb @@ -0,0 +1,1902 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. logistic_regression(逻辑回归)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 备注\n", + "运行环境:python 3.6 \n", + "现在我知道我应该考虑列向量,而Tensorflow对数据的形状非常挑剔。 但是在numpy中,正常的一维ndarray已经被表示为列向量。 如果我重新塑造$\\mathbb{R}^n$ 为 $\\mathbb{R}^{n\\times1}$,它不再是列向量了,而是是1列的矩阵,那使用scipy会有麻烦。\n", + "*所以我们应该把TensorFlow的数据视为特殊情况。 我们继续使用numpy的惯例。" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "plt.style.use('fivethirtyeight')\n", + "import matplotlib.pyplot as plt\n", + "# import tensorflow as tf\n", + "from sklearn.metrics import classification_report#这个包是评价报告" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 准备数据" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
exam1exam2admitted
034.62366078.0246930
130.28671143.8949980
235.84740972.9021980
360.18259986.3085521
479.03273675.3443761
\n", + "
" + ], + "text/plain": [ + " exam1 exam2 admitted\n", + "0 34.623660 78.024693 0\n", + "1 30.286711 43.894998 0\n", + "2 35.847409 72.902198 0\n", + "3 60.182599 86.308552 1\n", + "4 79.032736 75.344376 1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv('ex2data1.txt', names=['exam1', 'exam2', 'admitted'])\n", + "data.head()#看前五行" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
exam1exam2admitted
count100.000000100.000000100.000000
mean65.64427466.2219980.600000
std19.45822218.5827830.492366
min30.05882230.6032630.000000
25%50.91951148.1792050.000000
50%67.03298867.6823811.000000
75%80.21252979.3606051.000000
max99.82785898.8694361.000000
\n", + "
" + ], + "text/plain": [ + " exam1 exam2 admitted\n", + "count 100.000000 100.000000 100.000000\n", + "mean 65.644274 66.221998 0.600000\n", + "std 19.458222 18.582783 0.492366\n", + "min 30.058822 30.603263 0.000000\n", + "25% 50.919511 48.179205 0.000000\n", + "50% 67.032988 67.682381 1.000000\n", + "75% 80.212529 79.360605 1.000000\n", + "max 99.827858 98.869436 1.000000" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.set(context=\"notebook\", style=\"darkgrid\", palette=sns.color_palette(\"RdBu\", 2))\n", + "\n", + "sns.lmplot('exam1', 'exam2', hue='admitted', data=data, \n", + " size=6, \n", + " fit_reg=False, \n", + " scatter_kws={\"s\": 50}\n", + " )\n", + "plt.show()#看下数据的样子" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def get_X(df):#读取特征\n", + "# \"\"\"\n", + "# use concat to add intersect feature to avoid side effect\n", + "# not efficient for big dataset though\n", + "# \"\"\"\n", + " ones = pd.DataFrame({'ones': np.ones(len(df))})#ones是m行1列的dataframe\n", + " data = pd.concat([ones, df], axis=1) # 合并数据,根据列合并\n", + " return data.iloc[:, :-1].as_matrix() # 这个操作返回 ndarray,不是矩阵\n", + "\n", + "\n", + "def get_y(df):#读取标签\n", + "# '''assume the last column is the target'''\n", + " return np.array(df.iloc[:, -1])#df.iloc[:, -1]是指df的最后一列\n", + "\n", + "\n", + "def normalize_feature(df):\n", + "# \"\"\"Applies function along input axis(default 0) of DataFrame.\"\"\"\n", + " return df.apply(lambda column: (column - column.mean()) / column.std())#特征缩放" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(100, 3)\n", + "(100,)\n" + ] + } + ], + "source": [ + "X = get_X(data)\n", + "print(X.shape)\n", + "\n", + "y = get_y(data)\n", + "print(y.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# sigmoid 函数\n", + "g 代表一个常用的逻辑函数(logistic function)为S形函数(Sigmoid function),公式为: \\\\[g\\left( z \\right)=\\frac{1}{1+{{e}^{-z}}}\\\\] \n", + "合起来,我们得到逻辑回归模型的假设函数: \n", + "\t\\\\[{{h}_{\\theta }}\\left( x \\right)=\\frac{1}{1+{{e}^{-{{\\theta }^{T}}X}}}\\\\] \n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sigmoid(z):\n", + " return 1 / (1 + np.exp(-z))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi4AAAGmCAYAAABbQQ/3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8FPXh//H37Mxu7kASAnIFIQLWogJq1a8iFkXrfaAC\nKrFK61WtWopH+9V6IKjVflW8rdXWeoBoW/HXaouiWKwWUFSsULkiAYUkJCSba4/5/P4IrIQkSEKS\nye6+no8Hj92d2Z19T5bdvDOfmVnLGGMEAAAQB3xeBwAAANhTFBcAABA3KC4AACBuUFwAAEDcoLgA\nAIC4QXEBAABxg+ICJJgbb7xRw4cP9zpGi2bPnq3hw4erpKSkQ+733nvv6aSTTtKIESN0/vnnd2TU\nNnFdt0nWDz74QMOHD9crr7ziWSYgUTleBwDQsSZOnKgjjzzS6xgtGj9+vAoKCpSbm7vXy3JdV9Om\nTZNt27rpppu0zz77dEDCtgsGg/rhD3+osWPH6uqrr5YkFRYW6p577tHo0aM9yQQkMooLkGBGjRql\nUaNGeR2jRfvvv7/233//DllWaWmptm7dqosvvlgXXHBBhyyzPSorK/Xpp59q7NixsWm9evXSGWec\n4VkmIJExVAQgLoXDYUlSRkaGx0kAdCWKCxBHtm3bphtvvFHHHnusRowYoeOPP1733XefGhoaYvdp\naR+XtWvX6oorrtChhx6qww8/XDNmzNDcuXOb7Ecye/ZsjRo1SqtXr9bFF1+skSNHasyYMXryySdl\njNFTTz2lY489VqNGjdLUqVOb7X+yceNGTZ8+XUcccYQOPPBAnX766Zo7d26T+7S078qXX36pq6++\nWocddpgOP/xw3X333bFS0prZs2fruOOOkyQ99NBDGj58uD744INW943Zdfrs2bN14IEHav369brs\nsss0atQoHXbYYbrhhhtUUVHR5LHBYFAzZ87Uscceq4MPPlinnXaaXnrpJUmN+7LsmqOkpKTFfVyi\n0ah++9vf6sQTT9SIESN09NFH61e/+pW2bt0au8+Oxy1evFi33XabjjzySB188MG66KKLtHLlyt3+\nTIBkwVAREEeuvfZa/ec//1FRUZF69+6tjz76SE888YQqKyt1xx13tPiYTZs2xXZcveSSS+Q4jp57\n7jnNnz+/2X3D4bAuuugiHX/88TrhhBP08ssv695779X777+vjRs36oc//KEqKir029/+VjfddJOe\nffZZSdKGDRt03nnnqaGhQRdeeKHy8/P197//XTfffLPWr1+v66+/vsVsZWVlmjRpUux5U1NT9fzz\nzzcrD7saP368srKyNGvWLI0fP17jx49XYWGh/v3vf+/xz9J1XRUVFenQQw/VDTfcoE8//VTz5s1T\nfX29HnjgAUlSKBTSBRdcoC+++ELnnXee9t9/f73zzjv63//9X9XV1enkk0/WTTfd1CRHbm6uNm7c\n2Oz5rrvuOr3xxhs64YQTVFRUpHXr1umFF17Q+++/r5deeknZ2dmx+/7v//6vevfurSuvvFLbtm3T\nb3/7W/34xz/WwoUL5Th8bCO58Q4A4kR5ebnee+89XX/99Zo6daok6dxzz5UxRhs2bGj1cQ899JCq\nq6v16quvqrCwUJJ0xhln6Ac/+EGz+4bDYZ1++um64YYbJEmHHXaYTjnlFH300UdasGBBbKfajRs3\n6rXXXlMoFFIgENBvfvMbVVZWat68efrud78rSbrgggt05ZVX6ne/+53OOussDR06tNnzPfXUU9q6\ndatefvnl2OPOOussnXrqqaqtrW11nfbff39lZmZq1qxZGj58eLv2J4lEIjr55JN14403SpImTZqk\nzZs3a8GCBaqrq1NaWprmzZunlStX6t5779Vpp50mqXHn5wsvvFBPPPGELrzwQh1//PHfmmPRokV6\n4403VFRUpF/+8pex6YcccoiuvfZaPfbYY03KXV5enp5//nnZti1JCgQCuu+++/TBBx/oqKOOavO6\nAomEoSIgTmRlZSk9PV3PP/+83njjjdgv9lmzZumZZ55p8THGGL355psaM2ZMrLRIUp8+fXT66ae3\n+Jjjjz8+dn3fffeVJI0ePbrJkUADBgyQMUZlZWWKRqN6++23dfTRR8fKhyT5fD5dfvnlMsborbfe\navG5Fi1apAMPPLDJ4/Ly8nTKKafs/ofRQU466aQmt7/zne8oEomosrJSkvT2228rNzdXp556auw+\nlmXpnnvu0XPPPSfLsvboeXas/2WXXdbs+QcPHqw333yzyfQTTjghVlp25JIad0gGkh3FBYgTgUBA\nt99+u8rLy/XTn/5Uhx9+uKZOnao5c+Y02cdlZ5WVlaqsrIwVkJ0NGTKkxcf06tUrdn3HsEReXl6T\n++z4peq6rioqKlRbW6vBgwc3W9aOstTS0MmO6QUFBXucraPtelh2IBCQ1Lg/ivRNvl0LSv/+/TVo\n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\njNExxxyjfffdV5I0cuRITZs2rcl95s6dqxdffFGO4+iKK67Q97//fQ+Stk91dbWmT5+uYDCocDis\nG2+8UaNGjWpyn3h9DV3X1a233qpVq1YpEAhoxowZGjRoUGz+W2+9pYcffliO42jChAk677zzPEzb\nPuFwWL/4xS+0ceNGhUIhXXHFFTruuONi85955hm99NJLsc+T2267TUOGDPEqbrudddZZyszMlCQN\nGDBAs2bNis1LhNfxlVde0Z/+9CdJUkNDgz7//HMtXrxY2dnZkuL/dfz4449177336tlnn1VxcbFu\nvPFGWZaloUOH6le/+pV8vm+2f3zb+7bDGMTccccd5sQTTzTXXnttbNrpp59uiouLjeu65kc/+pH5\n7LPPmjzmd7/7nXnwwQeNMca89tpr5o477ujSzB3h0ksvNe+++26z6ZMmTTLl5eUeJOoY69evN5dd\ndlmr87ds2WJOPfVU09DQYKqqqmLX48UDDzxgnn76aWOMMWvWrDFnnnlms/vE62v4xhtvmBtuuMEY\nY8xHH31kLr/88ti8UChkjj/+eFNZWWkaGhrM2WefbUpLS72K2m7z5s0zM2bMMMYYU1FRYcaOHdtk\n/rRp08ynn37qQbKOU19fb84444wW5yXK67izW2+91bz44otNpsXz6/jEE0+YU0891Zx77rnGGGMu\nu+wy8/777xtjjLn55pvN3//+9yb33937tiMxVLST0aNH69Zbb43dDgaDCoVCKigokGVZOvroo/Xe\ne+81ecyyZcs0ZswYSdIxxxyjf/3rX10Zea/9/e9/V3Z2to4++ugm013XVXFxsW655RZNmjRJ8+bN\n8yhh+3322WfavHmzpkyZoh//+Mdau3Ztk/mffPKJRo0apUAgoKysLBUUFGjlypUepW27H/7wh5o0\naZIkKRqNKiUlpcn8eH4Nd35fjRw5UitWrIjNW7NmjQoKCtSjRw8FAgEdcsghWrJkiVdR2+0HP/iB\nrrnmGkmNWwdt224y/7PPPtMTTzyhyZMn6/HHH/ci4l5buXKl6urqdMkll6ioqEjLly+PzUuU13GH\nTz/9VKtXr9bEiRObTI/n17GgoECzZ8+O3f7ss8/0ve99T1Lj77vd/T7c9X3bkZJyqOill17S73//\n+ybTZs6cqZNPPlkffPBBbFowGIxt4pSkjIwMbdiwocnjgsFgbNN7RkaGqqurOzF5+7S2vgcddJAe\nf/xx/eY3v2n2mNraWl144YW6+OKLFY1GVVRUpBEjRmj//ffvqtht0tI63nLLLbr00kt10kknaenS\npZo+fbpefvnl2PydXzup8fULBoNdlrktdvcalpaWavr06frFL37RZH68vYY72/W9Z9u2IpGIHMeJ\nq9dtd3YM3wWDQf30pz/Vtdde22T+KaecovPPP1+ZmZm66qqrtHDhwrgaypSk1NRUTZ06Veeee67W\nr1+vH//4x3r99dcT6nXc4fHHH9dPfvKTZtPj+XU88cQTVVJSErttjJFlWZJa/n23u/dtR0rK4nLu\nuefq3HPP/db7ZWZmqqamJna7pqYmNm7Z0n1amt8dtLa+q1evVnZ2dotjkGlpaSoqKlJaWpok6Ygj\njtDKlSu77S+9ltaxrq4u9lfsoYceqi1btjR547X0+nbX/T9aew1XrVqln/3sZ7r++utjfwntEG+v\n4c52fW1c1419+MXT6/ZtvvrqK/3kJz/R+eefr9NOOy023Rijiy66KLZeY8eO1X/+85+4+YW3w+DB\ngzVo0CBZlqXBgwerZ8+eKi0tVd++fRPqdayqqtK6det0xBFHNJmeKK/jDjvvz/Jtvw+lpu/bDs3R\n4UtMIJmZmfL7/fryyy9ljNE///lPHXrooU3uM3r0aL3zzjuSpEWLFumQQw7xImq7vPfeezrmmGNa\nnLd+/XpNnjxZ0WhU4XBYH374ob773e92ccK989BDD8W2UqxcuVJ9+/aNlRZJOuigg7Rs2TI1NDSo\nurpaa9as0bBhw7yK22arV6/WNddco/vuu09jx45tNj+eX8PRo0dr0aJFkhp3kN/5dSksLFRxcbEq\nKysVCoW0dOnSZjslx4OysjJdcsklmj59us4555wm84LBoE499VTV1NTIGKMPPvhAI0aM8Chp+82b\nN0933XWXJGnz5s0KBoPKz8+XlDivoyQtWbJERx55ZLPpifI67nDAAQfERiUWLVrU4u/D1t63HSkp\nt7i0xW233aaf//znikajOvroo3XwwQdLki655BI99thjmjx5sm644QZNnjxZfr8/djRSPFi3bp2O\nOuqoJtOefvppFRQU6LjjjtMZZ5yh8847T36/X2eccYaGDh3qUdL2ufTSSzV9+nS98847sm07djTD\nzus4ZcoUnX/++TLG6Lrrrmu2n0h3dt999ykUCunOO++U1Fi0H3300YR4DcePH6/Fixdr0qRJMsZo\n5syZmj9/vmprazVx4kTdeOONmjp1qowxmjBhgvr06eN15DZ77LHHVFVVpUceeUSPPPKIpMYta3V1\ndZo4caKuu+46FRUVKRAI6Mgjj2yxnHZ355xzjm666SZNnjxZlmVp5syZ+tvf/pZQr6PU+Fk6YMCA\n2O2d/68mwuu4ww033KCbb75Zv/nNbzRkyBCdeOKJkqTrr79e1157bYvv287At0MDAIC4wVARAACI\nGxQXAAAQNyguAAAgblBcAABA3KC4AACAuEFxAQAAcYPiAgAA4gbFBQAAxA2KCwAAiBuc8h9At/bB\nBx+oqKio1fmzZs3S2Wef3YWJAHiJU/4D6NbKysq0ePHiJtMikYjuueceRaNRvfLKKyooKPAoHYCu\nxhYXAN1ar169dMYZZzSZdtttt2nbtm165JFHKC1AkmEfFwBx5aWXXtLzzz+vK664QuPGjfM6DoAu\nxlARgLjx4YcfqqioSEcccYSeeOIJ+Xz87QUkG4oLgLiwefNmTZgwQYFAQK+88op69uzpdSQAHmAf\nFwDdXkNDg6688kpVVVXpxRdfpLQASYziAqDbu/nmm7VixQrdfffdOuCAA7yOA8BDFBcA3dpzzz2n\nv/zlLzrssMOUlpamV199VTuPcBcUFGjUqFEeJgTQlSguALq1Tz/9VJK0ZMkSLVmypNn8s846i+IC\nJBF2zgUAAHGDYwkBAEDcoLgAAIC4QXEBAABxg+ICAADiBsUFAADEDYoLAACIGxQXAAAQNyguAAAg\nblBcAABA3KC4AACAuPH/AcjaArQEMTkZAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(figsize=(8, 6))\n", + "ax.plot(np.arange(-10, 10, step=0.01),\n", + " sigmoid(np.arange(-10, 10, step=0.01)))\n", + "ax.set_ylim((-0.1,1.1))\n", + "ax.set_xlabel('z', fontsize=18)\n", + "ax.set_ylabel('g(z)', fontsize=18)\n", + "ax.set_title('sigmoid function', fontsize=18)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cost function(代价函数)\n", + "> * $max(\\ell(\\theta)) = min(-\\ell(\\theta))$ \n", + "> * choose $-\\ell(\\theta)$ as the cost function\n", + "\n", + "$$\\begin{align}\n", + " & J\\left( \\theta \\right)=-\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[{{y}^{(i)}}\\log \\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)+\\left( 1-{{y}^{(i)}} \\right)\\log \\left( 1-{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)]} \\\\ \n", + " & =\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[-{{y}^{(i)}}\\log \\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)-\\left( 1-{{y}^{(i)}} \\right)\\log \\left( 1-{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)]} \\\\ \n", + "\\end{align}$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0., 0., 0.])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "theta = theta=np.zeros(3) # X(m*n) so theta is n*1\n", + "theta" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def cost(theta, X, y):\n", + " ''' cost fn is -l(theta) for you to minimize'''\n", + " return np.mean(-y * np.log(sigmoid(X @ theta)) - (1 - y) * np.log(1 - sigmoid(X @ theta)))\n", + "\n", + "# X @ theta与X.dot(theta)等价" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.69314718055994529" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost(theta, X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# gradient descent(梯度下降)\n", + "* 这是批量梯度下降(batch gradient descent) \n", + "* 转化为向量化计算: $\\frac{1}{m} X^T( Sigmoid(X\\theta) - y )$\n", + "$$\\frac{\\partial J\\left( \\theta \\right)}{\\partial {{\\theta }_{j}}}=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{({{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}})x_{_{j}}^{(i)}}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradient(theta, X, y):\n", + "# '''just 1 batch gradient'''\n", + " return (1 / len(X)) * X.T @ (sigmoid(X @ theta) - y)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ -0.1 , -12.00921659, -11.26284221])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gradient(theta, X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# 拟合参数\n", + "> * 这里我使用 [`scipy.optimize.minimize`](http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize) 去寻找参数 \n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import scipy.optimize as opt" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "res = opt.minimize(fun=cost, x0=theta, args=(X, y), method='Newton-CG', jac=gradient)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 0.20349770172083584\n", + " jac: array([ 1.98942032e-06, 1.34698328e-04, 1.47259166e-04])\n", + " message: 'Optimization terminated successfully.'\n", + " nfev: 73\n", + " nhev: 0\n", + " nit: 30\n", + " njev: 270\n", + " status: 0\n", + " success: True\n", + " x: array([-25.16227358, 0.20623923, 0.20147921])\n" + ] + } + ], + "source": [ + "print(res)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 用训练集预测和验证" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def predict(x, theta):\n", + " prob = sigmoid(x @ theta)\n", + " return (prob >= 0.5).astype(int)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.87 0.85 0.86 40\n", + " 1 0.90 0.92 0.91 60\n", + "\n", + "avg / total 0.89 0.89 0.89 100\n", + "\n" + ] + } + ], + "source": [ + "final_theta = res.x\n", + "y_pred = predict(X, final_theta)\n", + "\n", + "print(classification_report(y, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 寻找决策边界\n", + "http://stats.stackexchange.com/questions/93569/why-is-logistic-regression-a-linear-classifier\n", + "> $X \\times \\theta = 0$ (this is the line)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-25.16227358 0.20623923 0.20147921]\n" + ] + } + ], + "source": [ + "print(res.x) # this is final theta" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 124.88769463 -1.0236254 -1. ]\n" + ] + } + ], + "source": [ + "coef = -(res.x / res.x[2]) # find the equation\n", + "print(coef)\n", + "\n", + "x = np.arange(130, step=0.1)\n", + "y = coef[0] + coef[1]*x" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
exam1exam2admitted
count100.000000100.000000100.000000
mean65.64427466.2219980.600000
std19.45822218.5827830.492366
min30.05882230.6032630.000000
25%50.91951148.1792050.000000
50%67.03298867.6823811.000000
75%80.21252979.3606051.000000
max99.82785898.8694361.000000
\n", + "
" + ], + "text/plain": [ + " exam1 exam2 admitted\n", + "count 100.000000 100.000000 100.000000\n", + "mean 65.644274 66.221998 0.600000\n", + "std 19.458222 18.582783 0.492366\n", + "min 30.058822 30.603263 0.000000\n", + "25% 50.919511 48.179205 0.000000\n", + "50% 67.032988 67.682381 1.000000\n", + "75% 80.212529 79.360605 1.000000\n", + "max 99.827858 98.869436 1.000000" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.describe() # find the range of x and y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "> you know the intercept would be around 125 for both x and y" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdkAAAGlCAYAAAC2p4y4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xlc1HX+wPHXzHDIoYCKiApJaHgHqVjmUXhkouKFisCg\nbZu55apbm5V2bNd2rLtr2rZdmwwIKgpeVGqmlpUHnmWeaAoqioAYcs7A7w9/TI4ocszwHYb38/Fw\nt/nOd77fN5Tz/r4/p6qioqICIYQQQpidWukAhBBCCFslSVYIIYSwEEmyQgghhIVIkhVCCCEsRJKs\nEEIIYSGSZIUQQggLkSQrFPP8888TEBBg8qdHjx4MHjyYv/71r5w4ccKi94+OjiYkJKRWn1m8eDEB\nAQFkZmZaKKqqdu3aVeX31KVLF/r168cf/vAH9u3b12Cx1EVycjIBAQHs2rVL6VCEaHB2SgcgxAsv\nvICHhwcARUVFnD17ltWrV7Nx40Y++eQT+vXrZ5H7PvnkkxQVFdXqM8OGDcPX15eWLVtaJKY73XvY\nsGEAGAwGLl++zNq1a4mJiSExMZEePXo0eExCiOpJkhWKGzp0KB06dDA5Fh0dzYQJE5gzZw5ff/01\nLi4uZr/vgw8+WOvPdOnShS5dupg9lpoICAggLCzM5NjEiRMJCQnh448/5v3331ckLiHE7UlzsbBK\n3t7ezJs3j9zcXFavXq10OFarZcuW3HPPPRZvWhdC1I0kWWG1RowYgYODA999953J8f379zN9+nSC\ngoIICgriscce49ChQ1U+f/DgQf74xz/Sp08f+vXrxxNPPMGxY8eM79/cJ1taWsqbb77JkCFDjH3D\nf/vb38jPzzeec6s+2by8PF599VUGDhxIjx49eOSRR/j4448xGAwmn+vZsye//vorM2bMICgoiL59\n+zJv3jzy8vLq/DuqqKjg4sWL+Pr6mhwvKipi4cKFhISE0KNHD0JCQvjHP/5h0jx+u77Sm49Xvj56\n9CjPPPMMffv2JSgoiD/96U9V+qZzcnJ44YUXuP/+++nduzcvvPACv/32W5W4z5w5w7x58xg0aBA9\nevQgODiYJ5980uRhofK+GzduJCQkhHvvvZe33nqLXr16MXv27CrXTExMJCAgQB44hFWR5mJhtRwd\nHfH19eXo0aPGY99//z0zZsygS5cuzJ49m9LSUpKTk4mMjOTzzz+nT58+AKSlpTFt2jTatGnD448/\nTrNmzdDpdGi1WlavXl2leRrgtddeY8OGDWi1Wnx8fDhx4gTLli3jzJkz/O9//7tljPn5+UyZMoVz\n584xZcoU/Pz8+P7771m4cCG//PIL//73v43nlpeXo9Vq6dOnD/PmzeOnn35i1apVFBcXs2jRojv+\nPoqKisjNzQWuJ9fc3FyWLl1KTk4OM2bMMJ5XWlrK9OnTOXDgAOPHj6dHjx4cOnSITz75hL1796LT\n6bC3t6/Zv4QbzJw5E39/f+bOnUtGRgaxsbFcunSJVatWAVBSUkJUVBSZmZlotVo8PT1JSUnhq6++\nMrnO5cuXmTRpEq6urkRFReHh4cGRI0dYuXIlhw8f5ptvvjGJb/78+URFReHq6kpgYCAXLlxg+/bt\nFBUV4eTkZDwvNTWVgIAAOnfuXOufTQhLkSQrrFqLFi04e/YscD1JvfLKK/Ts2ZP4+Hg0Gg0AUVFR\njB07ljfeeIM1a9YA8M477+Du7s7q1auNg6oGDx7MyJEjSUhI4Lnnnqtyr/Xr1zNhwgT+8pe/GI85\nOzvz3Xffce3atVv2C3/yySf8+uuvfPDBBwwdOhSAyMhI/va3v5GQkMC4ceMYPHgwAHq9npEjR/L8\n888DMGXKFC5evMjXX39dJWHcymeffcZnn31W5fhjjz1GUFCQ8fXq1avZv38/L7zwAtOmTQNg6tSp\ndOrUiffee4+VK1cSGRlZ7b1upUePHixevNj4urCwkOXLl/Prr7/SsWNHkpKSOHXqlMnvYtKkSYSH\nh3Py5Enj55KTk8nPzychIQF/f3/jcRcXFz7++GOOHz9O9+7djcdDQ0OZM2eO8XVubi6bNm1i69at\njBw5EoCLFy+yd+9e5s6dW+ufSwhLkuZiYdX0ej0qlQqAX375hYyMDIYOHUp+fj65ubnk5uZSXFzM\nww8/zJEjR7h48SI5OTkcOnSI0aNHGxMsgJ+fH6tXr+aPf/zjLe/Vtm1bvvjiC5KTk7l69SoAc+bM\nYfXq1bcdePXNN9/g7+9vTCqV/vSnPwGwZcsWk+OPPvqoyeuuXbui1+u5cuXKHX8XYWFhfP7553z+\n+ed89tln/POf/2T06NH873//48UXXzSJydXVtUoi1Wq1uLq68s0339zxXrdyq9jhemUK8O2339K6\ndWuT34WzszPh4eEmn3viiSf4/vvvTRJscXExavX1r6PCwkKT8/v27Wvy+qGHHqJ58+YmFfKXX35J\nRUUFoaGhdfrZhLAUqWSFVbty5YpxukxlRfvuu+/y7rvv3vL88+fPGyvcu+66q8r73bp1u+29Xn31\nVebMmcMLL7zASy+9RGBgIMOGDWPChAk0b978lp/JzMxk4MCBVY57enrSokULzp07Z3L85qk/Dg4O\nACb9t7fj4+ND//79TY6FhoaiUqlITk5mypQp3HvvvWRmZuLj41OlSdjBwQEfH58qMdXUjQ8st4r9\n3Llz+Pj4VPmcn59flWNlZWX861//4vDhw5w9e5bMzEzjdcrLy03ObdWqVZX7Dh8+nNTUVAoLC3F2\ndiY1NZWgoCDat29fp59NCEuRJCusVkFBARkZGTz00EPA71++s2fPJjAw8Jafufvuuzl9+jSAsQKu\nqQceeICtW7ca/3z//ff8/e9/Z+nSpSQnJ99ybmx12zGXl5dXSXS1jakmRowYwbp169i/fz/33ntv\nrWO62e0SfmWleTsqlYri4uIqx2+OJy0tjT/84Q84OzvTv39/JkyYQLdu3Th79iyvvfZaje47evRo\nVq9ezbZt2+jZsyeHDh3i5ZdfrjY+IZQgSVZYra+++oqKigqGDBkCYKxSKr+cb3To0CHy8/Np1qwZ\n3t7ewO+V743ee+893NzceOKJJ0yOl5aWcuTIEdq2bUtoaCihoaGUl5fz+eef8+6775Kamkp0dHSV\n67Vv396Y1G+UnZ1NQUGBMRZLqkxilQm8ffv2HDhwgLKyMpOEWlpaSmZmpnFwWGXyKi0tNbleZfNv\nbXXo0IG0tDT0ej12dr9/tWRkZJic9/7779OsWTNSU1NNHlz++9//1vhe/fr1w9PTky1btpCdnY2d\nnV2V5mwhrIH0yQqrdOnSJd5//328vLwYPXo0cH3gjaenJ3FxcVy7ds14bkFBgbGZV6PR4OXlRZcu\nXUhNTaWgoMB4XkZGBjqd7pZJJC8vj8mTJ/PRRx8Zj6nVanr27Gn851t5+OGHSU9P5+uvvzY5/vHH\nHwMYq3BL2rBhA4BxZayQkBAKCgpYtmyZyXkJCQlcu3bNGJOnpycAR44cMZ6j1+vZtGlTneIYPnw4\nv/32G0lJScZjZWVlrFy50uS8yi6AGxPsb7/9RkpKClCzpnO1Wk1oaCg7duxg27Zt3H///YqswiXE\nnUglKxT39ddfG/v7SkpKOHXqFGvWrKGkpIRPPvmEZs2aAWBvb8+CBQuYO3cu48ePZ+LEiTg6OpKU\nlMT58+f5xz/+YaygXnjhBR5//HEmTJhAeHg4arWa+Ph4WrRoccuBT5XJPCEhgaKiIoKCgrhy5Qrx\n8fG0bt36tlXSjBkz2LRpE3PmzCEiIoKOHTuyc+dONm3axPDhw40ji83h2LFjrF271vi6uLiYzZs3\n89133zFq1CjjSlTh4eGkpKTw9ttvc/z4cXr06MHPP/9McnIygYGBxoFIwcHBeHp68p///IeSkhJa\ntWrF2rVrqww8qqmwsDBWrlzJ66+/Tnp6Oh07dmTdunVkZ2ebnDdo0CA++eQTZs+ezYABA8jOzmbV\nqlXGh58bH6CqM2rUKJYuXcoPP/zAO++8U6eYhbA0SbJCcX//+9+N/2xvb4+XlxchISH88Y9/rDJo\nZsSIEbi5ufHhhx/yn//8B7VaTefOnfnwww95+OGHjefdf//9xMbG8v777/PBBx/g6OhI3759+etf\n/2qs4G72+uuv4+PjQ2pqKqmpqTg5OfHAAw8wd+7c21ZJ7u7urFixgn//+9988cUXXL16FR8fH557\n7jnj9Blz2bx5M5s3bza+dnZ2pmPHjjz77LPExMQYjzs4OLB06VI++OADvvzyS9atW0fbtm2ZMWMG\nM2fONDYh29vb8+mnn/L222/z6aef4uzszKhRoxg+fDhRUVG1jk+j0RhHPX/55ZcUFhYyaNAgpk2b\nZjK1ZtasWRgMBr744gu2bt1KmzZt6N+/P4899hihoaHs3LnTuEZzdXr27EnHjh25cOFCldHdQlgL\nVUV1oySEEMKKPfroowQEBJgs+iGENZE+WSFEo7R7925OnTrF+PHjlQ5FiNuS5mIhRKOyZs0a4xSr\nLl263HKeshDWQipZIUSjotFo+Pbbb/H19eVf//qXReYeC2Eu0icrhBBCWEiTrmT1ej2ZmZno9Xql\nQxFCCGGDmnSSzcrKYsiQIWRlZSkdihBCCBvUpJOsEEIIYUmSZIUQQggLkSQrhBBCWIgkWSGEEMJC\nJMkKIYQQFiJJVgghhLAQSbJCCCGEhUiSFUIIISxEkqwQQghhIZJkhRBCCAuRJCuEEEJYiCRZoKCg\nQOkQhBBC2CBJskBycrIkWiGEEGYnSRbIy8tDp9Nx7do1pUMRQghhQyTJAoGBgWRnZxMXF0dRUZHS\n4QghhLARkmSBQYMG0adPHy5evEh8fDzFxcVKhySEEMIGSJIFVCoVI0eOJDAwkPPnz7Ns2TJKSkqU\nDksIIUQjJ0n2/6lUKkaPHk3Pnj3JzMwkMTGRsrIypcMSQgjRiEmSvYFarWbs2LF069aNM2fOsHz5\ncvR6vdJhCSGEaKQkyd5ErVYzfvx4AgICOHXqFCtXrpREK4QQok4UTbIvv/wy8+fPNzkWHx/PiBEj\nCAwMZOTIkSQlJZm8n5OTw+zZs+nTpw8PPPAA7733ntmToEajYeLEiXTq1IkTJ06watUqDAaDWe8h\nhBDC9imSZCsqKli0aBErVqwwOZ6QkMDChQuZOXMm69atY/r06fztb39jzZo1xnNmzZrF5cuXiY+P\n5+233yY5OZnFixebPUY7OzsmTZqEn58fx44dIzk5mfLycrPfRwghhO1q8CSbkZGBVqslMTGRdu3a\nmby3fPlypk6dSlhYGL6+voSHhzNmzBiSk5MB2L9/P3v37uXtt9+mS5cuDB48mOeee464uDhKS0vN\nHqu9vT1TpkzB19eXX375hbVr10qiFUIIUWMNnmT37duHt7c369evp0OHDibvLViwgClTppgcU6vV\nXL16FYC0tDTat2+Pj4+P8f3g4GCuXbvGkSNHLBKvg4MDU6dOpUOHDhw6dIgNGzZQUVFhkXsJIYSw\nLQ2eZMPCwnj33Xfx9PSs8l5wcLBJAj1//jypqakMHDgQgIsXL9KmTRuTz1S+vnDhgsVidnR0JDIy\nEm9vb/bv388XX3whiVYIIcQd2SkdwO3k5uYyY8YMWrduzRNPPAFAUVERjo6OJufZ29ujUqnuuHjE\n4sWLWbJkSZ3jadasGVFRUeh0OtLS0rCzs2P48OGoVKo6X1MIIYRts8opPBkZGURERHD16lX+97//\n0bx5c+B6oru577WsrIyKigqcnZ2rveasWbM4duyYyZ8tW7bUKi5nZ2eio6Px9PRk586dbNmyRSpa\nIYQQt2V1Sfbw4cNMnjwZtVrN8uXLTZqP27ZtS3Z2tsn5ly5dAsDLy6tB4nNxcSE6OpqWLVvy/fff\ns3379ga5rxBCiMbHqpJseno6jz32GO3btychIQFvb2+T93v37k1GRoZJ/+uuXbtwcXGhS5cuDRZn\n8+bNiYmJwd3dne3bt7Njx44Gu7cQQojGw6qS7Lx583BwcODdd99Fr9eTnZ1NdnY2ubm5AAQFBREY\nGMjcuXM5fPgw27dv57333mP69Ok4ODg0aKwtWrQgJiaGFi1asGXLFn788ccGvb8QQgjrZzUDn06f\nPs1PP/0EwIgRI0ze8/X1ZfPmzahUKpYsWcKrr75KZGQkLi4uhIeH89RTTykRMu7u7sTExLB06VI2\nbdqEnZ0dffv2VSQWIYQQ1kdV0YRH7mRmZjJkyBC2bNlSZc5ubVy+fJmlS5dy7do1Ro8ezX333WfG\nKIUQQjRWVtVc3Fi1bt0arVaLk5MT69ev59ChQ0qHJIQQwgpIkjWTNm3aEB0dTbNmzVizZg2HDx9W\nOiQhhBAKkyRrRt7e3kRFRWFvb09ycjJHjx5VOiQhhBAKkiRrZu3btycyMhKNRkNSUhInTpxQOiQh\nhBAKkSRrAb6+vkydOhW1Ws2KFSs4deqU0iEJIYRQgCRZC+nYsaNxR6HExETOnDmjcERCCCEamiRZ\nC/L392fSpEmUl5eTkJBARkaG0iEJIYRoQJJkLeyee+5h4sSJlJWVsWzZMs6fP690SEIIIRqIJNkG\n0LVrV8aPH09paSlxcXFkZWUpHZIQQogGIEm2gfTo0YOwsDCKi4uJi4sz7h4khBDCdkmSbUD33nsv\no0aNorCwEJ1OR05OjtIhCSGEsCBJsg2sd+/ePProo1y7do3Y2FjjDkNCCCFsjyRZBQQHBzNs2DB+\n++03dDodV65cUTokIYQQFiBJViH9+/cnJCSE/Px8dDodV69eVTokIYQQZiZJVkEDBw5k0KBB5OXl\nodPpKCgoUDokIYQQZiRJVmEPPfQQ/fv3JycnB51Ox7Vr15QOSQghhJlIklWYSqVi6NCh9OvXj+zs\nbOLj4ykqKlI6LCGEEGYgSdYKqFQqHnnkEXr37k1WVhbx8fEUFxcrHZYQQoh6kiRrJVQqFaGhoQQG\nBnL+/HmWLVtGSUmJ0mEJIYSoB0myVkSlUjF69Gh69uxJZmYmiYmJlJWVKR2WEEKIOpIka2XUajVj\nx46la9eunDlzhuXLl6PX65UOSwghRB1IkrVCarWaCRMmcM8993Dq1ClWrlyJwWBQOiwhhBC1JEnW\nSmk0GsLDw+nUqRMnTpxg1apVkmiFEKKRkSRrxezs7Jg0aRJ+fn4cPXqUlJQUysvLlQ5LCCFEDUmS\ntXL29vZMmTIFX19fDh8+zNq1ayXRCiFEIyFJthFwcHBg6tSptG/fnkOHDrFhwwYqKiqUDksIIcQd\nSJJtJBwdHYmKisLb25v9+/fzxRdfSKIVQggrJ0m2EWnWrBlRUVF4eXmRlpbGpk2bJNEKIYQVkyTb\nyDg7OxMdHU3r1q3ZuXMn33zzjSRaIYSwUpJkGyEXFxe0Wi0tW7Zkx44dfPvtt0qHJIQQ4hYkyTZS\nzZs3R6vV4u7uzrZt29ixY4fSIQkhhLiJJNlGzM3NjZiYGFq0aMGWLVvYuXOn0iEJIYS4gSTZRs7d\n3Z2YmBhcXV3ZuHEje/bsUTokIYQQ/0+SrA1o2bIlMTExuLi48MUXX7B//36lQxJCCIEkWZvRunVr\noqOjcXJyYt26dRw6dEjpkIQQosmTJGtDvLy8iI6OplmzZqxZs4bDhw8rHZIQQjRpkmRtjLe3N1FR\nUdjb25OcnMzRo0eVDkkIIZosSbI2qH379kRGRqLRaEhKSuLEiRNKhySEEE2SJFkb5evrS0REBGq1\nmhUrVnDq1CmlQxJCiCZHkqwN8/PzY/LkyQAkJiZy5swZhSMSQoimRdEk+/LLLzN//nyTYzt27CAs\nLIxevXoxevRotm/fbvJ+Tk4Os2fPpk+fPjzwwAO899576PX6hgy7UenUqROTJk2ivLychIQEMjIy\nlA5JCCGaDEWSbEVFBYsWLWLFihUmx0+ePMnMmTMZMWIEKSkpDBkyhKeeesqkT3HWrFlcvnyZ+Ph4\n3n77bZKTk1m8eHFD/wiNyj333MPEiRMpKytj2bJlnD9/XumQhBCiSWjwJJuRkYFWqyUxMZF27dqZ\nvKfT6QgMDGTmzJn4+/szZ84cgoKC0Ol0AOzfv5+9e/fy9ttv06VLFwYPHsxzzz1HXFwcpaWlDf2j\nNCpdu3Zl/PjxlJaWEhcXR1ZWltIhCSGEzWvwJLtv3z68vb1Zv349HTp0MHkvLS2N4OBgk2P9+vUj\nLS3N+H779u3x8fExvh8cHMy1a9c4cuSI5YNv5Hr06MGYMWMoLi4mLi6O7OxspUMSQgib1uBJNiws\njHfffRdPT88q72VlZeHl5WVyrE2bNsaq6+LFi7Rp06bK+wAXLlywUMS2JTAwkFGjRlFYWIhOpyMn\nJ0fpkIQQwmbZKR3AjYqLi3FwcDA55uDgQElJCQBFRUU4OjqavG9vb49KpTKeczuLFy9myZIl5g24\nkerduzcGg4Evv/yS2NhYpk+fjoeHh9JhCSGEzbGqJOvo6EhZWZnJsdLSUpycnABo1qxZlb7XsrIy\nKioqcHZ2rvbas2bNYtasWSbHMjMzGTJkiBkib3yCg4PR6/Vs3rzZmGjd3NzMeo+c/CISNx3j9Pl8\n/Nq5ETE8gFZuTma9hxBCWDOrmifr7e3NpUuXTI5dunTJ2ITctm3bKv2Ileff3Mws7qx///48/PDD\n5OfnExsby9WrV816/cRNx0jPvEJ5eQXpmVdI3HTMrNcXQghrZ1VJtnfv3lX2Q921axd9+vQxvp+R\nkWHS/7pr1y5cXFzo0qVLg8ZqKwYNGsSgQYPIy8tDp9NRUFBgtmufPp9f7WshhLB1VpVko6KiSEtL\n4/333yc9PZ1FixZx8OBBYmJiAAgKCiIwMJC5c+dy+PBhtm/fznvvvcf06dOr9OWKmnvooYfo378/\nOTk5xMXFUVhYaJbr+rVzq/a1MK/cwit8tGcZL25+h4/2LCO38IrSIQnR5FlVkg0ICGDJkiVs3LiR\nsWPH8s033/Df//4Xf39/AFQqFUuWLKFVq1ZERkby4osvEh4ezlNPPaVw5I2bSqVi6NChBAcHc+nS\nJeLi4igqKqr3dSOGB+DfwR21WoV/B3cihgfU+hqSOGou6XAqp/POUl5Rzum8syQdTlU6JCGaPFVF\nRUWF0kEopXLg05YtW6rM2W2KKioqSE1NZe/evbRr1864N62SPtqzjNN5Z42v/Tx8mdE3UsGIrNeL\nm9+hvKLc+FqtUvPWsHkKRiSEsKrRxUJZKpWK0NBQDAYDBw4cICEhgaioKEWb4s9cyaz2dWOXW3iF\npMOpnLmSyV3uHQjvHkpLZ/c6Xesu9w4mDyR3uZv3wdGcsQrRVFhVc7FQnkqlYvTo0fTo0YOMjAwS\nExOrTKtqSDcnCnMnDqVUNoM/t+lNdmceoNRQVu8m3vDuofh5+KJWqfHz8CW8e+gt71nXpndpjhai\n9iTJiirUajXjxo2ja9eu/PrrryxfvlyxnY7ulDgaq8qEVaIvpcRQSl7R9ZHX9anUWzq7M6NvJG8N\nm8eMvpFVqsz6Jklbb1UQwhKkuVjcklqtZsKECaxcuZLjx4+zcuVKJk+ejEajue1nLLH4RGXisDWV\nCcpBY0+JoYxSw/VFVixZqdc3SVq6OVoIWySVrLgtjUZDeHg4/v7+nDhxglWrVmEwGG57viw+UXOV\nCcrDyQ1HjT2Odg4Wr9Tr2/Ruq60KQliSjC6W0cV3VFZWRkJCAr/++ivdu3dn/PjxqNVVn8+eWbSd\n8vLf/3NSq1UsnD24IUNtNJQYRCQDl4RoeNJcLO7I3t6eiIgIli1bxuHDh7GzsyMsLAyVSmVynl87\nN9Izr5i8FremRDO4rTa9C2HNpLlY1IiDgwNTp06lffv2HDx4kPXr13NzI4g5Fp8QQghbIpWsqDFH\nR0eioqLQ6XTs378fOzs7Hn30UWNF28rNiafDAxWOUgghrIdUsqJWmjVrRlRUFG3atGHPnj1s2rSp\nSkUrhBDiOqlkRa05Ozuj1WpZunQpO3fuxM7OjpCQkCp9tEJZMtBJCOVJJSvqxMXFBa1WS8uWLdmx\nYwfffvut0iGJm8gKTUIoT5KsqLPmzZuj1Wpxd3dn27ZtfP/990qHJG7QECs0yS5JQlRPkqyoFzc3\nN7RaLS1atODrr79m586dSock/l9DrPss1bIQ1ZMkK+rNw8MDrVaLq6srGzduJC0tTemQBA2zQpOs\nZyxE9WTgkzCLVq1aGQdDpaamotFoCAoKUjqsJq0hFp/wcvXkUNYvlBrKcNDY06ttN4veT4jGRipZ\nYTaenp5otVqcnJxYt24dP/30k9IhCQtT3fC/oELGlwthSipZYVZeXl5ER0cTGxtLSkoKGo2Gbt2k\numkM6jLlJ6sgG0+XliavhRC/k0pWmJ23tzdRUVHY29uzevVqjh2T3Xgag7oMYmqIwVVCNGaSZIVF\ndOjQgcjISDQaDUlJSZw8eVLpkMRtVE7D2XFmN9nXctCX64GaDWKS7e+EqJ40FwuL8fX1JSIigoSE\nBFasWEFERAR333230mHVma2uoFRZwTpoHCgxlJJXlI+nS6saVaWys48Q1ZNKVliUn58fkydPpqKi\nguXLl3PmzBmlQ6ozW50TWlmxXt9A3oFSQ5lVV6WyAIZoTCTJCovr1KkT4eHhGAwGEhISyMxs+LmU\n5vhittU5oZUVq51ag6dLSwbcFcyMvpFWW6Xb6sOOsE2SZEWDCAgIYMKECZSVlREfH8/58+cb9P7m\n+GK21UE+ja1f1VYfdoRtkj5Z0WC6devGuHHjSE5OJj4+Hq1WS9u2bRvk3ub4Yg7vHlqlT9YW3Nyv\nWln1W1Pf84394YVlRdipNdipr3992crDjrBNkmRFg+rZsycGg4G1a9cSFxfHtGnT8PT0rPHn6zr4\n6C73DpzOO2vyuraayiCfyqofMFb9Sv/cN8Zkp7ZDX67HQeNgUw87wjZJc7FocIGBgYwaNYrCwkJ0\nOh05OTk1/mxdm30bW5OokqyxOfbGGOzUGpztnXhr2Lw69R3LwCnRkKSSFYro3bs3er2er776itjY\nWKZPn46Hh8cdP1fXBGANVWhjmQJkjqrf3MwZkzVW6sJ2SSUrFNOvXz+GDRvGb7/9RmxsLPn5+Xf8\nTGMefNThbOPAAAAgAElEQVRYRsVaY9VvzpissVIXtksqWaGo/v37o9fr2bp1q7Gibd68+W3Pb8yD\njyz15W6uCvnm6zz74AyrqbTN2RJhjZW6sF1SyQrFDRo0iIEDB5KXl4dOp6OgoOC251Z+2da1P05J\nlqrCzVUhN5ZKu76ssVIXtksqWWEVHn74YfR6PT/++CNxcXHExMTg7OysdFhmZakqvL4VcmUFu+PM\nbhw09ng4uWGntrPZZlRr6J8XTYckWWEVVCoVw4YNw2AwsHv3buLi4ox709oKS32517f5sz5rFwsh\nqifNxcJqqFQqRowYwX333UdWVhbLli2jpKRE6bCsXn2bPxvb2sVCNCZSyQqrolKpGDVqFAaDgYMH\nD7Js2TKioqJwcHBQOjSrVd8KubISrly72M/DV5pThTATqWSF1VGpVIwZM4YePXqQkZFBYmIiZWVl\nSodls2QgkBCWI5WssEpqtZqxY8diMBg4cuQIK1asYMqUKdjZyX+y5iYDgYSwHKlkhdXSaDRMmDCB\ne+65h/T0dFauXInBYFA6LCGEqDFJssKqaTQawsPD8ff358SJE6xatUoSrRCi0ZAkK6yenZ0dkydP\npmPHjhw9epQ1a9ZQXl6udFhCCHFHkmRFo2Bvb09ERAQ+Pj78/PPPrFu3joqKCqXDEkKIalldki0s\nLOT1119nwIAB9OnTh8cff5yTJ08a39+xYwdhYWH06tWL0aNHs337dgWjFQ3JwcGByMhI2rdvz8GD\nB9mwYYPNJlrZjk0I22B1SfbNN9/khx9+YNGiRaxYsQJHR0cef/xxSkpKOHnyJDNnzmTEiBGkpKQw\nZMgQnnrqKU6cOKF02KKBODo6EhkZSdu2bdm3bx9ffvmlTSbaprKOsBC2zuqS7Ndff83UqVPp3bs3\n/v7+zJ07lwsXLnDy5El0Oh2BgYHMnDkTf39/5syZQ1BQEDqdTumwRQNycnIiOjqaNm3asGfPHjZv\n3mxziVa2YxPCNlhdkm3ZsiVffPEFOTk5lJaWsmrVKtzc3PDx8SEtLY3g4GCT8/v160daWppC0Qql\nODs7Ex0dTevWrfnxxx/ZunWr0iGZVWPeN1cI8TurS7Kvv/46WVlZ9O/fn8DAQFauXMnHH39MixYt\nyMrKwsvLy+T8Nm3akJWVpVC0Qkmurq5otVpatmzJd999x7fffqt0SGYjqzAJYRusbvmcM2fO0Lp1\na1599VXc3d357LPP+POf/8zKlSspLi6usoatg4NDjRaRX7x4MUuWLLFU2EIhzZs3R6vVsnTpUrZu\n3YpGo+HBBx9UOqx6k1WYhLANVpVkMzIyeOmll0hISCAwMBCAhQsXMnLkSJYuXYqjo2OVNWxLS0tr\ntB3arFmzmDVrlsmxzMxMhgwZYr4fQFhcTn4RiZuOcfp8Pn7t3IgYHkArNzdjov3666+xs7OjX79+\nSocqhBDW1Vz8888/YzAY6NGjh/GYvb09Xbt25cyZM3h7e3Pp0iWTz1y6dKlKE7KwXYmbjpGeeYXy\n8grSM6+QuOkYAB4eHmi1WlxdXfnqq6+kn/4GMh1ICOVYVZJt27YtAMeOHTMeq6ioID09nY4dO9K7\nd2/27Nlj8pldu3bRp0+fBo1T1E5OfhFLkg7wzKLtLEk6QE5+UZ2vdfp8/m1ft2rVCq1Wi7OzM6mp\nqRw4cKDO91GSuZOiTAcSQjlWlWR79epFYGAgzz//PGlpaaSnp/PKK69w/vx5oqKiiIqKIi0tjfff\nf5/09HQWLVrEwYMHiYmJUTp0UY3bVZ914dfOrdrXnp6eaLVanJycWLt2LT/99FOd76UUcydFmQ4k\nhHKsKslqNBo+/PBD7r33Xv7yl78wefJkzp49S0JCAu3btycgIIAlS5awceNGxo4dyzfffMN///tf\n/P39lQ5dVKO66rO2IoYH4N/BHbVahX8HdyKGB1Q5x8vLi6ioKBwdHUlJSeGXX36p8/2UYO6k2JSm\nA0nTuLA2qgpbm8VfC5UDn7Zs2UKHDrb7xaO0JUkHSM/8/cvOv4M7T4cHWvy+mZmZxMXFodfrmTRp\nEgEBVROyNfpozzJO5501vvbz8K3XSOPcwiskHU7lzJVM7nLvQHj3UFo6u5sjVKtj7t+dEPVlVZWs\nsE01qT4toUOHDkydOhWNRkNSUpLJGtjWzNxzZCunA701bB4z+kZaPMEqWU1K07iwNlLJSiVrdW49\nTefO07Ru5/Tp0yQkJAAwdepU/Pz8zBWquAUlq0mpZIW1kUpWWB1zDpQC8PPzY/LkyVRUVJCYmMiZ\nM2eqnGOp6qsp9hEqWU3KSlnC2kiSFRZT16k75hwoValTp06Eh4djMBhISEggM9P0i99S01xsbfpM\nTR4alBxo1dBN40LciSRZYTF1rUjvNE2nrgICApgwYQJlZWXEx8dz4cIF43uWqr5srY+wJg8NUk0K\n8TtJssJi6lqRWnKgVLdu3Rg3bhwlJSXExcVx8eJFwHLVl61Nn6nJQ4NUk0L8TpKssJi6VqSt3Jx4\nOjyQhbMH83R4YL0GPd1Kz549CQsLo6ioCJ1OR3Z2tsWqL1ur6m58SNCX6yksK2pS/c1C1JaMLpbR\nxRZj7lHC5paWlkZqaiqurq5MmzaNVq1aKR2S1btxzm1hWRF2ajvs1BpARvIKcSuSZCXJNmm7du3i\nq6++okWLFkybNg0PDw+lQ2o0Xtz8DuUV5cbXapWat4bNUzAiIayPNBeLJq1fv34MHTqUq1evotPp\nyM+v/0jm6tjSlB5b628WwhIkyYoGZc4deczlwQcf5KGHHuLKlSvodDp+++03i92rcnRuqaGM3ZkH\neG7Tm4022dpaf7MQlnDHJLtv3z6efvppxowZwzPPPMORI0eqnHP06FEeeeQRiwQobIu5F5owl8GD\nBzNw4EByc3PR6XQUFBRY5D6Vo3HzivIpMZRSoi9ttPNnbW0UsS21MgjrUW2S3bVrF1FRUZw5cwZf\nX1927NhBeHg4iYmJJueVlJRw9uzZ21xFiN9ZYqEJc3n44Yd54IEHuHz5MnFxcRQWFpr9HpVNqqWG\nUgAcNPZA458/awtsbeEQYR2qTbKLFi1i6NChrF27liVLlrB582ZCQkJ47bXXjGvBClEbllpowhxU\nKhXDhg2jb9++XLp0ibi4OIqLi816j8omVkc7Bxw19ng4Xf/5pT9Teba2cIiwDtUm2ePHjzNp0iTU\n6uuntWjRgkWLFjFy5EjefPNNNm3a1CBBCttRm4UmlOi/ValUPProo9x3331kZWURHx9PSUmJ2a5f\n2cT67vD5BHcIwkHjIP2ZVkIGcglLsKvuTScnJ65du2ZyTKVS8c4775Cdnc1f//pXWrdujUajsWiQ\nwnZULjRRE5X9t4Cx/7Yh9qFVqVSMGjUKg8HAwYMHWbZsGVFRUTg4OJjtHpXJVliP8O6hVfbdFaK+\nqk2y9913H//5z3+477778PT0/P1DdnZ88MEHTJkyhRkzZjBt2jRLxymaICX7b1UqFWPGjMFgMPDz\nzz+TmJjI1KlTsbe3b7AYrEFT2vBdHnyEJVTbXPzMM8+Ql5dHSEgI//znP03ea968OZ9//jmenp4s\nXrzYokGKpknp/lu1Ws3YsWPp2rUrv/76KytWrECv15v9PtY8qlUGA4mGEhERUadckpmZSUBAgHEL\ny4yMDLZt22Z8/8iRI6SlpdU5rkGDBpGcnFznz1ebZH19fVm/fj3PPvss3bt3r/J+mzZtWLVqFdOn\nT6d9+/Z1DkKIW7HkRgE1pdFomDBhAp07dyY9PZ2kpCQMBoNZ76FkIrtTgldqMJA1P3gI6+Lt7c2O\nHTuMq/a9+OKL7N+/3/j+U089xenTp5UKr/rmYgA3NzdiYmJu+76zszPz5s1j3jxZTk2YV236b83t\n5mbScaMeoXxdOcePH2f16tVMnDjROCCwvpQc1VqZ4AFjgr+xyfQu9w7G9ytfW0NcQlTSaDQm3ZnW\n5o5J9kaHDx/mwIEDt1wRR6VSMWPGDLMFJoSSbv6STzm2kccmTyYhIYEjR46QkpLCuHHjzJJolUpk\ncOcEH949lPiDyRy6eH0RGu/mXuQWXrF4v6wlHzxufoAaevcAvj61o0n0Oze0/fv3895773H48GFU\nKhW9e/fmrbfewsvLi82bN/OPf/yDixcvMnHiRG5cRv/555/H3d2dixcv8s0339ChQwcWLlzIl19+\nybJly3BxcWH+/PkMHz7cuAb9pk2b+PDDD9m9eze7d+9m3759AJw7d44FCxawd+9e3n77bU6cOMHr\nr7/OgQMH8PLyIiIigunTp6NSqQBYvnw5H374IQUFBTzxxBP1/h3U+BsiNjaWiRMn8vrrr/Pvf//7\nln+EsBW3+pK3t7cnIiICHx8ffv75Z9atW4c59tdQcnnCO01baensjqOdI62dW9LauSUXfrvYIM3Z\nlpxOc3Pz/OJdn0u/swUUFBQwY8YM+vfvz4YNG/jss8/IzMzkww8/5OTJk8yZM4eIiAhWr15NaWmp\nSRMvQHx8PL1792bt2rU0b96c6Oho8vLyWLFiBQ8++CAvvfRSlb9/8+fPJygoiJiYGBYvXszixYtp\n27Ytzz//PPPnz6e4uJjHH3+cwMBA1q1bx4IFC4iNjSU+Ph6A7777jjfffJO5c+eyfPlyDhw4YNxz\nuq5qnGQ///xzhg0bxs6dOzl69GiVP7dablGIxup2X/IODg5ERkbSvn17Dh48yIYNG+qdaJVcnrAm\nCV6J5mxLPnjcHH9OYV6174u6KSoqYsaMGTz11FP4+PjQu3dvhg8fzsmTJ1m9ejX33Xcf06ZNw9/f\nn5deeqlKk2+XLl2IioqiY8eOhIaGUlRUxPz58/H39ycqKoorV66Ql2f676558+bY29vj5OSEu7s7\n7u7uaDQaXF1dad68OevXr8fNzY2//OUvdOzYkcGDBzNnzhxiY2MBSEpKIjQ0lLFjx9K5c2fefPPN\nek/dq3FzcX5+PpGRkbi7SzOKsH3VzZl0dHQkMjISnU7Hvn37sLOzY8SIEcbmpsakJtNWlGjOtuR0\nmpt/nlbOHlXeF/Xn6enJuHHjWLp0KUeOHOHkyZMcO3aMXr16kZ6eTkDA7wMZ7e3tTV4D+Pj4GP+5\nWbNmtG7dGkdHRwDj/5eWltYqplOnTnHy5EmCgoKMx8rLyyktLaW0tJT09HTCw8ON77Vs2bLeg3pr\nnGQHDBjA7t276devX71uKERjcKcveScnJ6Kjo4mNjWX37t1oNBqGDRvWKBPtndjaIg03/zy36pMV\n9Xfx4kUmTJhA165dGTBgAJMmTWLbtm3s3bv3luffPAf95kWOzDH+Qa/XExwczN/+9rcq79nZXU+H\nN7dM1XdufI2T7Msvv4xWq+X8+fP07NkTZ2fnKueMHTu2XsEI0Zg4OzsbE+2PP/6InZ0dISEhSodl\ndra2SMOtfh7/VncpFI3t2rx5My4uLnzyySfGY3FxcVRUVNC5c2eTuasGg4Fjx47dcqqoOfn5+bF5\n82bat29vTKpfffUVO3bs4I033qBz58789NNPxvMLCgrIyMio1z1rnGS3bt3K2bNnOX36NCkpKVXe\nV6lUkmSFonLyi0jcdIzT5/Pxa+dGxPAAWrk5WfSerq6uaLVaPv/8c7777jvs7OwYNGiQRe8JTWsl\nJtE4ubu7c+nSJb7//nt8fX358ssv2bRpE127diU8PBydTseSJUsYOXIkCQkJZGVlmeW+Li4unD17\nlpycHFq1aoWLiwunTp3iypUrjBkzhiVLlrBgwQL++Mc/kpWVxWuvvca4ceMAiIyMZPr06Sxfvpy+\nffuyePHieq9dXuP6+4MPPmDgwIGsXr2a7du3V/lz4wobQihBqb1qmzdvTkxMDG5ubmzdupUffvjB\n4veUlZiEtXv00UcZM2YMc+bMYfz48ezcuZMXXniB06dP07ZtW/773//y1VdfMXbsWPLy8hg4cKBZ\n7jt58mS+//57Hn/8ceB64ly+fDkLFizA1dWVTz/9lHPnzjFu3DjmzZvHuHHjmDt3LgB9+/bl73//\nO5988gkTJ07Ey8uLe+65p17xqCpqODQyKCiIDz/8kPvvv79eN7QmlfOrtmzZYlwtRDRezyzaTnn5\n7/85q9UqFs4e3GD3z8vLY+nSpVy9epURI0ZYdPzCi5vfobyi3PharVLz1jDbWxBGKnbR2NW4kg0O\nDubAgQOWjEWIelF6rWMPDw+0Wi2urq589dVXtx3gYQ5NZVu2ulTssiSjsCY17pOdOHEiCxYs4OzZ\ns/Tq1QsXF5cq54wePdqswYmmpb59qhHDA6p83pJuVWW1atUKrVbL0qVL2bBhAxqNhsBA8y8NaWsj\nfm+nLnN0ZUlGYU1q3FzcpUuX6i+kUjW6BSmkudi6LEk6YNw/FsC/g7tiaxfXxEd7lpnMt/Tz8DV+\nmV+8eJHY2FiKi4sZN24cPXv2VCrMRq263/HtNJWmdNE41LiS3bJliyXjEELR/WProroqy8vLi6io\nKHQ6HSkpKWg0Grp169bQITZ6danYlVwLWoib1TjJylZ2wtL82rmZVLIN3adaW3f6Mm/Xrh1RUVHE\nxcWxevVqNBpNlVVtRPXqMke3qTSli8ahxs3FcH3S7p49eygrKzOuilFeXk5RURH79+9n69atFgvU\nEqS52LooMc+1Pmo68vXMmTMsW7aM8vJypkyZQqdOnRSIVgihhBon2Q8++IDFixfTvHlz9Ho99vb2\n2NnZkZubi1qtJjw8/JZLVVkzSbLidsyd8E+fPk1CQgIAU6dOxc/Pz1yhCiGsWI2n8KSkpDB27Fh2\n795NTEwMDz/8MD/88AOrVq3C3d2dzp07WzJOIRqUuRe28PPzY/LkyVRUVJCYmMjZs2fv/CEhRKNX\n4ySblZXF6NGjUalUdO/e3bj3X48ePXjyySdJSkqyWJBCNDRLDMLq1KkT4eHhGAwGli1bRmambKkm\nhK2rcZJ1dnY27oLg6+tLZmYmxcXFAHTt2lW+MIRNsdTCFgEBAUyYMIGysjLi4+O5cOGCWa4rhLBO\nNU6yPXv2ZO3atcD1pi+NRsPOnTuB6/1N9d3YVghrEjE8AP8O7qjVKvw7uJt1YYtu3boxbtw4SkpK\niIuL4+LFi2a7thCibgwGAwsXLmTAgAEEBQXx5z//mcuXL9f7ujVOsk888QQbNmxg5syZODg4MGbM\nGObNm8ecOXP4+9//zoABA+odTKWkpCQeeeQRevXqxfjx4/nxxx+N7+3YsYOwsDB69erF6NGj2b59\nu9nuK0SlVm5OPB0eyMLZg3k6PNDso5x79uzJmDFjKCoqQqfTkZ2dbdbrCyFqZ/HixaSkpPDOO+8Q\nHx9PVlYWs2bNqvd1azWF55dffuH48eOMHTuWkpIS3njjDfbt20evXr14/vnncXOrf5NaSkoKL730\nEq+++ip9+/YlISGBlStXsn79euPqOX/6058YPnw469ev59NPPyUlJaVOA69kdLGoTkNMKUpLSyM1\nNRVXV1emTZtGq1atqj1fFsw3P/mditLSUu6//34WLFjA+PHjgd/zQ2JiIvfdd1+dr13jJFteXl7t\nzvTZ2dl4enrWORC4viP9kCFDCAsLY/bs2cb7jhs3jscff5w9e/Zw+vRp4uLijJ+Jjo6mY8eOvP76\n67W+nyRZy2tsc19v1FDLPO7cuZONGzfSokULpk2bhoeHx23Prcsyg6J68jsVhw4dIjw8vEouCAkJ\nYcqUKTzxxBN1vnaNm4unTJly22kHa9asYdSoUXUOotKpU6c4d+4cI0eO/D1AtZq1a9cyevRo0tLS\nCA4ONvlMv379SEtLq/e9hWUotcerOTTUMo/3338/Q4cO5erVq+h0OvLzb3+fuiyYL6onv1PrkpNf\nxJKkAzyzaDtLkg6Qk19k8XtWbhjv5eVlcrxNmzb13ky+xkk2JyeHsLAwVqxYYTx26dIlnnzySZ5/\n/nmzLID+66+/AnD16lW0Wi0PPPAAkZGR7Nu3D7j+i7DEL0FYjrWvR1zdX+iG3DrvwQcf5KGHHuLK\nlSvodDp+++23W57XVLa4a0jyO7UuSjyYFxUVoVarsbe3Nznu4OBASUlJva5d4yS7fv16Ro8ezSuv\nvMKTTz5JYmIio0aN4ueff2bhwoV8+umn9QoEoKCgAIDnn3+e8PBwPv30Uzp37kxMTAzp6ekUFxdX\nGcVc01/C4sWLCQgIMPkzZMiQescsqqf0Hq93Ut1f6LqMMK7PXqaDBg1iwIAB5ObmotPpuHbtWpVz\nwruH4ufhi1qlxs/DV9blNQP5nVoXJR7MmzVrRnl5OXq93uR4aWkpTk71696q8QYBzs7OvPbaawwa\nNIg///nPbN++na5du6LT6XB1da1XEJUqnyKefPJJ49603bp1Y+/evSQmJuLo6EhZWZnJZ2r6S5g1\na1aVkWKVfbLCchp6j9faqu4vdOUI49qoz16mKpWKkJAQ9Ho9O3fuRKfTERMTg7Ozs/GcuiyYL6on\nv1ProsRGId7e3sD1sUWV/wzXW2tvbj2trRpXsgCpqam8+uqrODs7ExISwi+//MKzzz5rtubaNm3a\nAHDPPfcYj6lUKu6++24yMzPx9vbm0qVLJp8xxy9BWI6lp8LUl7kr7fr276lUKoYPH07fvn25dOkS\n8fHxxkVfhGgKLDlH/Xa6dOmCi4sLu3fvNh7LzMzk3Llz9O3bt17XrnGS/cMf/sCzzz5LQEAAGzZs\n4IMPPuCjjz7iyJEjjBw5Ep1OV69AALp3746zszM//fST8VhFRQXp6en4+PjQu3dv9uzZY/KZXbt2\n0adPn3rfWzRN5v4LbY7+PZVKxaOPPkpQUBAXLlwgPj6+3v1CQjQWSjyYOzg4MHXqVN59912+/fZb\nDh8+zF/+8heCg4MJDKzfjIIaT+Hp06cP8+bNIzw83OR4QUEBb775JmvWrOHIkSP1Cgbg3//+NwkJ\nCbzxxhvcc889JCQksHz5ctasWUNZWRkTJkzgiSeeIDQ0lA0bNvDZZ5+RkpKCv79/re8lU3iEuZlz\nzmVFRQVr1qzh0KFD+Pr6EhkZKSurCWEher2ef/zjH6SkpKDX6xk4cCAvv/wyLVu2rNd1a5xks7Ky\naNu2LVlZWezcuZNLly4xbtw4srOz6dSpEz/++CODBw+uVzBw/Yvl448/JjExkZycHLp27cpzzz1n\nrFa3bdvGe++9x9mzZ7n77ruZN28e/fv3r9O9JMkKa1deXk5ycjKHDx/Gz8+PiIiIKiMghRDWq1Yr\nPr3zzjvExcWh1+tRqVSsWrWKf/7zn1y8eJHY2Ng7rlZjbSTJisbAYDCwatUqjh49ir+/P1OmTMHO\nrsZjFq2OrLAkmpIa98l+/PHHxMXF8dxzz7F582Yqc/PTTz9Nfn4+//rXvywWpBBNmUajYeLEiXTu\n3Jn09HSSkpIwGAxKh1VnlSOwyyvKjSOwhbBVNX4cXrFiBbNmzUKr1Zr8BQ8KCmLOnDksWrTIIgEK\nURuNeRnH6mg0GiZNmkRiYiLHjx9n9erVTJw4sdqlTq3FzZVreu6vqFW/xy0rLAlbVuO/oZcuXbrt\nqk7t27fnypWaT7oXwlIa8zKOd2JnZ8eUKVO46667OHLkCCkpKZSXlysd1h3dXLmWGkznussKS8KW\n1TjJ+vr68t13393yvbS0NHx8fMwWlBB1Ze3LONaXvb09U6dOxcfHh59//pn169dTi2EViri5UnXQ\n2MsKS6LJqHFzcUxMDK+88gp6vZ6QkBBUKhUZGRns3buXzz77jGeffdaScQpRI0qsFtPQKuf0xcXF\nceDAATQaDaGhoahUKqVDu6W73DuY7HLj37KjrLAkmoxajS7+6KOP+PDDDykpKTE+Pdvb2/PYY48x\nd+5ciwVpKTK62PbYap/srVRu+J6VlUVwcDAjRoywykQro4lFU1arJAvXF5/Yv38/V65coXnz5tx7\n773V7n9pzSTJisausLCQpUuXkp2dTf/+/Rk6dKhVJlohmqpaT7ZzdXVl4MCBlohFCFFLzs7OaLVa\nli5dyg8//ICdnR0PP/yw0mEJIf6f9Y//F0JUy9XVFa1Wi4eHB99++y3ffvut0iEJ0ai9/PLLzJ8/\n3yzXkiQrhA1o0aIFMTExuLm5sXXrVn744QelQxKi0amoqGDRokWsWLHCbNdsvGuzCSGMcguvkHQ8\nlUv+RTj9omHz5s3Y2dkRHBysdGhCNAoZGRm8+OKLnDhxgnbt2pntulLJCmEDjAs+OEJhFzVqBw1f\nfvkle/fuVTo0IRqFffv24e3tzfr16806EFYqWSFqydzThMxxvRsXfKhwUlHcTYP7cUc2bNiARqOp\n956YQti6sLAwwsLCzH5dqWRFk5STX8SSpAM8s2g7S5IOkJNfVOPPmnvpRnNc7+alCX3b+RIdHU2z\nZs1Yt24dP//8c71iFKKh5BZe4aM9y3hx8zt8tGcZuYWNe8leSbKiSapPYjP30o3muF5499AqSxW2\nbduW6OhoHBwcSE5O5siRI/WKU4iGYGu7NEmSFU1SfRLbzUs11nfpRnNcr6WzOzP6RvLWsHnM6Btp\nXFGpXbt2REZGYm9vz6pVqzh+/Hi9YhXC0m5e67qx79IkSVY0SfVJbBHDA/Dv4I5arcK/gzsRwwPq\nFYu5r3czHx8fpk6dikajYeXKlaSnp5v1+kKY081dH419lyYZ+CSapIjhAVUGG9VUKzcnng6v/0Ci\nmwc8vTgt2GLrLN91111MmTKFhIQEli9fTmRkJB07drTIvYSoj/DuoVXWum7MJMmKJunGRKnUpgKV\n/cKAsV/YHMn7du6++24mT57MihUrSEhIICoqCl9fX4vdT4i6qOz6sBXSXCxqrT4jc62RUhu9K7H3\nbefOnZk4cSIGg4Fly5Zx7tw5i99TiMYmLi6ON9980yzXkiQrak2ppGQpSm30bu4BVDXVpUsXxo8f\nT1lZGfHx8Vy4cKFB7itEUyRJVtSaUknJUvzauaE3VHApr4iMSwUUFusbpDq39ICn6nTv3p2xY8dS\nXBsjpiIAACAASURBVFxMXFwcFy9ebLB7C9GUSJIVtaZUBWYpEcMD0BvKKSk14Givxk6japDqvLJf\neOHswTwdHtjgm8v36tWLMWPGUFRURFxcHJcvXzb7PWxtYQEhakuSrKg1JSswS2jl5oRzMzt8vFxp\n4+GMnUbd6KvzmgoKCmLkyJFcu3aN2NhYcnNzzXp9W1tYQIjaktHFotbMNYXFmvi1czOO9K183VT0\n7dsXg8HAxo0biY2NZfr06bi7u1/f2eemqRSVi1zUlK0tLCBEbUklKxqEtY9ItrXqvLbuv/9+hgwZ\nwtWrV4mNjSU/P98sVaitLSwgRG1JJSsaREPPCa0ta5g3W1vmjnPAgAEYDAa2bduGTqfjwt3XwP73\n9+tShdrawgJC1JYkWdEgGtOIZGt/IKhkzjiNTcMlGbT09yA3PRfnUnsKugD2KqBuVaitLSwgRG1J\nc7FoEI1pRHJjeSAwZ5zGpmEquOxZgLOfO4aCMpofU6HWq4w7+wghakeSrGgQjaHPs7Lf+GJOIZfy\nCtEbygHrfSAw54OLSVOwSkVe2yL69u2L/rdSOma2JKbnhFoPelKSTB0S1kKai0WDaAwjkiubXz1a\nNCP3ajF5V0u4v6e3VT4QQP02ObjZXe4dOJ139vfXHj482udR9Ho9+/fvJz4+nujoaBwdHc0Req3U\nZZRzZWUOGAdtSbO1UIIkWSH+X2Vzq51GRRsPJ9RqlVU/GJjzweVWA5RUKhWjRo3CYDBw6NAhEhIS\niIyMxMHBAahb8quLuiRMmTokrIUkWSH+X1OeK3u7AUpqtZqwsDAMBgOHDx9m+fLlREREYG9v32DV\nYl0SZpXKXKYOCYVIn6ywKGufH3ujxtBvrAS1Ws24cePo0qULp0+fZuXKlej1+garFusy1za8eyh+\nHr6oVWoZtCUUpaqoqKhQOgilZGZmMmTIELZs2UKHDvKkW1O1mZ+5JOmASXXo38Hdqptgxe3p9XpW\nrlzJiRMnCAgI4Iqfnl/zM4zv+3n4WqSSbahmaSEsQSpZUWvVbXV3c+V6/GyeyWetdTqMuDM7Ozsm\nTZrE3XffzbFjx2h+SkVHN58aVYv1Ge3b0tmd8O6h3OXegTNXMkk6nCqjhUWjIUlW1Fp18zNvTsBl\n+nKTc5tSP6clKdUMb2dnx5QpU7jrrrs4efwkbc4588aQvzKjb2S11WV9l2iUjQZEYyVJVtRadfMz\nb07ADnZq6ee8gbmSY3WtCZZmb2/P1KlT8fHx4aeffmL9+vXc2Ot0q5+xvv23MlpYNFaSZEWtVTdA\n6OYE3NnXQ9E9U62NuZKj0qtSOTg4MHXqVNq1a8eBAwdITU01Jtpb/Yz13ShANhoQjZUkWVFr1W02\nLiN0q2eu5GgNy1Q2a9aMqKgo2rZty969e9m4cSMVFRW3/BnrO9pXRguLxkrmyQqzagwrOynJXHNx\nzbnaU31283FyciIqKorY2Fh27dqFRqOho3drTp37PdH6tXOr90YBstGAaKysupI9cOAA3bp1Y9eu\nXcZjO3bsICwsjF69ejF69Gi2b9+uYIRC1E59K/3K/s63lu4G4MVpwfVuhq9vE7aLiwtarZZWrVrx\nww8/4N/isrRmCPH/rDbJFhYW8txzz2EwGIzHTp48ycyZMxkxYgQpKSkMGTKEp556ihMnTigYqRA1\nV11Te01YYsCTOZqwXV1d0Wq1eHh4sGfXDxRmH693XELYAqtNsm+//TZeXl4mx3Q6HYGBgcycORN/\nf3/mzJlDUFAQOp1OoSiFaFiWGPBkrv7dFi1aoNVqUds7UZR9BPuisw0+8lkIa2OVSXb79u1s27aN\nBQsWmBxPS0sjODjY5Fi/fv1IS0tryPCEUIwlBjyZc7Cau7s7+c16Ua5ywKnkFA6l52QBEtGkWd3A\np9zcXObPn89bb72Fm5vpF0hWVlaV6rZNmzZkZWU1ZIhCKMacA54qmXuwWkeftpw+cy+uhQdwLj6J\ni4eL2a4tRGNjdUn2lVdeISQkhEGDBlVJnsXFxcZttio5ODhQUlJyx+suXryYJUuWmDVWIaB+o3Nr\nqzGM3r7+IABnMqB54UGuXTjIwYN+3HvvvUqHJkSDs6okm5KSwi+//MK6detu+b6joyNlZWUmx0pL\nS3FyuvMX2qxZs5g1a5bJscoNAoSoj8rBSICxD9LaE6El/f4gEEhW1n3Exsb+X3v3HhVlnf8B/D3D\nXcK7IAGZkngBuQRixBiutGpzIsmUVIahLGu7YdueTplSdrqtmoKXTa3+yAERUQGz2OQc3NjVk8SE\nWpooYBqYyC1FkQGG+f7+2F+zTVaozfDMM/N+nTPn0PPM5f0hD2+eh3nmiz179sDFxQVhYWFWf73+\n/CWH6EbZVckWFhbiwoULUKlUAGD+BJnFixcjOTkZ/v7+aGpqsnhMU1PTNaeQifqT1J++ZM9GjhyJ\ntLQ06HQ6FBYWwsXFBRMmTLDqa/zeLzksYJKaXb3x6d1338Wnn36K4uJiFBcX48MPPwQAvPnmm1iy\nZAmio6NRWVlp8ZiKigrExMRIEZcIgH18+pI9u/XWW5GamgpXV1fs2rULp05Z9/KeG1mwgu90pv5m\nVyXr5+eHUaNGmW8/rfHq5+eHYcOGQaPRQK/XY/369airq8O6detw9OhRpKenS5ycnBk/SrJvQUFB\nSE1NhVKpREFBAerq6qz23DeyYAXPMlB/s6uS7cu4ceOwceNG7Nu3D8nJydi/fz82b96M4OBgqaOR\nE/ujHzDhLEaNGoUFCxYAAPLz83HmzBmrPO+NLFjBswzU3xTi52tUOZmf3vhUVlZmPmomItuqqalB\nfn4+XFxcoNFocNttt9nstfg3WZIaS5YlS9TvqqursXPnTri6ukKr1SIgIEDqSEQ2IavTxUTkGMaP\nH485c+agp6cHubm5OH/+vNSRiGyCJUt0k35aEedv68qxcecRtF7qlDqSrISGhiI5ORkGgwE5OTnX\nXJ5H5AhYskQ3iZeH/HHh4eF44IEH0NnZCZ1Oh5aWFqkjEVkVS5boJvHyEOuIioqCWq1GR0cHtm7d\nira2NqkjEVkNS5boJvHyEOuZPHkyZsyYgStXrmDr1q24ePGi1JGIrIIlS3ST+CEU1hUXF4fExES0\nt7dj69ataG9vlzoS0R9mV59dTCQnclgRR25UKhWMRiPKy8uxdetWPPLII/Dx8ZE6FtFN45EsEdmV\nhIQExMfHo62tDTk5Oejo6JA6EtFNY8kSkV1RKBRITEzEXXfdhebmZuTk5KCzk5dHkTyxZInI7igU\nCsyYMQMxMTG4cOECcnJyYDAYpI5FdMNYskRklxQKBdRqNaKionD+/Hls27YNXV1dUsciuiEsWSKy\nWwqFAvfffz/Cw8PR0NCAvLw8dHd3Sx2L6LqxZInIrimVSsyePRuhoaH4/vvvkZ+fj56eHqljEV0X\nliwR2T2lUokHH3wQ48aNw3fffYeCggIYjUapYxH1iSVLRLJY7MDFxQVz587F2LFjUVtbi127dqG3\nt1fqWES/iyVLRLJZ7MDV1RUpKSkYM2YMTp48icLCQphMJqljEf0mliwRyWqxA1dXV8yfPx+jRo3C\nt99+i+LiYhYt2S2WLBHJbrEDNzc3LFiwAIGBgfjmm2+wd+9eCCGkjkV0DZYsEclysQMPDw+kpqbi\n1ltvxZEjR1BSUsKiJbvDBQKISLaLHXh6ekKj0WDr1q3Q6/VwcXHBzJkzoVAopI5GBIBHskQkc15e\nXkhLS8OIESNQUVGBsrIyHtGS3WDJEpHseXt7Q6vVYtiwYTh48CDKy8uljkQEgCVLRA7illtugVar\nxZAhQ1BeXo7//Oc/UkciYskSkeMYOHAgtFotBg0ahP379+OLL76QOhI5OZYsETmUwYMHQ6vVwsfH\nB6Wlpfjyyy+ljkROjCVLRA5n6NCh0Gq18Pb2xj//+U9UVVVJHYmcFEuWiBzS8OHDodVqMWDAAOzd\nuxdHjx6VOhI5IZYsETksX19fpKWlwdPTE3v27MGxY8ekjkROhiVLRA5t5MiR0Gg0cHd3R2FhIU6c\nOCF1JHIiLFkicngBAQFITU2Fq6srdu3ahVOnTkkdiZwES5aInEJQUBAWLlwIpVKJgoIC1NXVSR2J\nnABLloicxu23344FCxYAAPLz83HmzBlpA5HDY8kSkVMZM2YMHn74YZhMJuTl5aG+vl7qSOTAWLJE\n5HTGjh2LefPmwWg0Ytu2bTh37pzUkchBsWSJyCmNHz8eDz30ELq7u5Gbm4vGxkapI5EDYskSkdMK\nDQ1FcnIyDAYDdDodmpqapI5EDoYlS0ROLTw8HElJSejs7IROp0NLS4vUkciBsGSJyOndeeedUKvV\n6OjogE6nQ1tbm9SRyEGwZImIAEyePBkzZszA5cuXodPpcPHiRakjkQOwu5JtaWnBSy+9BJVKhZiY\nGDz22GMWn85y4MABzJ4923yKp7y8XMK0RORI4uLikJiYiEuXLkGn06G9vV3qSCRzdlWyJpMJzz77\nLM6cOYP33nsP+fn5uOWWW/DII4/gxx9/RG1tLZ566inMmjULRUVFSExMxDPPPIOamhqpoxORg1Cp\nVEhISMCPP/4InU6Hy5cvSx2JZMyuSra6uhqHDx/G22+/jfDwcNxxxx1YvXo1rl69ivLycuh0OkRG\nRuKpp55CcHAwnn/+eURFRUGn00kdnYgcSEJCAuLj49Ha2oqcnBx0dHRIHYlkyq5K1t/fH1u2bMHo\n0aPN2xQKBQDg0qVL0Ov1iI2NtXjMlClToNfr+zUnETk2hUKBxMRETJkyBc3NzcjJyUFnZ6fUsUiG\n7KpkhwwZgmnTpkGp/F+snJwcGAwGqFQqNDY2ws/Pz+Ixvr6+vIiciKxOoVBg5syZiImJwYULF5Cb\nmwuDwSB1LJIZV6kD/J6ysjKsXbsWjz76KIKDg2EwGODu7m5xH3d3d3R1dfX5XBs2bMDGjRttFZWI\nHJBCoYBarYbRaMSRI0ewbds2aDQaeHh4SB2NZMKujmR/rrCwEBkZGbjvvvvw4osvAgA8PDzQ09Nj\ncb/u7m54eXn1+XzPPfccTp48aXErKyuzSXYichwKhQJJSUkIDw9HQ0MDtm/fju7ubqljkUzYZclu\n2rQJS5cuxfz587Fq1Srz6WN/f/9rPvasqanpmlPIRETWpFQqMXv2bEycOBFnz55Ffn7+Nb/wE/0a\nuyvZDz74ANnZ2cjIyEBmZqb5jU8AEB0djcrKSov7V1RUICYmpr9jEpGTUSqVmDNnDsaNG4fvvvsO\nBQUFMBqNUsciO2dXJVtdXY2srCw89NBDSElJQXNzs/l29epVaDQa6PV6rF+/HnV1dVi3bh2OHj2K\n9PR0qaMTkRNwcXHB3Llzcccdd6C2tha7du1Cb2+v1LHIjtlVyZaUlKC3txe7d++GSqWyuH300UcY\nN24cNm7ciH379iE5ORn79+/H5s2bERwcLHV0InISrq6uSElJwZgxY3Dy5EkUFhbCZDJJHYvslEII\nIaQOIZWGhgYkJiairKwMgYGBUschIhnp7u5GXl4ezp49i0mTJiE5Odni8kMiwM6OZImI5MLd3R0L\nFixAYGAgvvnmG3zyySdw4mMW+g0sWSKim+Th4YHU1FT4+/vj8OHDKCkpYdGSBZYsEdEf4OnpibS0\nNPj5+UGv12Pfvn0sWjJjyRIR/UFeXl5IS0vDiBEjUFFRgbKyMhYtAWDJEhFZhbe3N7RaLYYNG4aD\nBw9yrWsCwJIlIrKaW265BVqtFkOGDEF5eTkOHDggdSSSGEuWiMiKBg4cCK1Wi0GDBqGsrAxffPGF\n1JFIQixZIiIrGzx4MLRaLXx8fFBaWnrNx8GS82DJEhHZwNChQ6HVauHt7Y2SkhJUVVVJHYkkwJIl\nIrKR4cOHQ6vVwsvLC3v37sXXX38tdSTqZyxZIiIb8vX1RVpaGjw9PVFcXIzjx49LHYn6EUuWiMjG\n/P39odFo4Obmht27d6O6ulrqSNRPWLJERP0gICAAGo0Grq6u2LlzJ2pqaqSORP2AJUtE1E+CgoKw\ncOFCKJVK7NixA6dPn5Y6EtkYS5aIqB/dfvvtmD9/PgBg+/btOHPmjLSByKZYskRE/Sw4OBgpKSkw\nmUzIy8tDfX291JHIRliyREQSCAkJwdy5c2E0GrFt2zacO3dO6khkAyxZIiKJTJgwAXPmzEF3dzdy\nc3PR2NgodSSyMpYsEZGEwsLCMHv2bBgMBuTk5KCpqUnqSGRFLFkiIolFREQgKSkJV69ehU6nQ0tL\ni9SRyEpYskREduDOO+/Efffdh46ODuh0OrS1tUkdiayAJUtEZCdiY2MxY8YMXL58GTqdDhcvXpQ6\nEv1BLFkiIjsSFxeH6dOn49KlS9DpdGhvb5c6Ev0BLFkiIjszdepU3HPPPfjxxx+h0+lw5coVqSPR\nTWLJEhHZoWnTpiE+Ph6tra3Q6XTo6OiQOhLdBJYsEZEdUigUSExMxJQpU9Dc3IycnBx0dnZKHYtu\nEEuWiMhOKRQKzJw5EzExMbhw4QJyc3NhMBikjkU3gCVLRGTHFAoF1Go1IiMj8cMPP2Dbtm3o6uqS\nOhZdJ5YsEZGdUygUSEpKwqRJk9DQ0IDt27ejp6dH6lh0HViyREQyoFQqkZycjIkTJ+Ls2bPIz8+H\n0WiUOhb1gSVLRCQTSqUSc+bMwbhx43D69GkUFBSwaO0cS5aISEZcXFwwd+5c3HHHHaipqcHu3bvR\n29srdSz6DSxZIiKZcXV1RUpKCkaPHo3q6moUFRXBZDJJHYt+BUuWiEiG3NzcMH/+fNx22204fvw4\n9uzZw6K1QyxZIiKZcnd3x8KFCxEYGIivv/4an3zyCYQQUsein2HJEhHJmIeHB1JTU+Hv74/Dhw+j\npKSERWtHWLJERDLn6ekJjUYDPz8/6PV6lJaWsmjtBEuWiMgBDBgwAGlpaRgxYgQOHTqE/fv3s2jt\nAEuWiMhBeHt7Iy0tDUOHDsWBAwfw73//W+pITo8lS0TkQHx8fJCeno7Bgwfj888/x4EDB6SO5NRY\nskREDmbgwIFIT0/HwIEDUVZWhkOHDkkdyWnJsmR7e3uxZs0aqFQqREVFISMjAy0tLVLHIiKyG4MH\nD0Z6ejp8fHywb98+VFZWSh3JKcmyZDds2ICioiKsXLkSubm5aGxsxHPPPSd1LCIiuzJ06FBotVp4\ne3ujpKQEhw8fljqS05FdyXZ3d0On0+GFF15AfHw8QkNDsXbtWlRVVaGqqkrqeEREdmX48OHQarXw\n8vLCxx9/jK+//lrqSE5FdiVbXV2Njo4OxMbGmrcFBgYiICAAer1ewmRERPbJ19cXaWlp8PT0RHFx\nMY4fPy51JKfhKnWAG9XY2AgA8PPzs9ju6+tr3ne9flq54kYfR0QkR/feey92794NnU4HtVqN4OBg\nqz7/yJEj4eoqu1qxKdl9Nzo7O6FUKuHm5max3d3dHV1dXb/5uA0bNmDjxo2/ui81NdWqGYmI7F1x\ncbHVn7OsrAyBgYFWf145k13Jenp6wmQywWg0WvzG1N3dDS8vr9983HPPPXfNm6MMBgMiIiJQWloK\nFxcXm2XuT4mJiSgrK5M6hlU52kycx75xnps3cuTIfnkdOZFdyfr7+wMAmpubzV8DQFNT0zWnkPvi\n6ekJABg1apT1AtoBR/xN0tFm4jz2jfOQtcjujU/jx4+Ht7c3vvzyS/O2hoYGnDt3DpMnT5YwGRER\nkSXZHcn+tH7iqlWrMGTIEAwbNgyvv/46YmNjERkZKXU8IiIiM9mVLAA8//zzMBqNePHFF2E0GjF1\n6lS8+uqrUsciIiKy4LJixYoVUoe4UUqlEiqVCosXL8aTTz6JWbNm/e6bnvoyZcoUK6aTnqPNAzje\nTJzHvnEeshaF4IKDRERENiG7Nz4RERHJBUuWiIjIRliyRERENsKSJSIishGWLBERkY04bcn29vZi\nzZo1UKlUiIqKQkZGBlpaWqSOdV1aWlrw0ksvQaVSISYmBo899hhOnTpl3n/gwAHMnj0b4eHhSEpK\nQnl5uYRpb8yRI0cwceJEVFRUmLfJdZ6dO3di5syZCA8Px5w5c/DFF1+Y98ltpqtXr+KNN94w/5t7\n/PHHUVtba94vp3leffVVLFu2zGJbX/lbW1uxZMkSxMTEIC4uDqtXr4bRaOzP2L/p1+bJzc3FrFmz\nEBkZCbVajZ07d1rst+d5HI5wUllZWSI+Pl4cOHBAHDt2TMybN0/Mnz9f6lh96u3tFQ8//LBISUkR\nR48eFTU1NSIjI0PExcWJtrY2UVNTI8LCwsR7770namtrRVZWlggNDRWnTp2SOnqfOjo6xJ///GcR\nEhIiDh06JIQQsp2nsLBQhIaGip07d4ozZ86It99+W0RGRor6+npZzvTKK6+IWbNmCb1eL2pra8XT\nTz8tEhIShMFgkM08JpNJZGdni5CQEPHKK6+Yt19P/gULFoiFCxeKEydOiM8//1zcddddYu3atVKM\nYfZb82zbtk1ERkaK4uJicfbsWVFQUCBCQ0NFUVGR+T72OI+jcsqS7erqElFRUWL37t3mbfX19SIk\nJER89dVXEibr2/Hjx0VISIiora01b+vq6hIRERGiqKhIZGZmCo1GY/EYjUYjli9f3t9Rb9hP2X9e\nsnKcx2QyiT/96U8iOzvbvK23t1c88MAD4uOPP5blTLGxsUKn05n/u6amRoSEhIhjx47JYp7vv/9e\naDQaMWXKFDFt2jSLUuorf1VVlQgJCRHff/+9eX9hYaGIiooSXV1d/TPAL/zePElJSWLVqlUW91+6\ndKlIS0sTQtjnPI7MKU8XV1dXo6OjA7GxseZtgYGBCAgIgF6vlzBZ3/z9/bFlyxaMHj3avE2hUAAA\nLl26BL1ebzEX8N9Pe7H3ucrLy/H5559j+fLlFtvlOM/p06dx7tw5qNVq8zalUok9e/YgKSlJljMN\nHToUJSUlaG1tRXd3N3bt2oVBgwYhKChIFvNUVVXB398fe/fuvWZFmr7y6/V6BAQEICgoyLw/NjYW\nHR0dOHHihO3D/4rfm2f58uWYP3++xTalUon29nYA9jmPI3PKkm1sbASAa5bG8/X1Ne+zV0OGDMG0\nadOgVP7vf11OTg4MBgNUKhUaGxtlN1dbWxuWLVuGN998E4MGDbLYJ8d5zpw5AwBob2+HVqtFXFwc\nUlNTUVVVBUCeM73xxhtobGzE3XffjcjISBQUFOD999/HwIEDZTHP7NmzsWrVKowYMeKafX3lv3Dh\nAnx9fa/ZDwDnz5+3UeLf93vzxMbGWhToDz/8gE8//RRTp04FYJ/zODKnLNnOzk4olUq4ublZbHd3\nd0dXV5dEqW5OWVkZ1q5di0cffRTBwcEwGAxwd3e3uI+9z/Xaa69h+vTpuOeee67ZJ8d5rly5AgB4\n+eWXMW/ePHz44YcYO3Ys0tPTUVdXJ8uZzp49i+HDh+P999/H9u3boVKpkJGRgcbGRlnO83N95e/s\n7ISHh4fFfjc3NygUCrufsa2tDU8++SSGDx+OJ554AoC855EjWa7C80d5enrCZDLBaDTC1fV/34Lu\n7u4/tNBAfyssLERmZibUajVefPFFAICHhwd6enos7mfPcxUVFeHbb7/Fxx9//Kv75TYPAPMvb3/5\ny1+QlJQEAJg4cSK++uorbN++XXYz1dfXIzMzE3l5eeblJNesWQO1Wo2PPvpIdvP8Ul/5PT090d3d\nbbG/p6cHQggMGDCg33LeqPr6ejz++OMwGAzIzc2Fj48PAPnOI1dOWbL+/v4AgObmZvPXANDU1HTN\naSN7tWnTJmRnZ0Oj0WD58uXmv8v6+/ujqanJ4r72PFdhYSEuXLgAlUoFABD/v17F4sWLkZycLLt5\ngP+degsJCTFvUygUGDNmDBoaGmQ307Fjx9Db24uwsDDzNjc3N0yYMAFnz56V3Ty/1Ff+kSNHXnNJ\nz0/3t9cZjx8/jsWLF2PQoEHIz8+3+Dknx3nkzClPF48fPx7e3t748ssvzdsaGhpw7tw5TJ48WcJk\n1+eDDz5AdnY2MjIykJmZaS5YAIiOjkZlZaXF/SsqKhATE9PfMa/Lu+++i08//RTFxcUoLi7Ghx9+\nCAB48803sWTJEtnNAwChoaEYMGAAvvnmG/M2IQTq6uoQFBQku5lGjhwJADh58qR520/z3H777bKb\n55f6yh8dHY36+nqLv1dWVFTA29sb48eP79es16Ourg6LFi1CQEAA8vLyLAoWkN88sifpe5sltHr1\nanH33XeL8vJy83Wyv3wbvz06ceKEmDBhgli6dKloamqyuHV0dIjq6moRGhoq1q1bJ2pra0V2draY\nNGmSxSU/9uz8+fMWl/DIdZ6srCwxefJksW/fPvHdd9+Jt956S0yaNEnU1dXJbiaj0ShSUlLE/fff\nLyorK0Vtba3IzMwUkZGRoqGhQXbzaDQai0te+spvMplESkqKePjhh8WxY8fM15WuX79eqhEs/HKe\nhx56SKhUKnH69GmLnw+tra1CCPufx9E4bcn29PSId955R8TGxoo777xTLFmyxPyP0J6tWbNGhISE\n/OrtH//4hxBCiH/9619CrVaLsLAw8cADD4iDBw9KnPr6/bJkhZDnPCaTSWzevFkkJCSIsLAwMW/e\nPFFZWWneL7eZWltbxbJly8TUqVNFdHS0SE9PF99++615v5zm+WUpCdF3/qamJvH000+LiIgIcffd\nd4s1a9aI3t7e/oz9m34+z+nTp3/z58O9995rfow9z+NouGg7ERGRjTjl32SJiIj6A0uWiIjIRliy\nRERENsKSJSIishGWLBERkY2wZImIiGyEJUvkhDIyMrBs2TKpYxA5PJYskRMRQmDVqlXYt2+f1FGI\nnIJTLhBA5Izq6urw1ltvQa/Xw9PTU+o4RE6BR7JEVlRQUAC1Wo2wsDBMnz4d77//PoQQOH/+PKKj\no7Fo0SLzfTs6OpCYmIi5c+fCaDQC+O8HtS9atAiTJ09GWFgYEhMTsXHjRphMJgD/Xchi3LhxSjJH\nRQAAA79JREFUKC0txRNPPIHIyEjcc8892LFjB5qamvDss88iMjISCQkJ+OijjyyyrVixAleuXMGO\nHTswbNiwfvueEDkzliyRlWzZsgWvvvoqpk6dis2bN2PevHlYv349Vq5cCX9/f7z88ss4ePAg9u7d\nCwBYuXIlWltbsXr1ari6uuL48eNYtGgRhg0bhuzsbGzatAnR0dHYsGEDPvvsM4vXWr58OSIiIrBp\n0yaMHz8er7/+OrRaLcaOHYtNmzYhPDwc77zzjsVKQJmZmSgoKMCECRP69ftC5Mx4upjICi5fvoz3\n3nsPqampWLp0KQBApVJhwIABWLlyJbRaLebNm4fPPvsMf//73+Hp6YkdO3bgtddew+jRowEAp06d\ngkqlwqpVq8zLF8bHx2P//v2orKyEWq02v9706dPxzDPPAAB8fHxQXl6O8PBwLFmyBMB/l3MsLS3F\n0aNHMWnSJACW69sSUf/gkSyRFRw+fBgGgwHTp0+H0Wg036ZPn47e3l4cOnQIwH/XyTUYDMjIyEBC\nQgIWLlxofo4HH3wQW7ZsQXd3N6qrq1FaWor169ejt7cXPT09Fq8XHh5u/nr48OEAgIiICPO2IUOG\nAADa29ttNjMR9Y1HskRWcPHiRQCw+JvrzzU1NQEA/P39MWXKFJSVlSEhIcHiPgaDAW+88Qb27NkD\no9GIwMBAREVFwdXVFb9cLMvb2/ua1/Dy8rLGKERkRSxZIivw8fEBAGRlZSEoKOia/b6+vgCA8vJy\nlJWVYcKECcjOzsa9994LPz8/AMBbb72F0tJSrFu3DnFxcRgwYAAAIC4urp+mICJr4+liIiuIiIiA\nm5sbmpqaMGnSJPPNaDQiKysLzc3NuHz5MjIzM5GQkACdTgd3d3dkZmaan+Orr75CXFwcEhMTzQV7\n7NgxtLW1md9dTETywiNZIisYOnQoFi1ahKysLFy5cgXR0dH44YcfkJWVBR8fH4wdOxYrVqzA5cuX\n8dprr2HgwIFYunQp/va3v6GwsBBz5sxBeHg4PvvsM+zYsQOjR49GdXU1Nm3aBIVCgc7OTqlHJKKb\nwJIlspK//vWvGDFiBPLy8rB582YMHjwYU6dOxQsvvIBDhw6hsLAQS5cuRUBAAADg/vvvR1FREd55\n5x3Ex8fj5ZdfRk9PD9auXYvu7m4EBgbiqaeeQm1tLcrLy3k0SyRDCvHLd1QQERGRVfBvskRERDbC\nkiUiIrIRliwREZGNsGSJiIhshCVLRERkIyxZIiIiG2HJEhER2QhLloiIyEZYskRERDbyf7T3za/+\nzh1lAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.set(context=\"notebook\", style=\"ticks\", font_scale=1.5)\n", + "\n", + "sns.lmplot('exam1', 'exam2', hue='admitted', data=data, \n", + " size=6, \n", + " fit_reg=False, \n", + " scatter_kws={\"s\": 25}\n", + " )\n", + "\n", + "plt.plot(x, y, 'grey')\n", + "plt.xlim(0, 130)\n", + "plt.ylim(0, 130)\n", + "plt.title('Decision Boundary')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# 3- 正则化逻辑回归" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
test1test2accepted
00.0512670.699561
1-0.0927420.684941
2-0.2137100.692251
3-0.3750000.502191
4-0.5132500.465641
\n", + "
" + ], + "text/plain": [ + " test1 test2 accepted\n", + "0 0.051267 0.69956 1\n", + "1 -0.092742 0.68494 1\n", + "2 -0.213710 0.69225 1\n", + "3 -0.375000 0.50219 1\n", + "4 -0.513250 0.46564 1" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nH+5xT+gQTWpoAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.set(context=\"notebook\", style=\"ticks\", font_scale=1.5)\n", + "\n", + "sns.lmplot('test1', 'test2', hue='accepted', data=df, \n", + " size=6, \n", + " fit_reg=False, \n", + " scatter_kws={\"s\": 50}\n", + " )\n", + "\n", + "plt.title('Regularized Logistic Regression')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# feature mapping(特征映射)\n", + "\n", + "polynomial expansion\n", + "\n", + "```\n", + "for i in 0..i\n", + " for p in 0..i:\n", + " output x^(i-p) * y^p\n", + "```\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def feature_mapping(x, y, power, as_ndarray=False):\n", + "# \"\"\"return mapped features as ndarray or dataframe\"\"\"\n", + " # data = {}\n", + " # # inclusive\n", + " # for i in np.arange(power + 1):\n", + " # for p in np.arange(i + 1):\n", + " # data[\"f{}{}\".format(i - p, p)] = np.power(x, i - p) * np.power(y, p)\n", + "\n", + " data = {\"f{}{}\".format(i - p, p): np.power(x, i - p) * np.power(y, p)\n", + " for i in np.arange(power + 1)\n", + " for p in np.arange(i + 1)\n", + " }\n", + "\n", + " if as_ndarray:\n", + " return pd.DataFrame(data).as_matrix()\n", + " else:\n", + " return pd.DataFrame(data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x1 = np.array(df.test1)\n", + "x2 = np.array(df.test2)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(118, 28)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
f00f01f02f03f04f05f06f10f11f12...f30f31f32f33f40f41f42f50f51f60
01.00.699560.4893840.3423540.2394970.1675420.1172060.0512670.0358640.025089...0.0001350.0000940.0000660.0000460.0000070.0000050.0000033.541519e-072.477505e-071.815630e-08
11.00.684940.4691430.3213350.2200950.1507520.103256-0.092742-0.063523-0.043509...-0.000798-0.000546-0.000374-0.0002560.0000740.0000510.000035-6.860919e-06-4.699318e-066.362953e-07
21.00.692250.4792100.3317330.2296420.1589700.110047-0.213710-0.147941-0.102412...-0.009761-0.006757-0.004677-0.0032380.0020860.0014440.001000-4.457837e-04-3.085938e-049.526844e-05
31.00.502190.2521950.1266500.0636020.0319400.016040-0.375000-0.188321-0.094573...-0.052734-0.026483-0.013299-0.0066790.0197750.0099310.004987-7.415771e-03-3.724126e-032.780914e-03
41.00.465640.2168210.1009600.0470110.0218900.010193-0.513250-0.238990-0.111283...-0.135203-0.062956-0.029315-0.0136500.0693930.0323120.015046-3.561597e-02-1.658422e-021.827990e-02
\n", + "

5 rows × 28 columns

\n", + "
" + ], + "text/plain": [ + " f00 f01 f02 f03 f04 f05 f06 f10 \\\n", + "0 1.0 0.69956 0.489384 0.342354 0.239497 0.167542 0.117206 0.051267 \n", + "1 1.0 0.68494 0.469143 0.321335 0.220095 0.150752 0.103256 -0.092742 \n", + "2 1.0 0.69225 0.479210 0.331733 0.229642 0.158970 0.110047 -0.213710 \n", + "3 1.0 0.50219 0.252195 0.126650 0.063602 0.031940 0.016040 -0.375000 \n", + "4 1.0 0.46564 0.216821 0.100960 0.047011 0.021890 0.010193 -0.513250 \n", + "\n", + " f11 f12 ... f30 f31 f32 f33 \\\n", + "0 0.035864 0.025089 ... 0.000135 0.000094 0.000066 0.000046 \n", + "1 -0.063523 -0.043509 ... -0.000798 -0.000546 -0.000374 -0.000256 \n", + "2 -0.147941 -0.102412 ... -0.009761 -0.006757 -0.004677 -0.003238 \n", + "3 -0.188321 -0.094573 ... -0.052734 -0.026483 -0.013299 -0.006679 \n", + "4 -0.238990 -0.111283 ... -0.135203 -0.062956 -0.029315 -0.013650 \n", + "\n", + " f40 f41 f42 f50 f51 f60 \n", + "0 0.000007 0.000005 0.000003 3.541519e-07 2.477505e-07 1.815630e-08 \n", + "1 0.000074 0.000051 0.000035 -6.860919e-06 -4.699318e-06 6.362953e-07 \n", + "2 0.002086 0.001444 0.001000 -4.457837e-04 -3.085938e-04 9.526844e-05 \n", + "3 0.019775 0.009931 0.004987 -7.415771e-03 -3.724126e-03 2.780914e-03 \n", + "4 0.069393 0.032312 0.015046 -3.561597e-02 -1.658422e-02 1.827990e-02 \n", + "\n", + "[5 rows x 28 columns]" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = feature_mapping(x1, x2, power=6)\n", + "print(data.shape)\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
f00f01f02f03f04f05f06f10f11f12...f30f31f32f33f40f41f42f50f51f60
count118.0118.000000118.000000118.0000001.180000e+02118.0000001.180000e+02118.000000118.000000118.000000...1.180000e+02118.0000001.180000e+02118.0000001.180000e+02118.0000001.180000e+021.180000e+02118.0000001.180000e+02
mean1.00.1831020.3013700.1423501.710985e-010.1157101.257256e-010.054779-0.0254720.015483...5.983333e-02-0.0052519.432094e-03-0.0017051.225384e-010.0118121.893340e-025.196507e-02-0.0007037.837118e-02
std0.00.5197430.2845360.3261342.815658e-010.2990922.964416e-010.4966540.2240750.150143...2.746459e-010.0967385.455787e-020.0374432.092709e-010.0722743.430092e-022.148098e-010.0582711.938621e-01
min1.0-0.7697400.000026-0.4560716.855856e-10-0.2702221.795116e-14-0.830070-0.484096-0.483743...-5.719317e-01-0.296854-1.592528e-01-0.1134481.612020e-09-0.2460682.577297e-10-3.940702e-01-0.2039716.472253e-14
25%1.0-0.2543850.061086-0.0164923.741593e-03-0.0010722.298277e-04-0.372120-0.178209-0.042980...-5.155632e-02-0.029360-3.659760e-03-0.0057491.869975e-03-0.0019261.258285e-04-7.147973e-03-0.0063818.086369e-05
50%1.00.2134550.2521950.0097346.360222e-020.0004441.604015e-02-0.006336-0.016521-0.000039...-2.544062e-07-0.000512-1.473547e-07-0.0000052.736163e-020.0002053.387050e-03-1.021440e-11-0.0000044.527344e-03
75%1.00.6465620.4641890.2703102.155453e-010.1130201.001215e-010.4789700.1007950.079510...1.099616e-010.0150501.370560e-020.0010241.520801e-010.0191832.090875e-022.526861e-020.0021045.932959e-02
max1.01.1089001.2296591.3635691.512062e+001.6767251.859321e+001.0709000.5683070.505577...1.228137e+000.3698052.451845e-010.1835481.315212e+000.3044092.018260e-011.408460e+000.2505771.508320e+00
\n", + "

8 rows × 28 columns

\n", + "
" + ], + "text/plain": [ + " f00 f01 f02 f03 f04 f05 \\\n", + "count 118.0 118.000000 118.000000 118.000000 1.180000e+02 118.000000 \n", + "mean 1.0 0.183102 0.301370 0.142350 1.710985e-01 0.115710 \n", + "std 0.0 0.519743 0.284536 0.326134 2.815658e-01 0.299092 \n", + "min 1.0 -0.769740 0.000026 -0.456071 6.855856e-10 -0.270222 \n", + "25% 1.0 -0.254385 0.061086 -0.016492 3.741593e-03 -0.001072 \n", + "50% 1.0 0.213455 0.252195 0.009734 6.360222e-02 0.000444 \n", + "75% 1.0 0.646562 0.464189 0.270310 2.155453e-01 0.113020 \n", + "max 1.0 1.108900 1.229659 1.363569 1.512062e+00 1.676725 \n", + "\n", + " f06 f10 f11 f12 ... \\\n", + "count 1.180000e+02 118.000000 118.000000 118.000000 ... \n", + "mean 1.257256e-01 0.054779 -0.025472 0.015483 ... \n", + "std 2.964416e-01 0.496654 0.224075 0.150143 ... \n", + "min 1.795116e-14 -0.830070 -0.484096 -0.483743 ... \n", + "25% 2.298277e-04 -0.372120 -0.178209 -0.042980 ... \n", + "50% 1.604015e-02 -0.006336 -0.016521 -0.000039 ... \n", + "75% 1.001215e-01 0.478970 0.100795 0.079510 ... \n", + "max 1.859321e+00 1.070900 0.568307 0.505577 ... \n", + "\n", + " f30 f31 f32 f33 f40 \\\n", + "count 1.180000e+02 118.000000 1.180000e+02 118.000000 1.180000e+02 \n", + "mean 5.983333e-02 -0.005251 9.432094e-03 -0.001705 1.225384e-01 \n", + "std 2.746459e-01 0.096738 5.455787e-02 0.037443 2.092709e-01 \n", + "min -5.719317e-01 -0.296854 -1.592528e-01 -0.113448 1.612020e-09 \n", + "25% -5.155632e-02 -0.029360 -3.659760e-03 -0.005749 1.869975e-03 \n", + "50% -2.544062e-07 -0.000512 -1.473547e-07 -0.000005 2.736163e-02 \n", + "75% 1.099616e-01 0.015050 1.370560e-02 0.001024 1.520801e-01 \n", + "max 1.228137e+00 0.369805 2.451845e-01 0.183548 1.315212e+00 \n", + "\n", + " f41 f42 f50 f51 f60 \n", + "count 118.000000 1.180000e+02 1.180000e+02 118.000000 1.180000e+02 \n", + "mean 0.011812 1.893340e-02 5.196507e-02 -0.000703 7.837118e-02 \n", + "std 0.072274 3.430092e-02 2.148098e-01 0.058271 1.938621e-01 \n", + "min -0.246068 2.577297e-10 -3.940702e-01 -0.203971 6.472253e-14 \n", + "25% -0.001926 1.258285e-04 -7.147973e-03 -0.006381 8.086369e-05 \n", + "50% 0.000205 3.387050e-03 -1.021440e-11 -0.000004 4.527344e-03 \n", + "75% 0.019183 2.090875e-02 2.526861e-02 0.002104 5.932959e-02 \n", + "max 0.304409 2.018260e-01 1.408460e+00 0.250577 1.508320e+00 \n", + "\n", + "[8 rows x 28 columns]" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# regularized cost(正则化代价函数)\n", + "$$J\\left( \\theta \\right)=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[-{{y}^{(i)}}\\log \\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)-\\left( 1-{{y}^{(i)}} \\right)\\log \\left( 1-{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)]}+\\frac{\\lambda }{2m}\\sum\\limits_{j=1}^{n}{\\theta _{j}^{2}}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(118, 28)\n", + "(118,)\n" + ] + } + ], + "source": [ + "theta = np.zeros(data.shape[1])\n", + "X = feature_mapping(x1, x2, power=6, as_ndarray=True)\n", + "print(X.shape)\n", + "\n", + "y = get_y(df)\n", + "print(y.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def regularized_cost(theta, X, y, l=1):\n", + "# '''you don't penalize theta_0'''\n", + " theta_j1_to_n = theta[1:]\n", + " regularized_term = (l / (2 * len(X))) * np.power(theta_j1_to_n, 2).sum()\n", + "\n", + " return cost(theta, X, y) + regularized_term\n", + "#正则化代价函数" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.6931471805599454" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "regularized_cost(theta, X, y, l=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "this is the same as the not regularized cost because we init theta as zeros...\n", + "因为我们设置theta为0,所以这个正则化代价函数与代价函数的值相同" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# regularized gradient(正则化梯度)\n", + "$$\\frac{\\partial J\\left( \\theta \\right)}{\\partial {{\\theta }_{j}}}=\\left( \\frac{1}{m}\\sum\\limits_{i=1}^{m}{\\left( {{h}_{\\theta }}\\left( {{x}^{\\left( i \\right)}} \\right)-{{y}^{\\left( i \\right)}} \\right)} \\right)+\\frac{\\lambda }{m}{{\\theta }_{j}}\\text{ }\\text{ for j}\\ge \\text{1}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def regularized_gradient(theta, X, y, l=1):\n", + "# '''still, leave theta_0 alone'''\n", + " theta_j1_to_n = theta[1:]\n", + " regularized_theta = (l / len(X)) * theta_j1_to_n\n", + "\n", + " # by doing this, no offset is on theta_0\n", + " regularized_term = np.concatenate([np.array([0]), regularized_theta])\n", + "\n", + " return gradient(theta, X, y) + regularized_term" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 8.47457627e-03, 7.77711864e-05, 3.76648474e-02,\n", + " 2.34764889e-02, 3.93028171e-02, 3.10079849e-02,\n", + " 3.87936363e-02, 1.87880932e-02, 1.15013308e-02,\n", + " 8.19244468e-03, 3.09593720e-03, 4.47629067e-03,\n", + " 1.37646175e-03, 5.03446395e-02, 7.32393391e-03,\n", + " 1.28600503e-02, 5.83822078e-03, 7.26504316e-03,\n", + " 1.83559872e-02, 2.23923907e-03, 3.38643902e-03,\n", + " 4.08503006e-04, 3.93486234e-02, 4.32983232e-03,\n", + " 6.31570797e-03, 1.99707467e-02, 1.09740238e-03,\n", + " 3.10312442e-02])" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "regularized_gradient(theta, X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 拟合参数" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import scipy.optimize as opt" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "init cost = 0.6931471805599454\n" + ] + }, + { + "data": { + "text/plain": [ + " fun: 0.5290027297127737\n", + " jac: array([ 1.05541650e-07, 6.13738958e-08, -7.04772465e-08,\n", + " -1.36777274e-08, -2.84652117e-08, -3.41659162e-08,\n", + " -5.15630062e-08, -1.74645557e-08, 7.50726574e-09,\n", + " 1.18564041e-08, 1.78853446e-08, 1.12436692e-08,\n", + " 8.73092759e-09, 5.56139873e-08, 4.12686771e-09,\n", + " -2.49410770e-08, -6.34978298e-09, -1.34271390e-08,\n", + " -2.13487848e-09, 4.54710087e-10, -4.37439525e-09,\n", + " -1.26745782e-09, -3.40985521e-09, 7.34158338e-09,\n", + " -7.74561697e-09, -9.84723852e-11, 9.65250750e-10,\n", + " -1.18501368e-08])\n", + " message: 'Optimization terminated successfully.'\n", + " nfev: 7\n", + " nhev: 0\n", + " nit: 6\n", + " njev: 66\n", + " status: 0\n", + " success: True\n", + " x: array([ 1.27273981, 1.18108974, -1.43166669, -0.17513036, -1.19281478,\n", + " -0.45635758, -0.9246528 , 0.62527237, -0.9174247 , -0.35723884,\n", + " -0.27470605, -0.29537769, -0.14388711, -2.0199599 , -0.36553508,\n", + " -0.61555685, -0.27778507, -0.32738029, 0.12400668, -0.05098942,\n", + " -0.04473108, 0.01556645, -1.45815829, -0.20600596, -0.29243192,\n", + " -0.24218804, 0.02777165, -1.04320421])" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print('init cost = {}'.format(regularized_cost(theta, X, y)))\n", + "\n", + "res = opt.minimize(fun=regularized_cost, x0=theta, args=(X, y), method='Newton-CG', jac=regularized_gradient)\n", + "res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 预测" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.90 0.75 0.82 60\n", + " 1 0.78 0.91 0.84 58\n", + "\n", + "avg / total 0.84 0.83 0.83 118\n", + "\n" + ] + } + ], + "source": [ + "final_theta = res.x\n", + "y_pred = predict(X, final_theta)\n", + "\n", + "print(classification_report(y, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 使用不同的 $\\lambda$ (这个是常数)\n", + "# 画出决策边界\n", + "* 我们找到所有满足 $X\\times \\theta = 0$ 的x\n", + "* instead of solving polynomial equation, just create a coridate x,y grid that is dense enough, and find all those $X\\times \\theta$ that is close enough to 0, then plot them" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def draw_boundary(power, l):\n", + "# \"\"\"\n", + "# power: polynomial power for mapped feature\n", + "# l: lambda constant\n", + "# \"\"\"\n", + " density = 1000\n", + " threshhold = 2 * 10**-3\n", + "\n", + " final_theta = feature_mapped_logistic_regression(power, l)\n", + " x, y = find_decision_boundary(density, power, final_theta, threshhold)\n", + "\n", + " df = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])\n", + " sns.lmplot('test1', 'test2', hue='accepted', data=df, size=6, fit_reg=False, scatter_kws={\"s\": 100})\n", + "\n", + " plt.scatter(x, y, c='R', s=10)\n", + " plt.title('Decision boundary')\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def feature_mapped_logistic_regression(power, l):\n", + "# \"\"\"for drawing purpose only.. not a well generealize logistic regression\n", + "# power: int\n", + "# raise x1, x2 to polynomial power\n", + "# l: int\n", + "# lambda constant for regularization term\n", + "# \"\"\"\n", + " df = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])\n", + " x1 = np.array(df.test1)\n", + " x2 = np.array(df.test2)\n", + " y = get_y(df)\n", + "\n", + " X = feature_mapping(x1, x2, power, as_ndarray=True)\n", + " theta = np.zeros(X.shape[1])\n", + "\n", + " res = opt.minimize(fun=regularized_cost,\n", + " x0=theta,\n", + " args=(X, y, l),\n", + " method='TNC',\n", + " jac=regularized_gradient)\n", + " final_theta = res.x\n", + "\n", + " return final_theta" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def find_decision_boundary(density, power, theta, threshhold):\n", + " t1 = np.linspace(-1, 1.5, density)\n", + " t2 = np.linspace(-1, 1.5, density)\n", + "\n", + " cordinates = [(x, y) for x in t1 for y in t2]\n", + " x_cord, y_cord = zip(*cordinates)\n", + " mapped_cord = feature_mapping(x_cord, y_cord, power) # this is a dataframe\n", + "\n", + " inner_product = mapped_cord.as_matrix() @ theta\n", + "\n", + " decision = mapped_cord[np.abs(inner_product) < threshhold]\n", + "\n", + " return decision.f10, decision.f01\n", + "#寻找决策边界函数" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\nQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "draw_boundary(power=6, l=1)#lambda=1" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "draw_boundary(power=6, l=0) # no regularization, over fitting,#lambda=0,没有正则化,过拟合了" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nLCGEECKQ/w/oZEhiy3ciggAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "draw_boundary(power=6, l=100) # underfitting,#lambda=100,欠拟合" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/code/ex2-logistic regression/ML-Exercise2.ipynb b/code/ex2-logistic regression/ML-Exercise2.ipynb new file mode 100644 index 00000000..3197f9c1 --- /dev/null +++ b/code/ex2-logistic regression/ML-Exercise2.ipynb @@ -0,0 +1,1193 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 机器学习练习 2 - 逻辑回归" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这个笔记包含了以Python为编程语言的Coursera上机器学习的第二次编程练习。请参考 [作业文件](ex2.pdf) 详细描述和方程。\n", + "在这一次练习中,我们将要实现逻辑回归并且应用到一个分类任务。我们还将通过将正则化加入训练算法,来提高算法的鲁棒性,并用更复杂的情形来测试它。\n", + "\n", + "代码修改并注释:黄海广,haiguang2000@qq.com" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 逻辑回归" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在训练的初始阶段,我们将要构建一个逻辑回归模型来预测,某个学生是否被大学录取。设想你是大学相关部分的管理者,想通过申请学生两次测试的评分,来决定他们是否被录取。现在你拥有之前申请学生的可以用于训练逻辑回归的训练样本集。对于每一个训练样本,你有他们两次测试的评分和最后是被录取的结果。为了完成这个预测任务,我们准备构建一个可以基于两次测试评分来评估录取可能性的分类模型。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "让我们从检查数据开始。" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Exam 1Exam 2Admitted
034.62366078.0246930
130.28671143.8949980
235.84740972.9021980
360.18259986.3085521
479.03273675.3443761
\n", + "
" + ], + "text/plain": [ + " Exam 1 Exam 2 Admitted\n", + "0 34.623660 78.024693 0\n", + "1 30.286711 43.894998 0\n", + "2 35.847409 72.902198 0\n", + "3 60.182599 86.308552 1\n", + "4 79.032736 75.344376 1" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "path = 'ex2data1.txt'\n", + "data = pd.read_csv(path, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "让我们创建两个分数的散点图,并使用颜色编码来可视化,如果样本是正的(被接纳)或负的(未被接纳)。" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtcAAAHjCAYAAADojTN7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3X943XV9///HM/yqJJkIdnyhrCuj0YkIdYtMtFKggqwq\nhOoI6rS6zrp9UPtDZ8u16/LXtQmiH2vUbX5YGeLGahhLA9fs/FVxWnS4VKsgxaW6grXlhyDzJP6C\n5vn943XezUl6TnJyzvuc96/77bp6nZz3OUleeSdNHu/Xeb6eL3N3AQAAAGheR9IDAAAAAPKCcA0A\nAADEhHANAAAAxIRwDQAAAMSEcA0AAADEhHANAAAAxIRwDQAAAMSEcA0AAADEhHANAAAAxOTopAfQ\njGc+85m+aNGipIcBAACAnNu1a9dP3H3+bM/LdLhetGiRRkZGkh4GAAAAcs7MHqjneZSFAAAAADEh\nXAMAAAAxIVwDAAAAMcl0zTUAAEBWPfnkk9q/f79++ctfJj0UVJg3b55OO+00HXPMMQ29P+EaAAAg\nAfv371d3d7cWLVokM0t6OJDk7nrssce0f/9+nX766Q19DMpCAAAAEvDLX/5SJ510EsE6RcxMJ510\nUlOvJhCuAQAAEkKwTp9mvyeEawAAACAmhGsAAIAMKJWkLVukjRvDbakU38ceHh6Wmen++++v+vgb\n3/hG3XbbbXV/vAMHDujVr361JGn37t3avn374ce+8pWv6Otf//qcx7ho0SL95Cc/mfP7tRvhGgAA\nIOV27pQWLJDWrZOuvz7cLlgQjsdh69atWrp0qbZu3RrLxzv11FMPh/G4wnVWEK4BAABSrFSSVqwI\nt+Pj4dj4+OTxsbHmPv7Y2Jh27typG2+8UZ/5zGckha4Zb33rW/XsZz9bL33pS/XII48cfv6iRYt0\nzTXXaMmSJert7dW3vvUtvexlL9MZZ5yhT37yk5Kkffv26ayzztKvf/1rvfvd79bg4KCWLFmiD37w\ng/rkJz+pzZs3a8mSJfra176mRx99VK961av0ghe8QC94wQt01113SZIee+wxXXLJJXruc5+rP/3T\nP5W7N/eFtknLWvGZ2T9IeoWkR9z9rPKxEyUNSlokaZ+kK939p+XHrpG0WtIhSW9398+3amwAAABZ\nMTgoTUxUf2xiIjy+enXjH//222/XpZdeqmc961k66aSTtGvXLj3wwAP6/ve/r/vuu08PP/ywzjzz\nTP3Jn/zJ4fdZuHChdu/erfXr1+uNb3yj7rrrLv3yl7/UWWedpT/7sz87/Lxjjz1W73//+zUyMqJP\nfOITkqRf/OIX6urq0jvf+U5J0mtf+1qtX79eS5cu1YMPPqiXvexl2rNnj973vvdp6dKleve7363P\nfvazuvHGGxv/ItuolX2uPyXpE5I+XXFsk6Qd7n6dmW0q399oZmdKukrScyWdKulLZvYsdz/UwvEB\nAACk3ujo5Iz1dOPj0t69zX38rVu3au3atZKkq666Slu3btVTTz2l17zmNTrqqKN06qmn6qKLLpry\nPpdddpkk6XnPe57GxsbU3d2t7u5uHXfccXriiSfm9Pm/9KUv6b777jt8/2c/+5nGxsb01a9+VUND\nQ5Kkl7/85XrGM57RzJfZNi0L1+7+VTNbNO3w5ZIuKL99s6SvSNpYPv4Zd/+VpP8xs72SzpX0jVaN\nDwAAIAt6eqTOzuoBu7NTWry48Y/9+OOP68tf/rLuuecemZkOHTokM9MVV1wx4/sdd9xxkqSOjo7D\nb0f3n3rqqTmNYWJiQv/5n/+pefPmzf0LSKF211yf7O4Hy28/JOnk8tsLJP2o4nn7y8eOYGZrzGzE\nzEYeffTR1o0UAAAgBfr7pY4aia2jIzzeqNtuu02vf/3r9cADD2jfvn360Y9+pNNPP10nnXSSBgcH\ndejQIR08eFB33nlnw5+ju7tbpYrWJtPvX3LJJfr4xz9++P7u3bslSeeff77++Z//WZL07//+7/rp\nT3/a8BjaKbEFjR6q0udcme7uN7h7r7v3zp8/vwUjAwAASI/ubmn79nDb2RmOdXZOHu/qavxjb926\n9YhZ6le96lU6ePCgenp6dOaZZ+oNb3iDzjvvvIY/x4UXXqj77rtPS5Ys0eDgoF75yldq27Zthxc0\nfuxjH9PIyIjOPvtsnXnmmYcXRb7nPe/RV7/6VT33uc/V0NCQFi5c2PgX2kbWypWX5bKQf6tY0Ph9\nSRe4+0EzO0XSV9z92eXFjHL3a8vP+7yk97r7jGUhvb29PjIy0rLxp5q7NDws9fVJlTsJ1ToOAABS\nZc+ePXrOc55T9/PHxsLixb17QylIf39zwRq1VfvemNkud++d7X3bPXN9h6RV5bdXSbq94vhVZnac\nmZ0uqUfSN9s8tmwZHpZWrpTWrw+BWgq369eH48PDyY4PAADEqqsrdAW59tpwS7BOp1a24tuqsHjx\n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\ncC1JkiT15BuusxrFcxyTBwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "positive = data[data['Admitted'].isin([1])]\n", + "negative = data[data['Admitted'].isin([0])]\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')\n", + "ax.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')\n", + "ax.legend()\n", + "ax.set_xlabel('Exam 1 Score')\n", + "ax.set_ylabel('Exam 2 Score')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "看起来在两类间,有一个清晰的决策边界。现在我们需要实现逻辑回归,那样就可以训练一个模型来预测结果。方程实现在下面的代码示例在\"exercises\" 文件夹的 \"ex2.pdf\" 中。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# sigmoid 函数\n", + "g 代表一个常用的逻辑函数(logistic function)为S形函数(Sigmoid function),公式为: \\\\[g\\left( z \\right)=\\frac{1}{1+{{e}^{-z}}}\\\\] \n", + "合起来,我们得到逻辑回归模型的假设函数: \n", + "\t\\\\[{{h}_{\\theta }}\\left( x \\right)=\\frac{1}{1+{{e}^{-{{\\theta }^{T}}X}}}\\\\] " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sigmoid(z):\n", + " return 1 / (1 + np.exp(-z))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "让我们做一个快速的检查,来确保它可以工作。" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAAHVCAYAAADywj0dAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xmc1WXd//HXRxY19wRREcI9S7MM0Tu1tNTAPU0B0+7K\n+7bNuu9+dbtktt6Z7WZaZOmdpWdwA0WDXNK0NE3MHdOAVMANN0RQYJjr98d3iAFmmANzzlxneT0f\nj/OYM+d8Yd6dvjO8veZzrm+klJAkSZKa3Tq5A0iSJEm1wGIsSZIkYTGWJEmSAIuxJEmSBFiMJUmS\nJMBiLEmSJAEWY0mSJAmwGEuSJEmAxViSJEkCoG+uLzxgwIA0bNiwXF9ekiRJTeLee+99IaU0sLvj\nshXjYcOGMXXq1FxfXpIkSU0iIp4s5zhHKSRJkiQsxpIkSRJgMZYkSZIAi7EkSZIEWIwlSZIkwGIs\nSZIkARZjSZIkCbAYS5IkSYDFWJIkSQIsxpIkSRJgMZYkSZIAi7EkSZIEWIwlSZIkwGIsSZIkAWUU\n44i4OCKej4iHu3g+IuK8iJgeEQ9GxB6VjylJkiRVVzkrxr8GRq7m+VHAju23k4Gf9zyWJEmS1Lv6\ndndASun2iBi2mkOOBH6TUkrAXRGxaURslVJ6pkIZJUmSVE0pLf9YzfubbALr1O4kb7fFuAyDgVkd\nPp/d/pjFWJIk5ZUSLFgA8+cXH5csKf/W2rpmx3f351pboa1t+S2lFT+v9OOdPddZWe1NTz0FQ4b0\n/tctUyWKcdki4mSKcQuGDh3am19akiTVi7Y2eO01ePXVotDOn79m9zs+Nn9+9Qpgv36d3/r27frx\n/v0holg17ezW1XNr+nhnz0Usv0Ge+5tuWp3/LyqkEsV4DtCx+m/T/tgqUkoXAhcCDB8+PMN/pkiS\npF6TEjz3HEyfXtzmzOm8vK58f8GC8v7+vn1h441ho42K28Ybw2abwdChKz6+7LkNNui6zJZTbDve\n+vRZXvrUMCpRjCcBp0TEeGAvYJ7zxZIkNYmlS2H27KL4zpixvATPmFHcVi656667apkdNAh22GHV\nx1cutivfX3ddy6kqqttiHBEtwP7AgIiYDXwN6AeQUhoHTAYOAaYDC4GPVyusJEnKYMkSeOKJFUvv\nsvv//CcsXrz82HXXhe22K4ru+99ffNxhB9h++2K2dN11s/3PkLpTzq4UY7t5PgGfrVgiSZLU+15/\nHWbO7Lz8PvVUsTK8zIYbFkV3113hqKOK+8sK8ODBNb3rgLQ6vfrmO0mSlNGrr3Y+8rBs/rejN7+5\nKLp77w0nnLB81XeHHWCLLRxhUEOyGEuS1MiefRZaWuC3v4X77lvxuS23LIruQQetuOq7/fbFm9ik\nJmMxliSp0SxcCNdcU5ThG28stj/bc084+2zYeeei/G63XTESIelfLMaSJDWCpUvhj38syvDVVxf7\nAL/lLXDGGcUoxFvfmjuhVPMsxpIk1bOHHy7K8GWXFXPCm2wCY8bAiSfCvvv6RjhpDViMJUmqN88+\nC6VSUYjvv7+4IMXIkfDjH8Phh8N66+VOKNUli7EkSfVgwYLlc8M33bR8bvi884oV4oEDcyeU6p7F\nWJKkWrV0Kdx6a1GGJ0xYcW74xBOLN9JJqhiLsSRJteahh5bPDT/9tHPDUi+xGEuSVAueeWb53PAD\nDxRzw6NGwbnnOjcs9RKLsSRJuSxYABMnFmX45puLueERI+CnP4XRo50blnqZxViSpN60dCnccsvy\nueEFC2DYMPjyl4v9hp0blrKxGEuS1BueeqpYCS6Vls8NH398MTe8zz7ODUs1wGIsSVK1/fWvcNhh\n8PLLcMghRRk+7DDnhqUaYzGWJKmarr8ejjsOttwS/vxn2Gmn3IkkdcHf20iSVC0XXghHHglvfzv8\n5S+WYqnGWYwlSaq0lOCss+CTnywu1XzrrTBoUO5UkrrhKIUkSZW0ZAn853/CJZfASSfBuHHFnsSS\nap4rxpIkVcr8+cWb6i65BL7+dfjlLy3FUh3xu1WSpEp45hk49FB48EG46CL4xCdyJ5K0hizGkiT1\n1N//XswSv/ACXHddcSlnSXXHYixJUk/ccQcccUQxMvHHP8Lw4bkTSVpLzhhLkrS2JkyAD3wANt+8\n2I7NUizVNYuxJElr46c/hQ9/GPbYA+68E7bbLnciST1kMZYkaU20tcGpp8LnP19cvOPmm2HAgNyp\nJFWAM8aSJJVr0SL4+MehpQU+8xk47zzo0yd3KkkVYjGWJKkcr7wCRx9dXMXunHOKVeOI3KkkVZDF\nWJKk7syeXWzB9thj8Nvfwgkn5E4kqQosxpIkrc7DDxeleN48mDKl2IVCUkPyzXeSJHXl1lth332L\nN9z96U+WYqnBWYwlSerM+PHF1ewGDy72KN5999yJJFWZxViSpI5Sgh/8AMaOhb33hj//GYYOzZ1K\nUi+wGEuStMzSpfDf/w3/8z9w3HFwww2w2Wa5U0nqJRZjSZIAXn8dRo8u9ib+wheKvYrXWy93Kkm9\nyF0pJEl66SU44oji0s4/+lFRjCU1HYuxJKm5PfFEsR3bzJlw+eVw7LG5E0nKxGIsSWpe990HhxwC\nb7wBN94I73tf7kSSMnLGWJLUnG68Ed77XujXr9h5wlIsNT2LsSSp+VxyCRx6KGy3XbFH8dvfnjuR\npBpgMZYkNY+U4Nvfho99rFghvv324gIekoQzxpKkZtHaCqecAr/4BXzkI3DxxdC/f+5UkmqIK8aS\npObwX/9VlOLTT4ff/MZSLGkVrhhLkhrfI4/AuHHFivF3vpM7jaQa5YqxJKnxnXEGbLghfP3ruZNI\nqmEWY0lSY/vTn+C664oRis03z51GUg2zGEuSGldKcOqpsPXWxYyxJK2GM8aSpMZ1zTVw113wy1/C\nm96UO42kGueKsSSpMbW2FrPFu+xS7FssSd1wxViS1JguvhgeewyuvRb6+s+dpO65YixJajwLFsDX\nvgb77AOHH547jaQ64X9CS5Iaz7nnwrPPwtVXQ0TuNJLqhCvGkqTGMncufPe7cNRR8J735E4jqY5Y\njCVJjeXb3y5GKbzCnaQ1ZDGWJDWOmTPhZz+Dk06Ct741dxpJdcZiLElqHGedVexA4aWfJa0Fi7Ek\nqTH87W9QKsEXvlBc6U6S1pDFWJLUGE4/HTbfvLgEtCStBbdrkyTVv5tuKm4//jFssknuNJLqlCvG\nkqT61tYGp50Gw4bBpz+dO42kOuaKsSSpvo0fD/fdB5deCuuumzuNpDrmirEkqX4tWgRnngnvfCeM\nHZs7jaQ654qxJKl+jRsHTzwBN9wA67jWI6ln/CkiSapP8+bBt74FBx4IBx+cO42kBmAxliTVp+9/\nH158Ec45J3cSSQ3CYixJqj9PPw0/+lExV/zud+dOI6lBWIwlSfXnG9+A1lb43//NnURSA7EYS5Lq\ny9//DhddVOxZvN12udNIaiAWY0lSffnyl+FNb4KvfCV3EkkNxmIsSaofd94JEyfCqafCwIG500hq\nMBZjSVJ9SKm49POWW8IXvpA7jaQG5AU+JEn14brr4M9/Li7qscEGudNIakBlrRhHxMiIeCwipkfE\n6Z08v0lEXBcRD0TEIxHx8cpHlSQ1rdZWOOMM2Gkn+MQncqeR1KC6XTGOiD7ABcBBwGzgnoiYlFKa\n1uGwzwLTUkqHR8RA4LGIuCyltLgqqSVJzeWSS2DaNLj6aujXL3caSQ2qnBXjEcD0lNLM9qI7Hjhy\npWMSsFFEBLAh8BLQWtGkkqTmtHAhfO1rsPfe8KEP5U4jqYGVM2M8GJjV4fPZwF4rHXM+MAl4GtgI\nGJ1Salv5L4qIk4GTAYYOHbo2eSVJzea882DOHGhpgYjcaSQ1sErtSvFB4H5ga+CdwPkRsfHKB6WU\nLkwpDU8pDR/oNjuSpO68+CKccw4cfjjst1/uNJIaXDnFeA4wpMPn27Q/1tHHgQmpMB34J/DWykSU\nJDWts8+G+fPhO9/JnURSEyinGN8D7BgR20ZEf2AMxdhER08BHwCIiEHAzsDMSgaVJDWZJ5+E88+H\nj30M3v723GkkNYFuZ4xTSq0RcQpwA9AHuDil9EhEfKr9+XHAt4BfR8RDQACnpZReqGJuSVKjO+ss\nWGcd+MY3cieR1CTKusBHSmkyMHmlx8Z1uP80cHBlo0mSmtYDD8CllxaXft5mm9xpJDUJLwktSao9\np58Om25aXAJaknqJl4SWJNWWW26B3/8efvAD2Gyz3GkkNRFXjCVJtaOtrRifGDoUPvvZ3GkkNRlX\njCVJtePKK+Hee4tLQK+3Xu40kpqMK8aSpNqweDGceSbstht85CO500hqQq4YS5Jqw4UXwowZMHky\n9OmTO42kJuSKsSQpv/nz4ZvfhP33h5Ejc6eR1KQsxpKk/H7wA5g7F773PYjInUZSk7IYS5LyevZZ\n+OEP4dhjYc89c6eR1MQsxpKkvL75TVi0CL797dxJJDU5i7EkKZ/HHy/edHfyybDjjrnTSGpyFmNJ\nUj5nnlnsV/zVr+ZOIkkWY0lSJnffDVddBV/6EgwalDuNJFmMJUkZpASnnQZbbAFf/GLuNJIEeIEP\nSVIOU6bAbbfB+efDRhvlTiNJgCvGkqTetnRpsVq8ww7Fm+4kqUa4YixJ6l2XXgoPPwyXXw79+uVO\nI0n/4oqxJKn3vPEGnHVWcSGPY4/NnUaSVuCKsSSp95x/PsyaBZdc4qWfJdUcV4wlSb3j5Zfh7LNh\n1Cg44IDcaSRpFRZjSVLv+N734JVX4JxzcieRpE5ZjCVJ1dfaCv/3f3DUUfCOd+ROI0mdshhLkqrv\n1lvhuefghBNyJ5GkLlmMJUnVVyrBxhvDIYfkTiJJXbIYS5Kq6403YMIEOOYYWG+93GkkqUsWY0lS\ndU2eDK++CscfnzuJJK2WxViSVF2lEgwa5BZtkmqexViSVD3z5sH118Po0dCnT+40krRaFmNJUvVM\nnAiLFjlGIakuWIwlSdVTKsF228GIEbmTSFK3LMaSpOp47jn4wx+K1eKI3GkkqVsWY0lSdVxxBbS1\nwdixuZNIUlksxpKk6iiVYPfd4W1vy51EkspiMZYkVd7MmXDXXb7pTlJdsRhLkipv/Pji45gxeXNI\n0hqwGEuSKisluOwy2HdfGDo0dxpJKpvFWJJUWQ89BNOmOUYhqe5YjCVJlVUqQd++cOyxuZNI0hqx\nGEuSKqetrZgvPvhgGDAgdxpJWiMWY0lS5fzlL/Dkk45RSKpLFmNJUuWUSrD++nDkkbmTSNIasxhL\nkipjyZLiandHHAEbbpg7jSStMYuxJKkybr4ZXnjBMQpJdctiLEmqjJYW2GwzGDkydxJJWisWY0lS\nzy1cCBMnwjHHQP/+udNI0lqxGEuSeu766+G11xyjkFTXLMaSpJ4rlWDrreG9782dRJLWmsVYktQz\nL78MU6bAmDHQp0/uNJK01izGkqSemTABFi92jEJS3bMYS5J6plSCHXeEPfbInUSSesRiLElae08/\nDbfeWqwWR+ROI0k9YjGWJK29yy+HlGDs2NxJJKnHLMaSpLXX0gLvfjfsvHPuJJLUYxZjSdLa+cc/\n4J57XC2W1DAsxpKktdPSUswVjx6dO4kkVYTFWJK05lIqdqN43/tgm21yp5GkirAYS5LW3P33w2OP\nuXexpIZiMZYkrblSCfr1g2OOyZ1EkirGYixJWjNtbcV88ciR8OY3504jSRVjMZYkrZk//QnmzHGM\nQlLDsRhLktZMqQQbbACHH547iSRVlMVYklS+xYvhqqvgqKOKcixJDcRiLEkq3403wksveVEPSQ3J\nYixJKl+pBJtvDgcfnDuJJFWcxViSVJ4FC+Daa+HYY4ut2iSpwViMJUnlmTQJFi50NwpJDctiLEkq\nT6lUXP55n31yJ5GkqrAYS5K69+KL8PvfF2+6W8d/OiQ1Jn+6SZK6d9VV0NrqGIWkhmYxliR1r6UF\ndtkFdt89dxJJqpqyinFEjIyIxyJiekSc3sUx+0fE/RHxSETcVtmYkqRsZs2C228vVosjcqeRpKrp\n290BEdEHuAA4CJgN3BMRk1JK0zocsynwM2BkSumpiNiiWoElSb3s8sshJRgzJncSSaqqclaMRwDT\nU0ozU0qLgfHAkSsdczwwIaX0FEBK6fnKxpQkZVMqwYgRsMMOuZNIUlWVU4wHA7M6fD67/bGOdgI2\ni4g/RsS9EfHRzv6iiDg5IqZGxNS5c+euXWJJUu/5+9/hvvt8052kplCpN9/1Bd4NHAp8EDgrInZa\n+aCU0oUppeEppeEDBw6s0JeWJFVNS0uxPdtxx+VOIklV1+2MMTAHGNLh823aH+toNvBiSmkBsCAi\nbgd2Bx6vSEpJUu9LqRijOOAA2Gqr3GkkqerKWTG+B9gxIraNiP7AGGDSSsdcC+wbEX0j4k3AXsCj\nlY0qSepVU6fC9OmOUUhqGt2uGKeUWiPiFOAGoA9wcUrpkYj4VPvz41JKj0bE74EHgTbgVymlh6sZ\nXJJUZaUS9O8PRx+dO4kk9YpIKWX5wsOHD09Tp07N8rUlSd1YuhSGDIG994YJE3KnkaQeiYh7U0rD\nuzvOK99JklZ1223wzDMwdmzuJJLUayzGkqRVlUqw4YZw2GG5k0hSr7EYS5JWtGgRXHVVMVu8/vq5\n00hSr7EYS5JWNGUKzJvnbhSSmo7FWJK0opYWGDgQPvCB3EkkqVdZjCVJy82fD5MmFVe661vONaAk\nqXFYjCVJy11zDbzxhmMUkpqSxViStFypBMOGwb/9W+4kktTrLMaSpMLcuXDTTcXexRG500hSr7MY\nS5IKV15ZXPHOi3pIalIWY0lSoVSCXXeF3XbLnUSSsrAYS5LgySfhjjt8052kpmYxliTB+PHFxzFj\n8uaQpIwsxpKkYoziPe+BbbfNnUSSsrEYS1Kze/hhePBB33QnqelZjCWp2bW0QJ8+cOyxuZNIUlYW\nY0lqZikVxfjAA2HQoNxpJCkri7EkNbO774Z//tPdKCQJi7EkNbdSCdZbD446KncSScrOYixJzaq1\nFS6/HA47DDbeOHcaScrOYixJzeqWW+D55x2jkKR2FmNJalYtLbDJJjBqVO4kklQTLMaS1Ixefx2u\nvhqOPrqYMZYkWYwlqSlNngzz5ztGIUkdWIwlqRmVSsW+xQcckDuJJNUMi7EkNZt58+B3v4MxY4or\n3kmSAIuxJDWfiRNh0SLHKCRpJRZjSWo2pRJsvz3suWfuJJJUUyzGktRMnn0W/vAHGDsWInKnkaSa\nYjGWpGZyxRXQ1uYYhSR1wmIsSc2kpQXe+U7YZZfcSSSp5liMJalZzJwJd91VjFFIklZhMZakZtHS\nUnwcMyZvDkmqURZjSWoGKRW7Uey7LwwdmjuNJNUki7EkNYMHH4Rp0+AjH8mdRJJqlsVYkppBSwv0\n7Qsf/nDuJJJUsyzGktTo2tqKYnzwwTBgQO40klSzLMaS1OjuvBOeesq9iyWpGxZjSWp0pRKsvz4c\neWTuJJJU0yzGktTIliyBK68sSvGGG+ZOI0k1zWIsSY3s5pvhhRe8qIcklcFiLEmNrFSCzTaDkSNz\nJ5GkmmcxlqRGtXAhTJxYbNHWv3/uNJJU8yzGktSorr8eFixwNwpJKpPFWJIaVakEW28N++2XO4kk\n1QWLsSQ1opdfhsmTYcwY6NMndxpJqgsWY0lqRFdfXWzV5hiFJJXNYixJjahUgp12gj32yJ1EkuqG\nxViSGs3TT8Mf/1isFkfkTiNJdcNiLEmN5vLLISUv6iFJa8hiLEmNplSCd7+7GKWQJJXNYixJjeQf\n/4CpU33TnSStBYuxJDWSlpZirnj06NxJJKnuWIwlqVGkVIxRvO99MHhw7jSSVHcsxpLUKO67Dx57\nzDEKSVpLFmNJahSlEvTrB8cckzuJJNUli7EkNYK2Nhg/HkaNgje/OXcaSapLFmNJagR/+hPMmeMY\nhST1gMVYkhpBqQQbbACHH547iSTVLYuxJNW7xYvhyivhqKPgTW/KnUaS6pbFWJLq3Q03wMsvO0Yh\nST1kMZaketfSAptvDgcdlDuJJNU1i7Ek1bPXXoNrr4Vjjy22apMkrTWLsSTVs0mTYOFCxygkqQIs\nxpJUz0olGDIE9tkndxJJqnsWY0mqVy++WLzxbuxYWMcf55LUU/4klaR6ddVV0NpaFGNJUo9ZjCWp\nXpVKsMsusPvuuZNIUkOwGEtSPZo1C26/vXjTXUTuNJLUECzGklSPxo8vPjpGIUkVU1YxjoiREfFY\nREyPiNNXc9yeEdEaER+uXERJ0ipaWmCvvWD77XMnkaSG0W0xjog+wAXAKOBtwNiIeFsXx30XuLHS\nISVJHTz6KNx3n6vFklRh5awYjwCmp5RmppQWA+OBIzs57nPA1cDzFcwnSVpZS0uxPdtxx+VOIkkN\npZxiPBiY1eHz2e2P/UtEDAY+BPx8dX9RRJwcEVMjYurcuXPXNKskKaViN4r3vx+22ip3GklqKJV6\n8925wGkppbbVHZRSujClNDylNHzgwIEV+tKS1ETuuQdmzPAS0JJUBX3LOGYOMKTD59u0P9bRcGB8\nFFsGDQAOiYjWlNI1FUkpSSq0tED//vChD+VOIkkNp5xifA+wY0RsS1GIxwArLFWklLZddj8ifg1c\nbymWpApburTYpu3QQ2HTTXOnkaSG020xTim1RsQpwA1AH+DilNIjEfGp9ufHVTmjJAngj3+EZ591\njEKSqqScFWNSSpOBySs91mkhTil9rOexJEmrKJVgo42KFWNJUsV55TtJqgeLFsHVV8PRR8P66+dO\nI0kNyWIsSfVgyhSYN8+LekhSFVmMJakelEowcCB84AO5k0hSw7IYS1Kte/VVuO46GD0a+pb11hBJ\n0lqwGEtSrbvmGnjjDXejkKQqsxhLUq1raYFhw2DvvXMnkaSGZjGWpFr2/PNw003Fm+6Kq4tKkqrE\nYixJtezKK4sr3jlGIUlVZzGWpFpWKsFuu8Guu+ZOIkkNz2IsSbXqiSfgzjtdLZakXmIxlqRaNX58\n8XHMmLw5JKlJWIwlqVaVSvCe9xQ7UkiSqs5iLEm16KGHiptjFJLUayzGklSLWlqgTx849tjcSSSp\naViMJanWpFQU4wMPhC22yJ1GkpqGxViSas1ddxU7UjhGIUm9ymIsSbWmVIL11oOjjsqdRJKaisVY\nkmpJaytccQUcfjhsvHHuNJLUVCzGklRLbrkFnn8exo7NnUSSmo7FWJJqSakEm2wCo0blTiJJTcdi\nLEm14vXXYcIEOOaYYsZYktSrLMaSVCt+9zuYP9/dKCQpE4uxJNWKUgm23BL23z93EklqShZjSaoF\nr7wCkyfD6NHFFe8kSb3OYixJtWDiRFi0yDEKScrIYixJtaBUgu23hz33zJ1EkpqWxViScnv22WL/\n4uOPh4jcaSSpaVmMJSm3K66AtjYv6iFJmVmMJSm3Ugne+U7YZZfcSSSpqVmMJSmnGTPg7rt9050k\n1QCLsSTl1NJSfBwzJm8OSZLFWJKySakYo3jve2HIkNxpJKnpWYwlKZcHH4RHH/VNd5JUIyzGkpRL\nqQR9+8KHP5w7iSQJi7Ek5dHWVswXf/CDMGBA7jSSJCzGkpTHHXfArFnuRiFJNcRiLEk5tLTA+uvD\nEUfkTiJJamcxlqTetmRJcbW7I4+EDTfMnUaS1M5iLEm97aab4MUXHaOQpBpjMZak3lYqwWabFW+8\nkyTVDIuxJPWmhQvhmmuKLdr698+dRpLUgcVYknrTddfBggWOUUhSDbIYS1JvKpVg8GDYb7/cSSRJ\nK7EYS1JveeklmDIFxoyBPn1yp5EkrcRiLEm95eqri63aHKOQpJpkMZak3pASXHwx7LQTvOtdudNI\nkjrRN3cASWoK110Hd90FP/85ROROI0nqhCvGklRtra1wxhnFavFJJ+VOI0nqgivGklRtl1wC06bB\nVVdBv36500iSuuCKsSRV08KF8LWvwV57wdFH504jSVoNV4wlqZrOOw/mzCn2L3a2WJJqmivGklQt\nL74I55wDhx0G731v7jSSpG5YjCWpWs4+G+bPh+98J3cSSVIZLMaSVA1PPgnnnw///u+w666500iS\nymAxlqRqOOssWGcd+MY3cieRJJXJYixJlfbAA3DppfD5z8OQIbnTSJLKZDGWpEo7/XTYdNPioySp\nbrhdmyRV0i23wO9/D9//Pmy2We40kqQ14IqxJFVKWxucemoxPnHKKbnTSJLWkCvGklQpV14J994L\nv/41rLde7jSSpDXkirEkVcLixXDmmbDbbnDCCbnTSJLWgivGklQJF14IM2bA734HffrkTiNJWguu\nGEtST82fD9/8Juy/P4walTuNJGktWYwlqad+8AOYOxe++12IyJ1GkrSWLMaS1BPPPgs//CEceyyM\nGJE7jSSpByzGktQT3/wmLFoE3/527iSSpB6yGEvS2nr88eJNdyefDDvumDuNJKmHLMaStLbOPLPY\nr/irX82dRJJUARZjSVobd98NV10FX/oSDBqUO40kqQIsxpK0plKC006DLbaAL34xdxpJUoWUVYwj\nYmREPBYR0yPi9E6e/0hEPBgRD0XEnRGxe+WjSlKNmDIFbrutGKHYaKPcaSRJFdJtMY6IPsAFwCjg\nbcDYiHjbSof9E3hfSmk34FvAhZUOKkk1YenSYrV4hx2KN91JkhpGOZeEHgFMTynNBIiI8cCRwLRl\nB6SU7uxw/F3ANpUMKUk149JL4eGH4fLLoV+/3GkkSRVUzijFYGBWh89ntz/WlZOAKZ09EREnR8TU\niJg6d+7c8lNKUi144w046yzYc8/igh6SpIZSzopx2SLiAIpivG9nz6eULqR9zGL48OGpkl9bkqru\n/PNh1iy45BIv/SxJDaicYjwHGNLh823aH1tBRLwD+BUwKqX0YmXiSVKNePllOPtsGDUKDjggdxpJ\nUhWUM0pxD7BjRGwbEf2BMcCkjgdExFBgAnBiSunxyseUpMzOOQdeeaX4KElqSN2uGKeUWiPiFOAG\n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\nD/iWfPodA7wwAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "nums = np.arange(-10, 10, step=1)\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.plot(nums, sigmoid(nums), 'r')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "棒极了!现在,我们需要编写代价函数来评估结果。\n", + "代价函数:\n", + "$J\\left( \\theta \\right)=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[-{{y}^{(i)}}\\log \\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)-\\left( 1-{{y}^{(i)}} \\right)\\log \\left( 1-{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)]}$" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def cost(theta, X, y):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " first = np.multiply(-y, np.log(sigmoid(X * theta.T)))\n", + " second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))\n", + " return np.sum(first - second) / (len(X))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在,我们要做一些设置,和我们在练习1在线性回归的练习很相似。" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# add a ones column - this makes the matrix multiplication work out easier\n", + "data.insert(0, 'Ones', 1)\n", + "\n", + "# set X (training data) and y (target variable)\n", + "cols = data.shape[1]\n", + "X = data.iloc[:,0:cols-1]\n", + "y = data.iloc[:,cols-1:cols]\n", + "\n", + "# convert to numpy arrays and initalize the parameter array theta\n", + "X = np.array(X.values)\n", + "y = np.array(y.values)\n", + "theta = np.zeros(3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "让我们来检查矩阵的维度来确保一切良好。" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0., 0., 0.])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "theta" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((100, 3), (3,), (100, 1))" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X.shape, theta.shape, y.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "让我们计算初始化参数的代价函数(theta为0)。" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.69314718055994529" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost(theta, X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "看起来不错,接下来,我们需要一个函数来计算我们的训练数据、标签和一些参数thata的梯度。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# gradient descent(梯度下降)\n", + "* 这是批量梯度下降(batch gradient descent) \n", + "* 转化为向量化计算: $\\frac{1}{m} X^T( Sigmoid(X\\theta) - y )$\n", + "$$\\frac{\\partial J\\left( \\theta \\right)}{\\partial {{\\theta }_{j}}}=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{({{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}})x_{_{j}}^{(i)}}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradient(theta, X, y):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " \n", + " parameters = int(theta.ravel().shape[1])\n", + " grad = np.zeros(parameters)\n", + " \n", + " error = sigmoid(X * theta.T) - y\n", + " \n", + " for i in range(parameters):\n", + " term = np.multiply(error, X[:,i])\n", + " grad[i] = np.sum(term) / len(X)\n", + " \n", + " return grad" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "注意,我们实际上没有在这个函数中执行梯度下降,我们仅仅在计算一个梯度步长。在练习中,一个称为“fminunc”的Octave函数是用来优化函数来计算成本和梯度参数。由于我们使用Python,我们可以用SciPy的“optimize”命名空间来做同样的事情。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们看看用我们的数据和初始参数为0的梯度下降法的结果。" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ -0.1 , -12.00921659, -11.26284221])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gradient(theta, X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在可以用SciPy's truncated newton(TNC)实现寻找最优参数。" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([-25.1613186 , 0.20623159, 0.20147149]), 36, 0)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import scipy.optimize as opt\n", + "result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y))\n", + "result" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "让我们看看在这个结论下代价函数计算结果是什么个样子~" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.20349770158947464" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cost(result[0], X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "接下来,我们需要编写一个函数,用我们所学的参数theta来为数据集X输出预测。然后,我们可以使用这个函数来给我们的分类器的训练精度打分。\n", + "逻辑回归模型的假设函数: \n", + "\t\\\\[{{h}_{\\theta }}\\left( x \\right)=\\frac{1}{1+{{e}^{-{{\\theta }^{T}}X}}}\\\\] \n", + "当${{h}_{\\theta }}$大于等于0.5时,预测 y=1\n", + "\n", + "当${{h}_{\\theta }}$小于0.5时,预测 y=0 。" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def predict(theta, X):\n", + " probability = sigmoid(X * theta.T)\n", + " return [1 if x >= 0.5 else 0 for x in probability]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "accuracy = 89%\n" + ] + } + ], + "source": [ + "theta_min = np.matrix(result[0])\n", + "predictions = predict(theta_min, X)\n", + "correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y)]\n", + "accuracy = (sum(map(int, correct)) % len(correct))\n", + "print ('accuracy = {0}%'.format(accuracy))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们的逻辑回归分类器预测正确,如果一个学生被录取或没有录取,达到89%的精确度。不坏!记住,这是训练集的准确性。我们没有保持住了设置或使用交叉验证得到的真实逼近,所以这个数字有可能高于其真实值(这个话题将在以后说明)。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 正则化逻辑回归" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在训练的第二部分,我们将要通过加入正则项提升逻辑回归算法。如果你对正则化有点眼生,或者喜欢这一节的方程的背景,请参考在\"exercises\"文件夹中的\"ex2.pdf\"。简而言之,正则化是成本函数中的一个术语,它使算法更倾向于“更简单”的模型(在这种情况下,模型将更小的系数)。这个理论助于减少过拟合,提高模型的泛化能力。这样,我们开始吧。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "设想你是工厂的生产主管,你有一些芯片在两次测试中的测试结果。对于这两次测试,你想决定是否芯片要被接受或抛弃。为了帮助你做出艰难的决定,你拥有过去芯片的测试数据集,从其中你可以构建一个逻辑回归模型。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "和第一部分很像,从数据可视化开始吧!" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Test 1Test 2Accepted
00.0512670.699561
1-0.0927420.684941
2-0.2137100.692251
3-0.3750000.502191
4-0.5132500.465641
\n", + "
" + ], + "text/plain": [ + " Test 1 Test 2 Accepted\n", + "0 0.051267 0.69956 1\n", + "1 -0.092742 0.68494 1\n", + "2 -0.213710 0.69225 1\n", + "3 -0.375000 0.50219 1\n", + "4 -0.513250 0.46564 1" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "path = 'ex2data2.txt'\n", + "data2 = pd.read_csv(path, header=None, names=['Test 1', 'Test 2', 'Accepted'])\n", + "data2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuMAAAHjCAYAAACJlRE5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3X14pHV59//PGcAbycYHHkTIQqG/3SpaYVkjFd2a4iOs\nD2S3YEBFb92j+Fh32V/bXWt7a6s9aNfWNLa03HRF0Vtha5sE2q6KqL0xUh+y/EAQkCy6KLs8CaiT\nUFsx5++P71ybK5OZZJKZuR7fr+PIMZnrmkm+c2Uyc873Or/nae4uAAAAAMnrSnsAAAAAQFkRjAMA\nAAApIRgHAAAAUkIwDgAAAKSEYBwAAABICcE4AAAAkBKCcQAAACAlBOMAAABASgjGAQAAgJQcmvYA\nknT00Uf7SSedlPYwAAAAUHB79uz5sbsfs9jtShWMn3TSSZqYmEh7GAAAACg4M7u3mduRpgIAAACk\nhGAcAAAASAnBOAAAAJCSUuWMAwAAIPjFL36h++67Tz//+c/THkquHX744Vq5cqUOO+ywZd2fYBwA\nAKCE7rvvPvX09Oikk06SmaU9nFxydz3yyCO67777dPLJJy/rZ5CmAgAAUEI///nPddRRRxGIt8DM\ndNRRR7V0doFgHAAAoKQIxFvX6jEkGAcAAABSQjAOAACARVUq0s6d0rZt4bJSac/PHRsbk5nprrvu\nas8PXMRf//Vf6/HHH1/Sff793/9dr3nNazoyHoJxAAAALGh8XOrtlbZskXbsCJe9vWF7q66++mqt\nW7dOV199des/rAnLCcY7iWAcAAAADVUq0vr14XJ6Omybnp7dPjW1/J89NTWl8fFxffzjH9c111xz\ncPtf/MVf6HnPe55OO+00bd++XZK0d+9evfzlL9dpp52mtWvX6p577pEkfeQjH9ELXvACnXrqqfrA\nBz4gSdq3b5+e/exn641vfKNOOeUUnXfeeXr88cf1sY99TAcOHNBZZ52ls846S5J0/fXX68wzz9Ta\ntWt1/vnna6r6gL7whS/o2c9+ttauXauRkZHlP8hFEIwDAACgoV27pJmZ+vtmZsL+5br22mt19tln\n69d+7dd01FFHac+ePfr85z+va6+9Vt/85jd166236g/+4A8kSW984xv17ne/W7feeqtuuukmHXfc\ncbr++us1OTmpb33rW7rlllu0Z88e3XjjjZKk733ve3rXu96lO++8U095ylP0d3/3d3rve9+r448/\n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\nkplNVi+fXuc2zzKzW2JfPzOzLdV9HzSz/bF965N/FOlo5thVb7fPzG6rHp+Jpd6/qJp87p1gZl81\nszvM7Ltmtjm2r3TPPTM728y+Z2Z7zWx7nf1mZh+r7v+Oma1t9r5F18Sxe2P1mN1mZjeZ2WmxfXX/\nh8ukieP3W2b209j/4/9q9r5F18Sx+/3YcbvdzH5pZkdW95X6uWdmV5rZQ2Z2e4P9vObFuTtfOfyS\ntEPS9ur32yX9xSK3P0TSAwoF6CXpg5J+L+3HkeVjJ2mfpKNbPfZF+2rm8Us6TtLa6vc9ku6W9Jzq\n9VI996r/e/dI+lVJT5J0a3QsYrdZL+nzkkzSCyV9s9n7FvmryWP3IklPr35/TnTsqtfr/g+X5avJ\n4/dbkv51Ofct8tdSH7+k10r6Sux62Z97L5G0VtLtDfbzmhf7YmY8v86VdFX1+6skDSxy+5dJusfd\ny9CBdDFLPXbtvn/eLfr43f1+d7+5+n1F0p2SehMbYbacIWmvu3/f3f9b0jUKxzDuXEmf8uAbkp5m\nZsc1ed8iW/Txu/tN7v5Y9eo3JK1MeIxZ1srzh+fe0h7/hZKuTmRkOeDuN0p6dIGb8JoXQzCeX8e6\n+/3V7x+QdOwit79A818ofrd6eujKkqVaNHvsXNINZrbHzC5exv2LakmP38xOknS6pG/GNpfpudcr\n6Uex6/dp/geTRrdp5r5FttTHv0lhti3S6H+4LJo9fi+q/j9+3syeu8T7FlXTj9/MjpB0tqR/jm0u\n+3NvMbzmxRya9gDQmJndIOmZdXa9P37F3d3MGtaoNLMnSXqdpPfFNv+9pA8pvGB8SNJfSXpbq2PO\nijYdu3Xuvt/MniHpS2Z2V/XTfrP3z602PvdWKLxBbXH3n1U3F/q5h3SY2VkKwfi62OZF/4ehmyWd\n6O5T1fUbY5JWpzymvHmtpK+7e3wmmOcemkYwnmHu/vJG+8zsQTM7zt3vr57aeWiBH3WOpJvd/cHY\nzz74vZn9g6R/bceYs6Idx87d91cvHzKzUYXTZzdKWsqxz6V2HD8zO0whEP+Mu4/Efnahn3t17Jd0\nQuz6yuq2Zm5zWBP3LbJmjp3M7FRJOyWd4+6PRNsX+B8ui0WPX+xDstx9t5n9nZkd3cx9C24pj3/e\nmWeee4viNS+GNJX8uk7SW6rfv0XStQvcdl4uWzWIimyQVHfFc0EteuzMrNvMeqLvJb1Ss8doKce+\niJo5fibp45LudPeP1uwr23Pv25JWm9nJ1bNUFygcw7jrJL25WmHghZJ+Wk0Faua+Rbbo4zezEyWN\nSLrI3e+ObV/of7gsmjl+z6z+v8rMzlCICx5p5r4F19TjN7OnSupX7HWQ515TeM2LS3sFKV/L+5J0\nlKQvS5qUdIOkI6vbj5e0O3a7boUX1qfW3P/Tkm6T9B2FJ/pxaT+mLB07hZXct1a/vivp/Yvdvyxf\nTR6/dQppKN+RdEv1a31Zn3sKlQPuVqgS8P7qtndIekf1e5N0WXX/bZL6Frpvmb6aOHY7JT0We55N\nVLc3/B8u01cTx+891eNzq8IC2Bfx3Gvu2FWv/09J19Tcr/TPPYUJwPsl/UIh73sTr3mNv6z6wAEA\nAAAkjDQVAAAAICUE4wAAAEBKCMYBAACAlBCMAwAAACkhGAcAAABSQjAOADlgZkeZ2S3VrwfMbH/s\n+pOW8HPeZmb1uqvKzAbN7A4zmzGzNQ1uc4iZXWZmt5vZbWb2LTP7leU+LgAoOzpwAkAOeOgsuUaS\nzOyDkqbc/S+X8aPeptAC/YE6+26TNCDpygXu/waFWvOnuvtMtenOzxa4/aLM7FB3f6KVnwEAeUUw\nDgA5Z2ZvkfRuSU+SdJNCI5cuSZ9QCOBN0hWSHqxe32Vm/ynpDHf/7+jnuPsd1Z+30K87TtL97j5T\nvc8PY+N4taQPSTpE0oPu/spqa/UrJZ0kaUrSxe5+u5n9/+3dP2hWVxzG8e9TClakqKWCLllKSYXG\nQdtOWrSIUAJKKJaCS7sUDXV2UpB2chFcpK1Ghw6FTg4VDJGAGVTIEOwsJZZ2CFIECURs+XW4Rwj+\nWV4Clzf9fuCF+9577j33faeHw++c8x0wArwD/J7kS+Ac3YZRbwAXqurS4P+KJA0Hw7gkDbEk7wMT\ndDsn/pPkB7otpO8Db1fVWGu3paoeJTkJfFNVCwN2+TMwl2Q/3U6sP1XVQit9uQjsq6rFJG+19t8C\nd6vqcJJDwFXgg3btPeDjqlpJMgksVdVHSTYAd5JMrw77krQeGcYlabgdBD4E5tuI9kbgD+AGMJrk\nAvArML0WnVXVgySjwCftM5tkAtgKzFbVYmv3d7tlLzDezk0nuZpkU7t2rapW2vEhYGeSL9r3zcC7\ngGFc0rpmGJek4RZgqqpOv3Ah2QV8SlfC8hnw9Vp02AL0deB6kofAEeDWAI9aXnUcYLKqbq7BK0rS\n0HA1FUkabjPA5602+9mqKyNJtgGpql+AM8Du1v4x8OagnSXZk2RHO34NGAMW6WrVDzxbWWVVmcoc\ncKydOwj8WVXLLzy4G8mfTPJ6azuaZOOg7ylJw8KRcUkaYlX1W5KzwEwLx0+B48C/wOV0tSsFnGq3\nXAEuvWwCZ5KjwHlgG3AjyXxVjT/X5Xbgx7acYoDbwMWqepLkBHCt9fkX3aj8GWAqyT26CZxfveKn\nfE83oXOhldss0Y24S9K6lqrq+x0kSZKk/yXLVCRJkqSeGMYlSZKknhjGJUmSpJ4YxiVJkqSeGMYl\nSZKknhjGJUmSpJ4YxiVJkqSe/AeUxWiWnpvoUgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "positive = data2[data2['Accepted'].isin([1])]\n", + "negative = data2[data2['Accepted'].isin([0])]\n", + "\n", + "fig, ax = plt.subplots(figsize=(12,8))\n", + "ax.scatter(positive['Test 1'], positive['Test 2'], s=50, c='b', marker='o', label='Accepted')\n", + "ax.scatter(negative['Test 1'], negative['Test 2'], s=50, c='r', marker='x', label='Rejected')\n", + "ax.legend()\n", + "ax.set_xlabel('Test 1 Score')\n", + "ax.set_ylabel('Test 2 Score')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "哇,这个数据看起来可比前一次的复杂得多。特别地,你会注意到其中没有线性决策界限,来良好的分开两类数据。一个方法是用像逻辑回归这样的线性技术来构造从原始特征的多项式中得到的特征。让我们通过创建一组多项式特征入手吧。" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
AcceptedOnesF10F20F21F30F31F32F40F41F42F43
0110.0512670.0026280.0358640.0001350.0018390.0250890.0000070.0000940.0012860.017551
111-0.0927420.008601-0.063523-0.0007980.005891-0.0435090.000074-0.0005460.004035-0.029801
211-0.2137100.045672-0.147941-0.0097610.031616-0.1024120.002086-0.0067570.021886-0.070895
311-0.3750000.140625-0.188321-0.0527340.070620-0.0945730.019775-0.0264830.035465-0.047494
411-0.5132500.263426-0.238990-0.1352030.122661-0.1112830.069393-0.0629560.057116-0.051818
\n", + "
" + ], + "text/plain": [ + " Accepted Ones F10 F20 F21 F30 F31 F32 \\\n", + "0 1 1 0.051267 0.002628 0.035864 0.000135 0.001839 0.025089 \n", + "1 1 1 -0.092742 0.008601 -0.063523 -0.000798 0.005891 -0.043509 \n", + "2 1 1 -0.213710 0.045672 -0.147941 -0.009761 0.031616 -0.102412 \n", + "3 1 1 -0.375000 0.140625 -0.188321 -0.052734 0.070620 -0.094573 \n", + "4 1 1 -0.513250 0.263426 -0.238990 -0.135203 0.122661 -0.111283 \n", + "\n", + " F40 F41 F42 F43 \n", + "0 0.000007 0.000094 0.001286 0.017551 \n", + "1 0.000074 -0.000546 0.004035 -0.029801 \n", + "2 0.002086 -0.006757 0.021886 -0.070895 \n", + "3 0.019775 -0.026483 0.035465 -0.047494 \n", + "4 0.069393 -0.062956 0.057116 -0.051818 " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "degree = 5\n", + "x1 = data2['Test 1']\n", + "x2 = data2['Test 2']\n", + "\n", + "data2.insert(3, 'Ones', 1)\n", + "\n", + "for i in range(1, degree):\n", + " for j in range(0, i):\n", + " data2['F' + str(i) + str(j)] = np.power(x1, i-j) * np.power(x2, j)\n", + "\n", + "data2.drop('Test 1', axis=1, inplace=True)\n", + "data2.drop('Test 2', axis=1, inplace=True)\n", + "\n", + "data2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在,我们需要修改第1部分的成本和梯度函数,包括正则化项。首先是成本函数:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# regularized cost(正则化代价函数)\n", + "$$J\\left( \\theta \\right)=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[-{{y}^{(i)}}\\log \\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)-\\left( 1-{{y}^{(i)}} \\right)\\log \\left( 1-{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)]}+\\frac{\\lambda }{2m}\\sum\\limits_{j=1}^{n}{\\theta _{j}^{2}}$$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def cost(theta, X, y, learningRate):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " first = np.multiply(-y, np.log(sigmoid(X * theta.T)))\n", + " second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))\n", + " reg = (learningRate / (2 * len(X))) * np.sum(np.power(theta[:,1:theta.shape[1]], 2))\n", + " return np.sum(first - second) / len(X) + reg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "请注意等式中的\"reg\" 项。还注意到另外的一个“学习率”参数。这是一种超参数,用来控制正则化项。现在我们需要添加正则化梯度函数:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "如果我们要使用梯度下降法令这个代价函数最小化,因为我们未对${{\\theta }_{0}}$ 进行正则化,所以梯度下降算法将分两种情形:\n", + "\\begin{align}\n", + " & Repeat\\text{ }until\\text{ }convergence\\text{ }\\!\\!\\{\\!\\!\\text{ } \\\\ \n", + " & \\text{ }{{\\theta }_{0}}:={{\\theta }_{0}}-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}}]x_{_{0}}^{(i)}} \\\\ \n", + " & \\text{ }{{\\theta }_{j}}:={{\\theta }_{j}}-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}}]x_{j}^{(i)}}+\\frac{\\lambda }{m}{{\\theta }_{j}} \\\\ \n", + " & \\text{ }\\!\\!\\}\\!\\!\\text{ } \\\\ \n", + " & Repeat \\\\ \n", + "\\end{align}\n", + "\n", + "对上面的算法中 j=1,2,...,n 时的更新式子进行调整可得: \n", + "${{\\theta }_{j}}:={{\\theta }_{j}}(1-a\\frac{\\lambda }{m})-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{({{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}})x_{j}^{(i)}}$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradientReg(theta, X, y, learningRate):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " \n", + " parameters = int(theta.ravel().shape[1])\n", + " grad = np.zeros(parameters)\n", + " \n", + " error = sigmoid(X * theta.T) - y\n", + " \n", + " for i in range(parameters):\n", + " term = np.multiply(error, X[:,i])\n", + " \n", + " if (i == 0):\n", + " grad[i] = np.sum(term) / len(X)\n", + " else:\n", + " grad[i] = (np.sum(term) / len(X)) + ((learningRate / len(X)) * theta[:,i])\n", + " \n", + " return grad" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "就像在第一部分中做的一样,初始化变量。" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# set X and y (remember from above that we moved the label to column 0)\n", + "cols = data2.shape[1]\n", + "X2 = data2.iloc[:,1:cols]\n", + "y2 = data2.iloc[:,0:1]\n", + "\n", + "# convert to numpy arrays and initalize the parameter array theta\n", + "X2 = np.array(X2.values)\n", + "y2 = np.array(y2.values)\n", + "theta2 = np.zeros(11)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "让我们初始学习率到一个合理值。,果有必要的话(即如果惩罚太强或不够强),我们可以之后再折腾这个。" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "learningRate = 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在,让我们尝试调用新的默认为0的theta的正则化函数,以确保计算工作正常。" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.6931471805599454" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "costReg(theta2, X2, y2, learningRate)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.00847458, 0.01878809, 0.05034464, 0.01150133, 0.01835599,\n", + " 0.00732393, 0.00819244, 0.03934862, 0.00223924, 0.01286005,\n", + " 0.00309594])" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gradientReg(theta2, X2, y2, learningRate)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在我们可以使用和第一部分相同的优化函数来计算优化后的结果。" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([ 1.22702519e-04, 7.19894617e-05, -3.74156201e-04,\n", + " -1.44256427e-04, 2.93165088e-05, -5.64160786e-05,\n", + " -1.02826485e-04, -2.83150432e-04, 6.47297947e-07,\n", + " -1.99697568e-04, -1.68479583e-05]), 96, 1)" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result2 = opt.fmin_tnc(func=costReg, x0=theta2, fprime=gradientReg, args=(X2, y2, learningRate))\n", + "result2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "最后,我们可以使用第1部分中的预测函数来查看我们的方案在训练数据上的准确度。" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "accuracy = 77%\n" + ] + } + ], + "source": [ + "theta_min = np.matrix(result2[0])\n", + "predictions = predict(theta_min, X2)\n", + "correct = [1 if ((a == 1 and b == 1) or (a == 0 and b == 0)) else 0 for (a, b) in zip(predictions, y2)]\n", + "accuracy = (sum(map(int, correct)) % len(correct))\n", + "print ('accuracy = {0}%'.format(accuracy))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "虽然我们实现了这些算法,值得注意的是,我们还可以使用高级Python库像scikit-learn来解决这个问题。" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", + " intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n", + " penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n", + " verbose=0, warm_start=False)" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn import linear_model#调用sklearn的线性回归包\n", + "model = linear_model.LogisticRegression(penalty='l2', C=1.0)\n", + "model.fit(X2, y2.ravel())" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.66101694915254239" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.score(X2, y2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这个准确度和我们刚刚实现的差了好多,不过请记住这个结果可以使用默认参数下计算的结果。我们可能需要做一些参数的调整来获得和我们之前结果相同的精确度。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这就是练习2的全部! 敬请期待下一个练习:多类图像分类。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/code/ex2-logistic regression/ex2.pdf b/code/ex2-logistic regression/ex2.pdf new file mode 100644 index 00000000..39c31da6 Binary files /dev/null and b/code/ex2-logistic regression/ex2.pdf differ diff --git a/code/ex2-logistic regression/ex2data1.txt b/code/ex2-logistic regression/ex2data1.txt new file mode 100644 index 00000000..3a5f9524 --- /dev/null +++ b/code/ex2-logistic regression/ex2data1.txt @@ -0,0 +1,100 @@ +34.62365962451697,78.0246928153624,0 +30.28671076822607,43.89499752400101,0 +35.84740876993872,72.90219802708364,0 +60.18259938620976,86.30855209546826,1 +79.0327360507101,75.3443764369103,1 +45.08327747668339,56.3163717815305,0 +61.10666453684766,96.51142588489624,1 +75.02474556738889,46.55401354116538,1 +76.09878670226257,87.42056971926803,1 +84.43281996120035,43.53339331072109,1 +95.86155507093572,38.22527805795094,0 +75.01365838958247,30.60326323428011,0 +82.30705337399482,76.48196330235604,1 +69.36458875970939,97.71869196188608,1 +39.53833914367223,76.03681085115882,0 +53.9710521485623,89.20735013750205,1 +69.07014406283025,52.74046973016765,1 +67.94685547711617,46.67857410673128,0 +70.66150955499435,92.92713789364831,1 +76.97878372747498,47.57596364975532,1 +67.37202754570876,42.83843832029179,0 +89.67677575072079,65.79936592745237,1 +50.534788289883,48.85581152764205,0 +34.21206097786789,44.20952859866288,0 +77.9240914545704,68.9723599933059,1 +62.27101367004632,69.95445795447587,1 +80.1901807509566,44.82162893218353,1 +93.114388797442,38.80067033713209,0 +61.83020602312595,50.25610789244621,0 +38.78580379679423,64.99568095539578,0 +61.379289447425,72.80788731317097,1 +85.40451939411645,57.05198397627122,1 +52.10797973193984,63.12762376881715,0 +52.04540476831827,69.43286012045222,1 +40.23689373545111,71.16774802184875,0 +54.63510555424817,52.21388588061123,0 +33.91550010906887,98.86943574220611,0 +64.17698887494485,80.90806058670817,1 +74.78925295941542,41.57341522824434,0 +34.1836400264419,75.2377203360134,0 +83.90239366249155,56.30804621605327,1 +51.54772026906181,46.85629026349976,0 +94.44336776917852,65.56892160559052,1 +82.36875375713919,40.61825515970618,0 +51.04775177128865,45.82270145776001,0 +62.22267576120188,52.06099194836679,0 +77.19303492601364,70.45820000180959,1 +97.77159928000232,86.7278223300282,1 +62.07306379667647,96.76882412413983,1 +91.56497449807442,88.69629254546599,1 +79.94481794066932,74.16311935043758,1 +99.2725269292572,60.99903099844988,1 +90.54671411399852,43.39060180650027,1 +34.52451385320009,60.39634245837173,0 +50.2864961189907,49.80453881323059,0 +49.58667721632031,59.80895099453265,0 +97.64563396007767,68.86157272420604,1 +32.57720016809309,95.59854761387875,0 +74.24869136721598,69.82457122657193,1 +71.79646205863379,78.45356224515052,1 +75.3956114656803,85.75993667331619,1 +35.28611281526193,47.02051394723416,0 +56.25381749711624,39.26147251058019,0 +30.05882244669796,49.59297386723685,0 +44.66826172480893,66.45008614558913,0 +66.56089447242954,41.09209807936973,0 +40.45755098375164,97.53518548909936,1 +49.07256321908844,51.88321182073966,0 +80.27957401466998,92.11606081344084,1 +66.74671856944039,60.99139402740988,1 +32.72283304060323,43.30717306430063,0 +64.0393204150601,78.03168802018232,1 +72.34649422579923,96.22759296761404,1 +60.45788573918959,73.09499809758037,1 +58.84095621726802,75.85844831279042,1 +99.82785779692128,72.36925193383885,1 +47.26426910848174,88.47586499559782,1 +50.45815980285988,75.80985952982456,1 +60.45555629271532,42.50840943572217,0 +82.22666157785568,42.71987853716458,0 +88.9138964166533,69.80378889835472,1 +94.83450672430196,45.69430680250754,1 +67.31925746917527,66.58935317747915,1 +57.23870631569862,59.51428198012956,1 +80.36675600171273,90.96014789746954,1 +68.46852178591112,85.59430710452014,1 +42.0754545384731,78.84478600148043,0 +75.47770200533905,90.42453899753964,1 +78.63542434898018,96.64742716885644,1 +52.34800398794107,60.76950525602592,0 +94.09433112516793,77.15910509073893,1 +90.44855097096364,87.50879176484702,1 +55.48216114069585,35.57070347228866,0 +74.49269241843041,84.84513684930135,1 +89.84580670720979,45.35828361091658,1 +83.48916274498238,48.38028579728175,1 +42.2617008099817,87.10385094025457,1 +99.31500880510394,68.77540947206617,1 +55.34001756003703,64.9319380069486,1 +74.77589300092767,89.52981289513276,1 diff --git a/code/ex2-logistic regression/ex2data2.txt b/code/ex2-logistic regression/ex2data2.txt new file mode 100644 index 00000000..a8889923 --- /dev/null +++ b/code/ex2-logistic regression/ex2data2.txt @@ -0,0 +1,118 @@ +0.051267,0.69956,1 +-0.092742,0.68494,1 +-0.21371,0.69225,1 +-0.375,0.50219,1 +-0.51325,0.46564,1 +-0.52477,0.2098,1 +-0.39804,0.034357,1 +-0.30588,-0.19225,1 +0.016705,-0.40424,1 +0.13191,-0.51389,1 +0.38537,-0.56506,1 +0.52938,-0.5212,1 +0.63882,-0.24342,1 +0.73675,-0.18494,1 +0.54666,0.48757,1 +0.322,0.5826,1 +0.16647,0.53874,1 +-0.046659,0.81652,1 +-0.17339,0.69956,1 +-0.47869,0.63377,1 +-0.60541,0.59722,1 +-0.62846,0.33406,1 +-0.59389,0.005117,1 +-0.42108,-0.27266,1 +-0.11578,-0.39693,1 +0.20104,-0.60161,1 +0.46601,-0.53582,1 +0.67339,-0.53582,1 +-0.13882,0.54605,1 +-0.29435,0.77997,1 +-0.26555,0.96272,1 +-0.16187,0.8019,1 +-0.17339,0.64839,1 +-0.28283,0.47295,1 +-0.36348,0.31213,1 +-0.30012,0.027047,1 +-0.23675,-0.21418,1 +-0.06394,-0.18494,1 +0.062788,-0.16301,1 +0.22984,-0.41155,1 +0.2932,-0.2288,1 +0.48329,-0.18494,1 +0.64459,-0.14108,1 +0.46025,0.012427,1 +0.6273,0.15863,1 +0.57546,0.26827,1 +0.72523,0.44371,1 +0.22408,0.52412,1 +0.44297,0.67032,1 +0.322,0.69225,1 +0.13767,0.57529,1 +-0.0063364,0.39985,1 +-0.092742,0.55336,1 +-0.20795,0.35599,1 +-0.20795,0.17325,1 +-0.43836,0.21711,1 +-0.21947,-0.016813,1 +-0.13882,-0.27266,1 +0.18376,0.93348,0 +0.22408,0.77997,0 +0.29896,0.61915,0 +0.50634,0.75804,0 +0.61578,0.7288,0 +0.60426,0.59722,0 +0.76555,0.50219,0 +0.92684,0.3633,0 +0.82316,0.27558,0 +0.96141,0.085526,0 +0.93836,0.012427,0 +0.86348,-0.082602,0 +0.89804,-0.20687,0 +0.85196,-0.36769,0 +0.82892,-0.5212,0 +0.79435,-0.55775,0 +0.59274,-0.7405,0 +0.51786,-0.5943,0 +0.46601,-0.41886,0 +0.35081,-0.57968,0 +0.28744,-0.76974,0 +0.085829,-0.75512,0 +0.14919,-0.57968,0 +-0.13306,-0.4481,0 +-0.40956,-0.41155,0 +-0.39228,-0.25804,0 +-0.74366,-0.25804,0 +-0.69758,0.041667,0 +-0.75518,0.2902,0 +-0.69758,0.68494,0 +-0.4038,0.70687,0 +-0.38076,0.91886,0 +-0.50749,0.90424,0 +-0.54781,0.70687,0 +0.10311,0.77997,0 +0.057028,0.91886,0 +-0.10426,0.99196,0 +-0.081221,1.1089,0 +0.28744,1.087,0 +0.39689,0.82383,0 +0.63882,0.88962,0 +0.82316,0.66301,0 +0.67339,0.64108,0 +1.0709,0.10015,0 +-0.046659,-0.57968,0 +-0.23675,-0.63816,0 +-0.15035,-0.36769,0 +-0.49021,-0.3019,0 +-0.46717,-0.13377,0 +-0.28859,-0.060673,0 +-0.61118,-0.067982,0 +-0.66302,-0.21418,0 +-0.59965,-0.41886,0 +-0.72638,-0.082602,0 +-0.83007,0.31213,0 +-0.72062,0.53874,0 +-0.59389,0.49488,0 +-0.48445,0.99927,0 +-0.0063364,0.99927,0 +0.63265,-0.030612,0 diff --git a/code/ex3-neural network/1- neural network.ipynb b/code/ex3-neural network/1- neural network.ipynb new file mode 100644 index 00000000..554afa6a --- /dev/null +++ b/code/ex3-neural network/1- neural network.ipynb @@ -0,0 +1,885 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# neural network(神经网络)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import scipy.io as sio\n", + "import matplotlib\n", + "import scipy.optimize as opt\n", + "from sklearn.metrics import classification_report#这个包是评价报告" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def load_data(path, transpose=True):\n", + " data = sio.loadmat(path)\n", + " y = data.get('y') # (5000,1)\n", + " y = y.reshape(y.shape[0]) # make it back to column vector\n", + "\n", + " X = data.get('X') # (5000,400)\n", + "\n", + " if transpose:\n", + " # for this dataset, you need a transpose to get the orientation right\n", + " X = np.array([im.reshape((20, 20)).T for im in X])\n", + "\n", + " # and I flat the image again to preserve the vector presentation\n", + " X = np.array([im.reshape(400) for im in X])\n", + "\n", + " return X, y" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(5000, 400)\n", + "(5000,)\n" + ] + } + ], + "source": [ + "X, y = load_data('ex3data1.mat')\n", + "\n", + "print(X.shape)\n", + "print(y.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def plot_an_image(image):\n", + "# \"\"\"\n", + "# image : (400,)\n", + "# \"\"\"\n", + " fig, ax = plt.subplots(figsize=(1, 1))\n", + " ax.matshow(image.reshape((20, 20)), cmap=matplotlib.cm.binary)\n", + " plt.xticks(np.array([])) # just get rid of ticks\n", + " plt.yticks(np.array([]))\n", + "#绘图函数" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAYAAAA4TnrqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAABJ5JREFUeJztm0sotH8Ux7/jGrkUuSwYxEqKQZGymLKSJBuSNdZk4bpQ\nlhIrC0tSFmIlK7fCQobESgnJrcltQW7zrn5nzvP3ypx3nhn/t/d8Vt9Oj/H0nXOe8/ud3zMOn88H\nJTAifvoG/ibULAFqlgA1S4CaJUDNEqBmCVCzBKhZAqIkF6empvqcTmeo7uXHOD09hdfrdXx3ncgs\np9OJ5eXlP7+r/ylutzug67QMBahZAkRlGCx8wuFw+B8RERH+7ywyMvLTte/v76Sjovy3HBMTAwB4\neXmhGNf8f9iBZpYANUtAWMuQl9Db2xvp+/t70icnJwCA+Ph4imVlZZE+ODggvbW1BQAoLy+nWHFx\nMWm7B5uaWQLULAG2liFPe15yHx8fAICdnR2KTU5Okj46OiJ9fX0NAIiNjaVYdnY26YuLC9L7+/sA\ngPb2dorxMrQbzSwBapYAW8uQLy69Xi/p4eFhAMDCwgLFXl9fSefm5n7SfHF5fHxM+vLyknRSUhIA\nYGNjg2KPj4+kExMTSdvRGTWzBNiaWfyhPjo6SnpqagoAUFJSQrGOjg7SlZWVpNPS0gAAT09PFDNr\nLwDo7+8nbRrG3d0dxW5ubkibzAM0s8KOmiUg6DI0UwIAODs7I726uko6ISEBANDd3U2xxsZG0vyh\nbNZk/OFcVlZG2jQLAGhoaAAAZGZmUiwjI4O0bnd+EDVLQNBlaMoGsJZAYWEhadPNPB4PxUpLS3/7\nd2YawT+Xr8nW1tZIm2lFfX09xXj58qGhHWhmCVCzBNhahtHR0aRbWlpIr6+vAwDGx8cptrS0RLqu\nro50TU0NAKCgoIBic3NzpEdGRki7XC4A/q4I2D9352hmCXBI1iIul8sX6CEr/4bNg31+fp5i29vb\npM/Pz0k/Pz8DsGYpX4fxLcz09DQA61iZb5MCzTK32w2Px/PtxZpZAtQsASEbK3NMmVRUVFCMn9L0\n9PSQ3tzcBGBtHBxeZrOzswD82ynA2hj4CZIdaGYJULME2FqGX3Ufs+3g4+Guri7Se3t7pKurqwEA\nbW1tFOMj5rGxMdITExMArMNBvg5LT0//dA/BrMM0swSoWQJC9q4DP+l5eHgAAPT29lJsd3eXdGdn\nJ+nm5mYA1vcbeOlUVVWRHhoaAgDMzMxQjB/eDg4Okv6qu0rQzBIQssziJz1ma2M21ABQW1tLuq+v\nj7SZXfEZFp9L8dmXaQJ8hL2yskK6tbWVdE5OzqfPkqKZJUDNEhCyMuRbn+TkZABAXFwcxfibM4uL\ni6RNufByS0lJIX17e0v66uoKgLVk+Zrsq3dY/xTNLAFqloCQlSHf8RcVFQGwdr2BgQHSvGvl5eUB\nAPLz8ylmShOwlq8ZGvL3G5qamkjzt3PsmEBoZglQswSErAz59sL8EoKXG9/OmCEe4B8KHh4eUoxr\n3tVMt+Olx6cVvBsarVOHMBGyzOLfoMkyHjPng//VwcIzmm9tdJ0VZtQsAWH57c7vSsDuk5dA/28w\naGYJULMEiN51cDgcNwBOvr3w7yPH5/OlfXeRyKx/HS1DAWqWADVLgJolQM0SoGYJULMEqFkC1CwB\nvwDVUJSgfZx/PAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "this should be 8\n" + ] + } + ], + "source": [ + "pick_one = np.random.randint(0, 5000)\n", + "plot_an_image(X[pick_one, :])\n", + "plt.show()\n", + "print('this should be {}'.format(y[pick_one]))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def plot_100_image(X):\n", + " \"\"\" sample 100 image and show them\n", + " assume the image is square\n", + "\n", + " X : (5000, 400)\n", + " \"\"\"\n", + " size = int(np.sqrt(X.shape[1]))\n", + "\n", + " # sample 100 image, reshape, reorg it\n", + " sample_idx = np.random.choice(np.arange(X.shape[0]), 100) # 100*400\n", + " sample_images = X[sample_idx, :]\n", + "\n", + " fig, ax_array = plt.subplots(nrows=10, ncols=10, sharey=True, sharex=True, figsize=(8, 8))\n", + "\n", + " for r in range(10):\n", + " for c in range(10):\n", + " ax_array[r, c].matshow(sample_images[10 * r + c].reshape((size, size)),\n", + " cmap=matplotlib.cm.binary)\n", + " plt.xticks(np.array([]))\n", + " plt.yticks(np.array([])) \n", + " #绘图函数,画100张图片" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nqMVmody7Wnsl1p100klA5qEv40aTnI4//vgCSOghPVWSqEp2FBIaNmyYC9PpeoI6rmvSg/jZZ591\nJWJhneO6r3QO6gzTfbXWWmu5kjXplPREk78UvtD7Fi9e7KY8razc8acABoPBYDDEHHlhptllAUGo\nAF+TTaZOneqsRllEcikFrYk4IZFIONamRJI11lgDKNx0ByWyaMagWIQsq19//ZXLL78c8A3aBbET\nuZii9gboGq644grAW459+/Z16fha16D7JTglIhv5SICQbOl0usZ10VqLbT766KPOUr7vvvsA33xE\nbdqiCldoDdQqTSU6ctnKbbruuuu6a/31118B34xf1632k2JcUSSYaF/FrFU6oiTGdddd1+m83LxK\naiy0V0vrqQQ/rWsikXDn2/777w94Bl4ombWn0gsleumce/jhh12CorwraoYhj5KS2hSm+eGHH9z5\nGJa+S0/kGVTYRJNhdtttN7fW8sipuYcSMuXVy/7MXPfBmKnBYDAYDDkiJ2YqC3LRokXOApAVrrZ1\nagguK/Pss8928bpzzjkH8Iy00FblsiBLc/jw4Y5RyzovREwv24KSVR5sJiGZR4wY4dLdg+0dlaav\nBJowR7AtC1o7xeokx/z5813LQVmPwZF9spxVXL5o0SL3b7Xny2Vv1Dxkk002cQ35gyPKgqx44403\npnfv3gC8/vrrgG/LpkQa7ZP2IGz9kcyyxtXcW+u3ZMkSl8ugJI7XXnsNgK5duwI+SSZKBNdFySLy\npnz22WfOk6FG7B07dgQK59WSPog9Dxs2DKjaQEWeJDWhEAp97gW9irqW3r17u7iu4rzKudCwEnkV\nlXPRpEmT0K9H+qs4uUpkFOstLS11Z4bmsepnPY8kbz5bwhozNRgMBoMhR+TETPV0HzlypItZzJ49\nG4DDDjsM8IOr5WP/7rvv2GyzzQDPSOMwtT0IWZSyaFQQDL4dnJqCR8FQ9R2NGzd2beGefPJJINOc\nAXyMTDGQ2267zWXZyYJXDETlERogoD1p0aJFJJay2L2ySZWx+cADD3DhhRcC3mIOlhTI+p88eTKQ\nafwgZi2GsjKxPe214nENGzZ06yM5a2KVlZWVTp81/knrWOgyjZqalJeUlLiWfYqp654Wy1ZMvRDl\nacEKAa3jE0884eT617/+BfhqgUJl8Wrd1PRCzFQ6W1FRwZ577glE0wBjRaD11T2jbNwePXq47OiH\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_100_image(X)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(5000, 400)\n", + "(5000,)\n" + ] + } + ], + "source": [ + "raw_X, raw_y = load_data('ex3data1.mat')\n", + "print(raw_X.shape)\n", + "print(raw_y.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 准备数据" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5000, 401)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# add intercept=1 for x0\n", + "X = np.insert(raw_X, 0, values=np.ones(raw_X.shape[0]), axis=1)#插入了第一列(全部为1)\n", + "X.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(10, 5000)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# y have 10 categories here. 1..10, they represent digit 0 as category 10 because matlab index start at 1\n", + "# I'll ditit 0, index 0 again\n", + "y_matrix = []\n", + "\n", + "for k in range(1, 11):\n", + " y_matrix.append((raw_y == k).astype(int))\n", + "\n", + "# last one is k==10, it's digit 0, bring it to the first position,最后一列k=10,都是0,把最后一列放到第一列\n", + "y_matrix = [y_matrix[-1]] + y_matrix[:-1]\n", + "y = np.array(y_matrix)\n", + "\n", + "y.shape\n", + "\n", + "# 扩展 5000*1 到 5000*10\n", + "# 比如 y=10 -> [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]: ndarray\n", + "# \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 1, 1, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " ..., \n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 1, 1, 1]])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# train 1 model(训练一维模型)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def cost(theta, X, y):\n", + " ''' cost fn is -l(theta) for you to minimize'''\n", + " return np.mean(-y * np.log(sigmoid(X @ theta)) - (1 - y) * np.log(1 - sigmoid(X @ theta)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def regularized_cost(theta, X, y, l=1):\n", + " '''you don't penalize theta_0'''\n", + " theta_j1_to_n = theta[1:]\n", + " regularized_term = (l / (2 * len(X))) * np.power(theta_j1_to_n, 2).sum()\n", + "\n", + " return cost(theta, X, y) + regularized_term" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def regularized_gradient(theta, X, y, l=1):\n", + " '''still, leave theta_0 alone'''\n", + " theta_j1_to_n = theta[1:]\n", + " regularized_theta = (l / len(X)) * theta_j1_to_n\n", + "\n", + " # by doing this, no offset is on theta_0\n", + " regularized_term = np.concatenate([np.array([0]), regularized_theta])\n", + "\n", + " return gradient(theta, X, y) + regularized_term" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sigmoid(z):\n", + " return 1 / (1 + np.exp(-z))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradient(theta, X, y):\n", + " '''just 1 batch gradient'''\n", + " return (1 / len(X)) * X.T @ (sigmoid(X @ theta) - y)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def logistic_regression(X, y, l=1):\n", + " \"\"\"generalized logistic regression\n", + " args:\n", + " X: feature matrix, (m, n+1) # with incercept x0=1\n", + " y: target vector, (m, )\n", + " l: lambda constant for regularization\n", + "\n", + " return: trained parameters\n", + " \"\"\"\n", + " # init theta\n", + " theta = np.zeros(X.shape[1])\n", + "\n", + " # train it\n", + " res = opt.minimize(fun=regularized_cost,\n", + " x0=theta,\n", + " args=(X, y, l),\n", + " method='TNC',\n", + " jac=regularized_gradient,\n", + " options={'disp': True})\n", + " # get trained parameters\n", + " final_theta = res.x\n", + "\n", + " return final_theta" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def predict(x, theta):\n", + " prob = sigmoid(x @ theta)\n", + " return (prob >= 0.5).astype(int)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "t0 = logistic_regression(X, y[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(401,)\n", + "Accuracy=0.9974\n" + ] + } + ], + "source": [ + "print(t0.shape)\n", + "y_pred = predict(X, t0)\n", + "print('Accuracy={}'.format(np.mean(y[0] == y_pred)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# train k model(训练k维模型)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(10, 401)\n" + ] + } + ], + "source": [ + "k_theta = np.array([logistic_regression(X, y[k]) for k in range(10)])\n", + "print(k_theta.shape)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 进行预测\n", + "* think about the shape of k_theta, now you are making $X\\times\\theta^T$\n", + "> $(5000, 401) \\times (10, 401).T = (5000, 10)$\n", + "* after that, you run sigmoid to get probabilities and for each row, you find the highest prob as the answer" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "prob_matrix = sigmoid(X @ k_theta.T)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0.9957736 , 0. , 0.0005348 , ..., 0.0000647 ,\n", + " 0.00003918, 0.00172193],\n", + " [ 0.99834617, 0.0000001 , 0.00005609, ..., 0.00009687,\n", + " 0.0000029 , 0.00008485],\n", + " [ 0.99139702, 0. , 0.00056824, ..., 0.00000655,\n", + " 0.02654595, 0.00197376],\n", + " ..., \n", + " [ 0.00000068, 0.0414034 , 0.00320872, ..., 0.00012718,\n", + " 0.00297474, 0.70751222],\n", + " [ 0.00001843, 0.00000013, 0.00000009, ..., 0.00164846,\n", + " 0.06810645, 0.86109385],\n", + " [ 0.02881702, 0. , 0.00012984, ..., 0.36623328,\n", + " 0.00498066, 0.14826916]])" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.set_printoptions(suppress=True)\n", + "prob_matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "y_pred = np.argmax(prob_matrix, axis=1)#返回沿轴axis最大值的索引,axis=1代表行" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 0, 0, ..., 9, 9, 7], dtype=int64)" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "y_answer = raw_y.copy()\n", + "y_answer[y_answer==10] = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.97 0.99 0.98 500\n", + " 1 0.95 0.99 0.97 500\n", + " 2 0.95 0.92 0.93 500\n", + " 3 0.95 0.91 0.93 500\n", + " 4 0.95 0.95 0.95 500\n", + " 5 0.92 0.92 0.92 500\n", + " 6 0.97 0.98 0.97 500\n", + " 7 0.95 0.95 0.95 500\n", + " 8 0.93 0.92 0.92 500\n", + " 9 0.92 0.92 0.92 500\n", + "\n", + "avg / total 0.94 0.94 0.94 5000\n", + "\n" + ] + } + ], + "source": [ + "print(classification_report(y_answer, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 神经网络模型图示\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def load_weight(path):\n", + " data = sio.loadmat(path)\n", + " return data['Theta1'], data['Theta2']\n" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((25, 401), (10, 26))" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "theta1, theta2 = load_weight('ex3weights.mat')\n", + "\n", + "theta1.shape, theta2.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " 因此在数据加载函数中,原始数据做了转置,然而,转置的数据与给定的参数不兼容,因为这些参数是由原始数据训练的。 所以为了应用给定的参数,我需要使用原始数据(不转置)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((5000, 401), (5000,))" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X, y = load_data('ex3data1.mat',transpose=False)\n", + "\n", + "X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1) # intercept\n", + "\n", + "X.shape, y.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# feed forward prediction(前馈预测)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "a1 = X" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5000, 25)" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "z2 = a1 @ theta1.T # (5000, 401) @ (25,401).T = (5000, 25)\n", + "z2.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "z2 = np.insert(z2, 0, values=np.ones(z2.shape[0]), axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5000, 26)" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a2 = sigmoid(z2)\n", + "a2.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5000, 10)" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "z3 = a2 @ theta2.T\n", + "z3.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0.00013825, 0.0020554 , 0.00304012, ..., 0.00049102,\n", + " 0.00774326, 0.99622946],\n", + " [ 0.00058776, 0.00285027, 0.00414688, ..., 0.00292311,\n", + " 0.00235617, 0.99619667],\n", + " [ 0.00010868, 0.0038266 , 0.03058551, ..., 0.07514539,\n", + " 0.0065704 , 0.93586278],\n", + " ..., \n", + " [ 0.06278247, 0.00450406, 0.03545109, ..., 0.0026367 ,\n", + " 0.68944816, 0.00002744],\n", + " [ 0.00101909, 0.00073436, 0.00037856, ..., 0.01456166,\n", + " 0.97598976, 0.00023337],\n", + " [ 0.00005908, 0.00054172, 0.0000259 , ..., 0.00700508,\n", + " 0.73281465, 0.09166961]])" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a3 = sigmoid(z3)\n", + "a3" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5000,)" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_pred = np.argmax(a3, axis=1) + 1 # numpy is 0 base index, +1 for matlab convention,返回沿轴axis最大值的索引,axis=1代表行\n", + "y_pred.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 准确率\n", + " \n", + "虽然人工神经网络是非常强大的模型,但训练数据的准确性并不能完美预测实际数据,在这里很容易过拟合。" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 1 0.97 0.98 0.97 500\n", + " 2 0.98 0.97 0.97 500\n", + " 3 0.98 0.96 0.97 500\n", + " 4 0.97 0.97 0.97 500\n", + " 5 0.98 0.98 0.98 500\n", + " 6 0.97 0.99 0.98 500\n", + " 7 0.98 0.97 0.97 500\n", + " 8 0.98 0.98 0.98 500\n", + " 9 0.97 0.96 0.96 500\n", + " 10 0.98 0.99 0.99 500\n", + "\n", + "avg / total 0.98 0.98 0.98 5000\n", + "\n" + ] + } + ], + "source": [ + "print(classification_report(y, y_pred))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/code/ex3-neural network/ML-Exercise3.ipynb b/code/ex3-neural network/ML-Exercise3.ipynb new file mode 100644 index 00000000..c41b5e7f --- /dev/null +++ b/code/ex3-neural network/ML-Exercise3.ipynb @@ -0,0 +1,503 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 机器学习练习 3 - 多类分类" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "该代码涵盖了基于Python的解决方案,用于Coursera机器学习课程的第三个编程练习。 有关详细说明和方程式,请参阅[exercise text](ex3.pdf)。\n", + "\n", + "\n", + "代码修改并注释:黄海广,haiguang2000@qq.com" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "对于此练习,我们将使用逻辑回归来识别手写数字(0到9)。 我们将扩展我们在练习2中写的逻辑回归的实现,并将其应用于一对一的分类。 让我们开始加载数据集。 它是在MATLAB的本机格式,所以要加载它在Python,我们需要使用一个SciPy工具。" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from scipy.io import loadmat" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'X': array([[ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " ..., \n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.],\n", + " [ 0., 0., 0., ..., 0., 0., 0.]]),\n", + " '__globals__': [],\n", + " '__header__': b'MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Sun Oct 16 13:09:09 2011',\n", + " '__version__': '1.0',\n", + " 'y': array([[10],\n", + " [10],\n", + " [10],\n", + " ..., \n", + " [ 9],\n", + " [ 9],\n", + " [ 9]], dtype=uint8)}" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = loadmat('ex3data1.mat')\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((5000, 400), (5000, 1))" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data['X'].shape, data['y'].shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "好的,我们已经加载了我们的数据。图像在martix X中表示为400维向量(其中有5,000个)。 400维“特征”是原始20 x 20图像中每个像素的灰度强度。类标签在向量y中作为表示图像中数字的数字类。\n", + "\n", + "\n", + "第一个任务是将我们的逻辑回归实现修改为完全向量化(即没有“for”循环)。这是因为向量化代码除了简洁外,还能够利用线性代数优化,并且通常比迭代代码快得多。但是,如果从练习2中看到我们的代价函数已经完全向量化实现了,所以我们可以在这里重复使用相同的实现。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# sigmoid 函数\n", + "g 代表一个常用的逻辑函数(logistic function)为S形函数(Sigmoid function),公式为: \\\\[g\\left( z \\right)=\\frac{1}{1+{{e}^{-z}}}\\\\] \n", + "合起来,我们得到逻辑回归模型的假设函数: \n", + "\t\\\\[{{h}_{\\theta }}\\left( x \\right)=\\frac{1}{1+{{e}^{-{{\\theta }^{T}}X}}}\\\\] " + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def sigmoid(z):\n", + " return 1 / (1 + np.exp(-z))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "代价函数:\n", + "$J\\left( \\theta \\right)=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[-{{y}^{(i)}}\\log \\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)-\\left( 1-{{y}^{(i)}} \\right)\\log \\left( 1-{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right) \\right)]}$" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "def cost(theta, X, y, learningRate):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " first = np.multiply(-y, np.log(sigmoid(X * theta.T)))\n", + " second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))\n", + " reg = (learningRate / (2 * len(X))) * np.sum(np.power(theta[:,1:theta.shape[1]], 2))\n", + " return np.sum(first - second) / len(X) + reg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "如果我们要使用梯度下降法令这个代价函数最小化,因为我们未对${{\\theta }_{0}}$ 进行正则化,所以梯度下降算法将分两种情形:\n", + "\\begin{align}\n", + " & Repeat\\text{ }until\\text{ }convergence\\text{ }\\!\\!\\{\\!\\!\\text{ } \\\\ \n", + " & \\text{ }{{\\theta }_{0}}:={{\\theta }_{0}}-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}}]x_{_{0}}^{(i)}} \\\\ \n", + " & \\text{ }{{\\theta }_{j}}:={{\\theta }_{j}}-a\\frac{1}{m}\\sum\\limits_{i=1}^{m}{[{{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}}]x_{j}^{(i)}}+\\frac{\\lambda }{m}{{\\theta }_{j}} \\\\ \n", + " & \\text{ }\\!\\!\\}\\!\\!\\text{ } \\\\ \n", + " & Repeat \\\\ \n", + "\\end{align}\n", + "\n", + "以下是原始代码是使用for循环的梯度函数:" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradient_with_loop(theta, X, y, learningRate):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " \n", + " parameters = int(theta.ravel().shape[1])\n", + " grad = np.zeros(parameters)\n", + " \n", + " error = sigmoid(X * theta.T) - y\n", + " \n", + " for i in range(parameters):\n", + " term = np.multiply(error, X[:,i])\n", + " \n", + " if (i == 0):\n", + " grad[i] = np.sum(term) / len(X)\n", + " else:\n", + " grad[i] = (np.sum(term) / len(X)) + ((learningRate / len(X)) * theta[:,i])\n", + " \n", + " return grad" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "向量化的梯度函数" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def gradient(theta, X, y, learningRate):\n", + " theta = np.matrix(theta)\n", + " X = np.matrix(X)\n", + " y = np.matrix(y)\n", + " \n", + " parameters = int(theta.ravel().shape[1])\n", + " error = sigmoid(X * theta.T) - y\n", + " \n", + " grad = ((X.T * error) / len(X)).T + ((learningRate / len(X)) * theta)\n", + " \n", + " # intercept gradient is not regularized\n", + " grad[0, 0] = np.sum(np.multiply(error, X[:,0])) / len(X)\n", + " \n", + " return np.array(grad).ravel()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在我们已经定义了代价函数和梯度函数,现在是构建分类器的时候了。 对于这个任务,我们有10个可能的类,并且由于逻辑回归只能一次在2个类之间进行分类,我们需要多类分类的策略。 在本练习中,我们的任务是实现一对一全分类方法,其中具有k个不同类的标签就有k个分类器,每个分类器在“类别 i”和“不是 i”之间决定。 我们将把分类器训练包含在一个函数中,该函数计算10个分类器中的每个分类器的最终权重,并将权重返回为k X(n + 1)数组,其中n是参数数量。" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from scipy.optimize import minimize\n", + "\n", + "def one_vs_all(X, y, num_labels, learning_rate):\n", + " rows = X.shape[0]\n", + " params = X.shape[1]\n", + " \n", + " # k X (n + 1) array for the parameters of each of the k classifiers\n", + " all_theta = np.zeros((num_labels, params + 1))\n", + " \n", + " # insert a column of ones at the beginning for the intercept term\n", + " X = np.insert(X, 0, values=np.ones(rows), axis=1)\n", + " \n", + " # labels are 1-indexed instead of 0-indexed\n", + " for i in range(1, num_labels + 1):\n", + " theta = np.zeros(params + 1)\n", + " y_i = np.array([1 if label == i else 0 for label in y])\n", + " y_i = np.reshape(y_i, (rows, 1))\n", + " \n", + " # minimize the objective function\n", + " fmin = minimize(fun=cost, x0=theta, args=(X, y_i, learning_rate), method='TNC', jac=gradient)\n", + " all_theta[i-1,:] = fmin.x\n", + " \n", + " return all_theta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这里需要注意的几点:首先,我们为theta添加了一个额外的参数(与训练数据一列),以计算截距项(常数项)。 其次,我们将y从类标签转换为每个分类器的二进制值(要么是类i,要么不是类i)。 最后,我们使用SciPy的较新优化API来最小化每个分类器的代价函数。 如果指定的话,API将采用目标函数,初始参数集,优化方法和jacobian(渐变)函数。 然后将优化程序找到的参数分配给参数数组。\n", + "\n", + "实现向量化代码的一个更具挑战性的部分是正确地写入所有的矩阵,保证维度正确。" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((5000, 401), (5000, 1), (401,), (10, 401))" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rows = data['X'].shape[0]\n", + "params = data['X'].shape[1]\n", + "\n", + "all_theta = np.zeros((10, params + 1))\n", + "\n", + "X = np.insert(data['X'], 0, values=np.ones(rows), axis=1)\n", + "\n", + "theta = np.zeros(params + 1)\n", + "\n", + "y_0 = np.array([1 if label == 0 else 0 for label in data['y']])\n", + "y_0 = np.reshape(y_0, (rows, 1))\n", + "\n", + "X.shape, y_0.shape, theta.shape, all_theta.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "注意,theta是一维数组,因此当它被转换为计算梯度的代码中的矩阵时,它变为(1×401)矩阵。 我们还检查y中的类标签,以确保它们看起来像我们想象的一致。" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=uint8)" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.unique(data['y'])#看下有几类标签" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "让我们确保我们的训练函数正确运行,并且得到合理的输出。" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ -2.38335105e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", + " 1.30434941e-03, -7.35542490e-10, 0.00000000e+00],\n", + " [ -3.18549977e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", + " 4.45902426e-03, -5.08371406e-04, 0.00000000e+00],\n", + " [ -4.79997891e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", + " -2.87612799e-05, -2.47948035e-07, 0.00000000e+00],\n", + " ..., \n", + " [ -7.98390460e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", + " -8.96271728e-05, 7.22810041e-06, 0.00000000e+00],\n", + " [ -4.57356699e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", + " -1.33528780e-03, 9.97862678e-05, 0.00000000e+00],\n", + " [ -5.40564903e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", + " -1.16550490e-04, 7.87549333e-06, 0.00000000e+00]])" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "all_theta = one_vs_all(data['X'], data['y'], 10, 1)\n", + "all_theta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们现在准备好最后一步 - 使用训练完毕的分类器预测每个图像的标签。 对于这一步,我们将计算每个类的类概率,对于每个训练样本(使用当然的向量化代码),并将输出类标签为具有最高概率的类。" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def predict_all(X, all_theta):\n", + " rows = X.shape[0]\n", + " params = X.shape[1]\n", + " num_labels = all_theta.shape[0]\n", + " \n", + " # same as before, insert ones to match the shape\n", + " X = np.insert(X, 0, values=np.ones(rows), axis=1)\n", + " \n", + " # convert to matrices\n", + " X = np.matrix(X)\n", + " all_theta = np.matrix(all_theta)\n", + " \n", + " # compute the class probability for each class on each training instance\n", + " h = sigmoid(X * all_theta.T)\n", + " \n", + " # create array of the index with the maximum probability\n", + " h_argmax = np.argmax(h, axis=1)\n", + " \n", + " # because our array was zero-indexed we need to add one for the true label prediction\n", + " h_argmax = h_argmax + 1\n", + " \n", + " return h_argmax" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在我们可以使用predict_all函数为每个实例生成类预测,看看我们的分类器是如何工作的。" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "accuracy = 94.46%\n" + ] + } + ], + "source": [ + "y_pred = predict_all(data['X'], all_theta)\n", + "correct = [1 if a == b else 0 for (a, b) in zip(y_pred, data['y'])]\n", + "accuracy = (sum(map(int, correct)) / float(len(correct)))\n", + "print ('accuracy = {0}%'.format(accuracy * 100))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在下一个练习中,我们将介绍如何从头开始实现前馈神经网络。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 神经网络模型图示\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.6.1" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/code/ex3-neural network/ex3.pdf b/code/ex3-neural network/ex3.pdf new file mode 100644 index 00000000..93ad46a2 Binary files /dev/null and b/code/ex3-neural network/ex3.pdf differ diff --git a/code/ex3-neural network/ex3data1.mat b/code/ex3-neural network/ex3data1.mat new file mode 100644 index 00000000..371bd0c0 Binary files /dev/null and b/code/ex3-neural network/ex3data1.mat differ diff --git a/code/ex3-neural network/ex3weights.mat b/code/ex3-neural network/ex3weights.mat new file mode 100644 index 00000000..ace2a090 Binary files /dev/null and b/code/ex3-neural network/ex3weights.mat differ diff --git a/code/ex4-NN back propagation/1- NN back propagation.ipynb b/code/ex4-NN back propagation/1- NN back propagation.ipynb new file mode 100644 index 00000000..a75d5ef1 --- /dev/null +++ b/code/ex4-NN back propagation/1- NN back propagation.ipynb @@ -0,0 +1,1855 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NN back propagation(神经网络反向传播)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import scipy.io as sio\n", + "import matplotlib\n", + "import scipy.optimize as opt\n", + "from sklearn.metrics import classification_report#这个包是评价报告" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def load_data(path, transpose=True):\n", + " data = sio.loadmat(path)\n", + " y = data.get('y') # (5000,1)\n", + " y = y.reshape(y.shape[0]) # make it back to column vector\n", + "\n", + " X = data.get('X') # (5000,400)\n", + "\n", + " if transpose:\n", + " # for this dataset, you need a transpose to get the orientation right\n", + " X = np.array([im.reshape((20, 20)).T for im in X])\n", + "\n", + " # and I flat the image again to preserve the vector presentation\n", + " X = np.array([im.reshape(400) for im in X])\n", + "\n", + " return X, y" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X, _ = load_data('ex4data1.mat')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def plot_100_image(X):\n", + " \"\"\" sample 100 image and show them\n", + " assume the image is square\n", + "\n", + " X : (5000, 400)\n", + " \"\"\"\n", + " size = int(np.sqrt(X.shape[1]))\n", + "\n", + " # sample 100 image, reshape, reorg it\n", + " sample_idx = np.random.choice(np.arange(X.shape[0]), 100) # 100*400\n", + " sample_images = X[sample_idx, :]\n", + "\n", + " fig, ax_array = plt.subplots(nrows=10, ncols=10, sharey=True, sharex=True, figsize=(8, 8))\n", + "\n", + " for r in range(10):\n", + " for c in range(10):\n", + " ax_array[r, c].matshow(sample_images[10 * r + c].reshape((size, size)),\n", + " cmap=matplotlib.cm.binary)\n", + " plt.xticks(np.array([]))\n", + " plt.yticks(np.array([]))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " this.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('