机器学习入门
吴恩达机器学习笔记
什么是机器学习
- 陈旧的定义(Arthur Samuel):在没有明确设置的情况下使计算机具有学习能力的研究领域
- 新的定义(Tom Mitchell):”A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T,as measured by P, improves with experience E.”
简单的一句话:机器学习就是让机器从大量的数据集中学习,进而得到一个更加符合现实规律的模型,通过对模型的使用使得机器比以往表现的更好。
主要的学习算法
简单来说,监督学习就是我们会教计算机做某件事情,无监督学习就是让计算机自己学习。
监督学习
- 定义:根据已有的数据集,知道输入和输出结果之间的关系。根据这种已知的关系,训练得到一个最优的模型。
监督学习的分类:回归问题(Regression)、分类问题(Classification)
回归问题(Regression)
我们想要预测连续的数值输出,这就是回归问题。例如预测房价,假如你的朋友想卖掉他的房子,他想知道能卖多少钱。
此时可以使用回归算法来根据数据集来画一条直线或二次函数来拟合数据,如下图所示,直线拟合出来能卖150k,而曲线拟合出来是200k
要通过不断学习,找到最合适的模型得到拟合数据,在这里为房价。
**回归通俗一点就是,对已经存在的点(训练数据)进行分析,拟合出适当的函数模型y=f(x),这里y就是数据的标签,而对于一个新的自变量x,通过这个函数模型得到标签y。 **
分类问题(Classification)
我们设法预测一个离散值输出,这就是分类问题。例如估计肿瘤性质,某人发现了一个乳腺癌,在乳腺上有个肿块,假设在数据集中,1是恶性的,0是良性的。此时分类算法就用来根据肿瘤大小来估计是恶性还是良性,输出结果只有‘是’和‘否’,是离散的。
在上面的例子中只使用了一个特征(feature)或者属性,即肿瘤的大小来预测。在其他机器学习问题中特征可能不只一个,如下图是根据年龄和肿瘤大小两个属性来预测
此时学习算法能做的就是在数据集上画出一条直线设法将恶性肿瘤和良性肿瘤分开,此时就可以通过这个来判断某人肿瘤的类型。
所以简单来说分类就是,要通过分析输入的特征向量,对于一个新的向量得到其标签。
无监督学习
- 定义:据类别未知(没有被标记)的训练样本解决模式识别中的各种问题,称之为无监督学习。
我们得到一个数据集,我们不知道拿他干什么,也不知道每个数据点究竟是什么,我们只被告知这里有一个数据集,无监督学习方法可以把这些数据分成两个不同的簇,这就是聚类算法。
聚类算法(Clustering)
一个应用聚类算法的例子就是谷歌新闻,谷歌新闻所做的就是去搜索成千上万条新闻,然后自动地将他们分簇,有关同一主题的新闻被显示在一起,如下图所示
监督学习
线性回归
监督学习算法的工作方式:以预测房价为例,我们向学习算法提供训练集(房价训练集),学习算法的任务是输出一个函数h,h代表假设函数,其作用是把房子的大小作为输入变量,而它会试着输出相应房子的预测值。
对于房价预测,选取初始假设函数为一个线性函数$h(x) = \theta_1x + \theta_0$,在拟合线性函数的基础上最终处理更加复杂的模型以及学习更复杂的学习算法,这个模型被成为线性回归。
这个例子是一个一元线性回归,是一个单变量的函数,θ称之为模型参数。我们所要做的就是如何选择这两个参数值$\theta_0$和$\theta_1$来让假设函数表示的直线尽量地与训练集中的数据点很好的拟合,使得在训练集中给出的x值能够合理准确地预测y的值。
代价函数
我们知道了现有的数据是准确的,那么预测就要以现有的数据为根基,尽量的贴合现有的数据,使得差距最小,因此使用代价函数来衡量这个差距。
我们使用平均平方和误差作为一元线性回归的代价函数,定义如下:
$$
J(\theta_0,\theta_1)=\frac{1}{2m}\displaystyle \sum^{m}_{i=1}{(h(x^i)-y^i)^2}
$$
m是训练集的样本数,h(x)是预测值,y为真实值
- 注:之所以是1/2m ,是因为带了平方,后面要用梯度下降法,要求导,这样求导多出的乘2就和二分之一抵消了,一个简化后面计算的技巧。
$$
minmize\theta_0,\theta_1( \frac{1}{2m}\displaystyle \sum^{m}_{i=1}{(h(x^i)-y^i)^2})
$$
这个表示关于$\theta_0$和$\theta_1$的最小化过程,这意味着我们要找到$\theta_0$和$\theta_1$的值来使这个表达式的值最小,因此这将是线性回归的整体目标函数。
简单的例子
看下面一个例子,假设$h(x) = \theta_1x $ ,即$\theta_0=0$ 时的假设函数,通过调整$\theta_1$的值来看代价函数$j(\theta_1)$的变化。对于这个训练集,可以看见当$\theta_1=1$时拟合的最好(淡蓝色的线),此时代价函数的值最小(等于0)。这就是为什么要最小化$J(\theta_1)$,可以找到一条最符合数据的直线。
较复杂的例子
当代价函数为$J(\theta_0,\theta_1)$时,其图像为下面这个样子,是个三维图形,旁边是对应的等高线图,同一条线上的值相同,下面的例子将使用等高线图来代替三维图
当$\theta_0$取500,$\theta_1$取接近于0的一个数时,对应的线并不能很好的拟合数据,此时代价函数的值并不小
再将$\theta_0$和$\theta_1$取另外两个数,这时直线能够很好的拟合数据,代价函数也非常小,接近于0
通过这两个例子可以更好的理解代价函数的意义,如何对应不同的假设函数以及接近代价函数J最小值的点对应着更好的假设函数。
梯度下降算法
假设代价函数为$J(\theta_0,\theta_1)$,目标是最小化此代价函数,可使用梯度下降算法
步骤:
- 给定$\theta_0和\theta_1$的初始值(通常都设为0)
- 不停地一点点改变$\theta_0和\theta_1$来使$J(\theta_0,\theta_1)$变小,直到我们找到最小值或局部最小值
由于初始值一点点的不同,梯度下降算法可能会得到一个完全不同的局部最优解,如下图所示
其具体算法如下,$\alpha$为学习率,用来控制梯度下降时迈出多大的步子,当$\alpha$取值很小时会导致梯度下降很慢;当$\alpha$取值较大时可能会导致无法收敛甚至发散。其中$\theta_0和\theta_1$要同时更新(simultaneous update)
下图是一个直观的解释,当只有一个参数$\theta_1$时,在某点的导数为该点切线的斜率,当斜率为正时,$\theta_1$会减去一个正数使得$\theta_1$在数轴上向左移动;当斜率为负时则$\theta_1$减去一个负数,即加上一个正数,使得$\theta_1$向数轴右移动。两者皆向使代价函数取得最小值的方向移动。
梯度下降法无须在计算过程中去调整$\alpha$的值来控制步长。当我们靠近一个局部最小值时,梯度下降法会自动采取更小的步长,因为越靠近局部最小值导数值越小 (最终趋近于0),从而使得参数的变化逐渐减小,最终收敛于最小值。
线性回归的梯度下降
假设函数为$h(x) = \theta_1x + \theta_0$,代价函数为$J(\theta_0,\theta_1)=\frac{1}{2m}\displaystyle \sum^{m}{i=1}{(h(x^i)-y^i)^2}$ ,即$J(\theta_0,\theta_1)=\frac{1}{2m}\displaystyle \sum^{m}{i=1}{(\theta_1x + \theta_0-y^i)^2}$,带入梯度下降公式可得:
这种算法也叫做Batch梯度下降算法,每次计算都要遍历整个训练集。
多功能
前面的的预测房屋价格的特征x只有一个,即房屋大小x,其假设函数为$h_\theta(x) = \theta_1x + \theta_0$
现考虑使用四个特征来预测房屋价格:楼层数,房间数,大小,房屋年龄,那么其假设函数为$h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + \theta_4x_4$ ,为了方便可以表示为向量形式,假设$x_0 = 1$,那么$\vec{x} = \begin{bmatrix} x_0,x_1,x_2 ,x_3 ,x_4 \end{bmatrix}^T, \vec{\theta} = \begin{bmatrix} \theta_0,\theta_1,\theta_2 ,\theta_3 ,\theta_4 \end{bmatrix}^T$,此时假设函数可以写为$h_\theta(x) = \theta^Tx$
多元梯度下降法
$\theta$和$x$为向量,假设函数为$h_\theta(x) = \theta^Tx$,代价函数为$J(\theta) = \frac{1}{2m}\displaystyle \sum^{m}_{i=1}{(h_\theta(x^i)-y^i)^2}$,则对应多元梯度下降公式为下图所示:
特征缩放
- 特征缩放(feature scaling):通过将特征除以其最大值使得每个特征的值大约在[-1,1]的范围内(大一点小一点都可以),通过数学可以证明可以使得梯度下降的速度更加快。
- 均值归一化(mean normalization):将$x_i$用$x_i - \mu_i$代替,让特征值具有为0的平均值。
学习率$\alpha$
左边两幅图中的代价函数并没有减少,原因是学习率过大,如右图所示:
如果损失函数随着梯度下降法迭代次数的增加并没有减少,可能的原因就是学习率过高,此时需要使用更小的学习率。在线性回归中,对于充分小的学习率,代价函数函数会随着迭代次数的增加而减少最终收敛(可通过数学证明)。
总结:
- 学习率过高,代价函数的值可能会随着迭代次数的增加而增加甚至发散
- 学习率过低会导致收敛非常慢
- 尝试使用…,0.001,0.01,0.1,1…..等等当做$\alpha$,选择最优的一个
多项式回归
如果线性函数不能很好的拟合下图的数据,可以考虑使用多项式函数来拟合。
此图可以想到使用三次函数来拟合(二次函数后面会下降,而房价随着面积增大不应该还会下降),可以想到这样的形式$h_\theta(x) = \theta_0 + \theta_1(size) + \theta_2(size)^2 + \theta_3(size)^3$ 。假设函数为$h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_3$,要想让两个式子对应起来,自然想到将$x_1$特征设为$size$,将$x_2$特征设为$size^2$,将$x^3$特征设为$size^3$,此时再应用线性回归的方法就可以将一个三次函数拟合到数据上。
此处有平方项和三次方项,输入特征值可能非常大,需要使用特征缩放。
正规方程法
如果代价函数只有一个参数(一个标量)$J(\theta)$,则可以使用求导将导数置零的方法求得最值,但如果参数是一个向量$J(\theta_0,\theta_1,\theta_2,…,\theta_m)$,如果维数较大的话求偏导置零求极值可能会很困难。梯度下降法的速度可能会很慢,可以考虑使用正规方程法。
如果有m个训练实例,每个实例有n个特征,样本的特征向量为$x^{(i)} = \begin{bmatrix} x_0^{(i)},x_1^{(i)},x_2^{(i)} ,…,x_n^{(i)} \end{bmatrix}^T,$ 将特征向量组合成样本矩阵$X = [(x^{(1)})^T,(x^{(2)})^T,…,(x^{(m)})^T]$,如下图所示:
特征参数为:$\theta = \begin{bmatrix} \theta_0,\theta_1,\theta_2 ,…,\theta_n \end{bmatrix}^T$ ,输出变量为$Y = [y^{(1)},y^{(2)},…,y^{(m)}]^T$ ,此时输出变量为$Y = X\theta$,通过下图所示的变换可得特征参数的表示$\theta = (X^TX)^{-1}X^TY$,这就是使得代价函数最小化的$\theta$
下图是房价预测的例子:
与梯度下降法的比较
梯度下降法:
- 需要选择学习率$\alpha$,可能需要很多次尝试来选择较好的学习率
- 需要很多次迭代来求参数
- 当特征数n很大时也工作良好
正规方程法:
- 不需要选择学习率
- 不需要迭代
- 需要计算$(X^TX)^{-1}$,矩阵计算的速度会随着特征数的增加而减慢,当n很大时速度慢
矩阵$(X^TX)$不可逆时的解决方法
- 删除多余的特征,如删除两个线性相关的特征的其中一个
- 使用正规化的方法
分类问题
分类问题的例子:垃圾邮件分类,网上交易,肿瘤分类等等
二分类问题
二分类问题尝试预测的变量y是只有两个取值的变量0或1,0代表负类(恶性肿瘤),1代表正类(良性肿瘤)
逻辑回归算法
我们希望分类器的输出值在[0,1]之间。此时可以设假设函数$h_\theta(x) = g(\theta^{T}x)$ ,其中$g(x)$为sigmoid函数。
sigmoid函数(logistic函数):$g(z) = \frac{1}{1+e^{-z}}$ ,随着z值的增大函数值会逼近于1,随着z值减小函数值会逼近于0。函数图像如下图所示
有了sigmoid函数后,$g(z)$的值在0和1之间,$h_\theta(x)=\frac{1}{1+e^{-\theta^Tx}}$的值也会在0和1之间。此时可以用参数$\theta$来拟合数据。
对假设函数输出的解释:根据输入特征x估计y=1的可能性。下面的例子是根据病人的肿瘤大小来估计y=1(肿瘤是恶性)的可能性,根据输出可知此时有70%的概率是恶性肿瘤。
假设函数更加正式的数学表达式:$h_\theta(x) = P(y=1|x;\theta)$,如果要知道y=0的概率,直接计算$P(y=0|x;\theta)=1-P(Y=1;x;\theta)$即可。
决策边界
假设如果$h_\theta(x)\ge0.5$则预测y=1,如果$h_\theta(x)<0.5$就预测y=0。根据sigmoid函数图像,即$\theta^Tx\ge0$预测y=1,否则预测y=0。
例子1:现状假设有一个训练集,图如下所示。假设函数为$h_\theta(x)=g(\theta_0+\theta_1x_1+\theta_2x_2)$,假设参数向量已经拟合好$\vec{\theta}=[-2,1,1]^T$。此时当$-3+x_1+x_2\ge0$就预测y=1,否则预测y=0。此时的决策边界是图中洋红色的直线$x_1+x_2=3$,直线右半平面为y=1区域,其他区域为y=0区域。
- 注意:决策边界为假设函数的一个属性,决定于其参数而不是数据集的属性。一旦有确定的参数$\theta$,我们将完全确定决策边界。无需通过画出训练集来确定决策边界。
例子2:训练集的图如下图所示。假设函数为$h_\theta(x)=g(\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_1^{2}+\theta_4x_2^{2})$。假设参数向量已经拟合好$\vec{\theta}=[-1,0,0,1,1]^T$。此时的决策边界为$x_1^2+x_2^2=1$,为以原点为中心,半径为1的圆。
通过在特征中增加更复杂的多项式可以得到更复杂的边界。
logistic回归的代价函数
代价函数为$J(\theta)=Cost(h_\theta(x^{(i)}),y^{(i)})$。如果使用之前线性回归的$Cost(h_\theta(x^{(i)}),y^{(i)})=\frac{1}{2}(h_\theta(x)-y)^2$,此时的代价函数是关于参数$\theta$的非凸函数,会出现很多局部最优值,使用梯度下降法不能保证收敛到全局最优值。需要使用一个凸函数作为代价函数,如下图所示:
从而logic回归的代价函数为如下所示:
假设预测y=1,代价函数的图像如下,随着$h_\theta(x) $->1,代价函数的值会趋向于无穷,预测y=0则相反。
将两个式子写在一起则为$Cost(h_\theta(x^{(i)}),y^{(i)})=-ylog(h_\theta(x))-(1-y)log(1-h_\theta(x))$,此时可得logistic回归的代价函数$J(\theta) = \frac{1}{m}\displaystyle\sum^{m}_{i=1} Cost(h_\theta(x^{(i)}),y^{(i)})=-\displaystyle\sum^{m}_{i=1}[y^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]$
- 注:这个式子是通过统计学中的极大似然法得到的(见《统计学习方法》)
为了拟合出让$J(\theta)$取得最小值的参数$\theta$,此时的策略为$minJ(\theta)$ ,方法仍然为梯度下降法。(此处画蓝线的地方求和符号前少了个1/m)
求导过程:
多元分类:一对多
例子:将邮件分类到不同种类的文件夹,天气分类…二元分类和多元分类的数据集区别如下
可以使用二元分类的思想来解决多元分类的问题,以三个分类为例,方法是将一对三分类问题分为三个独立的二元分类问题。对每个分类$i$拟合一个logistic回归分类器$h_\theta^{(i)}(x)$来预测$y=i$的可能性。比如在三个分类器输入x运行,然后选择三个分类器中输出概率最大的那个就是预测的y的值。
过拟合问题
什么是过拟合?
- 如果我们有很多特征,训练到的假设函数也许可以很好地拟合训练集(代价函数接近于0),但是不能够**泛化(generalize)**到新的样本之中(无法预测新样本的价格)。
- 泛化(generalize):一个假设模型应用到新样本的能力。
下面是欠拟合(高偏差),正好,过拟合(高方差)的两个例子,第一个是回归问题,第二个是分类问题:
解决方法:
- 减少特征的数量:人工检查变量清单,选择保留哪些特征;使用模型选择算法。
- 正则化:保留所有特征,但是减少量级或参数$\theta$的大小。当我们有许多特征时(每一个变量都或多或少是有用的)工作良好。
正则化
上面回归问题中如果模型是:$h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2^2+\theta_3x_3^3+\theta_4x_4^4$
从之前的两个例子可知,是高次项导致了过拟合的产生,如果能够让高次项的系数接近于0的话就能很好的拟合。正则化就是在一定程度上减少这些参数$\theta$的值。
方法:在代价函数中加入对$\theta_3和\theta_4$的惩罚,在最小化代价时会选择较小的$\theta$。修改后的代价函数:
$\underset{\theta }{\mathop{\min }}\,\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{\left( {{h}_{\theta }}\left( {{x}^{(i)}} \right)-{{y}^{(i)}} \right)}^{2}}+1000\theta _{3}^{2}+10000\theta _{4}^{2}]}$通过这样的代价函数选择出的${\theta_{3}}$和${\theta_{4}}$ 对预测结果的影响就比之前要小许多。假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。
这样的结果是得到了一个较为简单的能防止过拟合问题的假设:$J\left( \theta \right)=\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})}^{2}}+\lambda \sum\limits_{j=1}^{n}{\theta_{j}^{2}}]}$其中$\lambda $又称为正则化参数(Regularization Parameter),$\lambda \sum\limits_{j=1}^{n}{\theta_{j}^{2}}$为正则化项。
- 注:根据惯例,我们不对${\theta_{0}}$ 进行惩罚。
如果$\lambda$选择过大会导致所有参数最小化,从而导致模型变为$h_\theta(x)=\theta_0$,变成了一条直线,造成欠拟合。下图是原模型,正则化后的模型和$\lambda$选择过大的模型:
所以对于正则化,我们要取一个合理的 𝜆 的值,这样才能更好的应用正则化。
线性回归的正则化
正则化线性回归的代价函数:$J\left( \theta \right)=\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})}^{2}}+\lambda \sum\limits_{j=1}^{n}{\theta_{j}^{2}}]}$
正则化线性回归的梯度下降算法如下(其中不惩罚$\theta_0$,所以有两个式子):
$Repeat$ $until$ $convergence${ ${\theta_0}:={\theta_0}-a\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{0}^{(i)}})$ ${\theta_j}:={\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}]$ $for$ $j=1,2,...n$ }对上面的算法中$ j=1,2,…,n$ 时的更新式子进行调整可得:
${\theta_j}:={\theta_j}(1-a\frac{\lambda }{m})-a\frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}$可以看出,正则化线性回归的梯度下降算法的变化在于,每次都在原有算法更新规则的基础上令$\theta $值减少了一个额外的值。
对应正规方程的版本如下,图中的矩阵为$(n+1)*(n+1)$:
logistic回归的正则化
和线性回归同理,也对代价函数增加一个正则化项,得到正则化logistic回归的代价函数:
$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}}$正则化后的模型为下图洋红色的线:
正则化logistic回归的梯度下降算法如下(其中不惩罚$\theta_0$,所以有两个式子):
$Repeat$ $until$ $convergence${ ${\theta_0}:={\theta_0}-a\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{0}^{(i)}})$ ${\theta_j}:={\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}]$ $for$ $j=1,2,...n$ }注:虽然正则化的逻辑回归中的梯度下降和正则化的线性回归中的表达式看起来一样,但由于两者的${h_\theta}\left( x \right)$不同所以还是有很大差别。
神经网络
非线性假设
之前我们已经看到过,使用非线性的多项式项,能够帮助我们建立更好的分类模型。
假设我们有非常多的特征,例如大于100个变量,我们希望用这100个特征来构建一个非线性的多项式模型,结果将是数量非常惊人的特征组合,即便我们只采用两两特征的组合$(x_1x_2+x_1x_3+x_1x_4+…+x_2x_3+x_2x_4+…+x_{99}x_{100})$,我们也会有接近5000个组合而成的特征。这对于一般的逻辑回归来说需要计算的特征太多了。
简单的logistic回归算法并不是一个在n很大时学习复杂的非线性假设的好方法,因为特征过多。
例如根据50*50像素的图片来判断是否是汽车,这是个分类问题。输入特征为图片的像素,而一张图片有2500个像素,即n = 2500,此时特征向量的维数为2500,每个像素点的值为0到255之间(这还只是灰度图像,如果使用的是RGB彩色图像,包含红绿蓝三种颜色,此时n=7500)。此时如果要使用多项式来拟合,进一步将两两特征组合成一个多项式模型,则会有约${{2500}^{2}}/2$个(接近3百万个)特征。
普通的逻辑回归模型,不能有效地处理这么多的特征,这时候我们需要神经网络。
模型展示
神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。这些神经元(也叫激活单元,activation unit)采纳一些特征作为输出,并且根据本身的模型提供一个输出。下图是一个以逻辑回归模型作为自身学习模型的神经元示例,在神经网络中,参数又可被成为权重(weight)。$x_0$为偏置
我们设计出了类似于神经元的神经网络,效果如下。其中$x_1$, $x_2$, $x_3$是输入单元(input units),我们将原始数据输入给它们。
$a_1$, $a_2$, $a_3$是中间单元,它们负责将数据进行处理,然后呈递到下一层。
最后是输出单元,它负责计算${h_\theta}\left( x \right)$。
神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。下图为一个3层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏差单位(bias unit):
下面引入一些标记法来帮助描述模型:
$a_{i}^{\left( j \right)}$ 代表第$j$ 层的第 $i$ 个激活单元。${{\theta }^{\left( j \right)}}$代表从第 $j$ 层映射到第$ j+1$ 层时的权重的矩阵,例如${{\theta }^{\left( 1 \right)}}$代表从第一层映射到第二层的权重的矩阵。其尺寸为:以第 $j+1$层的激活单元数量为行数,以第 $j$ 层的激活单元数加一为列数的矩阵。例如:上图所示的神经网络中${{\theta }^{\left( 1 \right)}}$的尺寸为 3*4。 对于上图所示的模型,激活单元和输出分别表达为: $a_{1}^{(2)}=g(\Theta _{10}^{(1)}{{x}_{0}}+\Theta _{11}^{(1)}{{x}_{1}}+\Theta _{12}^{(1)}{{x}_{2}}+\Theta _{13}^{(1)}{{x}_{3}})$ $a_{2}^{(2)}=g(\Theta _{20}^{(1)}{{x}_{0}}+\Theta _{21}^{(1)}{{x}_{1}}+\Theta _{22}^{(1)}{{x}_{2}}+\Theta _{23}^{(1)}{{x}_{3}})$ $a_{3}^{(2)}=g(\Theta _{30}^{(1)}{{x}_{0}}+\Theta _{31}^{(1)}{{x}_{1}}+\Theta _{32}^{(1)}{{x}_{2}}+\Theta _{33}^{(1)}{{x}_{3}})$ ${{h}_{\Theta }}(x)=g(\Theta _{10}^{(2)}a_{0}^{(2)}+\Theta _{11}^{(2)}a_{1}^{(2)}+\Theta _{12}^{(2)}a_{2}^{(2)}+\Theta _{13}^{(2)}a_{3}^{(2)})$上面进行的讨论中只是将特征矩阵中的一行(一个训练实例)喂给了神经网络,我们需要将整个训练集都喂给我们的神经网络算法来学习模型。
我们可以知道:每一个$a$都是由上一层所有的$x$和每一个$x$所对应的权重所决定的。(我们把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION ))
相对于使用循环来编码,利用向量化的方法会使得计算更为简便。
神经网络很像logistic回归,但输入的特征是通过隐藏层(Layer2)计算的数值。
我们可以把$a_0, a_1, a_2, a_3$看成更为高级的特征值,也就是$x_0, x_1, x_2, x_3$的进化体,并且它们是由 $x$与$\theta$决定的,因为是梯度下降的,所以$a$是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将 $x$次方厉害,也能更好的预测新数据。
下面是一个不同的神经网络架构,有两个隐藏层。
普通的逻辑回归只能使用原始的输入特征x或他们的二项式组合,但神经网络中,原始特征只是输入层,通过隐藏层可以得出一系列新特征,可以逐渐构造出越来越复杂的函数,也能得到更加厉害的特征值。
神经网络中,单层神经元(无中间层)的计算可用来表示逻辑运算,比如逻辑与(AND)、逻辑或(OR)。XNOR神经元可以通过and和or神经元来组合:
多元分类
在神经网络中实现多元分类是对之前的一对多方法的扩展。
如果要通过图像来辨别出哪些是行人,汽车,摩托车或者货车,我们所要做的就是建立一个有四个输出单元的神经网络,每个输出单元代表一个分类,如下图所示:
输入向量$x$有三个维度,两个中间层,输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现${{\left[ a\text{ }b\text{ }c\text{ }d \right]}^{T}}$,且$a,b,c,d$中仅有一个为1,表示当前类。训练集中的数据为这种形式$(x^i,y^i)$,其中$y^i$为向量形式$[0,0,0,1]^T$,并不是一个具体的数值。 ### 代价函数 我们回顾逻辑回归问题中我们的代价函数为: $ J\left(\theta \right)=-\frac{1}{m}\left[\sum_\limits{i=1}^{m}{y}^{(i)}\log{h_\theta({x}^{(i)})}+\left(1-{y}^{(i)}\right)log\left(1-h_\theta\left({x}^{(i)}\right)\right)\right]+\frac{\lambda}{2m}\sum_\limits{j=1}^{n}{\theta_j}^{2} $ 在逻辑回归中,我们只有一个输出变量,又称标量(**scalar**),也只有一个因变量$y$,但是在神经网络中,我们可以有很多输出变量,我们的$h_\theta(x)$是一个维度为$K$的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为:$\newcommand{\subk}[1]{ #1_k }$ $$h_\theta\left(x\right)\in \mathbb{R}^{K}$$ $${\left({h_\theta}\left(x\right)\right)}_{i}={i}^{th} \text{output}$$ $J(\Theta) = -\frac{1}{m} \left[ \sum\limits_{i=1}^{m} \sum\limits_{k=1}^{k} {y_k}^{(i)} \log \subk{(h_\Theta(x^{(i)}))} + \left( 1 - y_k^{(i)} \right) \log \left( 1- \subk{\left( h_\Theta \left( x^{(i)} \right) \right)} \right) \right] + \frac{\lambda}{2m} \sum\limits_{l=1}^{L-1} \sum\limits_{i=1}^{s_l} \sum\limits_{j=1}^{s_{l+1}} \left( \Theta_{ji}^{(l)} \right)^2$ 这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出$K$个预测,基本上我们可以利用循环,对每一行特征都预测$K$个不同结果,然后在利用循环在$K$个预测中选择可能性最高的一个,将其与$y$中的实际数据进行比较。 正则化的那一项只是排除了每一层$\theta_0$后,每一层的$\theta$ 矩阵的和。最里层的循环$j$循环所有的行(由$s_{l+1}$ 层的激活单元数决定),循环$i$则循环所有的列,由该层($s_l$层)的激活单元数所决定。即:$h_\theta(x)$与真实值之间的距离为每个样本-每个类输出的加和,对参数进行**regularization**的**bias**项处理所有参数的平方和。 ### 反向传播算法 个人觉得《深度学习入门》讲得比较好,反向传播实际就是利用求导的链式法则,具体细节略过。 #### 梯度检测 反向传播算法中可能存在bug但也运行的比较好,但是最后的结果可能会比最好的结果要差上一个量级(而且你还不知道)。因此需要使用**数值微分**来检测反向传播算法求导的正确性。 使用双侧差分来求代价函数在某点的导数:$ \frac{\mathrm{d} J(\theta)}{\mathrm{d} \theta} \approx \frac{J(\theta + \epsilon) - J(\theta - \epsilon)}{2\epsilon}$。只要$\epsilon$足够小,就为代价函数的导数。 ![math_gradient](math_gradient.png) 如果$\theta$为向量形式,则求代价函数关于$\theta$中每个分量的偏导数: ![math_gradient1](math_gradient1.png) 使用数值微分后与反向传播求出的导数进行对比,看是否相等或在数值上接近,如果接近说明反向传播算法计算正确。 下面是具体的梯度检测步骤: 1. 使用反向传播算法计算参数导数 2. 使用数值微分算出参数的导数 3. 确保上面两步的值只有几位小数的差距 4. 确保正确后关闭数值微分算法,使用反向传播算法来进行具体的学习 注:如果在每次梯度下降的迭代中都使用梯度检测,会使程序运行的非常慢,因为数值微分计算很慢。 ### 随机初始化 对于梯度下降法和其他先进的最优化方法,通常需要初始化参数$\theta$的值。 考虑梯度下降法的初始值设置,有几种方法: 1. 将所有参数设为0,但这是没有用的。考虑下面的神经网络,如果将第一层的参数全部设为0,会导致三个的权重相等,从而进行反向传播算法时会导致代价函数对三个参数的偏导数都相等,从而每次梯度下降参数的更新会一直相等!从而导致每层传递的特征都相等,神经网络也就失去了意义。(对称权重问题) ![initia;](initia;.png) 1. 随机初始化,可以解决对称权重问题。随机初始化一个接近0的数,在$[-\epsilon,\epsilon]$之间。 ## 调试一个学习算法 假设你已经实现了一个正则化的线性回归模型来预测房价,然而当你在一个新的房价数据集上测试你的假设函数时,你发现它做出了错误率很大的预测,此时你应该怎么办? - 获取更多的训练集(通常没用) - 尝试更少的特征,去掉多余的特征防止过拟合 - 使用额外的特征 - 尝试增加多项式特征($x_1^2,x_2^2,x_1,x_2,etc.$) - 尝试调整正则化参数$\lambda$的大小 以上的方法通常会花费很多时间而且效果不好,使用更多的方法是**机器学习诊断法(Machine learning diagnostic)**,这个方法能够让你了解算法在哪里出了问题,也能告诉你要想改进一种算法怎么做才是有意义的。 ### 模型评估 如何评估一个模型? 第一种方法是画出假设函数的图形,是否拟合训练集的数据。但当特征很多时就变得不可能了。 另一种方法是将数据集打乱,按照7:3的比例划分为训练集和测试集,然后从训练集中学习参数$\theta$(通过最小化代价函数$J(\theta)$),然后在测试集上计算误差。(其实交叉验证的方法更好) - 注:逻辑回归的代价函数还可以使用0/1分类误差 ![0-1](0-1.png) ### 使用交叉验证集 假设要在几个多项式模型中选择一个,如下图所示: ![yanzheng](yanzheng.png) 此时不能够使用测试集来选择模型,然后再使用相同的测试集来评估泛化能力(这是的泛化能力肯定好)。而是要划分出一份额外的**交叉验证集**用于模型的选择。通常按照6:2:2的比例来划分训练集,交叉验证集和测试集。 具体步骤为使用训练集来训练模型,使用验证集来选择模型,使用测试集来评估模型的泛化能力。 ### 诊断偏差和方差 出现高偏差(high bias)则代表欠拟合,出现高方差(high variance)代表过拟合。判断高偏差还是高方差的方法: - 如果训练集误差和测试集(或验证集 )的代价函数损失都很大,则出现了高偏差。 - 如果训练集的误差很小,远远小于测试集或验证集的误差,说明出现了高方差。 ![baisandvariance](baisandvariance.png) #### 正则化和方差、偏差 之前说过,加入正则化项可以一定程度上避免过拟合,避免高方差。 正则化参数$\lambda$的选择十分重要,下面是选择方法: 1. 通过选取不同的$\lambda$值得到了12组模型(通常$\lambda$值的变化为两倍) 2. 然后通过训练集来训练,使用交叉验证集来评价 3. 选取交叉验证集的代价函数最小的模型作为最终选择 ![lambda](lambda.png) 可以借助画图来找出最佳的$\lambda$,但注意,加入了正则化项后的代价函数只用来梯度下降的参数更新,但是真正的代价函数是不包括正则化项的,画图时要注意 ![lambda1](lambda1.png) #### 学习曲线 训练集的样本数大小也会对代价函数的大小和偏差和方差产生影响。可以通过查看学习曲线来判断学习算法是否出现了高偏差和高方差。 看看高偏差的情形,此时假设函数为一条直线。当训练集的样本数过小时会拟合的非常好,训练集的代价函数的值会很小,但是交叉验证集的损失会很大。随着训练集样本数的逐渐增大,模型不能拟合的数据点会逐渐增多,训练集损失函数的值也会逐渐增大;交叉验证集的损失会逐渐减小,最后会逼近一条直线,此时训练集的损失和交叉验证集的损失几乎一样,但是两者的损失都停留在很大的一个值,此时再增大训练集的数据变化也帮助不大了,出现了高偏差的情形。 ![high bias](high bias.png) 下面是高方差的情形,假设函数的多项式次数很高。随着训练集样本容量的增大,训练集的误差会逐渐增大,但是总体的值仍处于一个很低的数值;交叉验证集的误差会逐渐变小,但是与训练集的误差会相差很大的数值,但是随着训练集数据的增大,两条曲线会逐渐靠近。 ![learning curve](learning curve.png) 总结: - 当模型出现了高偏差时,增大训练集的容量帮助不会太大,训练集和验证集的损失会逐渐接近,但最后都很大 - 当模型出现了高方差时,增大训练集的容量可能有用,训练集和验证集的损失会有差距,但会逐渐接近 - 通过查看学习曲线,可以查看高偏差和高方差的情形,避免一直增大训练集的样本数 ### 决定接下来做什么 回到最初的问题:假设你已经实现了一个正则化的线性回归模型来预测房价,然而当你在一个新的房价数据集上测试你的假设函数时,你发现它做出了错误率很大的预测,此时你应该怎么办?经过上面的学习,可以知道如何选择解决的方法: - 获取更多的训练集(应该先画出学习曲线图,看是否有方差问题),可以解决高方差的问题。 - 尝试更少的特征,去掉多余的特征防止过拟合,可以解决高方差问题,对高偏差无用 - 使用额外的特征,可以解决高偏差 - 尝试增加多项式特征($x_1^2,x_2^2,x_1,x_2,etc.$)可以解决高偏差 - 尝试调整正则化参数$\lambda$的大小,增大可以解决高偏差,减小可以解决高方差 此外,神经网络模型的选择也会产生过拟合问题,一个大型复杂的神经网络更容易出现过拟合,此时需要配合正则化来修正过拟合问题,而且效果很好。 具体选择多少层的神经网络,可以使用交叉验证集的方法来选择。 ## 机器学习系统的设计 以设计一个垃圾邮件分类器为例,要利用监督学习,首先要考虑**输入的特征是什么**。这里可以将某个单词的出现作为特征,那么特征向量$x$就是选择出现频率最多的100个单词按照字典序排序组成的向量,如果对应的分量的单词在邮件中出现,则对应分量的值为1。而输出$y = 1$则为垃圾邮件,否则不是。 接下来就开始设计一个垃圾邮件分类器了,如何使得分类器有比较低的错误率? - 收集大量的数据(大多数时间不管用) - 使用更加复杂的特征向量来描述邮件,比如邮件头部中的发件人信息 - 为邮件主体部分构建复杂的特征向量,如是否将"deal"和"dealer"视作同一个? - 使用复杂的算法来检测邮件中的拼写错误,有些垃圾邮件故意拼写错误来避免检测 - 等等...... 究竟选择哪个方法来改进学习算法,不同的人有不同的选择,但最好还是使用误差分析来选择 ### 误差分析 设计一个系统推荐的步骤: 1. 以一个简单,能够快速实现的算法开始。实现它并且使用交叉验证来测试它 2. 画出学习曲线来确定是否添加更多的特征、更多的数据 3. 误差分析:手工检查那些在交叉验证集中出错的样本,分析这些出错的样本是否有什么共同的特点和规律 以垃圾邮件分类器为例,通过手动查看误分类的100份数据,下面确定了分类器在判断钓鱼邮件(steel passwords)的表现较差(53份),然后分析这类邮件的特征,考虑是否有更好的特征来将他们正确分类,然后在钓鱼邮件中发现大部分(32份)都有奇怪的标点符号,此时可以考虑设计一个更复杂的基于标点符号的特征。 ![img](file:///C:\Users\MEC\AppData\Roaming\Tencent\Users\425331389\QQ\WinTemp\RichOle\`J4DB]_VBF9NN``T@I()K{1.png) 这就是为什么推荐先设计一个简单粗暴的算法,我们的目标是**找出这种算法最难以分类的样本。**对不同的算法,最难分类的样本是相似的,这样可以很快找出算法的不足。 #### 数值评价的重要性 在垃圾邮件分类器中要考虑是否将discount/discounts/discounted/discounting看作同一个单词,此时误差分析可能帮助不大,唯一的解决方法是尝试使用它并查看工作情况。 此时需要单一数值(如交叉验证集上的错误率)来评估算法在这两种情况下的表现,通过比较两者的错误率可以决定是否采用此方法。 推荐在**验证集上使用误差分析,而不是测试集**。 ### 不对称性分类的误差评估 当正样本和负样本的比例近于一个极端情况时,使用误分类率来评估算法会出现一些问题。 如在之前的癌症分类的问题中如果只有0.5%的患者有癌症,即使使用一个总是预测患者没有癌症的非机器学习算法也只有0.5%的误分类率,比一般的机器学习算法还要好。这0.5%的样本叫做**偏斜类。** 由于有偏斜类的存在,通常使用精准率(precision)和召回率(recall)来评估模型。 下面是二类分类问题的精准率/召回率的定义: - TP:将正类预测为正类的数量 - FN:将正类预测为负类的数量 - FP:将负类预测为正类的数量 - TN:将负类预测为负类的数量 - 精准率:$P = \frac{TP}{TP+FP}$ - 召回率:$R = \frac{TP}{TP+FN}$ 只有两者的值都很好才是一个好的模型 #### 精准率和召回率的权衡 拥有较高的精准率往往召回率会比较低,而召回率高的精准率则比较低,因此要对两者进行权衡。 如预测癌症,要想获得较高的精准率则可以调高预测的阈值,但此时会忽略掉一些确实得了癌症的患者;而调低阈值确实会预测到大部分患有癌症的患者,但是也会将很多没有癌症的患者预测为患有癌症。 如何选择精准率和召回率的值,有另一种指标可以用来权衡:F1值,是精准率和召回率的调和均值。 - $F_1 = \frac{2PR}{P+R}$ $F_1$值高的算法好,可以在交叉验证集上测试来得到较好的F值。 ## 支持向量机(SVM) 支持向量机SVM在学习复杂的非线性方程时能够提供一种更加强大的方式。 ### 优化目标 svm优化的目标函数为下图所示,其中c为正则化参数。$C$ 较大时,可能会导致过拟合,高方差。$C$ 较小时,可能会导致低拟合,高偏差。 ![svm](svm.png) 这是我的支持向量机模型的代价函数,在左边这里我画出了关于$z$的代价函数${\cos}t_1{(z)}$,此函数用于正样本,而在右边这里我画出了关于$z$的代价函数${\cos}t_0{(z)}$,横轴表示$z$,现在让我们考虑一下,最小化这些代价函数的必要条件是什么。如果你有一个正样本,$y=1$,则只有在$z>=1$时,代价函数${\cos}t_1{(z)}$才等于0。 换句话说,如果你有一个正样本,我们会希望$\theta^Tx>=1$,反之,如果$y=0$,我们观察一下,函数${\cos}t_0{(z)}$,它只有在$z<=-1$的区间里函数值为0。这是支持向量机的一个有趣性质。事实上,如果你有一个正样本$y=1$,则其实我们仅仅要求$\theta^Tx$大于等于0,就能将该样本恰当分出,这是因为如果$\theta^Tx$\>0大的话,我们的模型代价函数值为0,类似地,如果你有一个负样本,则仅需要$\theta^Tx$\<=0就会将负例正确分离,但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,**即不仅仅要求$\theta^Tx$\>0**,我们需要的是比0值大很多,比如大于等于1,我也想这个比0小很多,比如我希望它小于等于-1,这就相当于在支持向量机中嵌入了一个额外的安全因子,或者说安全的间距因子。 具体参考李航的《统计学习方法》 ### 核函数(Kernel function) 回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类问题,我们的模型可能是${{\theta }_{0}}+{{\theta }_{1}}{{x}_{1}}+{{\theta }_{2}}{{x}_{2}}+{{\theta }_{3}}{{x}_{1}}{{x}_{2}}+{{\theta }_{4}}x_{1}^{2}+{{\theta }_{5}}x_{2}^{2}+\cdots $的形式。我们可以用一系列的新的特征$f$来替换模型中的每一项。例如令: ${{f}_{1}}={{x}_{1}},{{f}_{2}}={{x}_{2}},{{f}_{3}}={{x}_{1}}{{x}_{2}},{{f}_{4}}=x_{1}^{2},{{f}_{5}}=x_{2}^{2}$ ...得到$h_θ(x)={{\theta }_{1}}f_1+{{\theta }_{2}}f_2+...+{{\theta }_{n}}f_n$。 ![kelnel](kelnel.png) 然而,除了对原有的特征进行组合以外,有没有更好的方法来构造$f_1,f_2,f_3$?我们可以利用核函数来计算出新的特征。 给定一个训练样本$x$,我们利用$x$的各个特征与我们预先选定的**地标**(**landmarks**)$l^{(1)},l^{(2)},l^{(3)}$的近似程度来选取新的特征$f_1,f_2,f_3$。 可以使用高斯核函数来选取:${{f}_{1}}=similarity(x,{{l}^{(1)}})=e(-\frac{{{\left\| x-{{l}^{(1)}} \right\|}^{2}}}{2{{\sigma }^{2}}})$ 这些地标的作用是什么?如果一个训练样本$x$与地标$l$之间的距离近似于0,则新特征 $f$近似于$e^{-0}=1$,如果训练样本$x$与地标$l$之间距离较远,则$f$近似于$e^{-(一个较大的数)}=0$。 在下图中,当$h_θ(x)=θ_0+θ_1f_1+θ_2f_2+θ_1f_3>0$时预测y=1,否则y=0。当样本处于洋红色的点位置处,因为其离$l^{(1)}$更近,但是离$l^{(2)}$和$l^{(3)}$较远,因此$f_1$接近1,而$f_2$,$f_3$接近0。因此$h_θ(x)=θ_0+θ_1f_1+θ_2f_2+θ_1f_3>0$,因此预测$y=1$。同理可以求出,对于离$l^{(2)}$较近的绿色点,也预测$y=1$,但是对于蓝绿色的点,因为其离三个地标都较远,预测$y=0$。 ![svm2](svm2.png)通过标记点和相似性函数来定义新的特征变量,可以训练到复杂的决策边界,能够在支持向量机中很好的使用。 #### 标记点的选择 我们通常是**根据训练集的数量**选择地标的数量,即如果训练集中有$m$个样本,则我们选取$m$个地标,并且令:$l^{(1)}=x^{(1)},l^{(2)}=x^{(2)},.....,l^{(m)}=x^{(m)}$。这样做的好处在于:现在我们得到的新特征是建立在原有特征与训练集中所有其他特征之间距离的基础之上的。 #### 使用SVM 选择好标记点后,此时可以将训练特征x通过高斯核函数转换为新的特征f,其中$f_i = similarity(x, l^i)$, $f = [f_1,f_2,...,f_m]^T$。![svm3](svm3.png) 此时修改我们的支持向量机假设为: • 给定$x$,计算新特征$f$,当$θ^Tf>=0$ 时,预测 $y=1$,否则反之。 相应地修改代价函数为:$\sum{_{j=1}^{n=m}}\theta _{j}^{2}={{\theta}^{T}}\theta $, $min C\sum\limits_{i=1}^{m}{[{{y}^{(i)}}cos {{t}_{1}}}( {{\theta }^{T}}{{f}^{(i)}})+(1-{{y}^{(i)}})cos {{t}_{0}}( {{\theta }^{T}}{{f}^{(i)}})]+\frac{1}{2}\sum\limits_{j=1}^{n=m}{\theta _{j}^{2}}$ 另外,支持向量机也可以不使用核函数,不使用核函数又称为**线性核函数**(**linear kernel**),当我们不采用非常复杂的函数,或者我们的训练集特征非常多而样本非常少的时候,可以采用这种不带核函数的支持向量机。 下面是支持向量机的两个参数$C$和$\sigma$的影响: $C=1/\lambda$ $C$ 较大时,相当于$\lambda$较小,可能会导致过拟合,高方差; $C$ 较小时,相当于$\lambda$较大,可能会导致低拟合,高偏差; $\sigma$较大时,可能会导致低方差,高偏差; $\sigma$较小时,可能会导致低偏差,高方差。 此外,在高斯核函数之外我们还有其他一些选择,如: - 多项式核函数(**Polynomial Kerne**l) - 字符串核函数(**String kernel**) - 卡方核函数( **chi-square kernel**) - 直方图交集核函数(**histogram intersection kernel**) - 等等... 这些核函数的目标也都是根据训练集和地标之间的距离来构建新特征,这些核函数需要满足Mercer's定理,才能被支持向量机的优化软件正确处理。 尽管你不去写你自己的**SVM**的优化软件,但是你也需要做几件事: 1、是提出参数$C$的选择。我们在之前的视频中讨论过误差/方差在这方面的性质。 2、你也需要选择内核参数或你想要使用的相似函数,其中一个选择是:我们选择不需要任何内核参数,没有内核参数的理念,也叫线性核函数。因此,如果有人说他使用了线性核的**SVM**(支持向量机),这就意味这他使用了不带有核函数的**SVM**(支持向量机)。 ### 逻辑回归和支持向量机的选择 从逻辑回归模型,我们得到了支持向量机模型,在两者之间,我们应该如何选择呢? **下面是一些普遍使用的准则:** $n$为特征数,$m$为训练样本数。 (1)如果相较于$m$而言,$n$要大许多,即**训练集数据量不够支持我们训练一个复杂的非线性模型**,我们选用逻辑回归模型或者不带核函数的支持向量机。 (2)如果$n$较小,而且$m$大小中等,例如$n$在 1-1000 之间,而$m$在10-10000之间,使用高斯核函数的支持向量机。 (3)如果$n$较小,而$m$较大,例如$n$在1-1000之间,而$m$大于50000,则使用支持向量机会非常慢,解决方案是**创造、增加更多的特征**,然后**使用逻辑回归**或不带核函数的支持向量机。 值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。 # 无监督学习 监督学习的任务是我们又一系列带标签的数据,然后用假设函数去拟合它们。 无监督学习的任务就是将一系列无标签的数据输入到算法中,然后让算法找到一些隐含在数据中的结构。具体的算法如聚类和降维 ![wujiandu](wujiandu.png) ## K均值(K-means)算法(聚类) k均值算法是一个聚类算法。 下面举例说明K-means算法的步骤,所用数据点如下图所示: ![km](km.png) 1. 第一步随机生成两点,这两点叫聚类中心(cluster centroid) ![cluster2](cluster2.png) 1. 簇分配:遍历数据集中每个点,看与哪个聚类中心的距离进,就将其分配给哪个聚类中心 ![cluster3](cluster3.png) 1. 移动聚类中心:计算两个聚类的均值(平均位置),如计算出红色点的均值,将红色聚类中心的位置移动到均值处,蓝色同理 2. 回到2进行循环迭代,直至聚类中心不在变化,k均值已经聚合为止 ![cluster4](cluster4.png) 下面是k-means算法的定义(假设有k个簇): ![km2](km2.png) ![km3](km3.png) 如果有一个没有点的聚类中心,可以做的选择就是直接移除它,此时只有k-1个聚类了。 ### 优化目标 ![km4](km4.png) 即每个点到其对应的聚类中心的距离的平均值最小。此代价函数也叫做失真代价函数(畸变函数)。 K-means方法的簇分配实际上就是$J$关于$C$的最小化,而移动聚类中心就是$J$关于$\mu$的最小化。所以k-means算法按照步骤运行就是在最小化代价函数。 ### 随机初始化 随机初始化的步骤如下图 ![km5](km5.png) 1. 随机选取K个点,K要小于训练样本数m 2. 将这K个点设为聚类中心 由于初始选取的聚类中心点不同,最后的聚类也可能不同。即K-means算法可能收敛到局部最优,也就是畸变函数的局部最优解 。如下图所示 ![km6](km6.png) 解决方法是进行多次随机初始化,选取畸变函数值最小的那一次作为初始值进行K-means算法。此方法在K值较小时效果明显。 ![km7](km7.png) ### 选取聚类数量 方法一:使用肘部法则。先画出以聚类数量为自变量,畸变函数值为因变量的图像,然后根据肘部法则来选取聚类数量。但是真实的图像往往使用不了肘部法则 。 ![km8](km8.png) 方法二:根据后续目的来选择聚类数量。使用聚类算法往往是为其他目的服务的,如市场分割,计算机集群等等。可以考虑后续目的来进行聚类数量的选择。下面是一个t-shirt市场分割,可以根据t-shirt的尺寸进行聚类数量的选择,下图考虑了3个和5个。 ![km9](km9.png) ## 降维 有几个不同的的原因使你可能想要做降维。一是数据压缩,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快我们的学习算法。 下面是二维降一维和三维降二维的例子 ![jiangwei1](jiangwei1.png) ![jiangwei](jiangwei.png) 二是可视化。在许多及其学习问题中,如果我们能将数据可视化,我们便能寻找到一个更好的解决方案,降维可以帮助我们。 下面是将50维的数据降成2维,降维后每个点代表一个国家,降维后就可以可视化了,否则无法将50维的数据可视化。这样做的问题在于,降维的算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现了。 ![keshi](keshi.png) ![keshi1](keshi1.png) 这个例子中,新的特征代表的含义可能是之前几个的综合体 ### 主成分分析方法PCA 主成分分析(**PCA**)是最常见的降维算法。 在**PCA**中,我们要做的是找到一个方向向量(**Vector direction**),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度。 ![pca1](pca1.jpg) 下面给出主成分分析问题的描述: 问题是要将$n$维数据降至$k$维,目标是找到向量$u^{(1)}$,$u^{(2)}$,...,$u^{(k)}$使得总的投射误差最小。 ![pca](pca.png) 主成分分析与线性回归的区别: - 主成分分析最小化的是投射误差(**Projected Error**),而线性回归尝试的是最小化预测误差。左边的是线性回归的误差(垂直于横轴投影),右边则是主要成分分析的误差(垂直于红线投影) ![pca2](pca2.png) - 线性回归的目的是预测结果,而主成分分析不作任何预测。 - PCA中所有变量的地位都是相同的,而线性回归中是用其他维来预测另一维的值(x与y) **PCA**将$n$个特征降维到$k$个,可以用来进行数据压缩,如果100维的向量最后可以用10维来表示,那么压缩率为90%。同样图像处理领域的**KL变换**使用**PCA**做图像压缩。但**PCA** 要保证降维后,还要保证数据的特性损失最小。 **PCA**技术的一大好处是对数据进行降维的处理。我们可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。 **PCA**技术的一个很大的优点是,它是完全无参数限制的。在**PCA**的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。 但是,这一点同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。 =0就会将负例正确分离,但是,支持向量机的要求更高,不仅仅要能正确分开输入的样本,**即不仅仅要求$\theta^Tx$\>=-1$的区间里函数值为0。这是支持向量机的一个有趣性质。事实上,如果你有一个正样本$y=1$,则其实我们仅仅要求$\theta^Tx$大于等于0,就能将该样本恰当分出,这是因为如果$\theta^Tx$\>