Spark上矩阵运算库(六)——高级矩阵操作2

高级矩阵操作调查2

基于基础的矩阵运算(矩阵、向量的乘、加等),我们可以实现一些更高级的应用,来演示并行矩阵运算库的功能和效果。上周时间,我调研并且找到了用Matlab语言实现的如下两个基础应用:

  1. Logistic Regression
  2. K-Means
  3. LU、QR矩阵分解

Logistic Regression

Logistic Regression是广义线性回归模型的代表,在回归问题中具有广泛的应用。Logstic Regression是在普通的线性回归模型基础上发展出来的,它将线性拟合的对象从因变量y变为因变量的对数几率 log p/(1-p) 。

其主要算法同普通的线性回归模型算法,但是在计算梯度时,因为引入了对数几率,因此与普通的线性回归不同。但除此之外,其他部分基本一致。

我找到了Stanford大学的机器学习课程中,提供的Logistic Regression参考实现的Matlab代码,代码下载页面见此。

K-means

K-Means 算法是一个经典的聚类算法。在K-Means中,主要的运算量发生在计算数据点与聚类中心的距离时。而这部分运算,可以很方便地使用矩阵运算的形式表示,具体的技巧见这篇博客文章。它的主要思路是利用|X-Y|^2 = X^2 + Y^2 - 2XY这个公式。

因为Spark还能较容易的提供MapReduce框架,所以后续步骤可以使用MapReduce模式高效完成。

LU、QR矩阵分解

基础介绍

LU和QR矩阵分解都是基础的矩阵分解方式。

  1. LU矩阵分解    LU矩阵分解是把一个矩阵A分解为一个下三角矩阵和上三角矩阵的乘积,\(PA=LU\),其中P是A的行变换矩阵,用以保证数值稳定性。LU矩阵分解在求解大型线性方程组当中具有广泛应用。
  2. QR矩阵分解   QR分解也是一个基础分解,它将一个正规矩阵A,分解为如下的形式,\(A=QR\),其中Q是一个正交矩阵,R是上三角矩阵。QR分解在求解矩阵特征值等应用中有应用。

LU分解

LU分解基于高斯消元法,它的结果就是高斯消元法中所有变换的结果。因此求解LU分解的过程,一般也是高斯消元法进行的过程。

设矩阵A是一个n*n阶的矩阵,则LU分解是将矩阵A分解为两个n*n阶的矩阵乘积:

              A = LU

其中L是一个下三角矩阵,U是一个上三角矩阵。

LU分解的应用

LU分解可以应用于解线性方程组中。 例如已知线性方程组Ax=b,如果需要直接求解\(Ax=b\)是比较困难的,但是我们可以把问题转化一下。 假设我们对A进行LU分解,得到A=LU。那么我们可以继续假设y=Ux。那么原问题Ax=b,即LUx=b可以转化为两个方程组:

  1. Ux = y
  2. Ly = b

因为U\(L\)一个是上三角矩阵,一个是下三角矩阵,求解上述两个方程组的问题的难度大大下降,可以直接使用顺向、反向代入法求解。

LU分解的实现

LU分解的过程也是高斯消元法的过程。如果被操作的矩阵A有n行,那么高斯消元法需要通过n次迭代完成。这个网页提供了若干高斯消元法的Matlab实现,可以作为我们实现的参考。

QR分解

QR分解也是一个迭代算法,它通过一系列的\(A_n=Q_nR_n\)计算,将原始的矩阵分解为Q和R的两个矩阵。其中关键的步骤是通过Householder变换实现每一步的QR分解。

一个简易的讲解可以参考《数值计算之美》第三章的内容,其中包含了一段简单的QR分解Matlab代码实现,这个也可以供我们实现时参考。

“实用的技术主要有两个:(1)将矩阵化简为上Hessenberg矩阵;(2)带原点位移的QR算法。”(见《数值计算之美》),这些部分较难,需要进一步参考数值计算的书籍。

下周工作

我打算实现在Spark上实现一下矩阵的LU分解。

你可能感兴趣的:(开源夏令营)