spark的机器学习库,包含常见的学习算法和工具如分类、回归、聚类、协同过滤、降维等
使用算法时都需要指定相应的数据集,下面为大家介绍常用的spark ml 数据类型。
1.本地向量(Local Vector)
存储在单台机器上,索引采用0开始的整型表示,值采用Double类型的值表示。Spark MLlib中支持两种类型的矩阵,分别是密度向量(Dense Vector)和稀疏向量(Spasre Vector),密度向量会存储所有的值包括零值,而稀疏向量存储的是索引位置及值,不存储零值,在数据量比较大时,稀疏向量才能体现它的优势和价值

scala> import org.apache.spark.mllib.linalg.{Vector, Vectors}
注意:scala默认会导入scala.collection.immutable.Vector,所以必须显式导入org.apache.spark.mllib.linalg.Vector
1.1密度向量,零值也存储
scala> val dv: Vector = Vectors.dense(1.0, 0.0, 3.0)
1.2.1创建稀疏向量,指定元素的个数、索引及非零值,数组方式
     基于索引(0,2)和值(1,3)创建稀疏向量
scala> val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0))
1.2.2 创建稀疏向量,指定元素的个数、索引及非零值,采用序列方式
scala> val sv2: Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0)))

2.带类标签的特征向量(Labeled point)
Labeled point是Spark MLlib中最重要的数据结构之一,它在无监督学习算法中使用十分广泛,它也是一种本地向量,只不过它提供了类的标签,对于二元分类,它的标签数据为0和1,而对于多类分类,它的标签数据为0,1,2,…。它同本地向量一样,同时具有Sparse和Dense两种实现方式

scala> import org.apache.spark.mllib.regression.LabeledPoint
2.1LabeledPoint第一个参数是类标签数据,第二参数是对应的特征数据
//密度
scala> val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))
scala> println(pos.features)
scala> println(pos.label)
//稀疏
scala> val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))
注意:第2个特征值为0,从编程的角度来说,这样做可以减少内存的使用,并提高做矩阵内积时的运算速度

3.本地矩阵(Local matrix)
本地向量是由从0开始的整数下标和Double类型的数值组成。它有稠密向量(dense vector)和稀疏向量(sparse vertor)两种。在列的主要顺序中,它的非零输入值存储在压缩的稀疏列(CSC)格式中
在一维数组[1.0、3.0、5.0、2.0、4.0、6.0]中,对应的矩阵大小(3、2):

本地矩阵的基类是Matrix,提供了两种实现 DenseMatrix和SparseMatrix. 推荐使用工厂方法实现的Matrices来创建本地矩阵.

scala> import org.apache.spark.mllib.linalg.{Matrix, Matrices}
3.1 创建稠密矩阵
scala> val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
3.2 创建稀疏矩阵
scala> val sm: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), Array(0, 2, 1), Array(9, 6, 8))

4.分布式矩阵(Distributed matrix)
分布式矩阵有Long类型的行列数据和Double类型值,存储在一个或多个RDDs中

4.1. 行矩阵(RowMatrix)
行矩阵是一个没有行索引的,以行为导向(row-oriented )的分布式矩阵,它的行只支持RDD格式,每一行都是一个本地向量。由于每一行都由一个局部向量表示,所以列的数量是由整数范围所限制的,但是在实际操作中应该要小得多

scala> import org.apache.spark.mllib.linalg.Vector
scala> import org.apache.spark.mllib.linalg.distributed.RowMatrix
scala> import org.apache.spark.mllib.linalg.{Vector, Vectors}

4.1.1 生成DataFrame
scala> val df1 = Seq(
           (1.0, 2.0, 3.0),
           (1.1, 2.1, 3.1),
           (1.2, 2.2, 3.2)).toDF("c1", "c2", "c3")
scala> df1.show
c1  c2  c3
1.0 2.0 3.0
1.1 2.1 3.1
1.2 2.2 3.2

4.1.2 DataFrame转换成RDD[Vector]
scala> val rv1= df1.rdd.map {
                  x =>Vectors.dense(
                      x(0).toString().toDouble,
                      x(1).toString().toDouble,
                      x(2).toString().toDouble)
                }
scala> rv1.collect()

4.1.3 创建行矩阵
scala> val mt1: RowMatrix = new RowMatrix(rv1)
scala> val m = mt1.numRows()
scala> val n = mt1.numCols()
查看:
scala> mt1.rows.collect()

scala>mt1.rows.map { x =>
             (x(0).toDouble,
                x(1).toDouble,
                x(2).toDouble)
          }.collect()

