MLlib中的数据类型

http://spark.apache.org/docs/1.6.3/mllib-data-types.html


Local Vector

有两种:dense、sparse

For example, a vector (1.0, 0.0, 3.0) can be represented in dense format as [1.0, 0.0, 3.0] or in sparse format as (3, [0, 2], [1.0, 3.0]), where 3 is the size of the vector.

import org.apache.spark.mllib.linalg.{Vector,Vectors}
// Create a dense vector (1.0, 0.0, 3.0).
val dv: Vector = Vectors.dense(1.0, 0.0, 3.0)
// Create a sparse vector (1.0, 0.0, 3.0) by specifying its indices and values corresponding to nonzero entries.
val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0))
// Create a sparse vector (1.0, 0.0, 3.0) by specifying its nonzero entries.
val sv2: Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0)))

import org.apache.spark.mllib.linalg.{Vector, Vectors}
dv: org.apache.spark.mllib.linalg.Vector = [1.0,0.0,3.0]
sv1: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0])
sv2: org.apache.spark.mllib.linalg.Vector = (3,[0,2],[1.0,3.0])


Labeled point

本身也是一个local vector,但有label。常用在监督学习算法里。多分类问题,lable必须从0开始,0,1,2,。。。

import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint

// Create a labeled point with a positive label and a dense feature vector.
val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))


Local Matrix

也分稠密矩阵与 稀疏矩阵。

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

// 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.0, 3.0, 5.0, 2.0, 4.0, 6.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))
// 第一个Array表示从第几个元素开始新起一列存放,第二个Array表示非零元素的行号,第三个Array表示非零元素的值。

dm: org.apache.spark.mllib.linalg.Matrix =
1.0 2.0
3.0 4.0
5.0 6.0
sm: org.apache.spark.mllib.linalg.Matrix =
3 x 2 CSCMatrix
(0,0) 9.0
(2,1) 6.0
(1,1) 8.0


Distributed matrix

第一种:RowMatrix,

按行存放的,每行是Local Vector。所以列数受限于integer的范围。

我们可以对每列进行统计描述,还可以进行QR分解。在SVD、PCA中有用到。

import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.mllib.linalg.distributed.RowMatrix

val rows: RDD[Vector] = ... // an RDD of local vectors
// Create a RowMatrix from an RDD[Vector].
val mat: RowMatrix = new RowMatrix(rows)

// QR decomposition 
val qrResult = mat.tallSkinnyQR(true)


第二种:IndexedRowMatrix

第三种:CoordinateMatrix

只适用于matrix的维度比较大,并且很稀疏。

Each entry is a tuple of (i: Long, j: Long, value: Double), where i is the row index, j is the column index, and value is the entry value.


第四种  BlockMatrix

PS。如何将RDD中的类型转换成自己想要的?

答:利用map,对每行数据进行类型转换。

import org.apache.spark.mllib.linalg.{Vector,Vectors}  
val m1 = sc.textFile("/user/hadoop-generalshop/caiqi.sun/spark/ml/matrix.txt").map{ r =>
    val row = r.split(" ").map(_.toDouble)
    (Vectors.dense(row))
}

import org.apache.spark.mllib.linalg.{Vector, Vectors}
m1: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MapPartitionsRDD[12] at map at <con


PPS。如何创建RDD?

1)从Hadoop文件系统(如HDFS、Hive、HBase)输入创建。
2)从父RDD转换得到新RDD。
3)通过parallelize或makeRDD将单机数据创建为分布式RDD。
从集合创建RDD:var rdd = sc.parallelize(1 to 10
var rdd = sc.makeRDD(collect) 

4)基于DB(Mysql)、NoSQL(HBase)、S3(SC3)、数据流创建。

### Apache Spark MLlib 特有的数据类型 #### 向量 (Vectors) 在 `MLlib` 中,向量表示数值特征的数组。这些对象被封装在一个名为 `Vector` 的特质下,在 Scala 和 Java 中位于包 `org.apache.spark.mllib.linalg.Vector` 下[^1]。 对于 Python 用户来说,则是在 `pyspark.ml.vector` 或者 `pyspark.mllib.linalg.Vectors` 类中找到相应的方法来创建稀疏或密集向量。下面是一个简单的例子展示如何创建这两种类型的向量: ```python from pyspark.ml.linalg import Vectors denseVec = Vectors.dense([1.0, 2.0, 3.0]) sparseVec = Vectors.sparse(4, {0: 1.0, 2: 3.0}) ``` #### 矩阵 (Matrices) 除了向量之外,`MLlib` 还支持两种主要形式的矩阵:稠密矩阵 (`DenseMatrix`) 和稀疏矩阵 (`SparseMatrix`)。它们继承自共同的基础接口 `Matrix`,同样可以在上述提到的语言绑定里找到对应的实现方式[^5]。 这里给出一个使用 Scala 创建稠密矩阵的例子: ```scala import org.apache.spark.mllib.linalg.{Matrix, Matrices} val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0)) println(dm) // 输出: // 1.0 2.0 // 3.0 4.0 // 5.0 6.0 ``` 值得注意的是,当定义矩阵时,输入的数据是以列优先顺序排列的一维数组。 #### LabeledPoint 另一个重要的数据结构是 `LabeledPoint`,它用于监督学习算法中的训练集表示法。每个 `LabeledPoint` 实例都由标签(通常是类别索引或者是回归目标值)和关联的特征向量组成。这使得机器学习库能够方便地处理带标注的数据集[^2]。 以下是加载 LIBSVM 文件格式作为 RDD[LabeledPoint] 的示例代码片段: ```scala import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.util.MLUtils import org.apache.spark.rdd.RDD val examples: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "file:///path/to/libsvm/file") ``` 通过这种方式可以轻松读取标准格式的数据文件,并将其转换成适合进一步分析的形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值