吴恩达机器学习总结

视频学习地址:https://study.163.com/course/courseMain.htm?courseId=1004570029

内容主要包含:

有监督学习:线性回归;逻辑回归;神经网络;支持向量机(SVM)。

无监督学习:聚类算法、主成分分析(PCA)、异常检测

应用机器学习的建议(模型和参数的选择、对应不同问题选择的优化解决方法);机器学习系统设计|(误差分析)。

应用:推荐系统、大规模机器学习

一、初识机器学习

机器学习应用:数据挖掘、垃圾邮件识别、自然语言处理、手写数字识别、图像识别等。

机器学习的定义:计算机程序从经验E中学习,解决某一任务T,进行某一性能度量P。通过测定P在T上的变现因E而提高。

机器学习算法:监督学习(教会计算机学习);无监督学习(让计算机自己学习);强化学习;推荐系统等。

回归用于预测连续值输出;分类用于预测离散值输出。J\left(\theta_{0}, \theta_{1} \ldots \theta_{n}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}

使用octave建立算法原型。

二、单变量线性回归

只有一个特征或输入变量的问题交单变量线性回归问题,假设h_{\theta}(x)={\theta}_{0}+\theta_{1} x,代价函数为:J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2},我们的目的是要求得代价函数最小时对应的参数,代价函数越小代表预测值与实际值得差值越小。

梯度下降算法:是一种用于求函数最小值的算法,通常用于求代价函数的最小值,其原理为先初始化参数,直到代价函数达到最小值,参数不再更新。其中\alpha为学习率,代表梯度下降时迈的步子有多大,\alpha太大,梯度下降算法可能越过最低点,甚至无法收敛;\alpha太小,梯度下降收敛的速度很慢。在实际中通常尝试不同的\alpha值,通过观察代价函数与迭代次数的图形来选择合适的\alpha,如...0.001,0003,0.01,0.03,0.1,0.3,1,...。在梯度下降算法中,当代价函数接近局部最小值时,该点的斜率越来越小,即导数越来越小,直到导数为0参数不再更新,因此没有必要再另外去减小\alpha的值。梯度下降算法容易陷入局部最优。

\theta_{j}:=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J(\theta)

三、多变量线性回归

多变量线性回归与单变量线性回归类似,代价函数为:J\left(\theta_{0}, \theta_{1} \ldots \theta_{n}\right)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2},其中h_{\theta}(x)=\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\ldots+\theta_{n} x_{n}=\theta^{T} X,我们仍然是要求代价函数最小值时对应的一系列参数,用梯度下降对参数进行更新:\theta_{\mathrm{j}}:=\theta_{\mathrm{j}}-\alpha \frac{\partial}{\partial \theta_{j}} \mathrm{J}\left(\theta_{0}, \theta_{1}, \ldots, \theta_{\mathrm{n}}\right)

当面对多维特征时,通常对特征值进行特征缩放(feature scaling)或者归一化,使得输入的特征具有相似的尺度,这样提法下降算法收敛的速度会更快,比如将所有的特征尺度缩放到(-1,1)之间。

正规方程:通过一下公式直接求我们想要的最优参数\theta,该公式由J(\theta)对\theta求偏导等于0时有最小值推导而来。一般情况下当特征数较小时选择正规方程求解,特征数较大时采用梯度下降算法求解,特征数超过10000即可认为较大。正规方程不用对学习率进行选择,但只适用于线性模型,当特征数很大时进行矩阵运算代价大。

\theta=\left(X^{T} X\right)^{-1} X^{T} y

从正规方程可以看出涉及到矩阵的求逆运算,当矩阵不可逆时主要有两个原因,一是出现了多余的特征,比如某些特征间存在线性关系,一个特征可以用其它特征的线性方程表示,则出现了冗余的特征,可以删除重复的特征;另一个是样本数量很少,特征数量却很大也会出现不可逆,可以删除一些不重要的特征。

四、matlab操作

pwd:查看当前所在路径
sprintf:格式化输出
cd+路径,进入某一个路径
load  路径  或    load('路径'):加载外部文件
who:查看当前变量
 whos:显示当前变量及其更详细的信息,变量类型、所占空间等
save用于保存变量。如save hello.mat v,将v变量中的值保存为 hello文件。
save hello.txt v -ascii,把文件保存为ASCII形式,,否则txt中的数据为乱码。
clear a,清除a变量;clear或 clear all,清除所有变量。
C=[A B]或C=[A,B],两个矩阵相连接,将矩阵B放在矩阵A后面,B应该与A有相同的行数;
C=[A;B],矩阵B放在矩阵A下面,A与B应该有相同的列数。
size(A),返回矩阵的大小,size(A,1)返回行的大小,size(A,2)返回列大小。
length(A),返回A行列数中最大的值;一般用于求向量大小,矩阵用size。
magic(n),产生大小为n×n的魔方阵。
pinv(A),计算A的逆矩阵,A乘以A的逆矩阵等于单位矩阵。
rand(n),产生大小为n×n的随机矩阵,值的范围为0-1。
max(A),默认返回每一列的最大值,结果为一个行向量。
max(A,[],1),返回每一列的最大值,max(A,[],2),返回每一行的最大值。
max(A,B),A和B大小相同,将其相同位置的元素两两比较,返回较大的一个。
close,绘画窗口关闭。
imagesc(A),产生大小与矩阵A相同的白色格子图;imagesc(A),colorbar,colormap gray,添加一个颜色条,格图为灰色。
print -dpng 'myplot.png',将绘制的图片保存。
addppath(路径),将还路径添加到搜索路径中,之后即使在其他路径下也可以调用该路径下的文件。

