3 Spark機器學習 spark MLlib 矩陣向量、矩陣運算Breeze庫-1
阿新 • • 發佈:2019-02-19
機器學習裡矩陣是必不可少的,無論Python、Java能做機器學習的語言,都會提供比較優質的矩陣庫。
spark mllib中提供的矩陣庫是Breeze,可以簡單看看Breeze庫的情況。
ScalaNLP是一套機器學習和數值計算的庫,主要是關於科學計算、機器學習和自然語言處理(NLP)的,裡面包含三個庫,Breeze、Epic和Puck。
其中Breeze是機器學習和數值計算庫,Epic是一種高效能統計分析器和結構化預測庫,Puck是一個快速GPU加速解析器。
本篇就是來看看Breeze的用法。
1 Breeze建立矩陣、向量
建立向量:
//建立全0的向量 val v1 = DenseVector.zeros[Double](5) println(v1) //建立全1的向量 val v2 = DenseVector.ones[Double](5) println(v2) //用某個值填充整個向量 val v3 = DenseVector.fill(3){5} println(v3) //建立某個範圍內的向量,引數分別是start、end、step(可不填) val v4 = DenseVector.range(1, 10, 2) println(v4) //按照行建立向量 val v5 = DenseVector(1, 2, 3, 4) println(v5) //向量轉置,就是把行向量轉為列向量 val v6 = DenseVector(1, 2, 3, 4).t println(v6) //從陣列建立向量 val v7 = DenseVector(Array(1, 2, 3, 4)) println(v7) //0到1的隨機向量,引數是數量 val v8 = DenseVector.rand(4) println(v8) //從函式建立向量 val v9 = DenseVector.tabulate(3){i => 2 * i} println(v9)
根據註釋,基本可以猜到結果是什麼。下面看結果:
DenseVector(0.0, 0.0, 0.0, 0.0, 0.0) DenseVector(1.0, 1.0, 1.0, 1.0, 1.0) DenseVector(5, 5, 5) DenseVector(1, 3, 5, 7, 9) DenseVector(1, 2, 3, 4) Transpose(DenseVector(1, 2, 3, 4)) DenseVector(1, 2, 3, 4) DenseVector(0.712553382031057, 0.7818284949827337, 0.55561285848614, 0.9092804939652446) DenseVector(0, 2, 4)
建立矩陣:
//建立全0的矩陣,2行3列 val m1 = DenseMatrix.zeros[Double](2, 3) println(m1) //單位矩陣,對角線為1,其他全為0 val m2 = DenseMatrix.eye[Double](3) println(m2) //對角矩陣,用給定的值作為對角線,其他全為0 val m3 = diag(DenseVector(1, 2, 3)) println(m3) //按照行建立矩陣 val m4 = DenseMatrix((1, 2, 3), (4, 5, 6)) println(m4) //從陣列建立矩陣 val m5 = new DenseMatrix(2, 3, Array(1, 2, 3, 4, 5, 6)) println(m5) //0到1的隨機矩陣 val m6 = DenseMatrix.rand(2, 3) println(m6) //從函式建立矩陣 val m7 = DenseMatrix.tabulate(2, 3) {case(i, j) => i + j} println(m7)
結果是:
2 Breeze訪問矩陣元素
前面是各種方式建立矩陣和向量的程式碼,這裡來看看如何訪問元素。
val v = DenseVector(Array(1, 2, 3, 4, 5, 6))
//-1是末位,其他的v(0)
println(v(-1))
//指定座標範圍
println(v(0 to 4))
//按照指定步長取子集
println(v(4 to 0 by -1))
println(v(1 to -1))
val m = DenseMatrix((1, 2, 3),(4, 5, 6))
//指定矩陣的位置
println(m(0, 1))
//指定列
println(m(::, 1))
結果是:
6
DenseVector(1, 2, 3, 4, 5)
DenseVector(5, 4, 3, 2, 1)
DenseVector(2, 3, 4, 5, 6)
2
DenseVector(2, 5)
3 Breeze元素操作
元素的操作有很多種,譬如賦值、矩陣轉換、調整形狀、連線矩陣等。
操作名稱 | Breeze函式 |
調整矩陣形狀 | a.reshape(3,2) |
矩陣轉成向量 | a.toDenseVector |
矩陣複製 | a.copy |
取物件線元素 | diag(a) |
給子集賦數值 | a(1 to 4) := 5.0 |
給子集賦向量 | a(1 to 4) :=DenseVector(1,2,3) |
矩陣賦值 | a(1 to 3,1 to 3) := 5.0 |
矩陣列賦值 | a(::,2) := 5.0 |
垂直連線矩陣 | DenseMatrix.vertcat(a.b) |
橫向連線矩陣 | DenseMatrix.horzcat(d,e) |
向量連線 | DenseVector.vertcat(a,b) |
我們來看看各個功能:
定義一個初始的矩陣,4行3列
val m = DenseMatrix((1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12))
1 2 3
4 5 6
7 8 9
10 11 12
1.
//轉成vector向量
val denseVector = m.toDenseVector
println(denseVector)
結果是:
DenseVector(1, 4, 7, 10, 2, 5, 8, 11, 3, 6, 9, 12)
注意一下這個結果,將矩陣轉為向量時,是按照列的順序依次獲取所有元素組成一個向量的。
2.
//形狀變成3行4列
val reshape = m.reshape(3, 4)
結果是:
1 10 8 6
4 2 11 9
7 5 3 12
可以看到,矩陣變形時也是按照列從上到下從左到右依次填滿矩陣的。
3.
然後看一下diag,取對角線元素。
val m1 = DenseMatrix((1, 2, 3), (4, 5, 6), (7, 8, 9))
//取對角線元素
val diagM1 = diag(m1)
println(diagM1)
結果如下圖,需要注意的是,diag只支援行列數一樣的矩陣,譬如3行3列。而3行4列的就無法使用該函數了。
DenseVector(1, 5, 9)
4.
修改某一列的值
//將第二列的值變成5
m1(::, 2) := 5
println(m1)
結果:
1 2 5
4 5 5
7 8 5
5.
給某個行列區間賦值
//矩陣賦值,從第二行到第三行,第二列到第三列賦值為5
m1(1 to 2, 1 to 2) := 5
println(m1)
結果:
1 2 3
4 5 5
7 5 5
6.
垂直連線矩陣
//垂直連線矩陣
val a1 = DenseMatrix((1, 2, 3), (4, 5, 6))
val a2 = DenseMatrix((7, 8, 9))
val a1a2 = DenseMatrix.vertcat(a1, a2)
println(a1a2)
結果:
1 2 3
4 5 6
7 8 9
可以看到兩個矩陣垂直連線時,只有列數相同就可以,行數不必相同。同理,橫向連線時
7.
橫向連線矩陣
//橫向連線矩陣
val b1 = DenseMatrix((1, 2, 3), (4, 5, 6))
val b2 = DenseMatrix((7, 8, 9), (10, 11, 12))
val b1b2 = DenseMatrix.horzcat(b1, b2)
println(b1b2)
結果是:
1 2 3 7 8 9
4 5 6 10 11 12