<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 2 章 线性回归 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/ml/chapter02/</link>
		<description>Recent content in 第 2 章 线性回归 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/ml/chapter02/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>2.1 模型的建立与求解</title>
				<link>https://mlwithme.github.io/ml/chapter02/2414d4b6648d405a/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter02/2414d4b6648d405a/</guid>
				<description>&lt;p&gt;经过第1章的介绍，我们已经完成了Python开发环境的安装与配置。现在，我们就正式开始介绍第1个算法： 线性回归（Linear Regression）。&#xA;按照前言中介绍的学习方法，整个线性回归的学习路线如图2-1所示。由于这是介绍的第1个算法，所以我们会介绍很多基础的内容，导致看起来内容繁多，因此，对于整个线性回归的学习我们将会通过7个小节的内容进行介绍，但是，值得高兴的是只要完成了前面4个步骤的学习就基本上达到了阶段一的要求。下面就正式开始介绍线性回归。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;500&#34; src=&#34;https://mlwithme.github.io/images/ml/240427123441.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 2-1 线性回归学习路线图&lt;/center&gt;&#xA;&lt;h1 id=&#34;21-模型的建立与求解&#34;&gt;2.1 模型的建立与求解&lt;a class=&#34;anchor&#34; href=&#34;#21-%e6%a8%a1%e5%9e%8b%e7%9a%84%e5%bb%ba%e7%ab%8b%e4%b8%8e%e6%b1%82%e8%a7%a3&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;211-理解线性回归模型&#34;&gt;2.1.1 理解线性回归模型&lt;a class=&#34;anchor&#34; href=&#34;#211-%e7%90%86%e8%a7%a3%e7%ba%bf%e6%80%a7%e5%9b%9e%e5%bd%92%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;通常来讲，机器学习中的每个算法都是为了解决某一类问题而诞生的。换句话说，也就是在实际情况中的确存在一些问题能够通过线性回归来解决，例如对房价的预测。但是有人可能会问，为什么对于房价的预测就应该用线性回归，而不是其他算法模型呢？其原因就在于常识告诉我们房价是随着面积的增长而增长的，且总体上呈线性增长的趋势。那有没有当面积大到一定程度后价格反而降低，因此不符合线性增长的呢？这当然也可能存在，但在实际处理中肯定会优先选择线性回归模型，当效果不佳时我们会尝试其他算法，因此，当学习过多个算法后，在得到某个具体的问题时，就需要考虑哪种模型更适合来解决当前这个问题了。&lt;/p&gt;&#xA;&lt;p&gt;例如某市的房价走势如图2-2所示，其中横坐标为面积，纵坐标为价格，并且房价整体上呈线性增长的趋势。假如现在随意告诉你一个房屋的面积，要怎样才能预测（或者叫计算）出其对应的价格呢？&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p2-2.png&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 2-2 某市的房价走势图&#xA;&lt;/center&gt;&#xA;&lt;h2 id=&#34;212-建立线性回归模型&#34;&gt;2.1.2 建立线性回归模型&lt;a class=&#34;anchor&#34; href=&#34;#212-%e5%bb%ba%e7%ab%8b%e7%ba%bf%e6%80%a7%e5%9b%9e%e5%bd%92%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;一般来讲，当我们得到一个实际问题时，首先会根据问题的背景结合常识选择一个合适的模型。同时，现在常识告诉我们房价的增长更优先符合线性回归这类模型，因此可以考虑建立一个如下所示的线性回归模型。&lt;/p&gt;&#xA;$$&#xA;\hat{y}=h(x)=wx+b\tag{2-1}&#xA;$$&lt;p&gt;其中$w$叫权重参数（Weight），$b$叫偏置（Bias）或者截距（Intercept）。当通过某种方法求解得到未知参数$w$和$b$之后，也就意味着我们得到了这个预测模型，即给定一个房屋面积$x$，就能够预测出其对应的房价$\hat{y}$。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;注意： 在机器学习中所谓的模型，可以简单理解为一个函数。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;213-求解线性回归模型&#34;&gt;2.1.3 求解线性回归模型&lt;a class=&#34;anchor&#34; href=&#34;#213-%e6%b1%82%e8%a7%a3%e7%ba%bf%e6%80%a7%e5%9b%9e%e5%bd%92%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;当建立好一个模型后，自然而然想到的就是如何通过给定的数据，也叫训练集（Training Data），来对模型 $h(x)$进行求解。在中学时期我们学过如何通过两个坐标点来求解过这两点的直线，可在上述的场景中这种做法显然是行不通的（因为所有的点并不在一条直线上），那有没有什么好的解决的办法呢？&lt;/p&gt;&#xA;&lt;p&gt;此时就需要我们转换一下思路，既然不能直接进行求解，那就换一种间接的方式。现在来想象一下，当 $h(x)$ 满足一个什么样的条件时，它才能称得上是一个好的$h(x)$？ 回想一下求解$h(x)$的目的是什么，不就是希望输入面积$x$后能够输出“准确”的房价$\hat{y}$吗？既然直接求解$h(x)$不好入手，那么我们就从“准确”来入手。&lt;/p&gt;&#xA;&lt;p&gt;可又怎样来定义准确呢？在这里，我们可以通过计算每个样本的真实房价与预测房价之间的均方误差来对“准确”进行刻画，即&lt;/p&gt;&#xA;$$&#xA;\begin{cases}&#xA; J(w,b)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}\\[2ex] &#xA;  {{{\hat{y}}}^{(i)}}=h({{x}^{(i)}})=w{{x}^{(i)}}+b  &#xA;\end{cases}&#xA;\tag{2-2}&#xA;$$&lt;p&gt;其中，$m$表示样本数量； $x^{(i)}$表示第$i$个样本的取值，也就是第$i$个房屋的面积； $y^{(i)}$表示第$i$个房屋的真实价格； $y^{(i)}$表示第$i$ 个房屋的预测价格。&lt;/p&gt;&#xA;&lt;p&gt;由式(2-2)可知，当函数$J(w,b)$取最小值时的参数$\hat{w}$和$\hat{b}$，就是要求的目标参数。为什么？因为当$J(w,b)$取最小值时就意味着此时所有样本的预测值与真实值之间的误差（Error）最小。如果极端一点，当所有预测值都等同于真实值，那么此时的$J(w,b)$就是0了。因此，对于如何求解模型 $h(x)$ 的问题就转换成了如何最小化函数$J(w,b)$的问题，而$J(w,b)$也有一个专门的术语叫作目标函数（Objective Function）或者代价函数（Cost Function）抑或损失函数（Loss Function）。&lt;/p&gt;&#xA;&lt;p&gt;至此，我们离第一阶段的学习目标就只有一步之遥了，那就是如何通过开源框架进行建模求解，并进行预测。至于求解过程到底怎样及如何进行的，那就是第二阶段的任务了，下面开始完成第一阶段的最后一步。&lt;/p&gt;&#xA;&lt;h2 id=&#34;214-sklearn简介&#34;&gt;2.1.4 sklearn简介&lt;a class=&#34;anchor&#34; href=&#34;#214-sklearn%e7%ae%80%e4%bb%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;如图2-3所示，scikit-learn简称sklearn。它是一个开源的机器学习框架，包含了数十种常用的机器学习算法，例如线性回归、逻辑回归、决策树、支持向量机、决策树以及聚类分析等。同时，其Python化的设计风格对于Python用户来讲也十分友好且易于上手，并且每个算法都给了相应的示例及API文档，因此，对于入门机器学习来讲，利用sklearn进行建模是一个不二的选择。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;600&#34; src=&#34;https://mlwithme.github.io/images/ml/p2-3.png&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 2-3 sklearn介绍&lt;/center&gt;&#xA;&lt;h2 id=&#34;215-安装sklearn及其他库&#34;&gt;2.1.5 安装sklearn及其他库&lt;a class=&#34;anchor&#34; href=&#34;#215-%e5%ae%89%e8%a3%85sklearn%e5%8f%8a%e5%85%b6%e4%bb%96%e5%ba%93&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在第1章内容中，我们已经介绍了如何配置Python环境，下面就开始在第1章中所创建的Python虚拟环境里安装所需要的包（库）。如果已经按照&lt;a href=&#34;Chapter01_Installation/Ch01.1_Installation&#34;&gt;第1.1.4节&lt;/a&gt;中的步骤完成了本书所有Python包的安装，则可以跳过本小节内容。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 打开终端&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果是在Windows环境中，则应先单击“开始”按钮，然后找到Anaconda Prompt并打开，最后激活相应的Python虚拟环境即可。如果是在Linux环境中，则可直接打开命令行终端，然后激活相应的虚拟环境。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 安装Python包&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;为了完成整个线性回归的建模任务及结果的可视化，需要安装sklearn和matplotlib这两个Python包。如果之前在配置环境的时候，已将pip源地址替换为清华大学镜像，则下载的速度会更快，如图2-4所示。&lt;/p&gt;</description>
			</item>
			<item>
				<title>2.2 多变量线性回归</title>
				<link>https://mlwithme.github.io/ml/chapter02/3e9ba14da71f4fd3/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter02/3e9ba14da71f4fd3/</guid>
				<description>&lt;h1 id=&#34;22-多变量线性回归&#34;&gt;2.2 多变量线性回归&lt;a class=&#34;anchor&#34; href=&#34;#22-%e5%a4%9a%e5%8f%98%e9%87%8f%e7%ba%bf%e6%80%a7%e5%9b%9e%e5%bd%92&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;221-理解多变量&#34;&gt;2.2.1 理解多变量&lt;a class=&#34;anchor&#34; href=&#34;#221-%e7%90%86%e8%a7%a3%e5%a4%9a%e5%8f%98%e9%87%8f&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在2.1节的内容中，我们详细地介绍了什么是线性回归及一个典型的应用场景，同时还介绍了如何通过开源的sklearn来搭建一个简单的线性回归模型。相信此时各位读者对于线性回归的核心思想已经有了一定的认识。接下来，我们将继续开始学习线性回归的后续内容。&lt;/p&gt;&#xA;&lt;p&gt;在这里我们还是继续以房价预测为例进行介绍。尽管影响房价的主要因素是面积，但是其他因素同样也可能影响房屋的价格。例如房屋到学校的距离、到医院的距离和到大型商场的距离等。虽然现实生活中一般不这么量化，但是开发商也总是会拿学区房做卖点，所以这时便有了影响房价的4个因素，而在机器学习中我们将其称为特征（Feature）或者属性（Attribute），因此，包含多个特征的线性回归就叫作多变量线性回归（Multiple Linear Regression）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;222-多变量线性回归建模&#34;&gt;2.2.2 多变量线性回归建模&lt;a class=&#34;anchor&#34; href=&#34;#222-%e5%a4%9a%e5%8f%98%e9%87%8f%e7%ba%bf%e6%80%a7%e5%9b%9e%e5%bd%92%e5%bb%ba%e6%a8%a1&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;以波士顿房价数据集为例，其一共包含了13个特征属性，因此可以得到如下所示的线性回归模型。&lt;/p&gt;&#xA;$$&#xA;h(x)=w_{1}x_{1}+\cdots +w_{13}x_{13}+b\tag{2-3}&#xA;$$&lt;p&gt;并且同时，其目标函数为&lt;/p&gt;&#xA;$$&#xA;\begin{cases}&#xA;J(W,b)=\frac{1}{2m}\sum_{i=1}^m(y^{(i)}-\hat{y}^{(i)})^2\\[2ex]&#xA;\hat{y}^{(i)}=h(x^{(i)})=w_1x_1^{(i)}+\cdots+w_{13}x_{13}^{(i)}+b&#xA;\end{cases} \tag{2-4}&#xA;$$&lt;p&gt;其中$x^{(i)}_j$表示第$i$个样本的第$j$个特征属性； $W$为一个向量，表示所有的权重；$b$为一个标量，表示偏置。&lt;/p&gt;&#xA;&lt;p&gt;由2.1节介绍的内容可知，只要通过某种方法最小化目标函数$J(W,b)$后，便可以求解出模型对应的参数。不过在这之前，我们先来看一下如何通过sklearn进行建模与求解。&lt;/p&gt;&#xA;&lt;h2 id=&#34;223-多变量回归示例代码&#34;&gt;2.2.3 多变量回归示例代码&lt;a class=&#34;anchor&#34; href=&#34;#223-%e5%a4%9a%e5%8f%98%e9%87%8f%e5%9b%9e%e5%bd%92%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;下面依旧以sklearn进行多变量线性回归模型的建模与求解为例，完整代码见 &lt;code&gt;AllBookCode/Chapter02/02_boston_price_train.py&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.导入数据集&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这里直接导入了一个sklearn内置的Boston房价数据集为例进行演示，代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;sklearn.datasets&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; fetch_california_housing&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;load_data&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     data &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; fetch_california_housing()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     x &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;data&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; data&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x, y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. 求解与结果&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;训练模型与输出相应的权重参数和预测值，代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;train&lt;/span&gt;(x, y):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; LinearRegression()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x,y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;权重为：&amp;#34;&lt;/span&gt;,model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;coef_,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;偏置为：&amp;#34;&lt;/span&gt;,model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;intercept_)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;第12个房屋的预测和真实价格：&amp;#34;&lt;/span&gt;,model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;predict(x[&lt;span style=&#34;color:#40a070&#34;&gt;12&lt;/span&gt;,:]&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;)))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;根据上述代码便完成了对于多变量线性回归模型的建立与求解，同时也得出了各个特征所对应的权重参数，但由于不易对高维数据进行可视化，所以这里只能从预测的结果来评判模型的好坏，具体的模型评估指标将在第2.4节中进行介绍。&lt;/p&gt;&#xA;&lt;h2 id=&#34;224-小结&#34;&gt;2.2.4 小结&lt;a class=&#34;anchor&#34; href=&#34;#224-%e5%b0%8f%e7%bb%93&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在本节内容中，我们首先介绍了什么是多变量回归，即包含有多个特征维度的线性回归模型；然后依旧以房间预测为例来介绍了多变量线性回归的建模过程；最后接受了在如何利用sklearn来完成多变量线性回归的建模任务。&lt;/p&gt;</description>
			</item>
			<item>
				<title>2.3 多项式回归</title>
				<link>https://mlwithme.github.io/ml/chapter02/4a16c0dc82a84e78/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter02/4a16c0dc82a84e78/</guid>
				<description>&lt;h1 id=&#34;23-多项式回归&#34;&gt;2.3 多项式回归&lt;a class=&#34;anchor&#34; href=&#34;#23-%e5%a4%9a%e9%a1%b9%e5%bc%8f%e5%9b%9e%e5%bd%92&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;231-理解多项式&#34;&gt;2.3.1 理解多项式&lt;a class=&#34;anchor&#34; href=&#34;#231-%e7%90%86%e8%a7%a3%e5%a4%9a%e9%a1%b9%e5%bc%8f&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在前面两个小节的内容中，我们分别介绍了单变量线性回归和多变量线性回归，那什么是多项式回归呢？现在假定已知矩形的面积公式，而不知道求解梯形的面积公式，并且同时手上有若干个类似图2-7所示的梯形。已知梯形的上底和下底，并且上底均等于高。现在需要建立一个模型，当任意给定一个类似图2-7中的梯形时能近似地算出其面积。面对这样的问题该如何进行建模呢？&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/p2-7.png&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 2-7 梯形&lt;/center&gt;&#xA;&lt;h2 id=&#34;232-多项式回归建模&#34;&gt;2.3.2 多项式回归建模&lt;a class=&#34;anchor&#34; href=&#34;#232-%e5%a4%9a%e9%a1%b9%e5%bc%8f%e5%9b%9e%e5%bd%92%e5%bb%ba%e6%a8%a1&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;首先需要明确的是，即使直接建模成类似于2.2节中的多变量线性回归模型$h(x)=w_1x_1+w_2x_2+b$也是可以的，只是效果可能不会太好。现在我们来分析一下，对于这个梯形，左边可以看成正方形，所以可以人为地构造第3个特征$(x_1)^2$，而整体也可以看成长方形的一部分，则又可以人为地构造出$x_1x_2$这个特征，最后，整体还可以看成大正方形的一部分，因此还可以构造出$(x_2)^2$这个特征。因此，我们便可以建立一个如式(2-5)所示的模型&#xA;&lt;/p&gt;&#xA;$$&#xA;h(x)=x_1w_1+x_2w_2+(x_1)^2w_3+x_1x_2w_4+(x_2)^2w_5+b\tag{2-5}&#xA;$$&lt;p&gt;&#xA;此时有读者可能会问，式(2-5)中有的部分重复累加了，计算出来的面积岂不大于实际面积吗？这当然不会，因为每一项前面都有一个权重参数$w_i$做系数，只要这些权重有正有负，就不会出现大于实际面积的情况。同时，可以发现$h(x)$中包含了$x_1x_2$、$(x_1)^2$、$(x_2)^2$这些项，因此也将其称为多项式回归（Polynomial Regression）。&lt;/p&gt;&#xA;&lt;p&gt;但是，只要进行如下替换，便可回到普通的线性回归：&#xA;&lt;/p&gt;&#xA;$$&#xA;h(x)={x}_{1}{w}_{1}+{x}_{2}{w}_{2}+{x}_{3}{w}_{3}+{x}_{4}{w}_{4}+{x}_{5}{w}_{5}+b\tag{2-6}&#xA;$$&lt;p&gt;&#xA;其中，$x_3=(x_1)^2$、$x_4=x_1x_2$、$x_5=(x_2)^2$，只是在实际建模时先要将原始两个特征的数据转化为5个特征的数据，同时在正式进行预测时，向模型$h(x)$输入的也将是包含5个特征的数据。&lt;/p&gt;&#xA;&lt;h2 id=&#34;233-多项式回归示例代码&#34;&gt;2.3.3 多项式回归示例代码&lt;a class=&#34;anchor&#34; href=&#34;#233-%e5%a4%9a%e9%a1%b9%e5%bc%8f%e5%9b%9e%e5%bd%92%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;要完成整个多项式回归的建模，首先需要对原始的特征进行转换，构造模型所需要的新特征，然后构造相应的数据集，最后进行模型的训练与预测。完整代码见 &lt;code&gt;AllBookCode/Chapter02/C04_trapezoid_polynomial_train.py&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 特征转化&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这里首先介绍一下sklearn中的多项式变换模块&lt;code&gt;PolynomialFeatures&lt;/code&gt;，它的作用便是对每个特征进行指定的幂次变换，代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;sklearn.preprocessing&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; PolynomialFeatures&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; a &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; [[&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;], [&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;]]  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt; model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; PolynomialFeatures(degree&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;,include_bias&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;False&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt; b &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit_transform(a)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(b)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt; &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;#输出结果：[[ 3.  4.  9. 12. 16.] [ 2.  3.  4.  6.  9.]]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;从输出结果可以看出，此时上述第3~4行代码的作用就是将原来的2个特征$x_1$和$x_2$变换为现在的5个特征$x_1$、$x_2$、$x^2_1$、$x_1x_2$和$x_2^2$。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 构造数据集&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;构造训练模型时所需要用到的数据集，代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;make_data&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;random&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;seed(&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     x1 &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;random&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;randint(&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;50&lt;/span&gt;)&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#40a070&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     x2 &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;random&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;randint(&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;16&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;50&lt;/span&gt;)&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;reshape(&lt;span style=&#34;color:#40a070&#34;&gt;50&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     x,y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;hstack((x1, x2)), &lt;span style=&#34;color:#40a070&#34;&gt;0.5&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; (x1 &lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt; x2) &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; x1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x, y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，&lt;code&gt;np.hstack((x1,x2))&lt;/code&gt;的作用是将两个50行1列的矩阵进行水平堆叠，这样便得到了一个50行2列的样本数据，其中第1列为上底，第2列为下底。&lt;/p&gt;</description>
			</item>
			<item>
				<title>2.4 回归模型评估</title>
				<link>https://mlwithme.github.io/ml/chapter02/f8dea699983c48c6/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter02/f8dea699983c48c6/</guid>
				<description>&lt;h1 id=&#34;24-回归模型评估&#34;&gt;2.4 回归模型评估&lt;a class=&#34;anchor&#34; href=&#34;#24-%e5%9b%9e%e5%bd%92%e6%a8%a1%e5%9e%8b%e8%af%84%e4%bc%b0&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在第2.1至第2.3这3节内容中，我们介绍了如何建模线性回归（包括多变量与多项式回归）及如何通过sklearn来搭建模型并求解，但是对于一个创建出来的模型应该怎样来对其进行评估呢？换句话说，这个模型到底怎么样呢？&lt;/p&gt;&#xA;&lt;p&gt;以最开始的房价预测为例，现在假设求解得到了图2-8所示的两个模型$h_1(x)$与$h_2(x)$，那么应该选哪一个呢？抑或在不能可视化的情况下，应该如何评估模型的好与坏呢？&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p2-8.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;  图 2-8 不同模型对房价的预测走势图&lt;/center&gt;&#xA;&lt;p&gt;在回归任务（对连续值的预测）中，常见的评估指标（Metric）有平均绝对误差（Mean Absolute Error,MAE）、均方误差（Mean Square Error, MSE）、均方根误差（Root Mean Square Error, RMSE）、平均绝对百分比误差（Mean Absolute Percentage Error, MAPE）和决定系数（Coefficient of Determination）等，其中用得最为广泛的是 MAE 和 MSE。下面我们依次来对这些指标进行一个大致的介绍，同时在所有的计算公式中，$n$均表示样本数量、$y^{(i)}$均表示第$i$个样本的真实值、$\hat{y}^{(i)}$均表示第$i$个样本的预测值。&lt;/p&gt;&#xA;&lt;h2 id=&#34;241-常见回归评估指标&#34;&gt;2.4.1 常见回归评估指标&lt;a class=&#34;anchor&#34; href=&#34;#241-%e5%b8%b8%e8%a7%81%e5%9b%9e%e5%bd%92%e8%af%84%e4%bc%b0%e6%8c%87%e6%a0%87&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;1.平均绝对误差（MAE）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;MAE用来衡量预测值与真实值之间的平均绝对误差，定义如下：&lt;/p&gt;&#xA;$$&#xA;\text{MAE}=\frac{1}{n}\sum\limits_{i=1}^{n}{|}{{y}^{(i)}}-{{\hat{y}}^{(i)}}|\tag{2-8}&#xA;$$&lt;p&gt;&#xA;其中 $\text{MAE}\in [0,+\infty )$，其值越小表示模型越好。&lt;/p&gt;&#xA;&lt;p&gt;从式(2-8)可以看出，$\text{MAE}$ 的核心思想就是平均上来我们的预测到底差了多少？说的通俗一点 $\text{MAE}$ 给我们的就是一个很直接的平均误差值，不管你是预测高了还是低了它只关心你到底差了多少，最后把所有这些差值取平均，并且它的单位跟原始数据是一模一样。比方说我们预测房价单位是万元，那 $\text{MAE}$ 的单位就是万元。&lt;/p&gt;&#xA;&lt;p&gt;所以，在 $\text{MAE}$ 眼里，所有错误都是平等的，一个 10 万块的误差严重性就是一个 1 万块误差的10倍，一视同仁。&lt;/p&gt;&#xA;&lt;p&gt;具体地，$\text{MAE}$ 实现代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;MAE&lt;/span&gt;(y, y_pre):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;mean(np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;abs(y &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt; y_pre))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. 均方误差（MSE）&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;MSE用来衡量预测值与真实值之间的误差平方，定义如下：&#xA;&lt;/p&gt;&#xA;$$&#xA;\text{MSE}=\frac{1}{n}\sum\limits_{i=1}^{n}{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}\tag{2-9}&#xA;$$&lt;p&gt;&#xA;其中$\text{MSE}\in [0,+\infty )$，其值越小表示模型越好。&lt;/p&gt;&#xA;&lt;p&gt;从式(2-9)可以看出，$\text{MSE}$ 认为不是所有错误都是平等的，有时候一个天大的错误比 10 个小错误加起来还要命。$\text{MSE}$ 的核心思想是犯小错可以容忍但犯大错绝对不行，所以最关键的变化就是这个平方项。例如一个误差是2一个误差是10，分别平方后则变成了4和100，一下就看出了对大误差的敏感度。&lt;/p&gt;</description>
			</item>
			<item>
				<title>2.5 梯度下降</title>
				<link>https://mlwithme.github.io/ml/chapter02/df41c2e97f554e68/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter02/df41c2e97f554e68/</guid>
				<description>&lt;h1 id=&#34;25-梯度下降&#34;&gt;2.5 梯度下降&lt;a class=&#34;anchor&#34; href=&#34;#25-%e6%a2%af%e5%ba%a6%e4%b8%8b%e9%99%8d&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在2.1.3节中，我们不假思索地直接给出了线性回归模型的目标函数$J(w,b)$，但并没有给出严格的数学定义。同时，在求解的过程中也是直接通过开源框架sklearn实现，也不知道其内部的真正原理，因此，在这一节内容中我们将会仔细地学习目标函数的求解过程及最小二乘法。&lt;/p&gt;&#xA;&lt;p&gt;根据前面的介绍可以知道，梯度下降算法的目的是用来最小化目标函数，也就是说梯度下降算法是一个求解的工具。当目标函数取到（或接近）全局最小值时，我们也就求解得到了模型所对应的参数。不过那什么又是梯度下降（Gradient Descent）呢？如图2-9所示，假设有一个山谷，并且你此时处于位置A处，那么请问以什么样的方向（角度）往前跳，你才能最快地到达谷底B处呢?&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p2-9.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;  图 2-9 跳跃方向&lt;/center&gt;&#xA;&lt;p&gt;现在大致有3个方向可以选择，沿着$Y$轴的$\bf{V}_1$方向，沿着$X$轴的$\bf{V}_2$方向及沿着两者间的$\bf{l}$方向。其实不用问，大家都会选择$\bf{l}$所在的方向往前跳第一步，然后接着选类似的方向往前跳第二步直到谷底。可为什么都应该这样选呢？答： 这还用问一看就知，不信请读者自己试一试。&lt;/p&gt;&#xA;&lt;h2 id=&#34;251-方向导数与梯度&#34;&gt;2.5.1 方向导数与梯度&lt;a class=&#34;anchor&#34; href=&#34;#251-%e6%96%b9%e5%90%91%e5%af%bc%e6%95%b0%e4%b8%8e%e6%a2%af%e5%ba%a6&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;由一元函数导数的相关知识可知，$f(x)$在$x_0$处的导数反映的是$f(x)$在$x=x_0$处时的变化率；$|f^{\prime}(x_0)|$越大，也就意味着$f(x)$在该处的变化率越大，即移动$\Delta x$后产生的函数增量$\Delta y$越大。同理，在二元函数$z=f(x,y)$中，为了寻找$z$在A处的最大变化率，就应该计算函数$z$在该点的方向导数&#xA;&lt;/p&gt;&#xA;$$&#xA;\frac{\partial f}{\partial \mathbf{l}}=\{\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}\}\cdot \{cos\alpha ,cos\beta \}=|gradf|\cdot |\mathbf{l}|\cdot \cos \theta\tag{2-13}&#xA;$$&lt;p&gt;&#xA;其中，$\bf{l}$为单位向量； $\alpha$和$\beta$分别为$\bf{l}$与$x$轴和$y$轴的夹角； $\theta$为梯度方向与l的夹角。&lt;/p&gt;&#xA;&lt;p&gt;根据式(2-13)可知，要想方向导数取得最大值，那么$\theta$必须为0。由此可知，只有当某点处方向导数的方向与梯度的方向一致时，方向导数在该点才会取得最大的变化率。&lt;/p&gt;&#xA;&lt;p&gt;在图2-9中，已知$z=x^2+y^2+5$，A的坐标为$(-3,3,23)$，则，则$\partial z/\partial x=2x,\partial z/\partial y=2y$。由此可知，此时在点A处梯度的方向为$(-6,6)$，所以当你站在A点并沿各个方向往前跳跃同样大小的距离时，只有沿着$(\sqrt{2}/2,-\sqrt{2}/2)$这个方向（进行了单位化，并且同时取了相反方向，因为这里需要的是负增量）才会产生最大的函数增量$\Delta z$。&lt;/p&gt;&#xA;&lt;p&gt;如图2-10所示，要想每次都能以最快的速度下降，则每次都必须向着梯度的反方向向前跳跃。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p2-10.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;  图 2-10 负梯度方向&lt;/center&gt;&#xA;&lt;h2 id=&#34;252-梯度下降算法&#34;&gt;2.5.2 梯度下降算法&lt;a class=&#34;anchor&#34; href=&#34;#252-%e6%a2%af%e5%ba%a6%e4%b8%8b%e9%99%8d%e7%ae%97%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;介绍这么多总算是把梯度的概念讲清楚了，那么如何用具体的数学表达式进行描述呢？总不能一个劲儿地喊它“跳”。为了方便后面的表述及将读者带入一个真实求解的过程中，这里先将图2-9中的字母替换成模型中的参数进行表述。&lt;/p&gt;&#xA;&lt;p&gt;现在有一个模型的目标函数$J(w_1,w_2)=w_1^2+w_2^2+2w_2+5$（为了方便可视化，此处省略了参数$b$，但是原理都一样），其中$w_1$和$w_2$为待求解的权重参数，并且随机初始化点A为初始权重值。下面就一步步地通过梯度下降算法进行求解。&lt;/p&gt;&#xA;&lt;p&gt;如图2-11所示，设初始点$A=(w_1,w_2)=(-2,3)$，则此时$J(-2,3)=24$，并且点$A$第一次往前跳的方向为 $-grad\;J=-(2{{w}_{1}},2{{w}_{2}}+2)=(1,-2)$ ，即$(1,-2)$这个方向。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p2-11.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;  图 2-11 梯度下降&lt;/center&gt;&#xA;&lt;p&gt;如图2-12所示，$OQ$为平面上梯度的反方向，$AP$为其平移后的方向，但是长度为之前的$\alpha$倍，因此，根据梯度下降的原则，此时曲面上的$A$点就该沿着其梯度的反方向跳跃，而投影到平面则为$A$应该沿着$AP$的方向移动。假定曲面上从$A$点跳跃到了$P$点，那么对应在投影平面上就是图2-12中的$AP$部分，同时权重参数也从$A$的位置更新到了$P$点的位置。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/p2-12.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;  图 2-12 梯度计算&lt;/center&gt;&#xA;&lt;p&gt;从图2-12可以看出，向量$\mathbf{AP}$、$\mathbf{OA}$和$\mathbf{OP}$三者的关系为&#xA;&lt;/p&gt;&#xA;$$&#xA;\mathbf{OP}=\mathbf{OA}-\mathbf{PA}\tag{2-14}&#xA;$$&lt;p&gt;&#xA;进一步，可以将式(2-14)改写成&#xA;&lt;/p&gt;&#xA;$$&#xA;\mathbf{OP}=\mathbf{OA}-\alpha \cdot grad\ J\tag{2-15}&#xA;$$&lt;p&gt;又由于$\mathbf{OP}$和$\mathbf{OA}$本质上就是权重参数$w_1$和$w_2$更新后与更新前的值，所以便可以得出梯度下降的更新公式为&lt;/p&gt;</description>
			</item>
			<item>
				<title>2.6 正态分布</title>
				<link>https://mlwithme.github.io/ml/chapter02/71ef816e0005492d/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter02/71ef816e0005492d/</guid>
				<description>&lt;h1 id=&#34;26-正态分布&#34;&gt;2.6 正态分布&lt;a class=&#34;anchor&#34; href=&#34;#26-%e6%ad%a3%e6%80%81%e5%88%86%e5%b8%83&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;261-一个问题的出现&#34;&gt;2.6.1 一个问题的出现&lt;a class=&#34;anchor&#34; href=&#34;#261-%e4%b8%80%e4%b8%aa%e9%97%ae%e9%a2%98%e7%9a%84%e5%87%ba%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;17、18世纪曾是科学发展的黄金年代，微积分的发展和牛顿万有引力定律的建立，直接推动了天文学和测地学的迅猛发展。这些天文学和测地学的问题，无不涉及数据的多次测量、分析与计算。很多年以前，学者们就已经经验性地认为，对于有误差的测量数据多次测量取算术平均是比较好的处理方法，并且这种做法现在我们依旧在使用。虽然当时缺乏理论上的论证，并且也不断地受到一些人的质疑，但取算术平均作为一种直观的方式，仍被使用了千百年。同时，算术平均在多年积累的数据处理经验中也得到相当程度的验证，被认为是一种良好的数据处理方法，但是在当时却没人能给出为什么。&lt;/p&gt;&#xA;&lt;p&gt;1805年，勒让德提出了一种方法来解决这个问题，其基本思想认为测量中存在误差，并且让所有的误差累积为$\sum{{{(\hat{y}-y)}^{2}}}$，其中$\hat{y}$为观测值，$y$为理论值，然后通过最小化累积误差来计算得到理论值，即设真实值为$\theta$，${{x}_{1}},{{x}_{2}},...,{{x}_{n}}$分别为$n$次独立观测后的测量值，每次测量的误差为$e_{i}={x}_{i}-\theta $，按照勒让德提出的方法，累计误差为&#xA;&lt;/p&gt;&#xA;$$&#xA;E(\theta )=\sum\limits_{i=1}^{n}{e_{i}^{2}}=\sum\limits_{i=1}^{n}{{{({{x}_{i}}-\theta )}^{2}}}\tag{2-18}&#xA;$$&lt;p&gt;&#xA;可以看出勒让德给出的方法其实就是最小二乘法（Least Square）。通过对$E(\theta)$求导后令其为$0$，求解得到的结果正是算术平均$\bar{x}=1/n\sum x_{i}$。也就是说，取所有观测结果的平均值来近似地代替真实值最终所产生的误差是最小的。由于算术平均是一个历经考验的方法，而以上的推理从另一个角度也说明了最小二乘法的优良性。这使当时的人们对于最小二乘法有了更强的信心。&lt;/p&gt;&#xA;&lt;p&gt;从这里可以看出，这种做法的逻辑是，首先认为算术平均这种做法好但不知道为什么，然后有人提出了一种衡量误差的方法（最小二乘法），接着对误差最小化求解后发现其解正是算术平均，所以肯定了最小二乘的有用性，但事实上却没有说清楚算术平均为什么好，反而用算术平均的结果来肯定了最小二乘法的作用。&lt;/p&gt;&#xA;&lt;p&gt;与此同时，伽利略在他著名的《关于两个主要世界系统的对话》中也对误差的分布做过一些定性的描述。这主要包括①误差是对称分布的；②大的误差出现频率低，小的误差出现频率高而这也很符合人们的认知常识。用数学的语言描述，也就是说误差分布函数$f(x)$关于$x=0$对称分布，概率密度函数$f(x)$随$x$增大而减小，如图2-15所示。于是许多天文学家和数学家开始了寻找误差分布曲线的尝试，但最终都没能给出有用的结果。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/ml/p2-15.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 2-15 理想状态下误差分布图&lt;/center&gt;&#xA;&lt;h2 id=&#34;262-正态分布&#34;&gt;2.6.2 正态分布&lt;a class=&#34;anchor&#34; href=&#34;#262-%e6%ad%a3%e6%80%81%e5%88%86%e5%b8%83&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;1801年1月，天文学家朱塞普·皮亚齐发现了一颗从未见过的光度为8等的星在移动，这颗现在被称作谷神星（Ceres）的小行星在夜空中出现了6个星期，扫过八度角后就在太阳的光芒下没了踪影而无法观测。由于留下的观测数据有限难以计算出它的轨迹，所以天文学家们也因此无法确定这颗新星是彗星还是行星。不过这个问题很快成了学术界关注的焦点。高斯当时已经是很有名望的年轻数学家了，这个问题引起了他的兴趣。高斯以其卓越的数学才能创立了一种崭新的行星轨道的计算方法，一个小时之内就计算出了谷神星的轨道，并预言了它在夜空中出现的时间和位置。1801年12月31日夜，德国天文爱好者奥伯斯，在高斯预言的时间里，用望远镜对准了这片天空，果然不出所料，谷神星出现了。&lt;/p&gt;&#xA;&lt;p&gt;高斯为此名声大震，但是高斯当时拒绝透露计算轨道的方法，原因可能是高斯认为自己的方法理论基础还不够成熟。直到1809年高斯系统地完善了相关的数学理论后，才将他的方法公布于众，而其中使用的数据分析方法，就是以正态误差分布为基础的最小二乘法。那么高斯是如何推导出误差分布为正态分布的呢？&lt;/p&gt;&#xA;&lt;p&gt;设真实值为$\theta$，${{x}_{1}},{{x}_{2}},...,{{x}_{n}}$分别为$n$次独立观测后的测量值 [2]，并且每次测量的误差$e_i$的密度函数为$f(x)$，并直接把$n$个误差同时出现的概率记为&#xA;&lt;/p&gt;&#xA;$$&#xA;L(\theta )=L(\theta ;x_{1},x_{2},...,x_{n})=f(e_{1})f(e_{2})\cdots f(e_{n})\tag{2-19}&#xA;$$&lt;p&gt;&#xA;接着取使$L(\theta)$达到最大值时的$\hat{\theta}$作为$\theta$的估计值，即使式(2-20)成立时的$\hat{\theta}$值。&lt;/p&gt;&#xA;$$&#xA;L(\hat{\theta })=\arg \underset{\theta }{\mathop{\max }}\,L(\theta )\tag{2-20}&#xA;$$&lt;p&gt;&#xA;现在我们把$L(\theta)$称为样本的似然函数，而得到的估计值$\hat{\theta}$称为$\theta$的极大似然估计（Maximum Likelihood Estimate，MLE）。在这里高斯首次给出了极大似然的思想，这个思想后来被统计学家费希尔系统地发展成为参数估计中的极大似然估计理论。同时，所谓极大似然估计是指在已知样本结果的情况下，推断出最有可能使该结果出现的参数的过程。也就是说极大似然估计一个过程，它用来估计出某个模型的参数，而这些参数能使已知样本的结果最可能发生。&lt;/p&gt;&#xA;&lt;p&gt;接下来高斯把整个问题的思考模式倒了过来，既然千百年来大家都认为算术平均是一个好的估计，那就认为极大似然估计导出的就应该是算术平均，所以高斯猜测误差分布导出的极大似然估计就是算术平均值。然后高斯就开始去寻找满足这样条件的误差密度函数$f(x)$，即寻找这样的概率密度函数$f(x)$，使极大似然估计的结果正好是算术平均$\hat{\theta}=\overline{x}$。最后高斯应用数学技巧求解得到了这个函数$f(x)$，并证明在所有的概率密度函数中，唯一满足这个性质的就是&#xA;&lt;/p&gt;&#xA;$$&#xA;f(x)=\frac{1}{\sqrt{2\pi }\sigma }{{e}^{-\frac{{{x}^{2}}}{2{{\sigma }^{2}}}}}\tag{2-21}&#xA;$$&lt;p&gt;&#xA;其中$\sigma&gt;0$为常数，而这也就是正态分布。&lt;/p&gt;&#xA;&lt;p&gt;进一步，高斯基于这个误差密度函数对最小二乘法给出了一个漂亮的解释。对于最小二乘公式中涉及的每个误差$e_i$，由式(2-19)可知其对应的似然估计为&#xA;&lt;/p&gt;&#xA;$$&#xA;L(\theta )=\prod\limits_{i=1}^{n}{f}({{e}_{i}})=\frac{1}{{{(\sqrt{2\pi }\sigma )}^{n}}}\exp \left\{ -\frac{1}{2{{\sigma }^{2}}}\sum\limits_{i=1}^{n}{e_{i}^{2}} \right\}\tag{2-22}&#xA;$$&lt;p&gt;&#xA;而要使$L(\theta)$ 最大化，则必须使$\sum\nolimits_{i=1}^{n}{e_{i}^{2}}$取值最小，显然这正好就是最小二乘法的要求。可以看出，高斯这种做法的初始动机仍旧是以算术平均作为一种“公理”，然后以此为基础做出假设并找到一种符合人们常识的误差密度函数，即正态分布。最后通过极大似然估计来印证了最小二乘法。&lt;/p&gt;</description>
			</item>
			<item>
				<title>2.7 目标函数推导</title>
				<link>https://mlwithme.github.io/ml/chapter02/803bee4f70be4dca/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter02/803bee4f70be4dca/</guid>
				<description>&lt;h1 id=&#34;27-目标函数推导&#34;&gt;2.7 目标函数推导&lt;a class=&#34;anchor&#34; href=&#34;#27-%e7%9b%ae%e6%a0%87%e5%87%bd%e6%95%b0%e6%8e%a8%e5%af%bc&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;经过前面几节内容的介绍，我们知道了什么是线性回归、怎样转换求解问题、如何通过sklearn进行建模求解及梯度下降法的原理与推导。同时，在2.6节中还通过一个故事来讲解了最小二乘法的来历，以及误差服从高斯分布的事实。下面，我们就来完成线性回归中的最后两个任务，线性回归的推导及Python代码的实现。&lt;/p&gt;&#xA;&lt;h2 id=&#34;271-目标函数&#34;&gt;2.7.1 目标函数&lt;a class=&#34;anchor&#34; href=&#34;#271-%e7%9b%ae%e6%a0%87%e5%87%bd%e6%95%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;根据前面的介绍，现在我们对线性回归的目标函数做如下定义： 设样本为$(x^{(i)},y^{(i)})$，对样本的观测（预测）值记为${{\hat{y}}^{(i)}}={{W}^{T}}{{x}^{(i)}}+b$，则有&#xA;&lt;/p&gt;&#xA;$$&#xA;{{y}^{(i)}}={{\hat{y}}^{(i)}}+{{e}^{(i)}}\tag{2-23}&#xA;$$&lt;p&gt;&#xA;其中$e^{(i)}$表示第$i$个样本预测值与真实值之间的误差，$W$和$x^{(i)}$均为一个列向量，$b$为一个标量，同时由于误差$e^{(i)}$独立同分布于均值为0的高斯分布[3]，于是有&#xA;&lt;/p&gt;&#xA;$$&#xA;f({{e}^{(i)}})=\frac{1}{\sqrt{2\pi }\sigma }\exp \left( -\frac{{{({{e}^{(i)}}-0)}^{2}}}{2{{\sigma }^{2}}} \right)\tag{2-24}&#xA;$$&lt;p&gt;&#xA;接着将式(2-23)代入式(2-24)有&#xA;&lt;/p&gt;&#xA;$$&#xA;f({{e}^{(i)}})=\frac{1}{\sqrt{2\pi }\sigma }\exp \left( -\frac{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}{2{{\sigma }^{2}}} \right)\tag{2-25}&#xA;$$&lt;p&gt;&#xA;此时需要注意式(2-25)的右边部分（从右往左看），站在$y^{(i)}$的角度看显然是随机变量$y^{(i)}$服从于以$\hat{y}^{(i)}$为均值的正态分布[4] 。又由于此时的密度函数与参数$W$、$b$和$x^{(i)}$有关（随机变量$y^{(i)}$是$x^{(i)}$、$W$和$b$下的条件分布），于是有&#xA;&lt;/p&gt;&#xA;$$&#xA;p({{y}^{(i)}}|{{x}^{(i)}};W,b)=\frac{1}{\sqrt{2\pi }\sigma }\exp \left( -\frac{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}{2{{\sigma }^{2}}} \right)\tag{2-26}&#xA;$$&lt;p&gt;&#xA;到目前为止，也就是说此时真实值$y^{(i)}$服从于均值为$\hat{y}^{(i)}$，方差为$\sigma^2$的正态分布。同时，由于$y^{(i)}$是依赖于参数$W$和$b$的变量，那么什么样的一组参数$W$和$b$能够使已知的真实值最容易发生呢？此时就需要用到极大似然估计进行参数估计&#xA;&lt;/p&gt;&#xA;$$&#xA;L(\theta )=\prod\limits_{i=1}^{m}{p}({{y}^{(i)}}|{{x}^{(i)}};W,b)=\prod\limits_{i=1}^{m}{\frac{1}{\sqrt{2\pi }\sigma }}\exp \left( -\frac{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}{2{{\sigma }^{2}}} \right)\tag{2-27}&#xA;$$&lt;p&gt;&#xA;为了便于求解，可以在等式(2-27)的两边同时取自然对数&#xA;&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp; \log L(W,b)=\log \left\{\prod\limits_{i=1}^{m}{\frac{1}{\sqrt{2\pi }\sigma }}\exp \left( -\frac{{{(y^{(i)}-{\hat{y}}^{(i)})}^{2}}}{2{{\sigma }^{2}}} \right) \right\} \\[2ex]&#xA; &amp; =\sum\limits_{i=1}^{m}{\log }\left\{ \frac{1}{\sqrt{2\pi }\sigma }\exp \left( -\frac{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}{2{{\sigma }^{2}}} \right) \right\} \\[2ex]&#xA; &amp; =\sum\limits_{i=1}^{m}{\left\{ \log \frac{1}{\sqrt{2\pi }\sigma }-\frac{{{({{y}^{(i)}}-{{{\hat{y}}}^{(i)}})}^{2}}}{2{{\sigma }^{2}}} \right\}} \\[2ex]&#xA; &amp; =m\cdot \log \frac{1}{\sqrt{2\pi }\sigma }-\frac{1}{{{\sigma }^{2}}}\frac{1}{2}\sum\limits_{i=1}^{m}{{{\left( {{y}^{(i)}}-{{{\hat{y}}}^{(i)}} \right)}^{2}}}  &#xA;\end{aligned}\tag{2-28}&#xA;$$&lt;p&gt;&#xA;由于$\max L(W,b)$ 等价于$\max\log L(W,b)$，所以&#xA;&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
