From 37c79a48f053c07a9954afcef07ff22ef05295bf Mon Sep 17 00:00:00 2001 From: Peter Ho Date: Wed, 2 Jan 2019 12:44:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E6=80=81=E6=96=B9=E7=A8=8B->=E6=AD=A3?= =?UTF-8?q?=E8=A7=84=E6=96=B9=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\347\273\203\346\250\241\345\236\213.md" | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git "a/docs/4.\350\256\255\347\273\203\346\250\241\345\236\213.md" "b/docs/4.\350\256\255\347\273\203\346\250\241\345\236\213.md" index 2970d2e..90e8906 100644 --- "a/docs/4.\350\256\255\347\273\203\346\250\241\345\236\213.md" +++ "b/docs/4.\350\256\255\347\273\203\346\250\241\345\236\213.md" @@ -15,7 +15,7 @@ 最后,我们将介绍两个常用于分类的模型:Logistic回归和Softmax回归 > 提示 -> +> > 在本章中包含许多数学公式,以及一些线性代数和微积分基本概念。为了理解这些公式,你需要知道什么是向量,什么是矩阵,以及它们直接是如何转化的,以及什么是点积,什么是矩阵的逆,什么是偏导数。如果你对这些不是很熟悉的话,你可以阅读本书提供的 Jupyter 在线笔记,它包括了线性代数和微积分的入门指导。对于那些不喜欢数学的人,你也应该快速简单的浏览这些公式。希望它足以帮助你理解大多数的概念。 ## 线性回归 @@ -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) @@ -71,7 +71,7 @@ 让我们生成一些近似线性的数据(如图 4-1)来测试一下这个方程。 ```python -import numpy as np +import numpy as np X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) ``` @@ -80,16 +80,16 @@ 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] +```python +X_b = np.c_[np.ones((100, 1)), X] theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) ``` 我们生产数据的函数实际上是 ![y = 4 + 3x_0 + 高斯噪声](../images/tex-751d6173162c5bb7b6294ca57e03d5b1.gif)。让我们看一下最后的计算结果。 -```python +```python >>> theta_best array([[4.21509616],[2.77011339]]) ``` @@ -98,7 +98,7 @@ array([[4.21509616],[2.77011339]]) 现在我们能够使用 ![\hat{\theta}](../images/tex-0678caa04da34220a4e8dc041488b618.gif) 来进行预测: -```python +```python >>> X_new = np.array([[0],[2]]) >>> X_new_b = np.c_[np.ones((2, 1)), X_new] >>> y_predict = X_new_b.dot(theta_best) @@ -108,7 +108,7 @@ array([[4.21509616],[9.75532293]]) 画出这个模型的图像,如图 4-2 -```python +```python plt.plot(X_new,y_predict,"r-") plt.plot(X,y,"b.") plt.axis([0,2,0,15]) @@ -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),因此只要有能放得下它的内存空间,它就可以对大规模数据进行训练。同时,一旦你得到了线性回归模型(通过解正规方程或者其他的算法),进行预测是非常快的。因为模型中计算复杂度对于要进行预测的实例数量和特征个数都是线性的。 换句话说,当实例个数变为原来的两倍多的时候(或特征个数变为原来的两倍多),预测时间也仅仅是原来的两倍多。 接下来,我们将介绍另一种方法去训练模型。这种方法适合在特征个数非常多,训练实例非常多,内存无法满足要求的时候使用。 @@ -184,7 +184,7 @@ array([[4.21509616],[9.75532293]]) 正如你看到的,左面的梯度下降可以直接快速地到达最小值,然而在右面的梯度下降第一次前进的方向几乎和全局最小值的方向垂直,并且最后到达一个几乎平坦的山谷,在平坦的山谷走了很长时间。它最终会达到最小值,但它需要很长时间。 > 提示 -> +> > 当我们使用梯度下降的时候,应该确保所有的特征有着相近的尺度范围(例如:使用 Scikit Learn 的 `StandardScaler`类),否则它将需要很长的时间才能够收敛。 这幅图也表明了一个事实:训练模型意味着找到一组模型参数,这组参数可以在训练集上使得损失函数最小。这是对于模型参数空间的搜索,模型的参数越多,参数空间的维度越多,找到合适的参数越困难。例如在300维的空间找到一枚针要比在三维空间里找到一枚针复杂的多。幸运的是线性回归模型的损失函数是凸函数,这个最优参数一定在碗的底部。 @@ -204,8 +204,8 @@ array([[4.21509616],[9.75532293]]) ![\nabla_{\theta}MSE(\theta)= \left(\begin{matrix} \frac{\partial }{\partial \theta_0}MSE(\theta)\\ \frac{\partial }{\partial \theta_1}MSE(\theta)\\ \vdots \\ \frac{\partial }{\partial \theta_n}MSE(\theta)\\ \end{matrix}\right)=\frac{2}{m}{\mathbf{X}}^T\cdot{(\mathbf{X}\cdot\theta-y)}](../images/tex-a007d1162d9c4957e8336b4b10d5fda3.gif) > 提示 -> -> 在这个方程中每一步计算时都包含了整个训练集 ![\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) @@ -249,7 +249,7 @@ array([[4.21509616],[2.77011339]]) 你可能想知道如何选取迭代的次数。如果它太小了,当算法停止的时候,你依然没有找到最优解。如果它太大了,算法会非常的耗时同时后来的迭代参数也不会发生改变。一个简单的解决方法是:设置一个非常大的迭代次数,但是当梯度向量变得非常小的时候,结束迭代。非常小指的是:梯度向量小于一个值 ![\varepsilon](../images/tex-f8b1c5a729a09649c275fca88976d8dd.gif)(称为容差)。这时候可以认为梯度下降几乎已经达到了最小值。 > 收敛速率: -> +> > 当损失函数是凸函数,同时它的斜率不能突变(就像均方差损失函数那样),那么它的批量梯度下降算法固定学习率之后,它的收敛速率是 ![O(\frac{1}{iterations})](../images/tex-2381690b73b9410210542c6128e83b96.gif)。换句话说,如果你将容差 ![\varepsilon](../images/tex-f8b1c5a729a09649c275fca88976d8dd.gif) 缩小 10 倍后(这样可以得到一个更精确的结果),这个算法的迭代次数大约会变成原来的 10 倍。 ### 随机梯度下降 @@ -269,7 +269,7 @@ array([[4.21509616],[2.77011339]]) 下面的代码使用一个简单的`learning schedule`来实现随机梯度下降: ```python -n_epochs = 50 +n_epochs = 50 t0, t1 = 5, 50 #learning_schedule的超参数 def learning_schedule(t): @@ -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_ @@ -334,7 +334,7 @@ sgd_reg.fit(X,y.ravel()) ![](../images/chapter_4/表4-1.PNG) > 提示 -> +> > 上述算法在完成训练后,得到的参数基本没什么不同,它们会得到非常相似的模型,最后会以一样的方式去进行预测。 ## 多项式回归 @@ -383,7 +383,7 @@ array([-0.75275929, 0.56664654]) 请注意,当存在多个特征时,多项式回归能够找出特征之间的关系(这是普通线性回归模型无法做到的)。 这是因为`LinearRegression`会自动添加当前阶数下特征的所有组合。例如,如果有两个特征 ![a,b](../images/tex-b345e1dc09f20fdefdea469f09167892.gif),使用 3 阶(`degree=3`)的`LinearRegression`时,不仅有 ![a^2,a^3,b^2](../images/tex-e2319eb828681ba30bf7e05e07d7f5fa.gif) 以及 ![b^3](../images/tex-2d275b176c3436e8981c70371f474c9c.gif),同时也会有它们的其他组合项 ![ab,a^2b,ab^2](../images/tex-e373951eded9d8d1fddb4db810c5069f.gif)。 > 提示 -> +> > `PolynomialFeatures(degree=d)`把一个包含 ![n](../images/tex-7b8b965ad4bca0e41ab51de7b31363a1.gif) 个特征的数组转换为一个包含 ![\frac{(n+d)!}{d!n!}](../images/tex-bbbca49c7d6afb0938a5c37bb5b5fbcf.gif) 特征的数组,![n!](../images/tex-388f554901ba5d77339eec8b26beebea.gif) 表示 ![n](../images/tex-7b8b965ad4bca0e41ab51de7b31363a1.gif) 的阶乘,等于 ![1 * 2 * 3 \cdots * n](../images/tex-62b4db05802cc87cf8ed00845ce751af.gif)。小心大量特征的组合爆炸! ## 学习曲线 @@ -433,7 +433,7 @@ plot_learning_curves(lin_reg, X, y) 上面的曲线表现了一个典型的欠拟合模型,两条曲线都到达高原地带并趋于稳定,并且最后两条曲线非常接近,同时误差值非常大。 > 提示 -> +> > 如果你的模型在训练集上是欠拟合的,添加更多的样本是没用的。你需要使用一个更复杂的模型或者找到更好的特征。 现在让我们看一个在相同数据上10阶多项式模型拟合的学习曲线(图 4-16): @@ -459,13 +459,13 @@ plot_learning_curves(polynomial_regression, X, y) 图4-16:多项式模型的学习曲线 > 提示 -> +> > 改善模型过拟合的一种方法是提供更多的训练数据,直到训练误差和验证误差相等。 > 偏差和方差的权衡 -> +> > 在统计和机器学习领域有个重要的理论:一个模型的泛化误差由三个不同误差的和决定: -> +> > + 偏差:泛化误差的这部分误差是由于错误的假设决定的。例如实际是一个二次模型,你却假设了一个线性模型。一个高偏差的模型最容易出现欠拟合。 > + 方差:这部分误差是由于模型对训练数据的微小变化较为敏感,一个多自由度的模型更容易有高的方差(例如一个高阶多项式模型),因此会导致模型过拟合。 > + 不可约误差:这部分误差是由于数据本身的噪声决定的。降低这部分误差的唯一方法就是进行数据清洗(例如:修复数据源,修复坏的传感器,识别和剔除异常值)。 @@ -482,7 +482,7 @@ plot_learning_curves(polynomial_regression, X, y) 岭回归(也称为 Tikhonov 正则化)是线性回归的正则化版:在损失函数上直接加上一个正则项 ![\alpha\sum_{i=1}^n\theta_i^2](../images/tex-a21c05b05e3a61cef53414437bae86cf.gif)。这使得学习算法不仅能够拟合数据,而且能够使模型的参数权重尽量的小。注意到这个正则项只有在训练过程中才会被加到损失函数。当得到完成训练的模型后,我们应该使用没有正则化的测量方法去评价模型的表现。 > 提示 -> +> > 一般情况下,训练过程使用的损失函数和测试过程使用的评价函数是不一样的。除了正则化,还有一个不同:训练时的损失函数应该在优化过程中易于求导,而在测试过程中,评价函数更应该接近最后的客观表现。一个好的例子:在分类训练中我们使用对数损失(马上我们会讨论它)作为损失函数,但是我们却使用精确率/召回率来作为它的评价函数。 超参数 ![\alpha](../images/tex-7b7f9dbfea05c83784f8b85149852f08.gif) 决定了你想正则化这个模型的强度。如果 ![\alpha=0](../images/tex-2aa447f3144cccc2865e6268c583f0f3.gif) 那此时的岭回归便变为了线性回归。如果 ![\alpha](../images/tex-7b7f9dbfea05c83784f8b85149852f08.gif) 非常的大,所有的权重最后都接近于零,最后结果将是一条穿过数据平均值的水平直线。公式 4-8 是岭回归的损失函数: @@ -494,7 +494,7 @@ plot_learning_curves(polynomial_regression, X, y) 值得注意的是偏差 ![\theta_0](../images/tex-dbc9011a370bca098d4752346ba71d5c.gif) 是没有被正则化的(累加运算的开始是 ![i=1](../images/tex-9a041ce63f6c28100344427c6d71837b.gif) 而不是 ![i=0](../images/tex-8a8f1e8e0a73d8e44a17653f830f7947.gif))。如我定义 ![\mathbf{w}](../images/tex-17227d892ae518eab12eb3f0e596f1a0.gif) 作为特征的权重向量(![\theta_1](../images/tex-7672d625e9a2492987c50d3b87c04349.gif) 到 ![\theta_n](../images/tex-a3026e320c132de94f7c8ebb952bda60.gif)),那么正则项可以简写成 ![\frac{1}{2}{({\parallel \mathbf{w}\parallel_2})}^2](../images/tex-e236013a1d5cfb056aa71c770d62e4ed.gif),其中 ![\parallel \cdot \parallel_2 ](../images/tex-3fd16a45c4fce610740da450e9f5a283.gif) 表示权重向量的 ![\ell_2](../images/tex-f2d02eaf32cb7a351989198531c0d12a.gif) 范数。对于梯度下降来说仅仅在均方差梯度向量(公式 4-6)加上一项 ![\alpha\mathbf{w}](../images/tex-b0bb6cfa6e49912f2da3f807dd931480.gif)。 > 提示 -> +> > 在使用岭回归前,对数据进行放缩(可以使用`StandardScaler`)是非常重要的,算法对于输入特征的数值尺度(scale)非常敏感。大多数的正则化模型都是这样的。 图 4-17 展示了在相同线性数据上使用不同 ![\alpha](../images/tex-7b7f9dbfea05c83784f8b85149852f08.gif) 值的岭回归模型最后的表现。左图中,使用简单的岭回归模型,最后得到了线性的预测。右图中的数据首先使用 10 阶的`PolynomialFearures`进行扩展,然后使用`StandardScaler`进行缩放,最后将岭模型应用在处理过后的特征上。这就是带有岭正则项的多项式回归。注意当![\alpha](../images/tex-7b7f9dbfea05c83784f8b85149852f08.gif)增大的时候,导致预测曲线变得扁平(即少了极端值,多了一般值),这样减少了模型的方差,却增加了模型的偏差。 @@ -553,12 +553,12 @@ Lasso 回归的一个重要特征是它倾向于完全消除最不重要的特 图 4-19:Ridge 回归和 Lasso 回归对比 > 提示 -> +> > 在 Lasso 损失函数中,批量梯度下降的路径趋向与在低谷有一个反弹。这是因为在 ![\theta_2=0](../images/tex-421570724060381e95985593de9d77c9.gif) 时斜率会有一个突变。为了最后真正收敛到全局最小值,你需要逐渐的降低学习率。 Lasso 损失函数在 ![\theta_i=0(i=1,2,\cdots,n) ](../images/tex-e4df33b5fe9a1d3789867afe58c9564a.gif) 处无法进行微分运算,但是梯度下降如果你使用子梯度向量 ![\mathbf{g}](../images/tex-d324bced968eda52e62e58cb90c82c2d.gif) 后它可以在任何 ![\theta_i=0](../images/tex-a64a4a0de329e98ac7b25d532cd74a4d.gif) 的情况下进行计算。公式 4-11 是在 Lasso 损失函数上进行梯度下降的子梯度向量公式。 -公式 4-11:Lasso 回归子梯度向量 +公式 4-11:Lasso 回归子梯度向量 ![g(\theta,J)=\nabla_{\theta}MSE(\theta)+ \alpha{\left(\begin{matrix} sign(\theta_1)\\ sign(\theta_2)\\ \vdots \\ sign(\theta_n)\\ \end{matrix}\right)}\ where\ sign(\theta_i)= \begin{cases} -1, &\theta_i<0 \\ 0, &\theta_i=0 \\ +1,&\theta_i>0 \\ \end{cases}](../images/tex-93eea6b5c197bbc8d7be8b4c14e9f8f3.gif) @@ -601,7 +601,7 @@ array([ 1.54333232]) 图 4-20:早期停止法 > 提示 -> +> > 随机梯度和小批量梯度下降不是平滑曲线,你可能很难知道它是否达到最小值。 一种解决方案是,只有在验证误差高于最小值一段时间后(你确信该模型不会变得更好了),才停止,之后将模型参数回滚到验证误差最小值。 下面是一个早期停止法的基础应用: @@ -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:逻辑回归损失函数的偏导数 @@ -728,7 +728,7 @@ Virginica 花的花瓣宽度(用三角形表示)在 1.4 厘米到 2.5 厘米 array([1, 0]) ``` -图 4-24 表示相同的数据集,但是这次使用了两个特征进行判断:花瓣的宽度和长度。 一旦训练完毕,Logistic 回归分类器就可以根据这两个特征来估计一朵花是 Virginica 的可能性。 虚线表示这时两类情况出现的概率都等于 50%:这是模型的决策边界。 请注意,它是一个线性边界。每条平行线都代表一个分类标准下的两两个不同类的概率,从 15%(左下角)到 90%(右上角)。越过右上角分界线的点都有超过 90% 的概率是 Virginica 花。 +图 4-24 表示相同的数据集,但是这次使用了两个特征进行判断:花瓣的宽度和长度。 一旦训练完毕,Logistic 回归分类器就可以根据这两个特征来估计一朵花是 Virginica 的可能性。 虚线表示这时两类情况出现的概率都等于 50%:这是模型的决策边界。 请注意,它是一个线性边界。每条平行线都代表一个分类标准下的两两个不同类的概率,从 15%(左下角)到 90%(右上角)。越过右上角分界线的点都有超过 90% 的概率是 Virginica 花。 ![](../images/chapter_4/图4-24.PNG) @@ -737,12 +737,12 @@ array([1, 0]) 就像其他线性模型,逻辑回归模型也可以 ![\ell_1](../images/tex-8524eb1789cf2093cfccc4c297138c7f.gif) 或者 ![\ell_2](../images/tex-f2d02eaf32cb7a351989198531c0d12a.gif) 惩罚使用进行正则化。Scikit-Learn 默认添加了 ![\ell_2](../images/tex-f2d02eaf32cb7a351989198531c0d12a.gif) 惩罚。 > 注意 -> +> > 在 Scikit-Learn 的`LogisticRegression`模型中控制正则化强度的超参数不是 ![\alpha](../images/tex-7b7f9dbfea05c83784f8b85149852f08.gif)(与其他线性模型一样),而是它的逆:![C](../images/tex-0d61f8370cad1d412f80b84d143e1257.gif)。 ![C](../images/tex-0d61f8370cad1d412f80b84d143e1257.gif) 的值越大,模型正则化强度越低。 ### Softmax 回归 -Logistic 回归模型可以直接推广到支持多类别分类,不必组合和训练多个二分类器(如第 3 章所述), 其称为 Softmax 回归或多类别 Logistic 回归。 +Logistic 回归模型可以直接推广到支持多类别分类,不必组合和训练多个二分类器(如第 3 章所述), 其称为 Softmax 回归或多类别 Logistic 回归。 这个想法很简单:当给定一个实例 ![\mathbf{x}](../images/tex-70e59a996bd69a0c21878b4093375e92.gif) 时,Softmax 回归模型首先计算 ![k](../images/tex-8ce4b16b22b58894aa86c421e8759df3.gif) 类的分数 ![s_k(\mathbf{x})](../images/tex-a840076f36cc4bef1947d97a65426bb3.gif),然后将分数应用在`Softmax `函数(也称为归一化指数)上,估计出每类的概率。 计算 ![s_k(\mathbf{x})](../images/tex-a840076f36cc4bef1947d97a65426bb3.gif) 的公式看起来很熟悉,因为它就像线性回归预测的公式一样(见公式 4-19)。 @@ -772,7 +772,7 @@ Logistic 回归模型可以直接推广到支持多类别分类,不必组合 + `argmax`运算返回一个函数取到最大值的变量值。 在这个等式,它返回使 ![\sigma{(\mathbf{s}(\mathbf{x}))_k}](../images/tex-7ccc7a43b364826d3d3caf874433ba74.gif) 最大时的 ![k](../images/tex-8ce4b16b22b58894aa86c421e8759df3.gif) 的值 > 注意 -> +> > Softmax 回归分类器一次只能预测一个类(即它是多类的,但不是多输出的),因此它只能用于判断互斥的类别,如不同类型的植物。 你不能用它来识别一张照片中的多个人。 现在我们知道这个模型如何估计概率并进行预测,接下来将介绍如何训练。我们的目标是建立一个模型在目标类别上有着较高的概率(因此其他类别的概率较低),最小化公式 4-22 可以达到这个目标,其表示了当前模型的损失函数,称为交叉熵,当模型对目标类得出了一个较低的概率,其会惩罚这个模型。 交叉熵通常用于衡量待测类别与目标类别的匹配程度(我们将在后面的章节中多次使用它) @@ -786,9 +786,9 @@ Logistic 回归模型可以直接推广到支持多类别分类,不必组合 可以看出,当只有两个类(![K=2](../images/tex-5869b95a3404e737433d626520200848.gif))时,此损失函数等同于 Logistic 回归的损失函数(对数损失;请参阅公式 4-17)。 > 交叉熵 -> +> > 交叉熵源于信息论。假设你想要高效地传输每天的天气信息。如果有八个选项(晴天,雨天等),则可以使用3位对每个选项进行编码,因为 ![2^3=8](../images/tex-5f344a952e29992de54b8cfe645b2d5b.gif)。但是,如果你认为几乎每天都是晴天,更高效的编码“晴天”的方式是:只用一位(0)。剩下的七项使用四位(从 1 开始)。交叉熵度量每个选项实际发送的平均比特数。 如果你对天气的假设是完美的,交叉熵就等于天气本身的熵(即其内部的不确定性)。 但是,如果你的假设是错误的(例如,如果经常下雨)交叉熵将会更大,称为 Kullback-Leibler 散度(KL 散度)。 -> +> > 两个概率分布 ![p](../images/tex-83878c91171338902e0fe0fb97a8c47a.gif) 和 ![q](../images/tex-7694f4a66316e53c8cdd9d9954bd611d.gif) 之间的交叉熵定义为:![H(p,q)=-\sum_xp(x)\log q(x)](../images/tex-6bc68f603b52e51645b4bbd318f8cdfe.gif)(分布至少是离散的) 这个损失函数关于 ![\theta_k](../images/tex-9f888eddb683fe5f80f87f44bd727b08.gif) 的梯度向量为公式 4-23: -- GitLab