LocalLR

来源:互联网 发布:怎么安装cad2008软件 编辑:程序博客网 时间:2024/06/05 22:09

1. 生成Array,由N个 DataPoint(Vector, Double), DataPoint 由 rand 随机生成D个元素组成Vector

def generateData = {    def generatePoint(i: Int) = {      val y = if(i % 2 == 0) -1 else 1      val x = DenseVector.fill(D){rand.nextGaussian + y * R}      DataPoint(x, y)    }    Array.tabulate(N)(generatePoint)  }
2. 定义 DataPoint

case class DataPoint(x: Vector[Double], y: Double)

3.随机初始化 系数 w (和vector维数一样D) 

var w = DenseVector.fill(D){2 * rand.nextDouble - 1}
4. 跌代 ITERATIONS次, 计算 gradient, 逻辑回归 (1/ 1+ e(-y * (w 点乘 vector(x))) - 1) * p.y 不断调节权重
 for (i <- 1 to ITERATIONS) {      println("On iteration " + i)      var gradient = DenseVector.zeros[Double](D)      for (p <- data) {        val scale = (1 / (1 + math.exp(-p.y * (w.dot(p.x)))) - 1) * p.y        gradient +=  p.x * scale      }      w -= gradient    }

5. 并行化

 val sparkConf = new SparkConf().setAppName("SparkLR")    val sc = new SparkContext(sparkConf)    val numSlices = if (args.length > 0) args(0).toInt else 2    val points = sc.parallelize(generateData, numSlices).cache()    // Initialize w to a random value    var w = DenseVector.fill(D){2 * rand.nextDouble - 1}    println("Initial w: " + w)    for (i <- 1 to ITERATIONS) {      println("On iteration " + i)      val gradient = points.map { p =>        p.x * (1 / (1 + exp(-p.y * (w.dot(p.x)))) - 1) * p.y      }.reduce(_ + _)      w -= gradient    }    println("Final w: " + w)    sc.stop()




0 0
原创粉丝点击