SparkMllib的基础数据类型

1. 简介

  • SparkMllib的数据结构: DataFrame和RDD
  • MLLIB支持很多种机器学习算法中类型,主要有向量和矩阵两种类型。
    有下面四种分类:
    (1)Local vector本地向量集,主要向Spark提供一组可进行操作的数据集合。
    (2)Labeled Point向量标签,让用户能够分类不同的数据集合。
    (3)Local matrix本地矩阵,将数据集合以矩阵形式存储在本地计算机中。
    (4)Distribute matrix分布式矩阵。将数据集以矩阵的形式存储在分布式的计算机中。

玩的就是向量和矩阵

2. Local vector本地向量详解以及代码解释(重点)

分类:

  • 1-稀疏型数据集spares
  • 2-密集型数据集dense

举例:

  • 有这样一组向量数据(1,2,3,4,5,6,7)
  1. spares: 稀疏型向量:(7 代表有7个数, Array(0,1,3,6) 代表非零的下标值, Array(1,2,3,5)代表非零值的元素)
  2. dense:稠密型向量(1,2,3,4,5,6,7)
    代码解释:
import org.apache.spark.ml.linalg.{
    
    Vector, Vectors}
/**
 * @author liu a fu
 * @date 2021/1/27 0027
 * @version 1.0
 * @DESC 学习本地向量localvector---sparse+dense
 *      1-1导入本地向量使用的包
 */
object _01LocalVectorTest {
    
    
  def main(args: Array[String]): Unit = {
    
    
    /**
     * spares 稀疏向量2种方法演示
     */
      //1-建立稀疏向量
    val sparesVector1: Vector = Vectors.sparse(3, Array(0, 1), Array(3, 4))
    println("sparesVectors1 is value:",sparesVector1)   //(sparesVectors is value:,(3,[0,1],[3.0,4.0]))
    println("sparesVector1 is value",sparesVector1(2))   // (sparesVector is value,0.0) 第三个元素没设置值

      //2-建立稀疏向量
    val sparesVector2: Vector = Vectors.sparse(3, Seq((0, 3.0), (1, 4.0)))  //第一个元素 3.0 第二个元素 4.0
    println("sparseVectors2 value is:", sparesVector2)
    println("sparseVectors2 value is:", sparesVector2(2)) //打印稀疏向量的第三个值
    /**
     * (sparseVectors2 value is:,(3,[0,1],[3.0,4.0]))
     * (sparseVectors2 value is:,0.0)   第3个元素没有设置值
     *
     */
    
    println("="*100)
    /**
     * dense 稠密向量两种方法演示
     */
      //1-建立稠密向量
    val denseVector1: Vector = Vectors.dense(1, 2, 3)
    println("denseVector1 is value",denseVector1)  //打印: (denseVector1 is value,[1.0,2.0,3.0])

    val denseVector2: Vector = Vectors.dense(Array(1.0, 2.0, 3.0))
    println("denseVector2 is value",denseVector2)  //(denseVector2 is value,[1.0,2.0,3.0])
  }

}

在MLlib的数据支持格式中,目前仅支持整数与浮点型数。其他数据类型不在支持范围之内,主要也是因为MLLIB主要用于做数值计算

  • 注意:scala.collection.immutable.Vector默认情况下, Scala会导入,因此您必须org.apache.spark.mllib.linalg.Vector明确导入 才能使用MLlibVector。

3. labeledpoint 标签向量详解以及代码演示(重点)

简介:标签向量用于MLLIB中机器学习算法做标记。在分类问题中,可以将不同的数据集分成若干份,以整数型0、1、2进行标记。

LaebledPoint是建立向量标签的静态类,主要有两个方法:

  • (1)Features用于显示打印标记点所代表的数据内容,
  • (2)而label用于显示标记数。

代码演示:

import org.apache.spark.mllib.linalg.{
    
    Vector, Vectors}
import org.apache.spark.mllib.regression.LabeledPoint

/**
 * @author liu a fu
 * @date 2021/1/27 0027
 * @version 1.0
 * @DESC 标签向量LabeledPoint----特征+标签列的方式
 *       1-1导入本地向量使用的包
 *       ("0.8.0") label: Double,
 *       ("1.0.0") features: Vector
 */
object _02LablePointTest {
    
    
  def main(args: Array[String]): Unit = {
    
    
    //1-创建稠密型向量
    val denseVector1: Vector = Vectors.dense(1, 2, 3)
    println("denseVector1 is value",denseVector1)
    val denseVector2: Vector = Vectors.dense(Array(1.0, 2, 3))
    println("denseVector2 is  value",denseVector2)

    //2-对密集向量建立标记点
    //特征+标签列
    val pointLable1: LabeledPoint = LabeledPoint(1.0, denseVector1)

    //打印标记点内容数据
    println("features",pointLable1.features)  //(features,[1.0,2.0,3.0])
    
    //打印既定标记
    println("lables",pointLable1.label) //(lables,1.0)
  }
}

4. libsvm数据读取【掌握】

