spark机器学一Mllib 数据类型
Posted yanshw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark机器学一Mllib 数据类型相关的知识,希望对你有一定的参考价值。
spark 提供了两个机器学习库 MLlib 和 ML,MLlib 是 spark 第一个机器学习库,相比于 ML,它更加成熟
rdd 是 spark core 的数据抽象,dataframe 是 sparkSQL 的数据抽象,
而 MLib 的数据抽象包括 Vector、LabeledPoint、Rating
Vector
vector 是一个由 数值型数据 构成的带索引的 集合,确切的说是一个向量;索引从 0 开始;
从机器学习的角度将,一个 vector 代表一个 对象,vector 的元素代表对象的特征;
MLib 支持两种类型的向量:稀疏 与 稠密;
MLib 的 vector 被定义成特质,无法直接创建一个 vector 实例,可以使用工厂方法 DenseVector 和 SparseVector 来创建具有 vector 特质的实例; 【Dense 稠密,Sparse 稀疏】
Vectors 类的 dense 和 sparse 方法提供了更统一的接口;
API 汇总
DenseVector 和 SparseVector 继承自 Vector,自然都有 asML 和 toArray 方法
Vectors 统一了 创建方法
DenseVector
创建对象
from pyspark.mllib.linalg import Vectors from pyspark.mllib.linalg import DenseVector ### DenseVector 方法 a = DenseVector([-1, 2]) print(a) # [-1.0,2.0] ### vectors.dense 方法 v = Vectors.dense([1.0, 3]) u = Vectors.dense([2, 4.0]) # s = Vectors.dense([‘a‘, ‘b‘]) # 不能是字符 ValueError: could not convert string to float: a t = Vectors.dense([1, 1]) # 元素可重复,非集合 set print(v[0]) # 1.0 print(v + u) # [3.0,7.0] print(v * u) # [2.0,12.0] print(v - 2) # [-1.0,1.0] print(v % 2) # [1.0,1.0] print(a + v) # [0.0,5.0] 两种方法创建的 向量 可直接相加
操作 API
dot(other)
向量相乘,参数支持 Numpy array, list, SparseVector, or SciPy sparse 等多种格式
v.dot(range(2)) # list # dense.dot(SparseVector(2, [0, 1], [2., 1.])) # SparseVector # dense.dot(np.array(range(1, 3))) # np
norm(p)
向量范数,
第一范数 Σ|x|;第二范数 平方和开方
a = DenseVector([0, -1, 2, -3]) a.norm(1) # 第一范数 6.0 a.norm(2) # 第二范数 3.7
查看全部的属性方法,使用时可自行研究
dir(a) [‘array‘, ‘asML‘, ‘dot‘, ‘norm‘, ‘numNonzeros‘, ‘parse‘, ‘squared_distance‘, ‘toArray‘, ‘values‘]
SparseVector
只存储非零值
SparseVector 实例中存在两个数组:一个存储非零值的索引,一个存储非零值
from pyspark.mllib.linalg import Vectors from pyspark.mllib.linalg import SparseVector ### SparseVector 方法 a = SparseVector(4, [1, 3], [3.0, 4.0]) # size 4, 非零元素索引 [1, 3], 非零元素值 [3, 4] print(a) print(a.values) # [ 3. 4.] print(a.toArray()) # [ 0. 3. 0. 4.] ### vectors.sparse 方法 n = Vectors.sparse(4, {1: 1.0, 3: 5.5}) # 方式1 p = Vectors.sparse(4, [(1, 1.0), (3, 5.5)]) # 方式2 q = Vectors.sparse(4, [1, 3], [1.0, 5.5]) # 方式3 print(n) print(a + n) # TypeError: unsupported operand type(s) for +: ‘SparseVector‘ and ‘SparseVector‘
查看全部的属性方法
dir(a) [ ‘dot‘, ‘indices‘, ‘norm‘, ‘numNonzeros‘, ‘parse‘, ‘size‘, ‘squared_distance‘, ‘toArray‘, ‘values‘]
LabeledPoint
由 LabeledPoint 构成的 RDD 是标签数据的主要抽象,MLlib 提供的回归和分类算法只能作用于由 LabeledPoint 构成的 RDD 上
from pyspark.mllib.regression import LabeledPoint from pyspark.mllib.linalg import Vectors # class pyspark.mllib.regression.LabeledPoint(label, features) classing = LabeledPoint(1, Vectors.dense([1, 3])) regression = LabeledPoint(2.5, Vectors.sparse(3, [2], [3])) print(classing) # (1.0,[1.0,3.0]) print(regression) # (2.5,(3,[2],[3.0]))
Rating
这个数据类型主要用在 推荐算法 中,表示用户对某个产品的评分;
在输入推荐算法之前必须把数据集转换成由 Rating 构成的 RDD
Rating 类有 3 个参数:
第一个是 用户 ID,int 型;
第二个是 产品 ID,int 型;
第三个是 评分,double 型
from pyspark.mllib.recommendation import Rating r = Rating(1, 2, 5.0) print(r.user, r.product, r.rating) # (1, 2, 5.0) print(r[0], r[1], r[2]) # (1, 2, 5.0)
参考资料:
以上是关于spark机器学一Mllib 数据类型的主要内容,如果未能解决你的问题,请参考以下文章