1、本地向量
MLlib的本地向量主要分為兩種,DenseVector和SparseVector,顧名思義,前者是用來保存稠密向量,后者是用來保存稀疏向量,其創建方式主要有一下三種(三種方式均創建了向量(1.0, 0.0, 2.0):
1 import org.apache.spark.mllib.linalg.{Vector, Vectors} 2 3 //創建一個稠密向量 4 val dv : Vector = Vector.dense(1.0,0.0,3.0); 5 //創建一個稀疏向量(第一種方式) 6 val sv1: Vector = Vector.sparse(3, Array(0,2), Array(1.0,3.0)); 7 //創建一個稀疏向量(第二種方式) 8 val sv2 : Vector = Vector.sparse(3, Seq((0,1.0),(2,3.0)))
對於稠密向量:很直觀,你要創建什么,就加入什么,其函數聲明為Vector.dense(values : Array[Double])
對於稀疏向量,當采用第一種方式時,3表示此向量的長度,第一個Array(0,2)表示的索引,第二個Array(1.0, 3.0)與前面的Array(0,2)是相互對應的,表示第0個位置的值為1.0,第2個位置的值為3
對於稀疏向量,當采用第二種方式時,3表示此向量的長度,后面的比較直觀,Seq里面每一對都是(索引,值)的形式。
tips:由於scala中會默認包含scal.collection.immutalbe.Vector,所以當使用MLlib中的Vector時,需要顯式的指明import路徑
2、向量標簽
向量標簽和向量是一起的,簡單來說,可以理解為一個向量對應的一個特殊值,這個值的具體內容可以由用戶指定,比如你開發了一個算法A,這個算法對每個向量處理之后會得出一個特殊的標記值p,你就可以把p作為向量標簽。同樣的,更為直觀的話,你可以把向量標簽作為行索引,從而用多個本地向量構成一個矩陣(當然,MLlib中已經實現了多種矩陣)
其使用代碼為:
1 import org.apache.spark.mllib.linag.Vectors 2 import org.apache.spark.mllib.regression.LabeledPoint 3 4 val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))
對於pos變量,第一個參數1.0的具體含義只有你自己知道咯,可以使行索引,可以使特殊值神馬的
從文件中直接讀入一個LabeledPoint
MLlib提供了一種快捷的方法,可以讓用戶直接從文件中讀取LabeledPoint格式的數據。規定其輸入文件的格式為:
label index1:value1 index2:value2.....
然后通過一下方式直接讀入即可
val test : RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "path")
3、本地矩陣
既然是算數運算包,肯定少不了矩陣包,先上代碼:
1 import org.apache.spark.mllib.linalg.{Matrix, Matrices} 3 val dm : Matrix = Matrices.dense(3,2, Array(1.0,3.0,5.0,2.0,4.0,6.0))
上面的代碼段創建了一個稠密矩陣:
| 1.0 | 2.0 |
| 3.0 | 4.0 |
| 5.0 | 6.0 |
很明顯,創建的時候是將原來的矩陣按照列變成一個一維矩陣之后再初始化的。 tips:注意,我們創建的是稠密矩陣,不幸的事,MLlib中並沒有提供稀疏矩陣的實現,官方說在后續版本中會提供
。。。 。。。