五、逻辑回归(logistic regression)

线性回归若用于分类问题通常得不到好的结果,并且输出值远大于1或远小于0,而不是0或1,所以通常不使用线性回归处理分类问题。逻辑回归虽然有“回归”二字,但它是用来分类的。

假设回归方程为:h_{\theta}(x)=\theta^{T} x,因为这是一个分类问题,我们期望输出的值在0~1之间,即0 \leq h_{\theta}(x) \leq 1,我们知道有一个函数叫sigmoid函数(也叫logistic函数),这也是逻辑回归名词的由来:g(z)=\frac{1}{1+e^{-z}},它的函数值得范围为(0~1),因此令{h}_{\theta}(x)=g\left(\theta^{T} x\right)=\frac{1}{1+e^{-\theta^{\top} x}},这样就可以将假设函数的输出值压缩到0-1之间,输出值的大小代表该输入特征属于某一类的概率。可以将公式解释为已知输入x和参数,输出为1的概率为:h_{\theta}(x)=p(y=1 | x ; \theta),输出为0的概率为:h_{\theta}(x)=P(y=0 | \boldsymbol{x}; \theta)=1-P(y=1 | x ; \theta)

sigmoid函数分布如下:g(z)=\frac{1}{1+e^{-z}}

由上面的分析知道h_{\theta}(x)的值为(0~1),但我们最终要将其分为某一类,假设当h_{\theta}(x) \geq 0.5时,预测值Y=1(即分为类‘1’),当h_{\theta}(x)<0.5时,预测值Y=0(即分为类‘0’)【一般来说1代表正样本,0代表负样本】。从sigmoid函数图可知当z>0时函数值>0.5,z<0时函数值<0.5,即\theta^{T} x>0时h_{\theta}(x)>=0.5,\theta^{T} x<0时,h_{\theta}(x)<0.5,则我们可将分类规则描述为:\theta^{T} x>0,判为正样本,\theta^{T} x<0判为负样本,\theta^{T} x=0所对应的函数就是决策界限,决策界限不是训练集的属性,而是假设本身及其参数的属性。

我们知道通过决策界限判定数据所属类别,前提是参数\theta已知,同样还是通过求解代价函数的最小值来求解\theta,如果代价函数采用与线性回归中的代价函数相同的形式,即J\left(\theta\right)=\frac{1}{ m} \sum_{i=1}^{m}\frac{1}{2 }\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2},由于h_{\theta}(x)是一个非常复杂的非线性函数,导致J\left(\theta\right)是一个非凸函数,有很多局部最优解,此时采用梯度下降算法不会得到全局最优解。

我们将逻辑回归的代价函数定义为:J\left(\theta\right)=\frac{1}{ m} \sum_{i=1}^{m}Cost\left(h_{\theta}\left(x\right),y\right)Cost\left(h_{\theta}\left(x\right),y\right)=-log(h_\theta(x)),if y=1;

Cost\left(h_{\theta}\left(x\right),y\right)=-log(1-h_\theta(x)),if y=0。将以上两种形式可以合并为:Cost\left(h_{\theta}\left(x\right),y\right)=-ylog(h_\theta(x))-(1-y)log(1-h_\theta(x)),最终可以得到逻辑回归中代价函数的表现形式为:

