zoukankan      html  css  js  c++  java
  • 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)

    参考资料:

  • 相关阅读:
    JSP课程设计:宿舍管理系统(附源码)
    【博客模板页】从此不再为写博客头疼 (ノ ̄▽ ̄)~(ノ ̄▽ ̄)~(ノ ̄▽ ̄)~
    个人自定义的快捷键
    碎知识点收藏栏 [逆序时间排版]
    JavaSE (46)
    《Java8实战》05
    Python04
    【BUG11】
    三、如何科学地做到:算法竞赛从入门到放弃/算法竞赛从了解入坑到快速放弃指南?
    二、如何科学地在面试时踩雷?
  • 原文地址:https://www.cnblogs.com/yanshw/p/12073021.html
Copyright © 2011-2022 走看看