spark基礎4
阿新 • • 發佈:2021-02-05
技術標籤:大資料
機器學習庫MLlib、SparseVector、dense vector、labelpoint
機器學習庫MLlib、SparseVector、dense vector、labelpoint
author:https://blog.csdn.net/u012925804/article/details/113645742
-
spark.mllib
和spark.ml
是兩個東西。spark.ml
是基於dataframe的。spark.mllib
是基於RDD的。
-
從Spark 2.0開始,程式包中基於RDD的API
spark.mllib
已進入維護模式。現在,用於Spark的主要機器學習API是軟體包中基於DataFrame的APIspark.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
,並且我們提供了兩種實現:DenseVector
和 SparseVector
。我們建議使用中實現的工廠方法 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 ...