J\left(\theta\right)=\frac{1}{ m} \sum_{i=1}^{m}Cost\left(h_{\theta}\left(x^{(i)}\right),y^{(i)}\right)=-\frac{1}{ m} [\sum_{i=1}^{m}y^{(i)}log(h_\theta(x^{i}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]

同样用梯度下降算法求损失函数的最小值:\theta_{\mathrm{j}}:=\theta_{\mathrm{j}}-\alpha \frac{\partial}{\partial \theta_{j}} \mathrm{J}\left(\theta\right)=\theta_{j}-\alpha \frac{1}{m}\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)x_{j}^{(i)}

参数更新的形式看起来和线性回归一样,实际上是完全不同的,在逻辑回归中{h}_{\theta}(x)=\frac{1}{1+e^{-\theta^{\top} x}},而在线性回归中h_{\theta}(x)=\theta^{T} X

除了梯度下降算法外,还有一些常用的:Conjugate gradient、BFGS、L-BFGS,它们不需要选择学习率,收敛速度快,但比梯度下降更复杂。

 

逻辑回归解决多分类(一共有i类)问题:构造i个标准的逻辑回归分类器,当对新的数据进行类别预测时,以这i个分类器中较大值为最终结果。max h_{\theta}^{(i)}(x)

六、正则化

过度拟合指模型在训练集上的表现很好,在新的数据集上的表现很差。

降低过拟合的方法:减少特征的数量,可以选择去掉一些不重要的特征;正则化,保留所有的特征,限制参数的量级。

在对训练集进行拟合时,为了使假设函数尽可能穿过所有的点,通常假设函数的形式会很复杂,这也导致了过拟合,我们可以在损失函数后加上对某些参数的限制,因为不知道具体对哪些参数进行限制,一般加上所有参数,由于损失函数要最小,损失函数后加的关于参数的部分就会接近于0,在保留了所有特征的情况下不会让假设函数很复杂而导致过拟合。例如线性回归的损失函数可以表示如下:其中\lamda\lambda为正则化参数,如果\lambda过大,则对参数的惩罚度过大,又会导致欠拟合。

 

线性回归的正则化

线性回归损失函数加上正则项后:

J\left(\theta\right)=\frac{1}{2 m}[\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+\lambda\sum_{j=1}^{n}\theta_j^{2}]

梯度下降算法+正则项:

\theta_{\mathrm{0}}:=\theta_{0}-\alpha \frac{1}{m}\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)x_{0}^{(i)}

\theta_{\mathrm{j}}:=\theta_{j}-\alpha [\frac{1}{m}\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)x_{j}^{(i)}+\frac{\lambda}{m}\theta_j](j=1,2,3,...,n)

合并相同项:

\theta_{\mathrm{j}}:=\theta_{j}(1-\alpha\frac{\lambda}{m})-\alpha \frac{1}{m}\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)x_{j}^{(i)}

 

正规方程+正则化:使用正规方程求参数时,如果损失函数加了正则项,参数的计算表达式如下,在一般情况下加了一项,还可以解决矩阵不可逆的问题。此时的参数求解方法和没有加正则项时一样,通过\frac{\partial J(\theta)} {\partial \theta} =0得到如下结果:

X=\left[ \begin{matrix} \left (x^{(1)} \right )^{T}\\ \vdots\\ \left (x^{(m)} \right )^{T} \end{matrix} \right ]                   y=\left[ \begin{matrix} \left (y^{(1)} \right )^{T}\\ \vdots\\ \left (y^{(m)} \right )^{T} \end{matrix} \right ]

 

逻辑回归的正则化

逻辑回归损失函数加上正则项后:

J\left(\theta\right)=-\frac{1}{ m} [\sum_{i=1}^{m}y^{(i)}log(h_\theta(x^{(i)}))+(1-y^{(i)})log(1-h_\theta(x^{(i)}))]+\frac{\lambda}{2m}\sum_{j=1}^{n}\theta_j^{2}

使用梯度下降算法求参数:

\theta_{\mathrm{0}}:=\theta_{0}-\alpha \frac{1}{m}\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)x_{0}^{(i)}

\theta_{\mathrm{j}}:=\theta_{j}-\alpha [\frac{1}{m}\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)x_{j}^{(i)}+\frac{\lambda}{m}\theta_j](j=1,2,3,...,n)

因为\theta_0是常数,求导后为0,正则项不会对\theta_0造成影响,所以梯度下降时\theta_0和其他\theta分开算。

 

梯度下降的方式分为三种:批量梯度下降(Batch Gradient Descent),随机梯度下降(stochastic gradient descent),小批量随机下降(mini-batch Gradient Descent)。批量梯度下降(BGD)针对的是整个数据集,通过对所有的样本的计算来求解梯度的方向。但是在实际应用中数据量往往会很大,从而导致使用批量梯度下降的效率变得很低,因此引入了随机批量下降法(SGD),随机梯度下降法是每次迭代只针对单个样本计算损失函数对参数的偏导数,从而寻找一个梯度来更新参数,因此效率高于BGD,但是SGD也有一定的局限性,它的收敛效果不如BGD好,因为每次只使用单个样本进行计算。而小批量随机下降(MBGD)又针对SGD进行了改进,一次性针对一小部分样本来计算,因此在提高效率的同时也比SGD更加稳定,降低了随机性。

七、神经网络学习、反向传播算法

神经网络中的代价函数:K代表输出单元数,L为神经网络的层数。

J\left(\theta\right)=-\frac{1}{ m} [\sum_{i=1}^{m}\sum_{k=1}^{K}y_k^{(i)}log(h_\theta(x^{(i)}))_k+(1-y_k^{(i)})log(1-h_\theta(x^{(i)}))_k]+\frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}(\theta_{ji}^{(l)})^2

反向传播推导过程参考:https://blog.csdn.net/Cowry5/article/details/80370798

