欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spark-29.spark机器学习_2_线性回归

程序员文章站 2022-07-14 21:58:11
...

线性回归是利用被称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或者多个被称为回归系数的模型参数的线性组合。

1.一元线性回归

找到一条直线能够最大程度上拟合二维空间中出现的点。
spark-29.spark机器学习_2_线性回归

2.多元线性回归

如果自变量多余1个,那么就要求一个多元函数去拟合空间中的点。

二元线性回归:

spark-29.spark机器学习_2_线性回归

n元线性回归:

spark-29.spark机器学习_2_线性回归
spark-29.spark机器学习_2_线性回归
要求什么?
要求使得所有点到这条线的误差最小。
误差最小化:
要求参数θ的最优解,使得所有点到这条线的误差最小。
如果将y表示样本的真实值,h_θ (x)表示样本的预测值,那么损失函数是:
spark-29.spark机器学习_2_线性回归

3.最小二乘法

最小二乘法:函数求导,令导数为0。
spark-29.spark机器学习_2_线性回归
若XTX不可逆,不可使用。实际中,若XTX阶过高,仍然需要使用梯度下降的方式计算数值解。
spark-29.spark机器学习_2_线性回归

4.梯度下降法

将求函数最小值想象成下山。注意局部最优解。
spark-29.spark机器学习_2_线性回归
一个在山顶的人的下山逻辑:
1、找到下山最快的坡度
2、沿着这个坡度走一段距离a。
3、重复1、2步骤,直到到山底。
1)批量梯度下降算法
1、遍历与此前高度相同的位置的下山最快的坡度
2)随机梯度下降算法
1、只遍历当前位置的下山最快的坡度
梯度下降算法:

  1. 初始化θ(随机初始化)。
  2. 迭代,新的θ能够使得J(θ)更小。
  3. 如果J(θ)能够继续减少不收敛,返回2)。 α称为学习率,也叫步长。
    spark-29.spark机器学习_2_线性回归

5.线性回归的应用

通过大量样本的实验学习到线性函数,然后根据新的样本外的特征数据,预测结果。

6.代码实现

  1. 创建SparkContext。
  2. 读取训练集。
  3. 训练模型。
  4. 使用模型,进行预测。
  5. 评估模型,将预测值与真实值作比较。
  6. 【Option】保存模型,方便下次使用。
  7. 关闭sparkContext。
package com.dengdan

import org.apache.spark.mllib.regression.{LinearRegressionModel, LinearRegressionWithSGD}
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.{SparkConf, SparkContext}

object LinearRegression {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[4]").setAppName("LinearRegression")
    val sc = new SparkContext(conf)

    val path = "D:\\idea_workspace2020\\spark\\sparkMLib\\linear_regression\\src\\main\\resources\\data.txt"
    //通过提供的工具类加载样本文件
    val data = MLUtils.loadLibSVMFile(sc, path).cache()
    //或者通过RDD转换加载
    /* val data = sc.textFile(path).map { line =>
       val parts = line.split(' ')
       // 结果 特征向量 特征向量 特征向量 特征向量。
       LabeledPoint(parts(0).toDouble, Vectors.dense(parts.tail.map(_.split(":")(1).toDouble)))
     }.cache()*/

    //迭代次数
    val numInterations = 100
    //梯度下降步长
    val stepSize = 0.00000001
    //训练模型
    val model = LinearRegressionWithSGD.train(data, numInterations, stepSize)

    //模型评估
    val valuesAndPreds = data.map { point =>
      //根据模型预测Label值
      val prediction = model.predict(point.features)
      println(s"【真实值】:${point.label}  ;【预测值】:${prediction}")
      (point.label, prediction)
    }

    //求均方误差
    val MSE = valuesAndPreds.map { case (v, p) => math.pow((v - p), 2) }.mean()
    println(s"训练模型的均方误差=${MSE}")

    val modelPath = "target/tmp/scalaLinearRegressionWithSGDModel"
    //保存模型
    model.save(sc, modelPath)
    //重新加载模型
    val sameModel = LinearRegressionModel.load(sc, modelPath)

    sc.stop()
  }
}