【机器学习笔记二】回归算法-随机梯度下降
参考资料:
【1】 Spark MLlib 机器学习实践
【2】 机器学习之梯度下降
【3】 统计学习方法
1、回归分析概念
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。
2、梯度下降的概念
梯度下降是一个寻找函数极值的过程,在低维度下非常容易理解。例如存在函数
,则我们有导数
。假设当前x=1,假设dx的步长为0.1,则我们有
,即下一次x的取值应为0.8,得到新的更小的y值。
备注:在机器学习的应用场景里,梯度下降只是自变量的维度变多,也可以理解梯度下降的方向变多而已。
3、梯度下降算法
1)假设存在建模函数
2)则有对应的代价函数
3)每次迭代时求代价函数的偏导数
,并根据负梯度的思想更新权值
4)迭代多次直到满足代价函数的收敛阈值
备注:
此处要区分的是梯度下降算法的两种常见类型,一个是随机梯度下降、另一个是批量梯度下降。对于批量梯度下降,需要对所有的训练样本完成遍历后,将偏差的总和再去更新参数值。而对于随机梯度下降,每一个训练样本都会马上更新参数值,因此速度更快,但也更容易获取局部最优解。
上面的例子属于批量随机下降,而随机梯度下降公式为:
,注意这里没有对m个参数的求总和。也就是说不在每一个时刻考虑所有方向(维度)的最优值,而是随便找一个方向(维度)就开始做负梯度下降。
4、随机梯度下降Spark Mlib例子
package com.fredric.spark.lr
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}
import scala.util.Random
/*-
* 线性回归-随机梯度下降
* Fredric 2017
*/
object lr {
def main(args:Array[String]): Unit ={
val conf = new SparkConf().setMaster("local").setAppName("Lr01")
val sc = new SparkContext(conf)
//以二元线性回归y = 7*x1 + 5*x2 + 3为例,初始化数据
val Array = new Array[LabeledPoint](500)
for(t <- 1 to 500){
val random = new Random();
val x1 = random.nextInt(4) + random.nextDouble();
val x2 = random.nextInt(3) + random.nextDouble();
val y = 7 * x1 + 5 * x2 + (new Random()).nextDouble() + 3;
//注意对于常量3,需要预留对应的向量,根据矩阵相乘,应填写1
Array(t-1) = new LabeledPoint(y, Vectors.dense(x1, x2, 1));
}
val data = sc.makeRDD(Array);
//Train a linear regression model with no regularization using Stochastic Gradient Descent
val model = new LinearRegressionWithSGD();
model.optimizer.setNumIterations(100);//迭代100次
val res = model.run(data);
//输出结果为 [7.0162907792955345,5.013683400288775,3.4386169185061966],分别对应x1 x2和常数
println(res.weights)
}
}