机器学习
机器学习
机器学习学习小总结
本文档使用 WYMF 发布
-
+
首页
机器学习
# 机器学习 ## 一.机器学习的简单介绍 ### 欢迎来到机器学习的学习,什么是机器学习 - 机器学习的定义:使计算机无需明确编程,即可学习的研究领域 <span style="color:red;"> 一个小故事 </span> - 早在 1950 年,一个计算机大佬编写了一个跳棋程序,但令人惊讶的是,这个大佬并不是一个跳棋大佬,他所做的是通过计算机编程,可以与自己进行上万次跳棋比赛,并且进行统计,下在哪个位置会增加胜利的概率,下在哪个位置会增加失败的概率,最后这个程序就会了解棋盘位置的好坏,变得越来越智能,增大赢棋的概率 我们都知道 <span style="color:red;"> 熟能生巧 </span>,计算机也不例外,你给它学习的机会越多,那么它表现的就越好 机器学习是一种使计算机系统能够通过经验和数据改进性能的技术。它从训练集中的数据中学习,能够对从未见过的数据进行预测与分析 ps:简单的理解,计算机在一个叫(数据集)的地方进行学习,然后帮我们分析和预测数据(干活) #### 什么样的问题适合机器学习那 ``` 1. 有潜在的,可开发的能力。通过不断的学习来开发潜在的能力,提高某种效益, 白话讲:机器学习要有可以学的到的东西,如果没有可学的到的东西,程序就在那来回跑,我在一直训练他也没有意义。 2.我们那要有数据,通过已有的数据集来让其进行学习 ``` ## 二.机器学习主要类型 ![](/media/202310/2023-10-10_222106_2060700.34165272434928307.png) ### 1.监督学习 (supervised learning) 监督学习还分为 <span style="color:red;"> 回归 </span> 和 <span style="color:red;"> 分类 </span> 监督学习是现实世界中使用最多的机器学习类型 #### 1/学习预测数字 (回归) 监督学习是指,学习-> 输入到输出的映射算法 ![](/media/202310/2023-10-10_222245_5001590.4198256762643502.png) 通过训练集中的输入(x),和输出(标准答案)来预测它们从来未见过的(x),并产生相应的输出(y)。例如,我们可以通过,房子的大小,x 作为输入,得到房子价格 y。 如下图所示,橙色实线为拟合线 这就是监督学习 ,因为我们给算法一个数据集,所谓的标准答案,每个房子的价格(y),目的是给我们生成更多的标准答案,也就是房子可能的价格。 ps:也叫 <span style="color:red;"> 回归 </span> eg:如下图,<span style="color:orange;"> 橙色直线 </span> 为拟合直线,此时我有一个朋友他的房子是 100 平方米 <span style="color:green;"> 绿色直线 </span>,根据拟合直线,价格可以卖在 110w 左右。 截屏 2023-10-10 下午 10.23.11 ![](/media/202310/2023-10-10_222723_3645850.4333092306133549.png) 注意:<span style="color:orange;"> 橙色直线 </span> 不一定是唯一的学习算法,如下图 <span style="color:purple;"> 拟合曲线 </span> 会更好,你会发现曲线囊括的数据更多 截屏 2023-10-10 下午 10.24.56 ![](/media/202310/2023-10-10_222736_3478850.8781543851935951.png) ####2 分类算法 根据一些事实进行分类,用一些方式来进行表示,例如我们 横轴代表年龄,纵轴代表肿瘤的大小,以 <span style="color:orange;"> 橙色 </span> 线为边界。将它们进行分类 例如 <span style="color:purple;"> 紫色 </span> 代表恶性,<span style="color:green;"> 绿色 </span> 代表良性 。 ps:也叫 <span style="color:red;"> 分类 </span> 如下图: ps:以上描述也叫多属性输入预测,因为我们根据病人的年龄和肿瘤尺寸两个属性来预测是 <span style="color:purple;"> 恶性 </span> 还是 <span style="color:green;"> 良性 </span> 例如我们此时有一个病人 我们知道了他的肿瘤尺寸和年龄,如下图的 <span style="color:blue;"> 蓝色直线 </span>,我们大致可以预测,他是良性肿瘤。 ![截屏 2023-09-26 下午 3.07.53](/Users/gcy/Library/Application Support/typora-user-images/截屏 2023-09-26 下午 3.07.53.png) 我们也可以用 0 或 1 来表示,肿瘤是否为良性还是恶性。 所以分类算法可以总结为 <span style="color:red;"> 预测类别 </span>,类别也可不是数字,例如我们输入一张图片,让其帮我们预测下,它是猫还是狗;他还可以预测肿瘤是良性还是恶性。我们可以用数字[0,1,2],来对他们的类别进行表示。 ### 2.无监督学习 (unsupervised learning) ####无监督学习,通过字面意思就可以大概理解为,不需要人们监督就可以自己学习的算法 截屏 2023-10-10 下午 10.27.52 ![](/media/202310/2023-10-10_222830_1164110.4200889291627282.png) 例如上图,我们没有将肿瘤分为良性还是恶性,会根据某一种规则讲它们进行分类,这就是无监督学习,我们没有用某种算法,或者没有像监督学习那样都给输入(x)一个正确答案(y),也叫 <span style="color:red;"> 聚类算法 </span>,因为它讲未标记 的数据放在了不同的群组里面。 下面 我来举一个无监督学习的例子: 截屏 2023-10-10 下午 10.28.49 ![](/media/202310/2023-10-10_222918_8416670.058200847920305.png) 例如,我们打开百度,输入 机器学习 python,就会给我们呈现这些我们可能需要的,每一项都有 <span style="color:red;"> 机器学习 python </span> 这两个关键字,所以聚类算法就可以理解为,你要去百度 找你想要的 东西。 ####网上有成千上万条,我们要找的东西,都是通过 <span style="color:red;"> 聚类算法和关键字 </span>,将它们进行分类。 ### <span style="color:red;"> 总结一下,无监督学习算法,把一些没有标签的数据,并且将他们自动分组的算法 </span> 另外一种无监督学习算法,<span style="color:red;"> 异常检测 </span>,通常用于检测异常事件, <span style="color:red;"> </span> <span style="color:orange;"> </span> 解释 ## 三.线性回归模型 让我们一起学习第一个模型,线性回归模型 (Linear Regression),通过名字我们就可以知道他是属于 <span style="color:red;"> 监督学习 </span> 的范畴。 我们还是用,房子的大小和其价格来举例子 此处应该有个图,里面有数据集 例如,你是一个房地产经理,你朋友要将他家的房子卖掉,让你算算他这个房子大约值多少钱,那么以上的数据集可能会帮到你 例如你朋友的房子是 120 平米,我们此时要建立一个回归模型,用一条拟合直线去与这些数据进行拟合 在来个图, 这就是监督学习模型中线性回归模型的的一个经典例子,因为你首先给你了数据集(所谓的输入 x,(房子的大小)和输处 y,(房子的价格)),我们可以根据这些数据去预测其他房子的价格。之所以叫 <span style="color:red;"> 回归模型 </span>,<span style="color:orange;"> 因为他的输出 y,都是以一个准确的数字结束,所以叫回归 </span>,那线性就更好理解了,因为我们是通过 <span style="color:red;"> 一条直线 </span> 和数据进行拟合,所以叫线性,所以线性回归就是这么来的。 如果用曲线来拟合数据就不叫线性了,嘻嘻。与回归模型相比,另一种更常见的监督学习模型叫 <span style="color:red;"> 分类模型 </span>(Classification model)。 ##### 回归模型与分类模型的差异 回归模型的输出会有==很多种结果==,而分类模型的结果是==有限==的,例如我们那判断这个图片是狼 🐺 还是狮子 🦁️ 等等 接着说你朋友的房子的事,我们把==训练模型的数据叫做训练集==,请注意,你朋友的房子没有在训练中,我们要训练模型以学习,然后帮你==预测==你朋友的房子能值多少钱。 我们通常将输入变量用 x 来表示,也叫 <span style="color:red;"> 输入特征 </span>(feature),通常将输出变量用 y 来表示,也叫 <span style="color:red;"> 目标变量 </span>,通常用 m 来表示,训练集当中训练样本的个数 F 是我们要学的东西,目标函数 targe function。 ## 四.成本函数 上一节我们讲的==线性回归==,为了实现==线性回归==,我们要定义一个==成本函数==。什么是==成本函数==,成本函数的定义:。通俗的话来讲就是,找到一个合适的模型,使其预测的更准确,这个成本函数就是间接的看出预测值与真实值的差距,成本函数越大预测的越不准,(可以理解为成本大),成本函数越小预测的越准确。 #### 模型 : f$_ {w,b}$=wx+b 其中 w,b 是模型的参数 parameter,他们是我们要调整的对象,来进行模型的改进。 设想一下你有一些数据,你要用一条直线去拟合他们,如下图 1 ![](/media/202310/2023-10-27_111756_9938430.5998945787466502.jpeg) 红色直线为拟合直线(直线上的值都是预测值),当 x=x<sub>1</sub> 时,可见预测值与真实值有一段距离,这段距离我们称为==误差==。 这条直线 $\widehat{y}$=f<sub>w,b</sub>(x<sup>(i)</sup>)=wx<sup>(i)</sup>+b ==现在的问题如何找到 w,b==,来预测 $\widehat{y}$,回答这个问题之前,我们如何考虑一条直线与训练集的拟合程度呢。 这时就进入了主题,我们构造一个==成本函数==(cost function)。分为一下几个步骤。 1. 算出预测值与真实值的差,$\widehat{y}$-y 2.将其平方,($\widehat{y}$-y)<sup>2</sup> 3.将整个训练集的 真实值与预测值差的平方加和 $\sum_{i=1}^m$ ($\widehat{y}$-y)平方 4.注意,随着训练量的增加你的 cost function 会变大,所以我们要除以训练集个数 m, 5.但是按照惯例,我们处于 2m,方便后面的计算 即 J(w,b)= $\frac{1}{2m}$ $\stackrel{m}{\sum\limits_{i=1}} f_{w,b}(x^{(i)}-y^{(i)})^2$ 不同的 model 用不同的 J,平方误差成本函数是迄今最适合用于线性回归的,J(w,b)也可以写成 J(w,b)= $\frac{1}{2m}$ $\stackrel{m}{\sum\limits_{i=1}} f_{w,b}(x^{(i)}-y^{(i)})^2$ 最终,我们将要找到使成本函数变小的 w,b。 #### 下一个问题 如何使用成本函数来找到最佳的参数 为了更清晰,我们只使用一个参数 ==w==, - model:f<sub>w</sub>=wx - parameter :w - J(w)=1/2m (f) 我们的目标是找到合适的 == w== 使 J 最小。 此时我们给 w 赋予不同的值,并且画出 f-w 的函数 WechatIMG12.jpeg ![](/media/202311/2023-11-06_192306_0413190.24105991765541368.jpeg) 接下来,我们再画 J-w 的函数 ,是一个二次函数(图先欠着) 由此可见 ,对于该数据集,w=1 时,即 f<sub>w</sub>=x 时,最合适。 ## 五 梯度下降 上次我们讲了==成本函数==J,和如何选择不同参数 w 和 b,接下来我们要利用==梯度下降算法==去寻找 w 和 b。 你现在有 J(w,b),你想要将其最小化,理论上梯度下降下降是一种算法,它可以最小化任何函数,不仅仅是线性回归的成本函数。 首先,我们对 w,b 有一个初步的假假设,在线性回归中,w,b 的值是多少不重要,一般我们将他们==设置为 0==。 而你要做的事没次更改 w,b 来尝试降低 J,知道 J 达到或接近最小值。 截屏 2023-11-11 下午 9.10.54 ![](/media/202311/2023-11-11_211113_6325410.23262034489614503.png) - 对于上图,它存在着多个局部最小值,因此该图不是平方误差损失函数的 J,也不是线形回归,这是一种训练神经网络可能会用到的成本函数,后面会讲 <span style="color:red;"> 重要的来了: </span> 对于上图,不同的 w 和 b,决定了不同的 J,不同的 J 也代表你在山的不同的高度,==梯度下降所做的是==,你环顾四周,问问自己,你要下山或者到达这些==山谷之一==,你要朝着哪一方向迈出==一小步==(不断的重复),下山最快。 以此类推,知道发现自己已经处在谷底(局部最小值)。 解释一波局部最小, 注意: 为何叫局部最小,是因为最开始选的 w 和 b 不同,导致起点不同,如下图,我们起点选的不同会导致我们到达两个不同的谷底。 ![](/media/202311/2023-11-11_212543_5526200.062429589384865314.png) 因此,你的起点不同,==梯度下降==会把你带到不同的谷底,你如上图,你在左边的位置,==梯度下降==不会把你带到第二个谷底,这是梯度下降的特性哈哈。 ### 5.2 梯度下降的实现 如何实现梯度下降,答案是==我们不断调整 w,b==,如下图 ![](/media/202311/2023-11-11_213930_7617790.7320239303118715.png) 其中 alpha 为学习率,值为[0,1]之间,后面会讲。 梯度下降所做的是,重复 w 和 b 的操作,直至达到一个局部最小值的点。 一个小细节,要同时去更新 w 和 b 这两个参数,之后写。 为了更清晰理解==梯度下降==,我们是用一个参数,或将 b 设置为 0。 ![](/media/202311/2023-11-11_215309_3286130.7282882757367987.jpeg) 通过这两个例子可以发现梯度下降正在做一个合理的事情,让你接近最低点。 ### 5.3 学习率 $\alpha$ 学习率 $\alpha$ 的 选择对实现提督下降效率产生巨大影响 $\alpha$ 的实质是[0,1]上的一个数,接下来让我们看看 $\alpha$ 太大或者太低下对梯度下降有什么影响? 如果 $\alpha$ 太小:根据公式 w=w-$\alpha$ $\frac{dJ(w)}{dw}$,w 会比原来小一点点,==如图 5-3-1==,该点会朝这最低点的方向移动一小步,循环这个过程,你最终会降低 J,但是速度太慢,会经历很多步骤才能到达最低点。 ![](/media/202311/2023-11-18_143800_6299240.13555930581011721.png) ==如图 5-3-1== 如果 $\alpha$ 太大:如果这个点离最低点很近,如果 $\alpha$ 太大了,根据公式 w=w-$\alpha$ $\frac{dJ(w)}{dw}$,可能就越过最小值 ==对应的 w==,循环这个步骤,可能会离最小值越来越远。==如图 5-3-2== ![](/media/202311/2023-11-18_143900_5308350.11167517728515819.png) ==图 5-3-2== ==这时细致的你可能会遇到一个问题==,如果你的参数 w 达到的局部最小值,那么下一步梯度下降该怎么做,==如图 5-3-3==, ![](/media/202311/2023-11-18_144042_5369820.6896801564123267.png) 由图像当前位置可知,由公式 w=w-$\alpha$ $\frac{dJ(w)}{dw}$,可知此处的斜率为 0,即 $\frac{dJ(w)}{dw}$=0,即 w=w<sub> 新 </sub>,此时你的参数 w 到达了局部最小值。 这就解释了梯度下降算法为什么可以达到局部最小值,即使固定学习率 $\alpha$ 。 我们在举一个例子,如图==5-3-4==, ![](/media/202311/2023-11-18_145122_3497870.23142036742454308.png) 从图中我们可以看出第一次梯度下降的时候(粉色线),迈出的步伐很大,第二步(橙色线)就比第一次平缓了许多,逐渐越来越平缓,直到达到了最小值。导数自动变小,意味着更新步骤也自动变小,这就是梯度下降算法,它可以使用它来最小化任何成本函数 J,不仅仅用于回归的平方误差函数。 ### 5.4 用于线性回归的梯度下降下降 之前我们介绍了,==线性回归模型==,==成本函数==,==梯度下降算法==,我们将它们能一起并使用,==平方误差成本函数梯度下降的线形回归算法==。 ==Linear regression model== : f$_{w,b}$(x)=wx+b ==cost function==J(w,b) : $\frac{1}{2m}$ $\stackrel{m}{\sum\limits_{i=1}} f_{w,b}(x^{(i)}-y^{(i)})^2$ ==Gradient descent algorithm== { w=w-$\alpha$ $\frac{dJ(w,b)}{dw}$ b=b-$\alpha$ $\frac{dJ(w,b)}{db}$ } 其中 $\frac{dJ(w,b)}{dw}$ = $\frac{1}{m}$ $\stackrel{m}{\sum\limits_{i=1}} f_{w,b}(x^{(i)}-y^{(i)})*x^{(i)}$ $\frac{dJ(w,b)}{db}$ = $\frac{1}{m}$ $\stackrel{m}{\sum\limits_{i=1}} f_{w,b}(x^{(i)}-y^{(i)})$ 因此,==线性回归下的梯度下降算法==即 { w=w-$\alpha$ $\frac{1}{m}$ $\stackrel{m}{\sum\limits_{i=1}} f_{w,b}(x^{(i)}-y^{(i)})*x^{(i)}$ b=b-$\alpha$ $\frac{1}{m}$ $\stackrel{m}{\sum\limits_{i=1}} f_{w,b}(x^{(i)}-y^{(i)})$ } 对 w,b 不断的更新直至收敛,==注意==每一步都要==同时==更新 w,b ### 5.6 总结 但事实证明,如果使用带有线性回归的平方误差成本函数时,成本函数永远也==没有多个局部最小值==,他 ==只有一个全局最小值==,因为他的成本函数 J(w,b)是一个二次函数,形状是一个碗形。 他的特性是除了一个全局最小值,不会有任何一个局部最小值,因此,当你实现这类函数的梯度下降时,一个不错的特性就是,只要你选择一个适当的 $\alpha$ ,它就会收敛到全局最小值。 # 第二周 多维特征 ### 1.多元线性回归 在以前我们讲线性回归时,只有一个特征 x,你可以预测价格 price。 现在,你不仅仅有一个特征,如图,您会有更多的信息来预测价格 price。 ![](/media/202311/2023-11-29_202247_6631310.20697201145177746.png) 如图所示,表中现在有 4 个特征,即 n=4,n 时特征的个数,我们用 $x_{1},x_{2},x_{3},x_{4}$,表示。 价格 price 不是特征,它是我们要预测的值也就是 y。 其中 $\vec{x}^{(i)}$,代表有这 4 个特征组成的 List,或训练集中的第 i 行特征向量,例如,$\vec{x}^{(1)}$=[2104,5,1,45] ,即第一行; $\vec{x}_{2}^{(1)}$= <font color=red>5</font>, $\vec{x}_{3}^{(2)}$=<font color=green>2</font> 早期的模型:f$_{w,b}$(x)=wx+b 现在的模型: ![](/media/202311/2023-11-29_202828_7904520.23946424799113986.png) 其中,$x_{1},x_{2},x_{3},x_{4}$ 前面的系数,可称之为权重。不同的特征对应的权重不同 一般来说,如果你有 n 个变量,那么模型如下: f$_{w,b}$(x)=$w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}...w_{n}x_{n}$+b 我们引入一些新的符号,向量 $\vec{w}$=[$w_{1},w_{2},w_{3},...w_{n}$],b 仅仅还是一个数字,和以前一样,w 和 b 是这个模型的参数。向量 $\vec{x}$=[$x_{1},x_{2},x_{3},...x_{n}$]。 使用以上引入的符号模型:f$_{w,b}$(x)=$w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}...w_{n}x_{n}$+b,可简写成:f$_{w,b}$(x)=$\vec{w}$$\cdot$$\vec{x}$+b。点乘,代表把两个向量对应位置的数字相乘再相加。 这种具有多个输入特征的线性回归模型叫 ==多元线性回归==。 ### 2.矢量化,向量化 ==矢量化==会使你的代码更短,并且使它运行起来更有效。 举个例子,$\vec{w}$=[$w_{1},w_{2},w_{3}]$,$\vec{x}$=[$x_{1},x_{2},x_{3}]$,==n== =3 f$_{w,b}$(x)=$w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}$+b - ==没有矢量化时==你的代码会是这样 f=w[0]*x[0]+w[1]*x[1]+w[2]*x[2],如果 n 不是 3,是 100,这样的代码会使你的计算机效率很低。 - ==没有矢量化的另一种方式==可以利用==for 循环==如下: ![](/media/202311/2023-11-29_211020_3641010.9094791976754809.png) 这种实现方式会比上一个好一点 - 现在让我们看看==矢量化==的代码如何写 f$_{w,b}$(x)=$\vec{w}$$\cdot$$\vec{x}$+b `f=np.dot(w,x)+b `,<font color=red> 红字 </font> 部分为矢量化的代码 dot 为 numpy 库中的函数可以直接用。当 n 很大的时候,矢量化会使你的代码速度运行的更快,并且更简短。 ### 3.多元线性回归的梯度下降 梯度下降有 $ 复合问题 以前的版本: 现在的版本: - 参数:$\vec{w}$=[$w_{1},w_{2},w_{3}]$ 和 b - 模型:f$_{w,b}$(x)=$\vec{w}$$\cdot$$\vec{x}$+b - 成本函数:J($\vec{w}$,b) 梯度下降:w=w-$\alpha$ $\frac{dJ(w,b)}{dw}$ b=b-$\alpha$ $\frac{dJ(w,b)}{db}$ w$_{1}$=w$_{1}$-$\alpha$ $\frac{1}{m}$ $\stackrel{m}{\sum\limits_{i=1}} $ $f_{w,b}$ $ (x^{(i)}-y^{(i)})*x^{(i)}$ ### 4.特征缩放(归一化) ==特征缩放==又称==归一化==,涉及调整数值数据的量度,使所有数据点在相似的尺度上。例如:身高、体重、年龄、收入等个人特征数据,每个==特征的区间==不一样,为保证所有特征数据尺度一样,我们就需要对原始数据做特征缩放,将身高、体重、年龄、收入都转化为区间[0,1]之间的数据。[0,1]区间也不是不是固定的,不同的归一化方法,可能产生不同的区间。 特征缩放(归一化)的目的,加快梯度下降的速度。 - 引例: ![](/media/202311/2023-11-30_141544_0752020.9990400331235147.png) 如上图,我们可以看见特征 x1 和特征 x2 的范围不同,x1 的范围比较大,x2 的范围比较小,那么参数 w 该如何选择? ![](/media/202311/2023-11-30_141840_8742110.281007231973761.png) 例如,如上图的参数,最后价格为 1 亿美金,与 500k 美金相差甚远,所以这不是一组很好的参数。 ![](/media/202311/2023-11-30_142117_3375470.780782581015456.png) 如果我们将 w1 和 w2 的数字互换,如上图,预测的价格和真实值的价格一样,这显然这是一组很好的参数。 通过上面的 ==引例==你会发现,当一个特征 x1 的范围很大时,我们要尽量选一个小一些的参数 w1,相反,如果一个特征 x2 的范围比较小时,我们要选一个大一些的参数 w2。 下图是,特征的散点图,和 ==成本函数==的等高线图 ![](/media/202311/2023-11-30_143411_5390010.441055879158341.png) 你会发现,如果你不进行特征缩放时,成本函数在梯度下降时,会在各个梯度之间反复弹跳,知道很长时间才到达最小值。 因此你现在要做的就是特征缩放,如果你进行了特征缩放,如下图: ![](/media/202311/2023-11-30_143908_5994080.2719192436382022.png) x1 和 x2 的范围都变成了[0,1],并且成本函数的等高校图,也从原来长长的椭圆形变成了圆形,这会使梯度下降能直接到达最小值,不用像在椭圆形中反复横跳。 所以,特征缩放(归一化)加快梯度下降的速度。 ### 如何进行特征缩放 - 最大值方法 x1 的范围时[300,2000]. x1=x1/x1max 即 0.15<=x1<=1 x2 的范围是[0,5]. x2=x2/x2max 即 0<=x2<=1 - 均值归一化 你要做的是先求出每个特征的平均值,记为 u,我们假设特征值 x1 的平均值是 u1=600,如下图 ![](/media/202311/2023-11-30_150337_0091950.384467598071342.png) - Z-score 标准化 我们要知道每个特征的均值和标准差 ![](/media/202311/2023-11-30_150535_5098560.26981825404565074.png) 如下图是特征缩放的标准,一般来说都缩放成[-1,1 的范围,只要范围不是太大,或者太小都可以接受。 ![](/media/202311/2023-11-30_150739_2432740.9894666955456768.png) ### 判断梯度下降是否收敛 其实判断梯度下降是否收敛以前我们说过,我们用一个图表示 ![](/media/202311/2023-11-30_185912_0630160.2509053306242224.png) - 我们的目标找到参数 w,b 使得成本函数 J 最小 - 所用到的方法就是==梯度下降== - 如图纵坐标代表成本函数 J 的大小,横坐标代表==迭代次数==,也就是梯度下降的次数 - 一般情况下,随着迭代次数的增多,成本函数 J 应该减小,但是如果 J 在某一次迭代后增加,意味着 $\alpha$ 太大或者代码中出现了错误 - 最后随着迭代次数的增加,J 下降的的很少或者不在减少这是成本函数 J 就收敛了,如图 400 次迭代(梯度下降),成本函数 J 收敛。 ### 如何设置学习率 $\alpha$ 如果 $\alpha$ 太小,收敛速度会很慢,如果 $\alpha$ 太大,它可能不会收敛。 如何设置一个适合模型的学习率 $\alpha$ 正确实现梯度下降的一个调试技巧是在一个足够小的 $\alpha$ 下,每迭代一次 J 都会降低。如果梯度下降不起作用,通常做的事是把 $\alpha$ 设置为一个 ==非常非常小==的数字。如果即使 $\alpha$ 特别小,梯度下降仍然不能使成本函数 J 减少,反而有时还增加那么你的代码出现了问题。 ==所以 $\alpha$ 怎么选,试就完了== ![](/media/202311/2023-11-30_194129_9010230.04891329284024404.png) ### 特征工程 ==官方解释:==[特征工程](https://vibaike.com/175632/)或[特征](https://vibaike.com/3139/)提取或特征[发现](https://vibaike.com/4095/)是利用领域知识从原始[数据](https://vibaike.com/3270/)中提取特征(特性、属性、属性)的过程。其动机是利用这些额外的特征来提高[机器学习](https://vibaike.com/175420/)过程的结果的质量,而不是只提供原始数据给[机器](https://vibaike.com/196501/)学习过程。 举个例子: ![](/media/202311/2023-11-30_195038_7446230.19871885665866362.png) 对于一个房子,我们有 x1 和 x2 两个特征,分别代表长和宽来预测房子的价格。 但是一个房子的面积对于房子的价格更有说服力吧 于是==特征工程==所做的事就是,新产生一个特征 x3=x1*x2,如下图 ![](/media/202311/2023-11-30_195341_8512620.28123370277053983.png) ### 多项式回归(有操作) ![](/media/202312/2023-12-01_134517_3536440.14014363295555377.png) 如上图,数据集看起来不能用直线拟合,因此我们可以用带有平方或立方的模型去拟合数据 ## 第三周 ### 简单介绍分类 ![](/media/202312/2023-12-01_143238_3025020.876170456188047.png) 以前我们了解了线性回归,它可以预测一个精准的数字,这回我们要预测类别。事实证明 ==线性回归==不是预测类别的好方法,如上图简单介绍了了一下线性回归为啥不能做分类,那么==逻辑回归==是一个预测类别的好方法。 举个例子,如下图: ![](/media/202312/2023-12-01_142150_8432040.1271275009250793.png) 图中有三个问题,对应的答案只有两种,这种只有两种答案的分类问题,称为 ==二元分类==(binary classification)。 ### 逻辑回归 ![](/media/202312/2023-12-02_132507_6194640.8338414138763919.png) 如图所示,这个曲线可以更好的去拟合数据 为了构建逻辑回归算法,我们引入一个重要的数学函数==Sigmoid 函数==,如下图。 ![](/media/202312/2023-12-02_132730_1979500.7186776746826934.png) ![](/media/202312/2023-12-02_132958_3143770.8178228378413273.png) 函数的输出为[0,1]之间,也可以理解为这件事情的概率。 现在我们使用它来构建 ==逻辑回归算法==。 我们将分两步执行次操作。 - 首先我们需要一个像 ==线性回归模型==的直线函数 f$_{w,b}$(x)=$\vec{w}$$\cdot$$\vec{x}$+b 我们将($\vec{w}$$\cdot$$\vec{x}$+b) 存在 z 这个变量里 即 z=$\vec{w}$$\cdot$$\vec{x}$+b - 再将 z 传入到 Sigmoid 函数中即 g(z)=$\frac{1}{1+e^{-z}}$,然后根据 Sigmoid 函数输出对应的值,如下图所示。 - ![](/media/202312/2023-12-02_140604_6604240.8844340377288217.png) ==综上逻辑回归模型==为 ![](/media/202312/2023-12-02_141020_1500260.8709722824490972.png) 它可以根据一个输入特征 x,输出一个在[0,1]区间的一个数字,下图是一个例子 ![](/media/202312/2023-12-02_141457_0325080.06339883265611745.png) ### 决策边界 上节我们讲了逻辑回归模型,决策边界可以更好地了解逻辑回归计算的这些预测。 ![](/media/202312/2023-12-05_173428_3744190.4149627060458426.png) 这是 ==逻辑回归模型==。 接下来如何学习预测算法, $\widehat{y}$ 是 0 还是 1,我们可以设置一个==阈值==,如果 $\widehat{y}$ 大于这个阈值就是 1,相反就是 0。 一个常见的阈值时 0.5 ![](/media/202312/2023-12-05_174101_0376100.4513798817324922.png) 何时 $\widehat{y}$=0 或 $\widehat{y}$=1 - 根据以上模型,我们可以知道当 ==$\vec{w}$$\cdot$$\vec{x}$+b>=0==时 f$_{w,b}$(x) $\geq$ 0.5,即 $\widehat{y}$=1 - ==$\vec{w}$$\cdot$$\vec{x}$+b<=0==时,$\widehat{y}$=0 ==决策边界==可以理解为,你对 $\widehat{y}$=0 或 $\widehat{y}$=1 保持着一个中立的态度,即这个这个边界将 y=0 和 y=1 的数据分隔开来。 举个例子 ![](/media/202312/2023-12-05_201802_9602880.065883750273795.png) w1,w2,b 为 1,1,-3 时的决策边界为紫色线,参数不同,决策边界不同。 另一个例子 ![](/media/202312/2023-12-05_202513_4278110.020705522864532644.png) ### 逻辑回归中的代价函数(损失函数)Loss 我们将了解平方误差成本函数时如何实现不是逻辑回归的理想成本函数,它可以帮助我们更好的选择逻辑回归的==参数== ![](/media/202312/2023-12-06_143604_5667690.1323089794564456.png) 如图,如果使用线性回归的成本函数,图像会有很多个局部最小值,很明显我们要换一个成本函数。 ![](/media/202312/2023-12-06_150052_9020830.24936472521721764.png) --- 0000000000000000 ![](/media/202312/2023-12-06_150103_3608650.3310336165590373.png) 你可能会有疑问,为什么逻辑回归的成本函数要这么定义,因为我们知道看他的结果,画出了他的图像,所以就这么定义了,可能说的有些模糊,我再想想 ### 简化的逻辑回归代价函数 ![](/media/202312/2023-12-06_153113_3056970.6630430329424114.png) 从以前的分段函数,到现在的用一个式子表示损失函数。 ![](/media/202312/2023-12-06_153716_2692610.7460409175556781.png) ### 逻辑回归实现呢梯度下降 ![](/media/202312/2023-12-07_134156_2758160.41400448105761833.png) 下图为 $\frac{dJ(w,b)}{dw}$ 的推导, $\frac{dJ(w,b)}{db}$ 同理 ![](/media/202312/2023-12-07_162500_8382790.05077632197718773.jpeg) ![](/media/202312/2023-12-07_134211_1428480.1735838373423496.png) 看起来和线性回归相同,但是 f(x)不同。 ### 过拟合问题(高方差) 过拟合是指模型在训练集上表现良好,但在测试集上表现较差的现象。这是因为模型在训练时过于拟合了训练数据的特征,导致对新数据的泛化能力较差。 ![](/media/202312/2023-12-07_162705_4696860.41638779040066676.png) 从这两个图中可看出欠拟合和过拟合,关于过拟合,即使成本函数的值是 0,但是有时候预测的也不够准确。 ![](/media/202312/2023-12-07_173910_3770740.6950654726456301.png) ### 如何解决过拟合问题 - 解决这个问题的一种方法是 ==收集更多的数据集==,如果你能收集更多的数据集,那就是更多的训练事例。 ![](/media/202312/2023-12-07_180401_1253310.6659269304739694.png) - 解决过拟合问题的第二种方法是,是否可以使用更少的特征 ![](/media/202312/2023-12-07_185920_3101460.6136502689814005.png) 缺点就是失去了一些关于房子的特征信息 - 第三个方法==正则化==,自动最合适的一组特征用于我们的预测任务,正则化你可以理解为以一种"温柔的"手段对某些特征进行消除,例如把某一特征的参数设置的非常小 0.00001,作用是让您保留所有特征,我们正常来时只需要正则化 w 即可,b 不用 ### 正则化 ![](/media/202312/2023-12-07_195601_3899760.41310533529503357.png) 我们最小化线性回归的 ==成本函数==,而不是模型函数,这么做我们最终会拟合出更接近二次函数的曲线,其中也包括 x3 和 x4 特征,这很好,没有丢失特征。 如果 w3 和 w4 很大,那么实际上是==惩罚==该模型,如果你想最小化==成本函数==,你只能让 w3 和 w4 很小很小,即模型函数中的 w3 和 w4 也就很小了。 ![](/media/202312/2023-12-12_141505_0576460.798365185084626.png) ==正则化的实现方法==,如果你有 100 个特征,但是你不知道哪些是比较重要的特征,哪些是要惩罚的特征。正则化的实现方法就是惩罚所有的特征,即惩罚所有参数 wj, ![](/media/202312/2023-12-12_144312_0713780.5395921314743356.png) - 如上图,添加==正则项==后,代价函数对 wj 的偏导变大,即 $\frac{dJ(w,b)}{dw}$ 变大,w 更新时,w=w-$\alpha$ $\frac{dJ(w,b)}{dw}$,w 会变小。 - ==平方误差项==,鼓励算法通过最小化预测值和真实值的平凡差来更好的训练数据。 正则化,还可以使 wj 变小,可减少过拟合 $\lambda$,的选择主要使平方误差项和正则项保持平衡,如果 $\lambda$=0,即没有正则项,会==过拟合==, $\lambda$ 很大很大,即 wj 很小很小,最后 f(x)=b,==欠拟合== ### 用于线性回归的正则方法 ![](/media/202312/2023-12-12_164251_4843400.6676019761221317.png) ![](/media/202312/2023-12-12_170017_6023500.7877231708472732.png) ### 用于逻辑回归的正则方法 与线性回归的正则方法一样,仅仅是 f 变了 # 神经网络(Deep Learning) ## 第一周 ### 一.神经元与大脑 首先让我们看看我们的大脑是如何工作的,以及和神经网络的关系 ![](/media/202312/2023-12-13_125536_4394150.4649881374598376.png) 一个神经元有多个输入,最后会有一个输出,该输出也会作为下一个神经元的输入 神经网络的动机是尝试构建模拟大脑的软件 ![](/media/202312/2023-12-13_130839_6541490.08806949617371695.png) ### 需求预测 为了说明神经网络是如何工作的,我们举一个例子 ![](/media/202312/2023-12-13_140435_2184370.32472908137006806.png) 有 4 个特征 $\vec{x}$,通过一层神经网络(隐藏层),变成了三个特征 $\vec{a}$,这个过程与之前说过的==特征工程==比较像,再将这个三个特征输入给下一层的神经元得到最后的结果。 ### 二. 神经网络中的网络层 某一层的神经网络如何工作的 ![](/media/202312/2023-12-14_125807_2553910.3391537620653544.png) 如图, $\vec{x}$ 为 layer0,有三个 <span style="color:blue;"> 蓝色 </span> 神经元的一层为第一隐藏层,他的工作原理,如图所示,每一个神经元中都有参数,每一个神经元也会输出一个值,将这三个神经元共同输出的值,也叫 ==激活值==,重新组成一个向量 $\vec{a}$,作为下一层的输入。 ![](/media/202312/2023-12-14_131314_8568360.36572677052390257.png) 第二层神经元的工作原理与第一层相似。因为第二层==只有一个神经元==,即最后输出的不是一个 $\vec{a}$,而是一个数字。 ![](/media/202312/2023-12-14_131621_3150170.2837983425621857.png) ### 激活函数 ==激活函数==即产生激活值的函数,一般情况,激活函数用到的激活值都是上一层产生的激活值,在产生本层的激活值,再当做下一层的激活元素。 ![](/media/202312/2023-12-14_140731_2187950.5653146611294603.png) 如图,黑框里的 Sigmoid 即==激活函数== ### 神经网络前向传播 ![](/media/202312/2023-12-14_144932_7703600.6618955631845868.png) ![](/media/202312/2023-12-14_144955_5467210.0457811453157827.png) ![](/media/202312/2023-12-14_145126_8486830.005691424992049332.png) 最初会有很多神经元,离输出层越近,hidden 层中神经元的数量越少 ### 三.Tensorflow 的简单代码 ![](/media/202312/2023-12-15_150601_8130020.9964076859283393.png) ![](/media/202312/2023-12-15_150616_5512970.6535309667153989.png ) ![](/media/202312/2023-12-15_150623_8705030.9806663026028108.png) ### tensorflow 中的数据形式 https://blog.csdn.net/u011453680/article/details/131153843 具体看这个博客。里面有吴恩达的图片 ### 搭建一个神经网络 https://blog.csdn.net/u011453680/article/details/131209587 ### 四 .python 和 np 实现前向传播 ![](/media/202312/2023-12-17_183135_0623660.1686270281787422.png) - 使用一维数组来表示这些向量和参数,所以只有一个方括号 - W1_1:表示 layer 1 的第一个神经元的 W - Z1_1:表示 W1_1 和输入 X 之间的点积,再与 b1_1 相加 - a1_1:表示应用 Z1_1 的 sigmoid 函数 - a1:表示把 a1_1,a1_2,a1_3 合成一个一维数组,作为 layer 1 的输出 ![](/media/202312/2023-12-17_190048_5258150.08495704817905336.png) * W 可以看作一个 2 * 3 的矩阵,第一列是参数 w1_1,第二列是参数 w1_2,第三列是参数 w1_3。b 可以看作一个一维数组。 * dense() 函数的作用是:给定参数 w、b 和激活函数 g()、上一层的激活值,然后输出当前层的激活值 * shape[0]:行数,shape[1]:列数。而此处 W 矩阵的列数等于该层的神经单元数 * 初始化 a_out 数组,令其元素数等于该层单元数,并把它设为 0 数组 * j 为索引,从 0 到该层单元数减一,即 0、1、2 * [ : , j ],二维数组切片,取第 j 列的每一行,即表示取矩阵的第 j 列 * =用 dot() 函数来计算 w 和 a_in 的点积,加上 b,之后整体作为 z 带入 g()函数,得出该单元的激活值 a_out[j] * 输出 a_out,该层的激活值 ==总结== * 给定输入特征 X,之后计算每一层的激活值 a,其中 W、b 有时也称为该层的权重。返回最后一层的激活值 f_x,即 a4,也就是整个神经网络模型的结果 f_x * 这里使用 W,根据约定,矩阵用大写字母,向量或标量用小写字母 ### 五.前向传播的循环代码与向量化代码的对比 ![](/media/202312/2023-12-18_115419_9101050.03561439317677084.png) * 把 X、B 写作二维数组,即矩阵 * 左边的 for 循环就可以用右边的 np.matmul 来实现 * matmul 是 numpy 执行矩阵乘法的一种方式,它不能用于常量,只能用于矩阵相乘,而.dot 可以用于常量 * 注意:此时所有的变量(X、W、B、Z、A_out)都是二维数组,即矩阵 ==矩阵乘法等说明== 略过,具体看 https://blog.csdn.net/u011453680/article/details/131359872 ## 第二周,tensorflow 实现 神经网络训练 ![](/media/202312/2023-12-20_200905_5422460.773648776102591.png) - 在 tensorflow 中训练神经网络模型的步骤:第一步:指定模型,并告诉 tensorflow 按何种方式计算。第二步:使用特定的损失函数编译模型。第三步:训练模型 ![](/media/202312/2023-12-20_202117_9644580.7844207915014874.png) - 第一步:如何在给定输入特征 x 和参数 w、b 的情况下计算输出 f(x) - 第二步:指定损失函数和成本函数。其中成本函数是参数 w 和 b 的函数,它计算 m 个训练实例的损失函数的平均值。损失函数是计算单个训练实例的函数,而成本函数是计算整个训练集的函数 - 第三步:使用训练集,并采用梯度下降算法来找到一组 w 和 b 使成本函数最小化 https://blog.csdn.net/u011453680/article/details/131425301 看他咋操作的 ### Sigmoid 的代替策略,如何选择激活函数 https://blog.csdn.net/u011453680/article/details/131498634 ### 为什么模型需要激活函数 https://blog.csdn.net/u011453680/article/details/131548807 ### 多类分类模型,Softmax 回归算法及其损失函数 https://blog.csdn.net/u011453680/article/details/131559498 ### # softmax 在神经网络模型上的应用,提高数据精度的方法 https://blog.csdn.net/u011453680/article/details/131621803 ### 多标签分类与多分类问题 P69 ### adam 算法 梯度下降是广泛用于机器学习的优化算法,但也有一些其他的优化算法也可以最小化成本函数,甚至比梯度下降更好。 ![](/media/202312/2023-12-27_135055_0052350.005853079620307677.png) - 在梯度下降中,学习率 α 控制着每一步的大小,如果 α 太小,可能会导致每一步走的太小,从而使梯度下降执行的太慢;相反,如果 α 太大,可能会导致每一步走的太大,从而使梯度下降来回振荡。 - Adam 算法可以自动调整 α 的大小,来保证可以用最短、最平滑的路径到达成本函数的最小值,通常它比梯度下降算法的速度要更快 ![](/media/202312/2023-12-27_135241_5767630.02105093450645734.png) - adam 算法可以自动调节学习率,自适应距估计,他并没有使用单一的全局变量学习率,他对模型的每个参数使用不同的学习率 ![](/media/202312/2023-12-27_135351_2201890.520694798926597.png) - 在 w、b 参数每次改变都朝着大致相同的方向移动时,adam 算法会加大学习率 α * 在 w、b 参数每次改变都不断来回振荡时,adam 算法会减小学习率 α ![](/media/202312/2023-12-27_135518_9936750.45141212122103813.png) - 使用 adam 算法时,需要在 compile()函数中,添加一个参数,指定使用 adam 优化器 - adam 优化算法需要设定默认的初始学习率 α,在实际实践中,可以多试几个默认 α 值,看看哪个 α 的速度最快 ### 卷积层 https://blog.csdn.net/u011453680/article/details/131680224 ### 第三周 模型估计 接下来你会知道一套方法,该方法可以让你知道==如何评估自己的算法== ![](/media/202401/2024-01-02_122101_8943300.6645467636937445.png) * 我们可以借助图像来判断模型是否良好。 * 但当我们用单一特征来绘制 f(x)图像时,模型容易出现过拟合现象。但如果增加一些输入特征的种类,绘制图像又会变得很困难。我们需要更系统的方法来评估你的模型。 ![](/media/202401/2024-01-02_124718_9395970.5152310944059733.png) 例如你有 10 个数据,我们不将其所有都用来训练 w,b,我们拿出 70% 用来训练 ==training set==,30% 用来测试==test set==,我们要做的是,在前 70% 上训练模型,(找到合适的参数),在用==test set== 测试其表现 ![](/media/202401/2024-01-02_125056_9654880.25857773023193364.png) * 对线性回归模型,我们可以用带正则化项的成本函数来得到使成本函数最小的 w、b * 可以通过不带正则化项,且数据为测试集来得到模型是否在新数据上表现良好,即不过拟合,能很好的泛化新数据 * 可以通过不带正则化项,且数据为训练集来得到模型是否在训练集上表现良好 ![](/media/202401/2024-01-02_125230_7900280.6618891752654.png) ==逻辑回归==也是如此,但是一般逻辑回归用个数去评判模型的好坏,也就是分类的错误率去评判。 #### 以上的想法还存在一些不足,我们完善完善它 我们可以看到,一旦模型的参数 w,b 适合训练集了,那么 J$_ {train}$ 将不是一个好的指标,训练误差为 0,但是它无法拟合从未见过的数据。 我们如何使用测试集为程序选择模型呢, ![](/media/202401/2024-01-02_132959_7615590.538790339621863.png) 你可以将 某阶数的模型去拟合到你的数据集中,你会得到想用的参数,你可以用该参数在测试集上计算误差,对比这些误差哪个最低,哪个模型可能就更适合。 - 但是这么做有一些缺陷:我们使用测试集选择了这个参数, - ==训练集用来训练参数 w 和 b,而测试集用来选择多项式模型(即 d),训练集不能评估 w 和 b 的好坏,类似的测试集也不能评估参数 d 的好坏== 因此将数据集分为三个子集,==训练集,交叉验证集,测试集==,如下图 ![](/media/202401/2024-01-02_133327_2329840.28421068291770524.png) * 如下图:训练集–拟合 w、b 得到许多模型,验证集–拟合 d 挑选最优模型,测试集–测试模型的泛化能力 ![](/media/202401/2024-01-02_134211_9912450.7978951573162028.png) ==总结==,训练集用于模型的训练和参数的调整;交叉验证用于模型的选择,超参数的调整(例如决策树的深度)选择最佳模型;测试集用于模型最终的性能的评估。 https://blog.csdn.net/u011453680/article/details/131766980 ### 用偏差,方差等进行诊断 构建机器学习系统过程的关键是如何决定下一步做什么以提高它的表现,在不同的应用程序中发现,学习算法的==方差==和==偏差==可以为您下一步的操作提供指导。 - 方差指的是==训练集==与==验证集==之间的误差 - 偏差指的是==训练集==上的误差 如果特征只有一个,我们完全可以画图去描绘,但是如果==特征有多个==,画图会不太方便,一种比较系统的方法是看您的算法是否有高偏差或者高方差来查看算法的性能 ![](/media/202401/2024-01-02_150728_2203910.8903009309800456.png) 如上图 - 图 1 的偏差很大 - 图 3 的偏差很小,但是方差很大因为 J$_ {cv}$ 远大于 J$_ {train}$ - 图 2 就很好,偏差和方差都很小 ![](/media/202401/2024-01-02_151715_3160500.1688758581022205.png) * 假设没有使用正则化,则随着拟合多项式的阶数越高,Jtrain 逐渐下降,即高阶多项式会越来越适合训练集 * 当 d 取 1 时,Jcv 非常高,此时模型欠拟合,所以它在验证集上的表现也不好;当 d 取 4 时,Jcv 依然很高,此时模型过拟合,所以它在验证集上的表现不好:但如果 d 取 2,Jcv 可能很低,此时模型泛化良好、拟合良好。综上:随着拟合多项式的阶数越高,Jcv 先下降再上升,即低阶多项式是欠拟合,高阶多项式是过拟合。 ![](/media/202401/2024-01-02_153029_2542700.6371648712661958.png) * 欠拟合/高偏差意味着 Jtrain 很高,同时 Jcv 近似于 Jtrain * 过拟合/高方差意味着 Jcv 远大于 Jtrain,而 Jtrain 可能很低 * 虽然对于同一个位置上不可能同时存在高偏差和高方差,但一个模型在不同位置可以既有高偏差、又有高方差,即同时存在过拟合和欠拟合的问题,如上图所示:左侧过拟合,右侧欠拟合,那么此时左侧的 Jcv 远大于 Jtrain,且右侧 Jtrain 很高 #### 正则化是如何影响偏差和方差的 ![](/media/202401/2024-01-02_160049_6388310.009386922661056785.png) * 假设该模型为四阶多项式 * 当 λ 很大时,在最小化 J 的过程中,w 会很小且接近 0,此时模型 f(x)近似于一个常数,所以此时模型欠拟合,Jtrain 和 Jcv 都很大 * 当 λ 很小时,表示模型几乎没有正则化,而四阶多项式的模型十分弯曲,所以此时模型过拟合,Jtrain 很小,Jcv 远大于 Jtrain * 当 λ 取中间值,模型刚好拟合良好、泛化良好,此时 Jtrain 很小、Jcv 也很小 ==我们如何选择一个合适的 λ== 一个字总结 ==试== ![](/media/202401/2024-01-02_162352_8566620.7320769444465484.png) ==λ 如何影响 Jtrain 和 Jcv== ![](/media/202401/2024-01-02_162625_2971280.23771295979807416.png) * λ 对 Jtrain 和 Jcv 的影响如上图所示,此图近似看作 d 对 Jtrain 和 Jcv 的影响图的镜像。 * 通过最小 Jcv,可以帮助选择一个合适的 λ、d,从而帮助选择合适的模型(泛化良好、拟合良好)
我有魔法
2024年3月8日 20:36
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码