梯度检测:在模型正式使用前对梯度进行检测,通过数值估计法计算梯度,将该梯度与返向传播法计算出的梯度进行比较,如果这两种方法计算出的结果相等或者十分接近,说明反向传播的实现是正确的。然后在使用该代码进行学习时应把梯度检测关闭,因为梯度检测代码比反向传播计算速度慢很多,我们用其计算梯度只是为了验证反向传播计算的梯度是否正确。

参数初始化:一般对参数进行随机初始化,而不是全初始化为0。如果全部初始化为0,参数虽然会更新,但它们的值始终相等,所有的隐藏单元都在学习相同的特征,出现高度冗余。

训练神经网络的过程:1、构建网络,随机初始化权重,初始化为很小的值,接近于0;2、使用前向传播计算每一个输入样本对应的输出值;3、计算代价函数;4、通过反向传播计算代价函数对参数的偏导,即梯度;5、进行梯度检测,将4中计算出的偏导值与数值估计计算出的值比较,确保反向传播结果的准确性;5、使用梯度下降算法或其他优化算法求得使代价函数最优对应的参数值。

八、应用机器学习的建议

评估假设:一般选择数据集的70%作为训练集,30%作为测试集,如果数据服从某种规律分布,应随机选择数据,如果数据本身服从随机分布,可以直接取前70%作为训练集,剩下的作为测试集。通过训练集计算出最优参数theta ,然后计算 测试集的代价函数值。 

模型选择:假设函数模型的选择通常将数据集按60%、20%、20%的比例分为训练集(training data)、交叉验证集(cross validation data)、测试集(test data),而不是仅仅分为训练集和测试集,如果通过测试集来选择模型,泛化能力可能很弱,因为我们只关注了模型在测试集上的效果,而不是那些新的样本。具体模型选择过程为:假设有多个模型,在训练集上得到每个模型代价函数最小时对应的参数,将这些参数用于验证集计算代价函数值,选取验证集上代价函数最小的参数所对应的模型,然后将该模型用于测试集,计算其在测试集上的代价函数值。

可以通过学习曲线判断是否出现欠拟合或过拟合。在学习率曲线上,如果训练集误差和验证集误差最终非常接近并且不会再下降,为偏差;如果随着样本数增加,如果验证集误差继续下降,为方差。

                       

 

偏差(欠拟合):训练集上的代价函数很大,验证集上的代价函数也很大;

方差(过拟合):训练集上的代价函数很小,验证集上的代价函数非常大。

在代价函数后加上正则向可以防止过拟合,具体实现机制为对参数的惩罚,正则化参数\lambda的选取很重要,\lambda过小会出现过拟合,\lambda过大会出现欠拟合。

当学习算法出现高偏差时,通过增加样本数量也不会让训练集或验证集的代价函数下降;在高方差的情况下增加训练样本数量对算法改进是有用的。

改善高偏差问题:增加特征数量、增加多项式特征、降低\lambda的值。

改善高方差问题:增加训练样本(数据集扩增)、减少特征数量(drop out)、增加\lambda的值(正则化)。

大型的神经网络性能更好,计算量很大,容易出现过拟合,但可以通过正则化修正过拟合问题。神经网络的隐含层数目的选择也可以通过将数据集分为训练集、验证集、测试集,尝试不同的隐含层数目,选择验证集代价函数中最小作为最终选择。

九、机器学习系统设计

误差分析:手动查看错误样本的规律和特点,有利于新特征的设计和了解现在系统的优缺点,从而对系统进行改进。

通常设定某个实数(误差度量值)【准确率或误差】来评估学习算法。

不对称性分类(偏斜类)的误差评估通常采用查准率(precision)和召回率(recall),而不采用分类误差(error)或分类准确率(accuracy),如果准确率和召回率都很高说明算法表现很好。使用查准率和召回率,算法不能通过总是预测为1或总是预测为0来欺骗我们【偏斜类:正样本和负样本的数量比例差别很大】。在分类时选择的阈值较大时,有较高的查准率(P),较低的召回率(R);选择的阈值较小时,有较高的召回率,较低的查准率。使用F=2\frac{PR}{P+R}来权衡查准率和召回率,在进行分类阈值选择时我们期望有较大的F。

十、支持向量机(SVM)

