MLib-Optimization模块代码阅读[to be Continued]

4 篇文章 0 订阅

常用机器学习算法最终都会需要求解一个无约束凸优化问题

minwdf(x)
这个模块实现了常用的优化问题求解算法,例如梯度下降法,LBFGS算法等。各种不同的线性求解算法 区别在于2点:

  • 下降方向(梯度方向、牛顿方向等)
  • 步长(wolf条件等)

这个模块一共有以下几个文件:

  • Gradient.scala:针对特定机器学习问题,定义了一些梯度计算函数
  • Updater.scala:根据计算好的梯度及步长信息来更新迭代
  • Optimizer.scala:定义凸优化问题 基类 Optimizer,优化函数optimize
  • GradientDescent.scala:梯度下降算法
  • LBFGS.scala:LBFGS算法
  • NNLS.scala:??

下面较为详细的阅读各个文件的源代码。

Gradient.scala文件

定义Gradient 基类

 /**
  * 计算loss function在某个data point的gradient和loss value
  */
 abstract class Gradient extends Serializable {
   /** 
    * @param data:一个data point
    * @param label:data point的标签 
    * @param weights:权重向量 
    *   
    * @return (gradient: 梯度, loss: 损失函数值)
    */  
   def compute(data: Vector, label: Double, weights: Vector): (Vector, Double)

   /** 
    * @param cumGradient the computed gradient will be added to this vector
    *   
    * @return loss:损失函数值
    */  
   def compute(data: Vector, label: Double, weights: Vector, cumGradient: Vector): Double
 }

定义Gradient 继承类

  • LogisticGradient for LR
  • LeastSquaresGradient for linear regression
  • HingeGradient for SVM
 class LogisticGradient(numClasses: Int) extends Gradient {
     numClasses match {
       case 2 =>
         /**
          * For Binary Logistic Regression.
          * 考虑到效率,2分类单独做
          */
         val margin = -1.0 * dot(data, weights)
         val multiplier = (1.0 / (1.0 + math.exp(margin))) - label
         axpy(multiplier, data, cumGradient)
         if (label > 0) {
           // The following is equivalent to log(1 + exp(margin)) but more numerically stable.
           MLUtils.log1pExp(margin)
         } else {
           MLUtils.log1pExp(margin) - margin
         }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值