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)
- spares: 稀疏型向量:(7 代表有7个数, Array(0,1,3,6) 代表非零的下标值, Array(1,2,3,5)代表非零值的元素)
- 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
}
}
此外还有分布式矩阵仅仅作为了解,就不写了.