支持向量机也叫最大间隔分类器将正样本和负样本以最大间距分开。损失函数定义为:J\left(\theta\right)=C\sum_{i=1}^{m}[y^{(i)}cost_1(\theta^{T}x^{(i)})+(1-y^{(i)})cost_0(\theta^{T}x^{(i)})]+\frac{1}{2}\sum_{j=1}^{n}\theta_j^{2},其中cost_1(\theta^Tx^{(i)})=-log(h_\theta(x^{(i)})cost_0(\theta^Tx^{(i)})=-log(1-h_\theta(x^{(i)})

SVM的假设函数值不是概率值,直接得到分类结果,h_{\theta}(x)=\begin{cases}1, &\if \quad \theta^Tx\geqslant 0 \cr 0, &otherwise\end{cases}

如果有一个正样本,仅要求\theta^Tx\geq 0就能将该样本正确分出,如果有一个负样本,仅要求\theta^Tx< 0就会将该负例正确分离,但是支持向量机的要求更高,不仅仅要求,我们需要\theta^Tx比0值大很多,比如大于等于1,也希望\theta^Tx比0小很多,比如小雨等于-1,相当于在支持向量机中嵌入了一个额外的安全因子,或者说安全的间距因子。

当参数C设置得非常大的时候,因为我们要使代价函数最小,所以J(\theta)第一项应该为0,则最小化优化问题转化为:

min\frac{1}{2}\sum_{j=1}^{n}\theta_j^{2}      \quad s.t\begin{cases}\theta^Tx^{(i)}\geq 1 &\if \quad y^{(i)}=1 \cr \theta^Tx^{(i)}\leq -1&if \quad y^{(i)}=0\end{cases}

参数C的作用类似于1/\lambda\lambda为正则化参数,可以通过在逻辑回归中对\lambda的分析对参数C进行分析:

C较大时,相当于\lambda较小,可能会导致过拟合,高方差;

C较小时,相当于\lambda较大,可能会导致欠拟合,高偏差。

向量内积计算:u =\left[ \begin{matrix}u_1 \\ u_2 \end{matrix} \right ]\nu =\left[ \begin{matrix}\nu_1 \\ \nu _2 \end{matrix} \right ],则u\nu的内积为\mu^T\nu=\mu_1\nu_1+\mu_2\nu_2.。从数学上来说,向量u\nu的内积为p.\left \| u \right \|,其中p为u\nu上的投影长度,p是一个实数,有正负,\left \| u \right \|u的范数,即u的欧几里得长度,\left \| u \right \|=\sqrt{u_1^2+u_2^2}。则\mu^T\nu=p.\left \| u \right \|。同时注意\mu^T\nu=\nu ^Tu

通过对内积和范数的了解我们可以对SVM的优化目标进一步改进,min\frac{1}{2}\sum_{j=1}^{n}\theta_j^{2}=min\frac{1}{2}(\theta_1^2+\theta_2^2+...+\theta_n^2)=min\frac{1}{2}(\sqrt{\theta_1^2+\theta_2^2+...+\theta_n^2})^2=min\frac{1}{2}\left \| \theta \right \|^2  

约束条件中的\theta^Tx^{(i)}实际上就是内积,即\theta^Tx^{(i)}=p^{(i)}.\left \| \theta \right \|

则优化目标函数为:min\frac{1}{2}\sum_{j=1}^{n}\theta_j^{2}=min\frac{1}{2}\left \| \theta \right \|^2\quad s.t\begin{cases}p^{(i)}.\left \| \theta \right \|\geq 1 &\if \quad y^{(i)}=1 \cr p^{(i)}.\left \| \theta \right \|\leq -1&if \quad y^{(i)}=0\end{cases}

当y=1时,我们期望p^{(i)}.\left \| \theta \right \|\geq 1},从代价函数可以看出要\left \| \theta \right \|最小,则p^{(i)}越大越好,p^{(i)}为样本x^{(i)}\theta上的投影长度,即正负样本的间距值。y=-1时分析同理。即支持向量机要做的事就是在目标函数有很大的C值情况下找到最大的间距,使得目标函数最小,这也解释了为什么支持向量机是一个最大间距分类器。

 

通过核函数解决无法通过直线进行分类的问题。比如构造一个非线性模型\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_1x_2+\theta_4x_1^2+\theta_5x_2^2+...,我们现在用一个新的特征f来替换模型的有关x的项,比如采取如下替换方式:f_1=x_1,f_2=x_2,f_3=x_1x_2,f_4=x_1^2,f_5=x_2^2,则h_\theta(x)=\theta_1f_1+\theta_2f_2+...+\theta_nf_n(这里忽略了第0项),这里我们通过对原有特征进行组合得到新的特征,而核函数则是通过计算样本x与地标l的相似度来得到新的特征f。我们通常将训练集的样本作为地标,例如有m个样本,则:l^{(1)}=x^{(1)},l^{(2)}=x^{(2)},...,l^{(m)}=x^{(m)}f_1=similarity(x,l^{(1)})=e(-\frac{\left \| x-l^{(1)} \right \|^2}{2\sigma ^2})similarity(x,l^{(1)})就是核函数,这里用的是高斯核函数,f_1就代表所有样本与第一个地标之间的距离,样本与地标间的距离越小,f越大,代表而二者相似度越大。\left \| x-l^{(1)} \right \|代表所有样本与第一个地标间的距离之和,\left \| x-l^{(1)} \right \|^2=\left ( \sqrt{\sum_{j=1}^n(x_j-l_j^{(1)})^2} \right ) ^2 =\sum_{j=1}^n(x_j-l_j^{(1)})^2}f_2,f_3,...,f_m计算类似。当\theta^Tf\geq =0时,预测为1,否则相反。

