• 【机器学习笔记二】回归分析


    参考资料:

    【1】    Spark MLlib 机器学习实践

    【2】    机器学习之梯度下降 http://www.cnblogs.com/rcfeng/p/3958926.html

    【3】   统计学习方法

    1、回归分析概念

    在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。

    2、梯度下降的概念

    梯度下降是一个寻找函数极值的过程,在低维度下非常容易理解。例如存在函数,则我们有导数

    假设当前x=1,假设dx的步长为0.1,则我们有,即下一次x的取值应为0.8,得到新的更小的y值

    备注:在机器学习的应用场景里,梯度下降只是自变量的维度变多,也可以理解梯度下降的方向变多而已。

    3、梯度下降算法

    1)假设存在建模函数

    2)则有对应的代价函数

    3)每次迭代时求代价函数的偏导数,并根据负梯度的思想更新权值

    4)迭代多次直到满足代价函数的收敛阈值

    备注:

    此处要区分的是梯度下降算法的两种常见类型,一个是随机梯度下降、另一个是批量梯度下降。对于批量梯度下降,需要对所有的训练样本完成遍历后,将偏差的总和再去更新参数值。而对于随机梯度下降,每一个训练样本都会马上更新参数值,因此速度更快,但也更容易获取局部最优解。

    上面的例子属于批量随机下降,而随机梯度下降公式为:,注意这里没有对m个参数的求总和。也就是说不在每一个时刻考虑所有方向(维度)的最优值,而是随便找一个方向(维度)就开始做负梯度下降。

    4、随机梯度下降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)
      }
    }
  • 相关阅读:
    新一代MQ apache pulsar的架构与核心概念
    Flutter使用fluwx实现微信分享
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
    Codeforces 873F Forbidden Indices 字符串 SAM/(SA+单调栈)
    Codeforces 873E Awards For Contestants ST表
  • 原文地址:https://www.cnblogs.com/Fredric-2013/p/8495969.html
Copyright © 2020-2023  润新知