1. 程式人生 > 其它 >spark基礎4

spark基礎4

技術標籤:大資料

機器學習庫MLlib、SparseVector、dense vector、labelpoint

機器學習庫MLlib、SparseVector、dense vector、labelpoint

author:https://blog.csdn.net/u012925804/article/details/113645742

注意:

  • spark.mllibspark.ml是兩個東西。

    • spark.ml是基於dataframe的。
    • spark.mllib是基於RDD的。
  • 從Spark 2.0開始,程式包中基於RDD的APIspark.mllib已進入維護模式。現在,用於Spark的主要機器學習API是軟體包中基於DataFrame的API spark.ml

什麼是“ Spark ML”?

  • “ Spark ML”不是正式名稱,但有時用於指代基於MLlib DataFrame的API。這主要歸因於org.apache.spark.ml基於DataFrame的API使用的Scala軟體包名稱,以及我們最初用來強調管道概念的“ Spark ML Pipelines”一詞。

功能簡介

MLlib是Spark的機器學習(ML)庫。它的目標是使實用的機器學習可擴充套件且容易。在較高級別,它提供了以下工具:

  • ML演算法:常見的學習演算法,例如分類,迴歸,聚類和協作過濾
  • 特徵化:特徵提取,變換,降維和選擇
  • 管道:用於構建,評估和調整ML管道的工具
  • 永續性:儲存和載入演算法,模型和管道
  • 實用程式:線性代數,統計資訊,資料處理等。

版本差異說明:

  • MLlib仍將spark.mllib通過錯誤修復支援基於RDD的API 。
  • MLlib不會向基於RDD的API新增新功能。
  • 在Spark 2.x發行版中,MLlib將功能新增到基於DataFrames的API中,以與基於RDD的API達到功能奇偶性。
  • 達到功能奇偶性(大致針對Spark 2.3估算)後,將不推薦使用基於RDD的API。
  • 預計將在Spark 3.0中刪除基於RDD的API。

為什麼MLlib切換到基於DataFrame的API?

  • 與RDD相比,DataFrames提供了更加使用者友好的API。DataFrames的許多好處包括Spark資料來源,SQL / DataFrame查詢,Tungsten和Catalyst優化以及跨語言的統一API。
  • 用於MLlib的基於DataFrame的API為ML演算法和多種語言提供了統一的API。
  • DataFrame有助於實際的ML管道,特別是功能轉換。有關詳細資訊,請參見管道指南

資料型別 - RDD-based API

MLlib supports local vectors and matrices stored on a single machine, as well as distributed matrices backed by one or more RDDs. Local vectors and local matrices are simple data models that serve as public interfaces.

區域性向量

  • MLlib 支援兩種 local vectors: dense and sparse;
  • 密集向量由表示其輸入值的雙精度陣列支援,而稀疏向量由兩個並行陣列支援:索引和值。
    • 例如,向量(1.0, 0.0, 3.0)可以以密格式表示為[1.0, 0.0, 3.0]或以稀疏格式表示為(3, [0, 2], [1.0, 3.0]),其中3是向量的大小。

scala:

區域性向量的基類是 Vector,並且我們提供了兩種實現:DenseVectorSparseVector。我們建議使用中實現的工廠方法 Vectors來建立區域性向量。

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)))

python:

  • python裡面可以直接用array,或者list表示dense vector。
import numpy as np
import scipy.sparse as sps
from pyspark.mllib.linalg import Vectors

# Use a NumPy array as a dense vector.
dv1 = np.array([1.0, 0.0, 3.0])
# Use a Python list as a dense vector.
dv2 = [1.0, 0.0, 3.0]
# Create a SparseVector.
sv1 = Vectors.sparse(3, [0, 2], [1.0, 3.0])
# Use a single-column SciPy csc_matrix as a sparse vector.
sv2 = sps.csc_matrix((np.array([1.0, 3.0]), np.array([0, 2]), np.array([0, 2])), shape=(3, 1))

記錄label資料,Labeled point

其實就是label的稀疏表示方法。

scala

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))

// Create a labeled point with a negative label and a sparse feature vector.
val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))

python

from pyspark.mllib.linalg import SparseVector
from pyspark.mllib.regression import LabeledPoint

# Create a labeled point with a positive label and a dense feature vector.
pos = LabeledPoint(1.0, [1.0, 0.0, 3.0]) # 正樣本,python裡面可以直接用list表示dense vector

# Create a labeled point with a negative label and a sparse feature vector.
neg = LabeledPoint(0.0, SparseVector(3, [0, 2], [1.0, 3.0])) # 負樣本,

neg = LabeledPoint(0.0, SparseVector(3, [0, 2], [1.0, 3.0])) ,這個程式碼可以把sparsevector變成densevector理解。就變成了neg = LabeledPoint(0.0, [1.0, 0.0, 3.0]))

libsvm格式

label index1:value1 index2:value2 ...