使用核函数时,还有考虑参数\sigma\sigma较大时,可能会导致低方差,高偏差;\sigma较小时,可能会导致低偏差,高方差。 \sigma用来衡量距离超平面远近的点的影响。对于较小的\sigma,模型受到严格约束,会考虑训练集中的所有点;对于较大的\sigma,模型仅使用接近超平面的点来建模。

使用SVM解决优化问题时一般使用工具包,比如libsvm,liblinear。

除了高斯核函数,还有多项式核函数、字符核函数、卡方核函数、直方图交集核函数等。

线性核的SVM只不带核函数的SVM。

n为特征数,m为训练样本数。

(1)如果相较于m而言,n要大许多,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。

(2)如果n较小,而且m大小中等,例如在n 1-1000 之间,而m在10-10000之间,使用高斯核函数的支持向量机。

(3)如果n较小,而m较大,例如n在1-1000之间,而m大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。

值得一提的是,神经网络在以上三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因主要在于它的代价函数是凸函数,不存在局部最小值。

支持向量机的决策边界只与支持向量有关,与其它点无关,当支持向量的位置发生改变,会引入松弛约束条件,决策边界就会发生变化。

十一、无监督学习

1、聚类---k-means聚类

聚类是无监督学习的一种,用于训练的数据没有标签,通过某种算法找到数据的内在结构将数据分为怒同的簇。k-means聚类是一种常用的聚类算法,算法大致过程为:确定了聚类的个数K后,随机选择K个点作为聚类中心,计算每个样本点到这些聚类中心的聚类,将该点与距离最近的中心点划为一类,然后计算每一类的均值作为新的中心点,不断迭代,直到中心店不再发生变化。

k-means的最小化问题是要使得每个数据点在当前类中与聚类中心点间的距离之和最小,它的代价函数(又称畸变函数)可表示如下:k-means的迭代过程实际上就是在不断减小这个代价函数。

J(c^{(1)},...,c^{(m)},\mu_1,...,\mu_K)=\frac{1}{m}\sum_{i=1}^m\left \| X^{(i)}-\mu_C^{(i)} \right \|^2

2、降维---PCA(主成分分析)

降维常用来对数据进行压缩,因此可以使用较少的内存或磁盘空间,加快算法速度,同时有利于可视化。

PCA是常用的一种降维方法,在PCA中我们要找到一个方向向量,把所有原始数据投射到这个方向向量上,我们希望投射平均均方误差尽可能小,投射误差指的是从特征向量向该方向向量作垂线的长度。

                                                   

PCA算法步骤:从n维降到k维

第一步:均值归一化

第二步:计算协方差矩阵\sum =\frac{1}{m}\sum_{i=1}^n(x^{(i)})(x^{(i)})^T

第三步:计算协方差矩阵的特征向量。在Octave中可以利用奇异分解来求解,[U,S,V]=svd(sigma),sigma就是协方差矩阵,U是由与数据之间投影误差最小的方向向量构成的矩阵,如果要从n维降到k维,就从U中选取前k个向量,用U_{reduce}表示,然后通过:z(i)=U_{reduce}^T*x(i)计算出新的向量。

主成分k值的选择:希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的k值,通过对k取不同的值,如果这个比列小于某个值,就保留k,比如\frac{\frac{1}{m} \sum_{i=1}^{m}\left\|x^{(i)}-x_{a p p r o x}^{(i)}\right\|^{2}}{\frac{1}{m} \sum_{i=1}^{m}\left\|x^{(i)}\right\|^{2}}\leq 1\%。我们也可以通过第三步中的S来计算这个比例,S是一个大学为nxn的对角阵,已知S后可以通过这样的方式计算合适的k值:\frac{\frac{1}{m} \sum_{i=1}^{m}\left\|x^{(i)}-x_{a p p r o x}^{(i)}\right\|^{2}}{\frac{1}{m} \sum_{i=1}^{m}\left\|x^{(i)}\right\|^{2}}=1-\frac{\Sigma_{i=1}^{k} S_{i i}}{\Sigma_{i=1}^{m} S_{i i}} \leq 1 \%

主成分分析不是学习过程的一部分,所以没必要一开始就先使用主成分分析,而是必要的时候才使用,一般主成分分析不用于降低过拟合。

3、异常检测

异常检测算法:

给定数据集x^{(1)},x^{(2)},...,x^{(m)},则针对每一个特征计算:\mu_j=\frac{1}{m}\sum_{i=1}^mx_j^{(i)}\sigma_j^2=\frac{1}{m}\sum_{i=1}^m(x_j^{(i)}-\mu_j)^2

得到概率模型:p(x)=p(x_1;\mu_1,\sigma_1^2)p(x_2;\mu_2,\sigma_2^2)...=\prod _{j=1}^np(x_j;\mu_j,\sigma_j^2)=\prod _{j=1}^n\frac{1}{\sqrt{2\pi}\sigma_j}exp(-\frac{(x_j-\mu_j)^2}{2\sigma_j^2})

