机器学习光速入门

861 阅读5分钟
机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

有监督学习

训练数据由一组训练实例组成。在监督学习中,每一个例子都是一对由一个输入对象(通常是一个向量)和一个期望的输出值(也被称为监督信号)。有监督学习算法分析训练数据,并产生一个推断的功能,它可以用于映射新的例子。一个最佳的方案将允许该算法正确地在标签不可见的情况下确定类标签。用已知某种或某些特性的样本作为训练集,以建立一个数学模型(如模式识别中的判别模型,人工神经网络法中的权重模型等),再用已建立的模型来预测未知样本,此种方法称为有监督学习。是最常见的机器学习方法。

线性回归 (梯度下降算法)

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的正态分布。回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

自学了一阵子的机器学习,也算是小有收获,先从最简单的线性回归开始走起 :)

话说有一天你走在大街上,路过一家房产中介,玻璃窗上标满了各类型房产的价格,你在感叹工作十年都买不起一个厕所的同时也在思考,房子的价格是由哪些因素决定的呢 ? (ps: 房子为什么那么贵呢???) 一般情况下,房子越大,价格越贵,那么可以认为房子的面积算是影响房子价格的一个因素。假设房子的价格仅由房子的面积房间的数量决定,那么房子价格的线性表达式即为:

h_\theta(x) = \theta_0 + \theta_1x_{房子的面积} + \theta_2x_{房间的数量}

\theta 表示各个特征的权重 ,其中 \theta_0 表示截距项(常数项) , 当特征数量庞大时,我们可以用以下表达式来简化线性方程:

h_\theta(x) = \sum_{i=0}^{n}\theta_ix_i = \theta^Tx

其中 n 代表特征的数量, x_0 = 1 并且右式中 \thetax 为向量表达式

至此 , 我们的假设方程已经诞生了!那么问题来了,我们要如何去选择 \theta 呢? 为了解决这个问题,我们在这里定义平方损失函数为:

J(\theta) = \frac{1}{2}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})^2

其中 m 代表 训练样本的数量x^{(i)}代表第 i训练样本的特征y^{(i)}代表第 i训练样本的目标, 不难看出,损失函数的值越小,假设函数值真实目标值越接近

这时候,我们可以用梯度下降算法来找出能够最小化损失函数\theta

先介绍一下什么是梯度:

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。 				---- 百度百科

通俗点说,梯度就是表示函数最大变化方向的向量,对于一元函数来说,梯度就是该函数的导数

那么什么是梯度下降呢?梯度下降就是说函数在当前点的平面(高维则不是平面)上沿着梯度负方向下降速率最快,那么这是为什么呢? 请看以下推导过程:

梯度下降原理推导
也就是说根据下列式子即可得到我们想要的 \theta

\theta_j := \theta_j - \alpha_{学习速率}\frac{\partial}{\partial\theta_j}J(\theta)

那么上式中的 \frac{\partial}{\partial\theta_j}J(\theta) 怎么求呢?

\frac{\partial}{\partial\theta_j}J(\theta) = \frac{\partial}{\partial\theta_j}\frac{1}{2}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})^2
= \sum_{i=1}^{m}\frac{1}{2}\frac{\partial}{\partial\theta_j}(h_\theta(x^{(i)}) - y^{(i)})^2
= \sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})\frac{1}{2}\cdot 2 \frac{\partial}{\partial\theta_j} (\sum_{j=0}^{n}\theta_jx^{(i)}_j - y^{(i)})
= \sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}

最后我们得到批量梯度下降算法:

Repeat until convergent{

\theta_j := \theta_j - \alpha\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}

            (for every j) }

当目标函数是凸函数时,梯度下降法的解是全局解。一般情况下,其解不保证是全局最优解。在这里, J(\theta) 是凸函数,所以我们可以获得全局最优解 (假设学习速率\alpha 足够小)

根据批量梯度下降算法每次权重迭代都需要对整个训练集进行运算 (速度慢!),所以当训练集特别大的时候我们可以考虑选择随机梯度下降算法:

Loop{             for i=1 to m, {

\theta_j := \theta_j - \alpha(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}

            (for every j)         } } 可以看出,随机梯度下降每次权重迭代仅需要对单个训练样本进行运算,速度上对比批量梯度下降要提升不少,虽然通过随机梯度下降不一定能保证 \theta 收敛 (在J(\theta)最小值处波动),但是基本上可以获得一个接近最小值的近似值 至此,相信大家对梯度下降算法有了初步的认识,我们下一章见。

欢迎大家扫码关注我的公众号「智能自动化测试」,回复:测试进阶教程,即可免费获得 进阶教程 ~