當前位置: 首頁>>機器學習>>正文


Spark機器學習庫指南[Spark 1.3.1版]——數據類型(Data Types)

下麵是章節數據類型的目錄(其他內容參見全文目錄)

MLlib支持存儲在單機上的局部向量和局部矩陣,也可以支持通過一個或多個RDD(可伸縮數據集)表示的分布式矩陣。局部向量和局部矩陣是用作公共接口的簡單數據模型,實際上底層的線性代數運算由Breeze (機器學習和數值運算的Scala庫)和 jblas (JAVA線性代數運算庫)提供。在有監督機器學習中,MLlib使用標記點(labeled point)來表示單個訓練語料。

局部向量[Local vector]

局部向量存儲在單機上,使用整數表示索引,索引從0開始;使用雙精度浮點數(double)存儲數值。MLlib支持兩種類型的局部向量:密集型和稀疏型。密集向量(dense vector)使用double數組表示元素值,而稀疏向量(sparse vector)通過兩個並列的數組來表示:一個表示索引,一個表示數值。例如:向量(1.0, 0.0, 3.0)使用密集型可表示為:[1.0, 0.0, 3.0], 而使用稀疏型可以表示為:(3, [0, 2], [1.0, 3.0]], 其中3是向量的長度。

在Python中,MLlib支持以下的方式表示密集向量:

  • NumPy的數組(NumPy’s array)(NumPy是一個第三方Python庫,用於科學計算)
  • Python中的鏈表(listPython’s list), 例如[1, 2, 3]

使用以下的方式表示稀疏向量:

  • MLlib中的SparseVector[MLlib’s SparseVector]
  • SciPy中的單列csc_matrix[SciPy’s csc_matrix with a single column] (SciPy是第三方Python庫,用於數學、科學、工程,SciPy包含多個子庫,NumPy是其中的一個)

基於性能的考慮,我們建議:使用NumPy數組而不是Python鏈表來創建密集向量,使用MLlib中的Vectors來創建稀疏向量。

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

 

標記點[Labeled point]

標記點是局部向量,向量可以是密集型或者稀疏型,每個向量會關聯了一個標簽(label)。MLlib的標記點用於有監督學習算法。我們使用double來存儲標簽值,這樣標記點既可以用於回歸又可以用於分類。在二分類中,標簽要麽是0要麽是1;在多分類中,標簽是0, 1, 2, ….

在Python中,標簽點使用 LabeledPoint表示

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

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

 

稀疏數據(Sparse data)

在實踐中經常用到稀疏訓練數據。MLlib支持讀取LIBSVM格式的訓練語料數據,這個是LIBSVMLIBLINEAR中用到的默認格式(LIBSVM和LIBLINERAR是台灣林智仁教授開發的的SVM庫和線性分類器)。這是一種文本格式,每行表示一個標記的稀疏特征向量,示例如下:

label index1:value1 index2:value2 …

字符串使用空格分隔,索引從0開始,以遞增的訓練排列。導入係統後,特征索引自動轉為從0開始索引。

MLUtils.loadLibSVMFile 可以讀取LIBSVM格式的訓練語料。

from pyspark.mllib.util import MLUtils

examples = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")

局部矩陣[Local matrix]

局部矩陣使用整型行列索引和浮點(double)數值,存儲在單機上。MLIB支持密集型矩陣,元素值按列優先以double數組的方式存儲。例如,下麵的矩陣:

1

會被存儲為一維數組[1.0, 3.0, 5.0, 2.0, 4.0, 6.0] ,矩陣的大小是(3, 2)。

注:暫無Python示例。

 

分布式矩陣[Distributed matrix]

分布式矩陣以long整型做索引,以double類型為值,以RDD的方式分布式存儲。當存儲非常大的分布式矩陣的時候,選擇正確的存儲方式非常重要。因為將分布式矩陣轉換為另一種格式可能需要全局shuffle, 這個開銷非常大。目前,有三種分布式矩陣已經實現。

基本類型是行矩陣(RowMatrix)。行矩陣按行分布式存儲,這個時候行號沒有意義。例如,特征向量集就可以表示為行矩陣,通過RDD來支撐矩陣的部分行,每行是一個局部向量。我們認為RowMatrix的列數不是特別巨大,所以單個局部向量可以方便地跟驅動程序交互,並且能夠在單個節點上存儲和操作。索引行矩陣(IndexedRowMatrix)跟RowMatrix類似,但是IndexedRowMatrix帶有行號,從而可以標記行並且執行join操作。坐標矩陣(CoordinateMatrix)是以coordinate list (COO)(COO用於存儲稀疏矩陣,以鏈表的形式(list)存放(rowIndex, colIndex, value)元組)格式存儲的分布式矩陣,其底層支撐也是RDD。

注意:分布式矩陣底層的RDD必須是確定的,因為我們緩存了矩陣的大小(size)。通常使用不確定的RDD會導致出錯。

分塊矩陣[BlockMatrix]

分塊矩陣(BlockMatrix)是由RDD支撐的分布式矩陣,RDD中的元素為MatrixBlock。MatrixBlock是多個((Int, Int), Matrix)組成的元組,其中(Int, Int)是分塊索引, Matriax是指定索引處的子矩陣, 該矩陣的大小為rowsPerBlock x colsPerBlock。BlockMatrix支持跟其他BlockMatrix做add(加)和multiply(乘)操作。BlockMatrix還有一個輔助方法validate,這個方法可以檢查BlockMatrix是否設置是否恰當。

注:暫無Python示例。

行矩陣[RowMatrix]

行矩陣(RowMatrix)按行分布式存儲,無行索引,底層支撐結構是多行數據組成的RDD,每行是一個局部向量。正因為每行是局部向量,列數受限於整數的範圍,不過在實踐中已經夠用了。

注:暫無Python示例。

索引行矩陣[IndexedRowMatrix]

索引行矩陣(IndexedRowMatrix)跟RowMatrix類似,但是有行索引。其底層支撐結構是索引的行組成的RDD,所以每行可以通過索引(long)和局部向量表示。

注:暫無Python示例。

坐標矩陣[CoordinateMatrix]

坐標矩陣(CoordinateMatrix)也是由RDD做底層結構的分布式矩陣。每個RDD元素是由多個(i : long, j : long, value: Double)組成的元組,其中i是行索引,j是列索引,value是元素值。CoordinateMatrix 隻應該應用於矩陣緯度高並且稀疏的情況下。

注:暫無Python示例。

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/447.html,未經允許,請勿轉載。