p(x)< \varepsilon时,为异常。

开发和评价一个异常检测系统:我们从带标记的数据着手,从中选择一部分正常数据用于构建训练集,剩下的正常数据和异常数据混合的数据构成交叉验证集和测试集。在训练集上计算各个特征的平均值和方差,构建p(x),在交叉验证集上,尝试不同的\varepsilon作为阈值,根据F1值或者查准率与查全率的比确定最合适的\varepsilon,用上述选出的\varepsilon作为阈值,在测试集上进行预测,计算异常系统的F1值,或者查准率与查全率之比。

当有大量负样本,少量正样本(异常数据)时用异常检测算法,同时拥有大量正样本和负样本时用监督学习算法。

异常检测假设特征服从高斯分布,如果数据不服从高斯分布,异常检测算法也能够工作,但最好还是将数据转换为高斯分布,比如对数据取对数,然后再计算高斯分布的参数。

误差分析:一些异常的数据也可能有较大的p(x)值,我们可以将一些相关的特征组合得到一些更好的特征,这些新的特征能够帮助我们更好地进行异常检测。

多元高斯分布:假如我们有两个相关的特征,而且这两个特征的值域范围比较宽,这种情况下,一般的高斯分布模型可能不能很好地识别异常数据。因为一般的高斯分布模型尝试去同时抓住两个特征的偏差,因此创造出一个比较大的判定边界,就可能把一些异常值当成正常的。多元高斯分布通过构建特征的协方差矩阵,用所有特征一起来计算p(x)

\mu=\frac{1}{m}\sum_{i=1}^mx^{(i)}

\sum =\frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)(x^{(i)}-\mu)^T=\frac{1}{m}(X-\mu)(X-\mu)^T

p(x)=\frac{1}{(2 \pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}} \exp \left(-\frac{1}{2}(x-\mu)^{T} \Sigma^{-1}(x-\mu)\right)

十二、推荐系统

推荐系统是机器学习的一个重要应用。

基于内容的推荐系统:以电影为例,已知这些电影的特征,以及用户对电影的评分(部分电影未评分),通过这些特征构建推荐系统,对未评分的电影打分。\theta^{(j)}表示用户j的参数向量,x^{(i)}是电影i的特性向量,则用户j对电影i的评分预测为:(\theta^{(j)})^Tx^{(i)}。则针对用户j,代价函数为:\min _{\theta(j)} \frac{1}{2} \sum_{i:r(i, j)=1}\left(\left(\theta^{(j)}\right)^{T} x^{(i)}-y^{(i, j)}\right)^{2}+\frac{\lambda}{2}\left(\theta_{k}^{(j)}\right)^{2},其中i:r(i, j)表示我们只计算那些用户 j评过分的电影,针对所有用户的代价求和:\min _{\theta^{(1)},...,\theta^{(n_u)}} \frac{1}{2} \sum_{j=1}^{n_u}\sum_{i:r(i, j)=1}\left(\left(\theta^{(j)}\right)^{T} x^{(i)}-y^{(i, j)}\right)^{2}+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^n\left(\theta_{k}^{(j)}\right)^{2},用梯度下降算法求最优值:

\begin{array}{l} \theta_{k}^{(j)}:=\theta_{k}^{(j)}-\alpha \sum_{i: r(i, j)=1}\left(\left(\theta^{(j)}\right)^{T} x^{(i)}-y^{(i, j)}\right) x_{k}^{(i)} \quad(\text { for } k=0) \\ \theta_{k}^{(j)}:=\theta_{k}^{(j)}-\alpha\left(\sum_{i ; \tau(i, j)=1}\left(\left(\theta^{(j)}\right)^{T} x^{(i)}-y^{(i, j)}\right) x_{k}^{(i)}+\lambda \theta_{k}^{(j)}\right) \quad(\text { for } k \neq 0) \end{array},这里分为k=0和不等于0两种情况是因为假设参数有一个常数项,即第0项为常数,正则项对常数不起作用。

相反地,如果我们拥有用户参数,也可以学习得到电影的特征:\min _{x^{(1)},...,x^{(n_m)}} \frac{1}{2} \sum_{i=1}^{n_m}\sum_{j:r(i, j)=1}\left(\left(\theta^{(j)}\right)^{T} x^{(i)}-y^{(i, j)}\right)^{2}+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^n\left(x_{k}^{(i)}\right)^{2}

协同过滤:既没有用户参数,也没有电影特征时,协同过滤可以同时学习这两个参数:J\left(x^{(1)}, \ldots x^{\left(n_{m}\right)}, \theta^{(1)}, \ldots, \theta^{\left(n_{n}\right)}\right)=\frac{1}{2} \sum_{(i ; j)=(i, j)-1}\left(\left(\theta^{(j)}\right)^{T} x^{(i)}-y^{(i j)}\right)^{2}+\frac{\lambda}{2} \sum_{i=1}^{n} \sum_{k=1}^{n}\left(x_{k}^{(j)}\right)^{2}+\frac{\lambda}{2} \sum_{j=1}^{n_{w}} \sum_{k=1}^{n}\left(\theta_{k}^{(j)}\right)^{2}

