SimpleUpdater

org.apache.spark.mllib.optimization.SimpleUpdater 

SimpleUpdater 在SparkMLlib中用于权重特征向量的更新,在GradientDescent梯度下降中有用到

该类中只有一个compute方法进行权重更新

  •  权重更新规则
  weights=weights - stepSize/sqrt(iter)*gradient
  用步长除以迭代次数的平方根 作为本次迭代下降的因子
  •   返回本次梯度下降后更新的特征权重向量

SimpleUpdater 源代码如下


/**
 * :: DeveloperApi ::
 * A simple updater for gradient descent *without* any regularization.
 * Uses a step-size decreasing with the square root of the number of iterations.
 */
@DeveloperApi
class SimpleUpdater extends Updater {
  override def compute(
      weightsOld: Vector,
      gradient: Vector,
      stepSize: Double,
      iter: Int,
      regParam: Double): (Vector, Double) = {
    val thisIterStepSize = stepSize / math.sqrt(iter)
    val brzWeights: BV[Double] = weightsOld.toBreeze.toDenseVector
    brzAxpy(-thisIterStepSize, gradient.toBreeze, brzWeights)

    (Vectors.fromBreeze(brzWeights), 0)
  }


对该类的测试代码如下

package com.mllib.component

import org.apache.spark.mllib.optimization.SimpleUpdater
import org.apache.spark.mllib.linalg.Vectors

/**
 * 简单的权重更新 SimpleUpdater
 * 只有一个compute方法进行权重更新
 * 权重更新规则
 * weights=weights - stepSize/sqrt(iter)*gradient
 * 用步长除以迭代次数的平方根 作为本次迭代下降的因子
         返回本次梯度下降后更新的特征权重向量
 */

object SimpleUpdaterTest {
    def main(args: Array[String]): Unit = {
        val updater = new SimpleUpdater
        /**
         * weightsOld: Vector,
         * gradient: Vector,
      	 * stepSize: Double,
      	 * iter: Int,
         * regParam: Double)
         */
        val weightsOldArr = Array[Double](1,2,3,4)
        val weightsOld = Vectors.dense(weightsOldArr)  //上次迭代计算后的特征权重向量
        val gradient = Vectors.dense(Array[Double](2,3,4,5)) //本次迭代的特征权重向量
        val stepSize = 0.1    //步长
        val iter = 1 //迭代次数
        val regParam = 0.0 //正则参数,SimpleUpdater是一个简单的梯度下降方法,不包括正则化,所以该参数取值没有用到
        //compute方法
        //用步长除以迭代次数的平方根 作为本次迭代下降的因子
        //返回本次梯度下降后更新的特征权重向量
        val res = updater.compute(weightsOld, gradient, stepSize, iter, regParam) //更新权重
        println(res._1.toArray.mkString(",")) //0.8,1.7,2.6,3.5
        println(res._2) //0.0  这里源代码返回0
    }
  
}


装载请注明http://blog.csdn.net/wguangliang



SimpAutoUpdater c#自动升级 模块源码 可以集成到自己程序: 首先在VS中为当前的主程序项目添加引用,引用“客户端”中的“SimpleUpdater.exe”。 在VS中,点开“解决方案管理器”中相应项目的“属性”节点,打开 AssemblyInfo.cs 文件,在最下面添加上一行自动更新声明: //--添加这行标记表示支持自动更新, 后面的网址为自动更新的根目录. [assembly: FSLib.App.SimpleUpdater.Updateable("http://ls.com/update.xml")] 这步是必须的,否则请求检查更新时会抛出异常;代码中的网址即上面提到的能访问到xml文件的网址。 如果您希望更加简单的使用而不用去加这样的属性,或者您想程序运行的时候自定义,您可以通过下列方式的任何一种方式取代上面的属性声明: 使用 FSLib.App.SimpleUpdater.Updater.CheckUpdateSimple("升级网址") 的重载方法。这个重载方法允许你传入一个升级包的地址; 在检查前手动设置 FSLib.App.SimpleUpdater.Updater.UpdateUrl 属性。这是一个静态属性,也就是说,您并不需要创建 FSLib.App.SimpleUpdater.Updater.UpdateUrl 的对象实例就可以修改它。 无论使用哪种方式,请确保在检查更新前,地址已经设置。 到这里,准备工作即告完成,为代码添加上检查更新的操作即可。 static class Program { /// /// 应用程序的主入口点。 /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var updater = FSLib.App.SimpleUpdater.Updater.Instance; //当检查发生错误时,这个事件会触发 updater.Error += new EventHandler(updater_Error); //没有找到更新的事件 updater.NoUpdatesFound += new EventHandler(updater_NoUpdatesFound); //找到更新的事件.但在此实例中,找到更新会自动进行处理,所以这里并不需要操作 //updater.UpdatesFound += new EventHandler(updater_UpdatesFound); //开始检查更新-这是最简单的模式.请现在 assemblyInfo.cs 中配置更新地址,参见对应的文件. FSLib.App.SimpleUpdater.Updater.CheckUpdateSimple(); /* * 如果您希望更加简单的使用而不用去加这样的属性,或者您想程序运行的时候自定义,您可以通过下列方式的任何一种方式取代上面的属性声明: * 使用Updater.CheckUpdateSimple 的重载方法。这个重载方法允许你传入一个升级包的地址; * 在检查前手动设置 FSLib.App.SimpleUpdater.Updater.UpdateUrl 属性。这是一个静态属性,也就是说,您并不需要创建 FSLib.App.SimpleUpdater.Updater.UpdateUrl 的对象实例就可以修改它。 */ FSLib.App.SimpleUpdater.Updater.CheckUpdateSimple("升级网址"); Application.Run(new Form1()); } static void updater_UpdatesFound(object sender, EventArgs e) { } static void updater_NoUpdatesFound(object sender, EventArgs e) { System.Windows.Forms.MessageBox.Show("没有找到更新"); } static void updater_Error(object sender, EventArgs e) { var updater = sender as FSLib.App.SimpleUpdater.Updater; System.Windows.Forms.MessageBox.Show(updater.Exception.ToString()); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值