4.2 CoordinateMatrix坐标矩阵
CoordinateMatrix是一个分布式矩阵,每行数据格式为三元组(i: Long, j: Long, value: Double), i表示行索引,j表示列索引,value表示数值。只有当矩阵的两个维度都很大且矩阵非常稀疏时,才应该使用坐标矩阵。可以通过RDD[MatrixEntry]实例来创建一个CoordinateMatrix。MatrixEntry包装类型(Long, Long, Double)
scala> import org.apache.spark.mllib.linalg.distributed.CoordinateMatrix
scala> import org.apache.spark.mllib.linalg.distributed.MatrixEntry
4.2.1 生成df(行坐标,列坐标,值)
scala> val df = Seq(
          (0, 0, 1.1), (0, 1, 1.2), (0, 2, 1.3),
          (1, 0, 2.1), (1, 1, 2.2), (1, 2, 2.3),
          (2, 0, 3.1), (2, 1, 3.2), (2, 2, 3.3)).toDF("row", "col", "value")

4.2.2 生成入口矩阵

scala> val m1 = df.rdd.map { x =>
           val a = x(0).toString().toLong
           val b = x(1).toString().toLong
           val c = x(2).toString().toDouble
           MatrixEntry(a, b, c)
          }
scala> m1.collect()
4.2.3 生成坐标矩阵
scala> val m2 = new CoordinateMatrix(m1)
scala> m2.numRows()
scala> m2.numCols()
查看
scala> m2.entries.collect().take(10)

spark 机器学习基础 数据类型的更多相关文章

  1. Spark机器学习基础三

    监督学习 0.线性回归(加L1.L2正则化) from __future__ import print_function from pyspark.ml.regression import Linea ...

  2. Spark机器学习基础二

    无监督学习 0.K-means from __future__ import print_function from pyspark.ml.clustering import KMeans #from ...

  3. Spark机器学习基础一

    特征工程 对连续值处理 0.binarizer/二值化 from __future__ import print_function from pyspark.sql import SparkSessi ...

  4. Spark机器学习基础-监督学习

    监督学习 0.线性回归(加L1.L2正则化) from __future__ import print_function from pyspark.ml.regression import Linea ...

  5. Spark机器学习基础-无监督学习

    0.K-means from __future__ import print_function from pyspark.ml.clustering import KMeans#硬聚类 #from p ...

  6. Spark机器学习基础-特征工程

    对连续值处理 0.binarizer/二值化 from __future__ import print_function from pyspark.sql import SparkSession fr ...

  7. Spark机器学习MLlib系列1(for python)--数据类型,向量,分布式矩阵,API

    Spark机器学习MLlib系列1(for python)--数据类型,向量,分布式矩阵,API 关键词:Local vector,Labeled point,Local matrix,Distrib ...

  8. Spark机器学习4·分类模型(spark-shell)

    线性模型 逻辑回归--逻辑损失(logistic loss) 线性支持向量机(Support Vector Machine, SVM)--合页损失(hinge loss) 朴素贝叶斯(Naive Ba ...

  9. 掌握Spark机器学习库(课程目录)

    第1章 初识机器学习 在本章中将带领大家概要了解什么是机器学习.机器学习在当前有哪些典型应用.机器学习的核心思想.常用的框架有哪些,该如何进行选型等相关问题. 1-1 导学 1-2 机器学习概述 1- ...

随机推荐

  1. sql server导出数据结构

    http://jingyan.baidu.com/article/eae07827ad76ba1fed548573.html

  2. 交换两个局部变量Integer的值

    反射是很强大的,谁说的final修饰的就不能改变, 通过反射获取成员变量,之后可以取消访问修饰符,也就是说private的也可以访问, 在修改常量(final修饰的),之后就可以对其做任何操作了 如下 ...

  3. XStream实现缓存

    ************************************************************************************ 系统实现缓存有多种方式,如re ...

  4. https://blog.csdn.net/u011489043/article/details/68488459

    转自https://blog.csdn.net/u011489043/article/details/68488459 String 字符串常量   StringBuffer 字符串变量(线程安全) ...

  5. 理解 RxJava 的线程模型

    来源:鸟窝, colobu.com/2016/07/25/understanding-rxjava-thread-model/ 如有好文章投稿,请点击 → 这里了解详情 ReactiveX是React ...

  6. log.go

    ) //打开日志文件 以及文件操作权限     if err != nil {         return err     }     // 解析日志记录的等级信息     level, err : ...

  7. 【欧拉函数】BZOJ2705: [SDOI2012]Longge的问题

    Description Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N).   Solut ...

  8. Git----GitHub上传本地文件到git

    1.首先在git上创建一个库,用来保存上传的本地文件 2.通过命令 git init 把这个目录变成git可以管理的仓库 git init 3.将远程git库克隆一份保存到本地 git clone x ...

  9. ReentrantLock之公平锁源码分析

    本文分析的ReentrantLock所对应的Java版本为JDK8. 在阅读本文前,读者应该知道什么是CAS.自旋. 本文大纲 1.ReentrantLock公平锁简介 2.AQS 3.lock方法 ...

  10. Java中ArrayList学习笔记

    1. 先看两段代码 这段代码在执行的时候会报 但是这样写就好着呢: 总结,研究报错的代码 ,在for循环的时候调用next()方法,next方法中调用了checkForComodification这个 ...