\begin{aligned} &x_{k}^{(i)}:=x_{k}^{(i)}-\alpha\left(\sum_{j: r(i, j)=1}\left(\left(\theta^{(j)}\right)^{T} x^{(i)}-y^{(i, j)}\right) \theta_{k}^{j}+\lambda x_{k}^{(i)}\right)\right.\\ &\theta_{k}^{(i)}:=\theta_{k}^{(i)}-\alpha\left(\sum_{i: r(i, j)=1}\left(\left(\theta^{(j)}\right)^{T} x^{(i)}-y^{(i, j)}\right) x_{k}^{(i)}+\lambda \theta_{k}^{(j)}\right)\right. \end{aligned}

初始时给x^{(1)},...,x^{(n_m)};\theta^{(1)},...,\theta^{(n_u)}一些随机小值。

 

注:如果某个用户对所有电影都没有打分,通过代价函数最小得到的\theta^{(j)}为0,则预测值(\theta^{(j)})^Tx^{(i)}也总是为0,就没有了实际意义;可以对数据进行均值归一化,最终预测值为(\theta^{(j)})^Tx^{(i)}+\mu_{i}

十三、大规模机器学习

批量梯度下降(Batch gradient descent):批量梯度下降在迭代的每一步都要遍历所有的训练样本,当数据非常多时会花费很多时间。

随机梯度下降(Stochastic gradient descent):对于一个大规模训练集,可以尝试用随机梯度下降代替批量梯度下降,定义单个样本的代价函数为:cost(\theta,(x^{(i)},y^{(i)}))=\frac{1}{2}(h_{\theta}(x^{(i)})-y^{(i)})^2,随机梯度下降的步骤为:

随机梯度下降每一次计算后都会对参数进行更新,而不需要首先计算所有样本的和。但是这样的算法存在的问题是,不是每一步都是朝着”正确”的方向迈出的。因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。

小批量梯度下降(mini-batch gradient descent):小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法,每次使用b个样本就可以对参数进行更新,b通常取2-200之间。当有优秀的向量运算时,mini-batch会比随机梯度下降速度更快。

随机梯度下降收敛:在批量梯度下降中,每一次梯度下降都会遍历所有样本,因此如果通过代价函数关于迭代次数的图表来观察收敛情况代价很大。在随机梯度下降中,每迭代m次,计算这m次的代价平均值,绘制这些平均值和迭代次数之间的关系图来判断收敛情况,可以保证随机梯度下降法正在正常运转和收敛,也可以通过它来调整学习率的大小(比如绘制的图像是下图的最后一种情况,就可以减小学习率的值)。

Map reduce:在批量梯度下降中,每次都要对整个训练集进行循环来计算偏导和代价再求和,计算代价非常大。Map reduce将数据集分配给多台计算机,让每一台计算机处理数据集的一个子集,然后将计所的结果汇总求和,这样的方法叫做映射简化。从而达到加速的目的。比如有400个样本,把它分配给4台计算机处理:

在线学习:在线学习算法指的是对数据流而非离线的静态数据集的学习,比如在线网站,都有持续不断的用户流,对于每一个用户,网站希望能在不将数据存储到数据库中便顺利地进行算法学习。一旦对一个数据的学习完成了,我们便可以丢弃该数据,不需要再存储它了。这种方式的好处在于,我们的算法可以很好的适应用户的倾向性,算法可以针对用户的当前行为不断地更新模型以适应该用户。比如一个购物网站,用户通过关键词搜索出来几个结果,用户可能只会查看其中一个或几个,y=1/0代表接受/不接受(或点击/不点击),它的更新机制和随机梯度下降类似,不同之处在于在线学习没有使用事先准备好的固定的数据集。

十、四应用实例--图片文字识别(OCR)

在text detection阶段使用滑动窗口将图片中有文字的部分标记出来,同样用滑动窗口对字符进行分割,最后利用神经网络、支持向量机、逻辑回归等分类器对字符进行识别。 

滑动窗口的使用:用一定大小的窗口遍历整幅图像,得到一些batches,把它们放进一个有监督模型(该模型是由包含正样本和负样本的数据训练得到)得到标签。

获取大量数据或人工数据:人工合成数据、手动收集数据、众包等。

上限分析:在机器学习中通常要经过几个步骤才能得到最终预测结果,比如上述的OCR,流程图中的每一部分输出都是下一部分输入,最终的结果代表了系统的整体系能。在上限分析中,我们选取某一部分,手工地进行处理,让这部分输出100%的正确结果,然后看整体的效果提升了多少,如果整体的效果提升较大,意味着我们可能希望投入更多的时间经历来提高这部分,如果提升较少说明这部分已经做的比较好了,则不应该花大量时间处理这一部分。

机器学习详细的视频笔记参考:机器学习教程中文笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值