参考资料:html
【1】 Spark MLlib 机器学习实践算法
【2】 机器学习之梯度降低 http://www.cnblogs.com/rcfeng/p/3958926.htmlapache
【3】 统计学习方法dom
一、回归分析概念机器学习
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。函数
二、梯度降低的概念学习
梯度降低是一个寻找函数极值的过程,在低维度下很是容易理解。例如存在函数,则咱们有导数
。spa
假设当前x=1,假设dx的步长为0.1,则咱们有,即下一次x的取值应为0.8,获得新的更小的y值。scala
备注:在机器学习的应用场景里,梯度降低只是自变量的维度变多,也能够理解梯度降低的方向变多而已。3d
三、梯度降低算法
1)假设存在建模函数
2)则有对应的代价函数
3)每次迭代时求代价函数的偏导数,并根据负梯度的思想更新权值
4)迭代屡次直到知足代价函数的收敛阈值
备注:
此处要区分的是梯度降低算法的两种常见类型,一个是随机梯度降低、另外一个是批量梯度降低。对于批量梯度降低,须要对全部的训练样本完成遍历后,将误差的总和再去更新参数值。而对于随机梯度降低,每个训练样本都会立刻更新参数值,所以速度更快,但也更容易获取局部最优解。
上面的例子属于批量随机降低,而随机梯度降低公式为:,注意这里没有对m个参数的求总和。也就是说不在每个时刻考虑全部方向(维度)的最优值,而是随便找一个方向(维度)就开始作负梯度降低。
四、随机梯度降低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) } }