未验证 提交 01bd1a76 编写于 作者: P PeterHo 提交者: GitHub

Merge pull request #112 from PeterHo/dev

正态方程->正规方程
......@@ -57,11 +57,11 @@
公式中符号的含义大多数都在第二章(详见“符号”)进行了说明,不同的是:为了突出模型的参数向量 ![\theta](../images/tex-2554a2bb846cffd697389e5dc8912759.gif),使用 ![h_{\theta}](../images/tex-b7ae93cd51ba1d38fe4ebac15eab3aa1.gif) 来代替 ![h](../images/tex-2510c39011c5be704182423e3a695e91.gif)。以后的使用中为了公式的简洁,使用 ![MSE(\theta)](../images/tex-e6e3116680e8cef8739f29e51e9ae4dc.gif) 来代替 ![MSE(\mathbf{X},h _{\theta})](../images/tex-8fdec996997ab7fb44bf97399fda93c7.gif)
### 正态方程
### 正规方程(The Normal Equation)
为了找到最小化损失函数的 ![\theta](../images/tex-2554a2bb846cffd697389e5dc8912759.gif) 值,可以采用公式解,换句话说,就是可以通过解正方程直接得到最后的结果。
为了找到最小化损失函数的 ![\theta](../images/tex-2554a2bb846cffd697389e5dc8912759.gif) 值,可以采用公式解,换句话说,就是可以通过解正方程直接得到最后的结果。
公式 4-4:正方程
公式 4-4:正方程
![\hat{\theta} = ({\mathbf{X}}^T\cdot\mathbf{X})^{-1}\cdot{\mathbf{X}}^T\cdot\mathbf{y}](../images/tex-43bfb04cdbbd85ad21489e8e2dc853ed.gif)
......@@ -80,7 +80,7 @@ y = 4 + 3 * X + np.random.randn(100, 1)
图 4-1:随机线性数据集
现在让我们使用正方程来计算 ![\hat{\theta}](../images/tex-0678caa04da34220a4e8dc041488b618.gif),我们将使用 Numpy 的线性代数模块(`np.linalg`)中的`inv()`函数来计算矩阵的逆,以及`dot()`方法来计算矩阵的乘法。
现在让我们使用正方程来计算 ![\hat{\theta}](../images/tex-0678caa04da34220a4e8dc041488b618.gif),我们将使用 Numpy 的线性代数模块(`np.linalg`)中的`inv()`函数来计算矩阵的逆,以及`dot()`方法来计算矩阵的乘法。
```python
X_b = np.c_[np.ones((100, 1)), X]
......@@ -133,13 +133,13 @@ array([[4.21509616],[9.75532293]])
### 计算复杂度
方程需要计算矩阵 ![{\mathbf{X}}^T\cdot\mathbf{X}](../images/tex-e5949d4f83eb4e13761f2b76ab62386e.gif) 的逆,它是一个 ![n * n](../images/tex-6679fc33e499a90a99b97201f4d00ed5.gif) 的矩阵(![n](../images/tex-7b8b965ad4bca0e41ab51de7b31363a1.gif) 是特征的个数)。这样一个矩阵求逆的运算复杂度大约在 ![O(n^{2.4})](../images/tex-31ba2ac7dbc438cef695358d6e49deb3.gif) 到 ![O(n^3)](../images/tex-4a7d22b39e93fbbcbe107e7a19e8bd34.gif) 之间,具体值取决于计算方式。换句话说,如果你将你的特征个数翻倍的话,其计算时间大概会变为原来的 5.3(![2^{2.4}](../images/tex-61f8abcb13be8d0a51b2868de491d3a8.gif))到 8(![2^3](../images/tex-5b9a77af89d04a685b4f649da485aed3.gif))倍。
方程需要计算矩阵 ![{\mathbf{X}}^T\cdot\mathbf{X}](../images/tex-e5949d4f83eb4e13761f2b76ab62386e.gif) 的逆,它是一个 ![n * n](../images/tex-6679fc33e499a90a99b97201f4d00ed5.gif) 的矩阵(![n](../images/tex-7b8b965ad4bca0e41ab51de7b31363a1.gif) 是特征的个数)。这样一个矩阵求逆的运算复杂度大约在 ![O(n^{2.4})](../images/tex-31ba2ac7dbc438cef695358d6e49deb3.gif) 到 ![O(n^3)](../images/tex-4a7d22b39e93fbbcbe107e7a19e8bd34.gif) 之间,具体值取决于计算方式。换句话说,如果你将你的特征个数翻倍的话,其计算时间大概会变为原来的 5.3(![2^{2.4}](../images/tex-61f8abcb13be8d0a51b2868de491d3a8.gif))到 8(![2^3](../images/tex-5b9a77af89d04a685b4f649da485aed3.gif))倍。
> 提示
>
> 当特征的个数较大的时候(例如:特征数量为 100000),正方程求解将会非常慢。
> 当特征的个数较大的时候(例如:特征数量为 100000),正方程求解将会非常慢。
有利的一面是,这个方程在训练集上对于每一个实例来说是线性的,其复杂度为 ![O(m)](../images/tex-0e2ae329177722b1818828e92b441032.gif),因此只要有能放得下它的内存空间,它就可以对大规模数据进行训练。同时,一旦你得到了线性回归模型(通过解正方程或者其他的算法),进行预测是非常快的。因为模型中计算复杂度对于要进行预测的实例数量和特征个数都是线性的。 换句话说,当实例个数变为原来的两倍多的时候(或特征个数变为原来的两倍多),预测时间也仅仅是原来的两倍多。
有利的一面是,这个方程在训练集上对于每一个实例来说是线性的,其复杂度为 ![O(m)](../images/tex-0e2ae329177722b1818828e92b441032.gif),因此只要有能放得下它的内存空间,它就可以对大规模数据进行训练。同时,一旦你得到了线性回归模型(通过解正方程或者其他的算法),进行预测是非常快的。因为模型中计算复杂度对于要进行预测的实例数量和特征个数都是线性的。 换句话说,当实例个数变为原来的两倍多的时候(或特征个数变为原来的两倍多),预测时间也仅仅是原来的两倍多。
接下来,我们将介绍另一种方法去训练模型。这种方法适合在特征个数非常多,训练实例非常多,内存无法满足要求的时候使用。
......@@ -205,7 +205,7 @@ array([[4.21509616],[9.75532293]])
> 提示
>
> 在这个方程中每一步计算时都包含了整个训练集 ![\mathbf{X}](../images/tex-ca340abf4b48dc6d816137fbadf58b53.gif),这也是为什么这个算法称为批量梯度下降:每一次训练过程都使用所有的的训练数据。因此,在大数据集上,其会变得相当的慢(但是我们接下来将会介绍更快的梯度下降算法)。然而,梯度下降的运算规模和特征的数量成正比。训练一个数千数量特征的线性回归模型使用*梯度下降要比使用正方程快的多。
> 在这个方程中每一步计算时都包含了整个训练集 ![\mathbf{X}](../images/tex-ca340abf4b48dc6d816137fbadf58b53.gif),这也是为什么这个算法称为批量梯度下降:每一次训练过程都使用所有的的训练数据。因此,在大数据集上,其会变得相当的慢(但是我们接下来将会介绍更快的梯度下降算法)。然而,梯度下降的运算规模和特征的数量成正比。训练一个数千数量特征的线性回归模型使用*梯度下降要比使用正方程快的多。
......@@ -236,7 +236,7 @@ for iteration in range(n_iterations):
array([[4.21509616],[2.77011339]])
```
看!正方程的表现非常好。完美地求出了梯度下降的参数。但是当你换一个学习率会发生什么?图 4-8 展示了使用了三个不同的学习率进行梯度下降的前 10 步运算(虚线代表起始位置)。
看!正方程的表现非常好。完美地求出了梯度下降的参数。但是当你换一个学习率会发生什么?图 4-8 展示了使用了三个不同的学习率进行梯度下降的前 10 步运算(虚线代表起始位置)。
![](../images/chapter_4/图4-8.PNG)
......@@ -310,7 +310,7 @@ sgd_reg = SGDRegressor(n_iter=50, penalty=None, eta0=0.1)
sgd_reg.fit(X,y.ravel())
```
你可以再一次发现,这个结果非常的接近正方程的解:
你可以再一次发现,这个结果非常的接近正方程的解:
```
>>> sgd_reg.intercept_, sgd_reg.coef_
......@@ -672,7 +672,7 @@ Logistic 函数(也称为 logit),用 ![\sigma()](../images/tex-8a5c57afba7
![J(\theta)=-\frac{1}{m}\sum\limits_{i=1}^m\left[y^{(i)}log\left(\hat{p}^{(i)}\right)+\left(1-y^{(i)}\right)log\left(1-\hat{p}^{(i)}\right)\right]](../images/tex-b6a0de3f265cdeedc2ac1d0687fef2ea.gif)
但是这个损失函数对于求解最小化损失函数的 ![\theta](../images/tex-2554a2bb846cffd697389e5dc8912759.gif) 是没有公式解的(没有等价的正方程)。 但好消息是,这个损失函数是凸的,所以梯度下降(或任何其他优化算法)一定能够找到全局最小值(如果学习速率不是太大,并且你等待足够长的时间)。公式 4-18 给出了损失函数关于第 ![j](../images/tex-363b122c528f54df4a0446b6bab05515.gif) 个模型参数 ![\theta_j](../images/tex-cb0e17d96e58d55d1eb06dc1b14b7a7b.gif) 的偏导数。
但是这个损失函数对于求解最小化损失函数的 ![\theta](../images/tex-2554a2bb846cffd697389e5dc8912759.gif) 是没有公式解的(没有等价的正方程)。 但好消息是,这个损失函数是凸的,所以梯度下降(或任何其他优化算法)一定能够找到全局最小值(如果学习速率不是太大,并且你等待足够长的时间)。公式 4-18 给出了损失函数关于第 ![j](../images/tex-363b122c528f54df4a0446b6bab05515.gif) 个模型参数 ![\theta_j](../images/tex-cb0e17d96e58d55d1eb06dc1b14b7a7b.gif) 的偏导数。
公式 4-18:逻辑回归损失函数的偏导数
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册