Spark MLlib之使用Breeze操作矩阵向量

1.spark Mlib 底层使用的向量、矩阵运算使用了Breeze库。

scalaNLP 是一套 机器学习和数值技算的库。它主要是关于科学技术(sc)、机器学习(ML)和自然语言处理(NLP)的。它包括三个库,Breeze、Epic 和 Puck。

Breeze :是机器学习和数值技术库 ,它是sparkMlib的核心,包括线性代数、数值技术和优化,是一种通用、功能强大、有效的机器学习方法。

Epic     :是一种高性能能统计分析器和结构化预测库

Puck    :是一个快速GPU加速解析器

 

在使用Breeze 库时,需要导入相关包:

1

2

3

import breeze.linalg._

 

import breeze.numerics._

  

具体练习如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

package leaning

 

import breeze.linalg._

import breeze.numerics._

import breeze.stats.distributions.Rand

 

/**

  * Created by dy9776 on 2017/12/5.

  */

 

 

object Practise_breeze{

  def main(args: Array[String]) {

    val matrix: DenseMatrix[Double] = DenseMatrix.zeros[Double](3,2)

    println(matrix)

    /*

      0.0  0.0

      0.0  0.0

      0.0  0.0

    */

    //全0向量

    val testVector: DenseVector[Double] = DenseVector.zeros[Double](2)

    println(testVector)

 

    //全1向量

    val allOneVector=DenseVector.ones[Double](2)

    println(allOneVector)

 

 

    //按数值填充向量

    val haveNumberFill =DenseVector.fill[Double](3,2)

    println(haveNumberFill)

 

    //生成随机向量

    val rangeNUm= DenseVector.range(1,  10 2)//DenseVector(1, 3, 5, 7, 9)

    val rangeNUmD= DenseVector.rangeD(1,  9 2)//DenseVector(1.0, 3.0, 5.0, 7.0)

    val rangeNUmF= DenseVector.rangeF(1,  7 2)//DenseVector(1.0, 3.0, 5.0)

    println(rangeNUm)

    println(rangeNUmD)

    println(rangeNUmF)

 

    //单位矩阵

    val unitMatrix=DenseMatrix.eye[Double](4)

//    println(unitMatrix)

     /*

     1.0  0.0  0.0  0.0

     0.0  1.0  0.0  0.0

     0.0  0.0  1.0  0.0

     0.0  0.0  0.0  1.0

      */

 

    //对角矩阵

    val doubleVecoter=diag(DenseVector(3.04.0 5.0))

//    println(doubleVecoter)

    /*

    3.0  0.0  0.0

    0.0  4.0  0.0

    0.0  0.0  5.0

     */

 

    //按照行创建矩阵

    val byRowCreateMatrix= DenseMatrix( (4.05.06.0 ) , (7.0 ,8.0 ,9.0))

//    println(byRowCreateMatrix)

    /*

    4.0  5.0  6.0

    7.0  8.0  9.0

     */

 

    //按照行创建向量

    val denseCreateVector = DenseVector((4.05.06.07.08.09.0))

//    println(denseCreateVector) ///DenseVector((4.0,5.0,6.0,7.0,8.0,9.0)

 

    //向量装置

    val vectorTranspostion= DenseVector( (4.05.06.07.08.09.0) ).t

    println(vectorTranspostion)//Transpose(DenseVector((4.0,5.0,6.0,7.0,8.0,9.0)))

 

    //从函数创建向量

    val funCreateVector=DenseVector.tabulate(5)(i=> i*i)

    println(funCreateVector)//DenseVector(0, 1, 4, 9, 16)

    val funCreateVector2=DenseVector.tabulate( 0 to 5)(i=> i*i)

    println(funCreateVector2)//DenseVector(0, 1, 4, 9, 16, 25)

 

    //从函数创建矩阵

    val createFuncMatrix= DenseMatrix.tabulate(34) {

      case (i ,j ) => i*i + j*j

    }

//    println(createFuncMatrix)

    /*

       0  1  4  9

       1  2  5  10

       4  5  8  13

     */

 

    //从数组创建矩阵

    val createFunctionMatrix= new DenseMatrix[Double](32, Array(1.04.07.03.06.09.0))

//    println(createFunctionMatrix)

    /*

    1.0  3.0

    4.0  6.0

    7.0  9.0

     */

 

    //0 到 1的随机向量

    val formZeroToOneRandomVector= DenseVector.rand( 9, Rand.uniform)

    println(formZeroToOneRandomVector)

//    DenseVector(0.7978222133507369, 0.48978247271729325, 0.24943434133065834, 0.6619447026155139, 0.5324942068054981, 0.9051865626036415, 0.5989291014099107, 0.9221881029987078, 0.17371486701192662)

    val formZeroToOneRandomVector2= DenseVector.rand( 9, Rand.uniform)

    println(formZeroToOneRandomVector2)

//DenseVector(0.7978222133507369, 0.48978247271729325, 0.24943434133065834, 0.6619447026155139, 0.5324942068054981, 0.9051865626036415, 0.5989291014099107, 0.9221881029987078, 0.17371486701192662)

 

 

    //0 到 1 的随机矩阵

    val formZeroToOneRandomMatrix= DenseMatrix.rand(32, Rand.uniform)

    println(formZeroToOneRandomMatrix)

    /*

    0.8036324612618653  0.538112087890035

    0.6864375371630702  0.3123993272549075

    0.9458628172312897  0.01137554621536796

     */

    val formZeroToOneRandomMatrix2=DenseMatrix.rand(32, Rand.gaussian)

    println(formZeroToOneRandomMatrix2)

    /*

      0.9510499901472648   0.287812938654061

      -0.5266499883462216  0.9380426076781263

      -0.3959295333472151  -0.9057610233257112

     */

 

    //Breeze元素访问

    val = new DenseVector[Int](Array(1 to 20 : _*))

    println(a)//DenseVector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)

 

    //指定位置

 

    println(a(0)) //1

 

    //向量子集

    println( a(1 to 4) )//DenseVector(2, 3, 4, 5)

    println( a(1 until 4) )//DenseVector(2, 3, 4)

 

    //指定开始位置至结尾

    println( a(1 to -1) )//DenseVector(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)

 

    //按照指定步长去子集  这个是倒序方式

    println( a(5 to 0 by -1) )//DenseVector(6, 5, 4, 3, 2, 1)

 

 

    //最后一个元素

    println( a(-1)) //20

 

 

    val = DenseMatrix((1.02.03.0), (4.05.06.0))

    println(m)

    /*

    1.0  2.0  3.0

    4.0  5.0  6.0

     */

 

    //指定位置

    println( m(0 ,1) ) //2.0

 

    //矩阵指定列

    println( m(:: ,1) ) // DenseVector(2.0, 5.0)

 

 

//Breeze元素操作

 

    //调整矩阵形状

    val justAdjustMatrix =m.reshape(32)

    println(justAdjustMatrix)

    /*

    DenseVector(2.0, 5.0)

    1.0  5.0

    4.0  3.0

    2.0  6.0

     */

 

    //矩阵转成向量

    val toVector=m.toDenseVector

    println(toVector)//DenseVector(1.0, 4.0, 2.0, 5.0, 3.0, 6.0)

    println(toVector.toDenseMatrix)//1.0  4.0  2.0  5.0  3.0  6.0

 

    //复制下三角

    println(lowerTriangular(m))//

    /*

    1.0  0.0

    4.0  5.0

     */

 

    //复制上三角

    println(upperTriangular(m))

    /*

    1.0  2.0

    0.0  5.0

     */

 

    //矩阵复制

    println(m.copy)

    //m 原始为这样的

    //    1.0  2.0

    //    0.0  5.0

 

 

    //取对角线元素

    println(diag(upperTriangular(m)))

    //DenseVector(1.0, 5.0)   个人觉得很怪异,不是应该为(1.0, 6.0)吗?上面上、下三角 也好像出乎的意料

 

 

    //子集赋数值

    println(a(1 to 4 ):=5)

    //(1.0, 5.0)

 

    //子集赋向量

    println( a(1 to 4):=DenseVector(1,2,3,4) )

      //DenseVector(1, 2, 3, 4)

 

    println(m)

    //矩阵赋值

//    println( m( 1 to 2, 1 to 2) := 0.0 )

//Exception in thread "main" java.lang.IndexOutOfBoundsException: Row slice of Range(1, 2) was bigger than matrix rows of 2

    println("-==========m1================-")

    println( m( 0 to 11 to 2:= 0.0 )

    println("-==========m================-")

    println(m)

    println("-==========m end================-")

    /*

    -==========m1================-

    0.0  0.0

    0.0  0.0

    -==========m================-

    0.0  0.0  3.0

    0.0  0.0  6.0

    -==========m end================-

    */

 

    //矩阵列赋值

    val re=m(::2:= 5.0

    println(re.toDenseMatrix)

    //5.0  5.0

 

 

    val a1 = DenseMatrix((1.02.03.0), (4.05.06.0))

    val a2 = DenseMatrix((7.08.09.0), (10.011.012.0))

 

 

    //垂直连接矩阵

    val verticalLike=DenseMatrix.vertcat(a1, a2)

    println(verticalLike)

    println("-==========================-")

    /*

    1.0   2.0   3.0

    4.0   5.0   6.0

    7.0   8.0   9.0

    10.0  11.0  12.0

     */

 

    //横向连接矩阵

    val twoMatrixConn=DenseMatrix.horzcat( a1, a2)

    println(twoMatrixConn)

    println("-==========================-")

/*

1.0  2.0  3.0  7.0   8.0   9.0

4.0  5.0  6.0  10.0  11.0  12.0

 */

 

    //向量的连接

    val connnectVector1=DenseVector.vertcat(DenseVector(202122), DenseVector(232425))

    val connnectVector2=DenseVector.horzcat(DenseVector(202122), DenseVector(232425))

 

    println(connnectVector1)//DenseVector(20, 21, 22, 23, 24, 25)

    println(connnectVector2)

    /*

      20  23

      21  24

      22  25

     */

 

 

//Breeze数值计算函数

    //元素加法

    println(a1 + a2)

    /*

      8.0   10.0  12.0

      14.0  16.0  18.0

     */

 

    //元素乘法

    println(a1 :* a2)

    /*

      7.0   16.0  27.0

      40.0  55.0  72.0

     */

 

    //元素除法

    println(a1 :/ a2)

    /*

      0.14285714285714285  0.25                 0.3333333333333333

      0.4                  0.45454545454545453  0.5

     */

 

    //元素比较

    println(a1 :< a2)

    /*

      true  true  true

      true  true  true

     */

 

    //元素相等

    println(a1 :== a2)

    /*

      false  false  false

      false  false  false

     */

 

    //元素追加

    println(a1 :+=2.0)

    /*

      3.0  4.0  5.0

      6.0  7.0  8.0

     */

 

    //元素追乘

    println(a1 :*=2.0)

    /*

      6.0   8.0   10.0

      12.0  14.0  16.0

     */

 

    //向量点积

    val vectorDot=DenseVector(1234) dot DenseVector(1111)

    println(vectorDot)//10

 

    //元素最大值

    println(max(a1))//16.0

 

    //元素最小值

    println(min(a1))//6.0

 

    //元素最大值的位置

    println(argmax(a1))// (1,2)

 

    //元素最小值的位置

    println(argmin(a1))// (0,0)

 

    //Breeze求和函数

 

    val m1 = DenseMatrix((1.02.03.04.0), (5.06.07.08.0), (9.010.011.012.0))

    println(m1)

    /*

        1.0  2.0   3.0   4.0

        5.0  6.0   7.0   8.0

        9.0  10.0  11.0  12.0

     */

 

    println("-==========================-")

    //元素求和

    println(sum(m1))//78.0

 

    //每一列求和

    println(sum(m1, Axis._0))//res59: breeze.linalg.DenseMatrix[Double] = 15.0  18.0  21.0  24.0

 

    //每一行求和

    println(sum(m1, Axis._1))//res60: breeze.linalg.DenseVector[Double] = DenseVector(10.0, 26.0, 42.0)

 

    //对角线元素和

     println(trace(lowerTriangular(m1)))// res61: Double = 18.0

 

    //累积和

    val a3 = new DenseVector[Int](Array(10 to 20: _*))

    println(accumulate(a3)) // DenseVector(10, 21, 33, 46, 60, 75, 91, 108, 126, 145, 165)

 

 

//Breeze布尔函数

 

    val = DenseVector(truefalsetrue)

    val = DenseVector(falsetruetrue)

    //元素与操作

    println(c :& d) // DenseVector(false, false, true)

 

    //元素或操作

    println(c :| d) //DenseVector(true, true, true)

 

    //元素非操作

    println(!c) //DenseVector(false, true, false)

 

 

    val = DenseVector[Int](-302)

 

 

    //存在非零元素

    println(any(e)) //true

 

    //所有元素非零

    println(all(e)) //false

 

//Breeze线性代数函数

    val = DenseMatrix((1.02.03.0), (4.05.06.0), (7.08.09.0))

    val = DenseMatrix((1.01.01.0), (1.01.01.0), (1.01.01.0))

 

    //线性求解,AX = B,求解X

    println(f \ g)

      /* breeze.linalg.DenseMatrix[Double] =

        -2.5  -2.5  -2.5

        4.0   4.0   4.0

        -1.5  -1.5  -1.5

       */

 

    //转置

    println(f.t)

    /* breeze.linalg.DenseMatrix[Double] =

      1.0  4.0  7.0

      2.0  5.0  8.0

      3.0  6.0  9.0

     */

 

    //求特征值

    println(det(f)) // Double = 6.661338147750939E-16

 

    //求逆

    println(inv(f))

    /*

      -4.503599627370499E15  9.007199254740992E15    -4.503599627370495E15

      9.007199254740998E15   -1.8014398509481984E16  9.007199254740991E15

      -4.503599627370498E15  9.007199254740992E15    -4.5035996273704955E15

     */

 

    //求伪逆

    println(pinv(f))

    /*

      -3.7720834019330525E14  7.544166803866101E14    -3.77208340193305E14

      7.544166803866094E14    -1.5088333607732208E15  7.544166803866108E14

      -3.772083401933041E14   7.544166803866104E14    -3.772083401933055E14

     */

 

    //特征值和特征向量

    println(eig(f))

    /*

    Eig(DenseVector(16.116843969807043, -1.1168439698070427, -1.3036777264747022E-15),DenseVector(0.0, 0.0, 0.0),-0.23197068724628617  -0.7858302387420671   0.40824829046386363

        -0.5253220933012336   -0.08675133925662833  -0.816496580927726

         -0.8186734993561815   0.61232756022881      0.4082482904638625

        )

     */

 

 

    //奇异值分解

    val svd.SVD(u,s,v) = svd(g)

    println(u)

    /*

      -0.5773502691896255  -0.5773502691896257  -0.5773502691896256

      -0.5773502691896256  -0.2113248654051871  0.7886751345948126

      -0.5773502691896256  0.7886751345948129   -0.21132486540518708

     */

    println("==============================")

    println(s) //DenseVector(3.0000000000000004, 0.0, 0.0)

    println("==============================")

    println(v)

    /*

      -0.5773502691896256  -0.5773502691896257  -0.5773502691896256

      0.0                  -0.7071067811865474  0.7071067811865477

      0.816496580927726    -0.4082482904638629  -0.4082482904638628

     */

 

 

    //求矩阵的秩

    println(rank(f))  //2

 

    //矩阵长度

    println(f.size) //9

 

    //矩阵行数

    println(f.rows) // 3

 

    //矩阵列数

    f.cols // 3

 

 

//Breeze取整函数

 

    val = DenseVector(-1.20.72.3// breeze.linalg.DenseVector[Double] = DenseVector(-1.2, 0.7, 2.3)

 

    //四舍五入

    println( round(h)  ) // breeze.linalg.DenseVector[Long] = DenseVector(-1, 1, 2)

 

    //大于它的最小整数

    println( ceil(h) ) // breeze.linalg.DenseVector[Double] = DenseVector(-1.0, 1.0, 3.0)

 

    //小于它的最大整数

    println( floor(h) ) // breeze.linalg.DenseVector[Double] = DenseVector(-2.0, 0.0, 2.0)

 

    //符号函数

    println( signum(h) ) // breeze.linalg.DenseVector[Double] = DenseVector(-1.0, 1.0, 1.0)

 

    //取正数

    println( abs(h) )  // breeze.linalg.DenseVector[Double] = DenseVector(1.2, 0.7, 2.3)

 

 

  }

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值