spark.mllib源代码阅读-优化算法1-Gradient

Spark中定义的损失函数及梯度,在看源代码之前,先回想一下机器学习中定义了哪些损失函数,毕竟梯度求解是为优化求解损失函数服务的。

监督学习问题是在如果空间F中选取模型f作为决策函数。对于给定的输入X,由f(X)给出对应的输出Y,这个输出的预測值f(X)与真实值Y可能一致也可能不一致,用一个损失函数(lossfunction)或代价函数(cost function)来度量预測错误的程度。损失函数是f(X)和Y的非负实值函数,记作L(Y, f(X)).

统计学习中经常使用的损失函数有下面几种:

(1) 0-1损失函数(0-1 loss function):

(2) 平方损失函数(quadraticloss function)

(3) 绝对损失函数(absolute lossfunction)

(4) 对数损失函数(logarithmicloss function) 或对数似然损失函数(log-likelihood loss function)

(5)间隔损失函数(hinge loss)

在不考虑过拟合的情况下。损失函数越小,模型就越好。

Spark中定义梯度和损失函数求解的类包含一个Gradient基类及其三个实现类:

Gradient

梯度计算的抽象类,定义了计算梯度值和损失函数值的compute函数:

def compute(data: Vector, label: Double, weights: Vector): (Vector, Double) = {
  val gradient = Vectors.zeros(weights.size)
  val loss = compute(data, label, weights, gradient)
  (gradient, loss)
}

后面的梯度计算类都继承子Gradient类并实现compute函数。

LeastSquaresGradient

实现了最小二乘法进行线性回归的梯度计算方法。

其对compute函数进行的覆写

override def compute(data: Vector, label: Double, weights: Vector): (Vector, Double) = {
  val diff = dot(data, weights) - label
  val loss = diff * diff / 2.0
  val gradient = data.copy
  scal(diff, gradient)//常数乘以向量 更新后的gradient即为梯度 gradient=(y - lable)* x
  (gradient, loss)
}

使用场景:

1、 參数预计的方法是最小化误差的平方和,其他预计方法不适合用此梯度算子。

2、 Spark实现的是线性回归的梯度计算。非线性回归的梯度计算不适合使用此算子。

HingeGradient

实现了最大化分类间距的hinge loss进行參数预计的梯度下降方法,对compute函数进行的覆写:

class HingeGradient extends Gradient {
  override def compute(data: Vector, label: Double, weights: Vector): (Vector, Double) = {
    val dotProduct = dot(data, weights)
    // Our loss function with {0, 1} labels is max(0, 1 - (2y - 1) (f_w(x)))
    // Therefore the gradient is -(2y - 1)*x
    val labelScaled = 2 * label - 1.0
    if (1.0 > labelScaled * dotProduct) {
      val gradient = data.copy
      scal(-labelScaled, gradient)
      (gradient, 1.0 - labelScaled * dotProduct)
    } else {
      (Vectors.sparse(weights.size, Array.empty, Array.empty), 0.0)
    }
  }

使用场景:

适用于利用最大化分类间隔思想来构建分类器,典型的使用如SVM。

LogisticGradient

使用对数似然损失函数对Logistic分类/回归进行參数预计的梯度下降方法。实现的代码比較长,在此就不贴了,在内部分了2分类和多分类两种情况进行计算。

时间: 2024-11-08 13:19:48

spark.mllib源代码阅读-优化算法1-Gradient的相关文章

Spark MLlib Linear Regression线性回归算法

1.Spark MLlib Linear Regression线性回归算法 1.1 线性回归算法 1.1.1 基础理论 在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合. 回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析.如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间

孙其功陪你学之——Spark MLlib之K-Means聚类算法

看到 程序员的自我修养 – SelfUp.cn 里面有Spark MLlib之K-Means聚类算法. 但是是java 语言的,于是我按照例程用Scala写了一个,分享在此. 由于在学习 spark mllib 但是如此详细的资料真的很难找,在此分享. 测试数据 0.0 0.0 0.0 0.1 0.1 0.1 0.2 0.2 0.2 9.0 9.0 9.0 9.1 9.1 9.1 9.2 9.2 9.2 15.1 15.1 15.1 18.0 17.0 19.0 20.0 21.0 22.0 p

Spark MLlib之水塘抽样算法(Reservoir Sampling)

1.理解 问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行? 首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand函数随机的获得一个行数,从而随机的取出一行,但是,当前的情况是不知道行数,这样如何求呢?我们需要一个概念来帮助我们做出猜想,来使得对每一行取出的概率相等,也即随机.这个概念即蓄水池抽样(Reservoir Sampling). 水塘抽样算法(Reservoir Sampling)思想: 在序列流中取一个数,如

spark.mllib源码阅读-优化算法1-Gradient

Spark中定义的损失函数及梯度,在看源码之前,先回顾一下机器学习中定义了哪些损失函数,毕竟梯度求解是为优化求解损失函数服务的. 监督学习问题是在假设空间F中选取模型f作为决策函数,对于给定的输入X,由f(X)给出相应的输出Y,这个输出的预测值f(X)与真实值Y可能一致也可能不一致,用一个损失函数(lossfunction)或代价函数(cost function)来度量预测错误的程度.损失函数是f(X)和Y的非负实值函数,记作L(Y, f(X)). 统计学习中常用的损失函数有以下几种: (1)

Spark MLlib算法调用展示平台及其实现过程

1. 软件版本: IDE:Intellij IDEA 14,Java:1.7,Scala:2.10.6:Tomcat:7,CDH:5.8.0: Spark:1.6.0-cdh5.8.0-hadoop2.6.0-cdh5.8.0 : Hadoop:hadoop2.6.0-cdh5.8.0:(使用的是CDH提供的虚拟机) 2. 工程下载及部署: Scala封装Spark算法工程:https://github.com/fansy1990/Spark_MLlib_Algorithm_1.6.0.git

用Spark学习矩阵分解推荐算法

在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib中,推荐算法这块只实现了基于矩阵分解的协同过滤推荐算法.而基于的算法是FunkSVD算法,即将m个用户和n个物品对应的评分矩阵M分解为两个低维的矩阵:$$M_{m \times n}=P_{m \times k}^TQ_{k \times n}$$ 其中k为分解成低维的维数,一般远比m和n小.如果大

spark.mllib源码阅读-分类算法4-DecisionTree

本篇博文主要围绕Spark上的决策树来讲解,我将分为2部分来阐述这一块的知识.第一部分会介绍一些决策树的基本概念.Spark下决策树的表示与存储.结点分类信息的存储.结点的特征选择与分类:第二部分通过一个Spark自带的示例来看看Spark的决策树的训练算法.另外,将本篇与上一篇博文"spark.mllib源码阅读bagging方法"的bagging子样本集抽样方法结合,也就理解了Spark下的决策森林树的实现过程. 第一部分: 决策树模型 分类决策树模型是一种描述对实例进行分类的树形

基于Spark MLlib平台的协同过滤算法---电影推荐系统

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,

Spark MLlib Logistic Regression逻辑回归算法

1.1 逻辑回归算法 1.1.1 基础理论 logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数g(z)将最为假设函数来预测.g(z)可以将连续值映射到0和1上. 它与线性回归的不同点在于:为了将线性回归输出的很大范围的数,例如从负无穷到正无穷,压缩到0和1之间,这样的输出值表达为"可能性"才能说服广大民众.当然了,把大值压缩到这个范围还有个很好的好处,就是可以消除特别冒尖的变量的影响. Logistic函数(或称为Sigm