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)

参考资料:

猜你喜欢

转载自www.cnblogs.com/yanshw/p/12073021.html