libsvm数据格式

  • 台湾大学老师发明的数据格式,最早用于svm模型中,用于稀疏矩阵的存储

  • label,index1:features index2:features2

  • 标签,特征列的索引1:特征数值,特征列的索引2:特征数值

例子:
2 1:5 2:8 3:9(数据索引从1开始,从0开始会报错) 第二个标签的第一个值为5

1 1:7 2:6 3:7

1 1:3 2:2 3:1

代码演示 原始方式:

import org.apache.spark.{
    
    SparkConf, SparkContext}
import org.apache.spark.mllib.linalg.{
    
    Vector, Vectors}
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.rdd.RDD
/**
 * @author liu a fu
 * @date 2021/1/27 0027
 * @version 1.0
 * @DESC 学习libsvm数据的读取---标签列的方式 特征索引1:特征值1 特征索引2:特征值2
 *       1-1导入本地向量使用的包
 *       ("0.8.0") label: Double,
 *       ("1.0.0") features: Vector
 */
object _03LibSvmFileTest {
    
    
  def main(args: Array[String]): Unit = {
    
    
    //1-准备环境
    val conf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName.stripSuffix("$")).setMaster("local[8]")
    val sc = new SparkContext(conf)
    sc.setLogLevel("WARN")

    //2-创建密集向量
    val denseVector1: Vector = Vectors.dense(1, 2, 3)

    //3-读取libsvm数据
    val valueLibSvmData: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "C:\\software\\studysoft\\BigdataCode\\Spark_Code\\Spark_Mllib\\data\\libsvm\\a.txt")
    valueLibSvmData.foreach(println(_))
    /**
     * (1.0 label,(3 num,[0,1,2] indices,[3.0,2.0,1.0] values))  sparse稀疏向量的表示
     * (2.0,(3,[0,1,2],[5.0,8.0,9.0]))
     * (1.0,(3,[0,1,2],[7.0,6.0,7.0]))
     */
  }

}

代码演示 SparkSQL的方式:

import org.apache.spark.sql.{
    
    DataFrame, SparkSession}

/**
 * @author liu a fu
 * @date 2021/1/27 0027
 * @version 1.0
 * @DESC  SparkSQL的方式演示读取libSVM数据
 */
object _04LibSvmSQLFile {
    
    
  def main(args: Array[String]): Unit = {
    
    
    //1-准备环境
    val spark: SparkSession = SparkSession
      .builder()
      .appName(this.getClass.getSimpleName.stripSuffix("$"))
      .master("local[*]")
      .getOrCreate()
    spark.sparkContext.setLogLevel("WARN")

    val path = "C:\\software\\studysoft\\BigdataCode\\Spark_Code\\Spark_Mllib\\data\\libsvm\\a.txt"

    //2-读取数据
    val libSVMDF: DataFrame = spark.read.format("libsvm").load(path)
    libSVMDF.printSchema()
    //root
    // |-- label: double (nullable = true)
    // |-- features: vector (nullable = true)

    libSVMDF.show(truncate = false)
    /**
     * +-----+-------------------------+
     * |label|features                 |
     * +-----+-------------------------+
     * |2.0  |(3,[0,1,2],[5.0,8.0,9.0])|   第二个标签  一共有3个数  第1 2 3 个数的值为  5.0,8.0,9.0
     * |1.0  |(3,[0,1,2],[7.0,6.0,7.0])|
     * |1.0  |(3,[0,1,2],[3.0,2.0,1.0])|
     * +-----+-------------------------+
     */
  }

}

5. localMatrix本地矩阵详解记忆代码【掌握dense】

local matrix本地矩阵

  • 按照式的方式存储
  • 更多的场景下使用向量构建矩阵

三行3列的矩阵
在这里插入图片描述

按照一个列向量存储[1.0, 3.0, 5.0, 2.0, 4.0, 6.0] 矩阵尺寸为 (3, 2)

代码解释:

import org.apache.spark.mllib.linalg.{
    
    Matrices, Matrix}

/**
 * @author liu a fu
 * @date 2021/1/27 0027
 * @version 1.0
 * @DESC 本地矩阵 代码详解
 */
object _05LocalMatrix {
    
    
  def main(args: Array[String]): Unit = {
    
    
    //1-创建一个3行2列的矩阵  稠密型的方式
    // Create a dense matrix ((1.0, 2.0), (3.0, 4.0), (5.0, 6.0))
    val dm: Matrix = Matrices.dense(3, 2, Array(1, 3, 5, 2, 4, 6))
    //这个是打印第三行  第一列的数
    println(dm(2,0)) //5.0

    
    
    //稀疏型的方式  了解 用得少
    // Create a sparse matrix ((9.0, 0.0), (0.0, 8.0), (0.0, 6.0))
    val sm: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), Array(0, 2, 1), Array(9, 6, 8))
    println(sm(2,1))  //6.0
  }

}

此外还有分布式矩阵仅仅作为了解,就不写了.

猜你喜欢

转载自blog.csdn.net/m0_49834705/article/details/113245776