一、算法原理

请参考我在大学时写的《QR方法求矩阵全部特征值》,其包含原理、实例及C语言实现:http://www.docin.com/p-114587383.html

二、源码分析

这里有一篇文章《使用MapRedece进行QR分解的步骤》可以看看

/**
For an <tt>m x n</tt> matrix <tt>A</tt> with <tt>m >= n</tt>, the QR decomposition is an <tt>m x n</tt>
orthogonal matrix <tt>Q</tt> and an <tt>n x n</tt> upper triangular matrix <tt>R</tt> so that
<tt>A = Q*R</tt>.
<P>
The QR decomposition always exists, even if the matrix does not have
full rank, so the constructor will never fail. The primary use of the
QR decomposition is in the least squares solution of non-square systems
of simultaneous linear equations. This will fail if <tt>isFullRank()</tt>
returns <tt>false</tt>.
*/ public class QRDecomposition implements QR {
private final Matrix q;
private final Matrix r;
private final boolean fullRank;
private final int rows;
private final int columns; /**
* Constructs and returns a new QR decomposition object; computed by Householder reflections; The
* decomposed matrices can be retrieved via instance methods of the returned decomposition
* object.
*
* @param a A rectangular matrix.
* @throws IllegalArgumentException if <tt>A.rows() < A.columns()</tt>.
*/
public QRDecomposition(Matrix a) { rows = a.rowSize();//m
int min = Math.min(a.rowSize(), a.columnSize());
columns = a.columnSize();//n Matrix qTmp = a.clone(); boolean fullRank = true; r = new DenseMatrix(min, columns); for (int i = 0; i < min; i++) {
Vector qi = qTmp.viewColumn(i);
double alpha = qi.norm(2);
if (Math.abs(alpha) > Double.MIN_VALUE) {
qi.assign(Functions.div(alpha));
} else {
if (Double.isInfinite(alpha) || Double.isNaN(alpha)) {
throw new ArithmeticException("Invalid intermediate result");
}
fullRank = false;
}
r.set(i, i, alpha); for (int j = i + 1; j < columns; j++) {
Vector qj = qTmp.viewColumn(j);
double norm = qj.norm(2);
if (Math.abs(norm) > Double.MIN_VALUE) {
double beta = qi.dot(qj);
r.set(i, j, beta);
if (j < min) {
qj.assign(qi, Functions.plusMult(-beta));
}
} else {
if (Double.isInfinite(norm) || Double.isNaN(norm)) {
throw new ArithmeticException("Invalid intermediate result");
}
}
}
}
if (columns > min) {
q = qTmp.viewPart(0, rows, 0, min).clone();
} else {
q = qTmp;
}
this.fullRank = fullRank;
} /**
* Generates and returns the (economy-sized) orthogonal factor <tt>Q</tt>.
*
* @return <tt>Q</tt>
*/
@Override
public Matrix getQ() {
return q;
} /**
* Returns the upper triangular factor, <tt>R</tt>.
*
* @return <tt>R</tt>
*/
@Override
public Matrix getR() {
return r;
} /**
* Returns whether the matrix <tt>A</tt> has full rank.
*
* @return true if <tt>R</tt>, and hence <tt>A</tt>, has full rank.
*/
@Override
public boolean hasFullRank() {
return fullRank;
} /**
* Least squares solution of <tt>A*X = B</tt>; <tt>returns X</tt>.
*
* @param B A matrix with as many rows as <tt>A</tt> and any number of columns.
* @return <tt>X</tt> that minimizes the two norm of <tt>Q*R*X - B</tt>.
* @throws IllegalArgumentException if <tt>B.rows() != A.rows()</tt>.
*/
@Override
public Matrix solve(Matrix B) {
if (B.numRows() != rows) {
throw new IllegalArgumentException("Matrix row dimensions must agree.");
} int cols = B.numCols();
Matrix x = B.like(columns, cols); // this can all be done a bit more efficiently if we don't actually
// form explicit versions of Q^T and R but this code isn't so bad
// and it is much easier to understand
Matrix qt = getQ().transpose();
Matrix y = qt.times(B); Matrix r = getR();
for (int k = Math.min(columns, rows) - 1; k >= 0; k--) {
// X[k,] = Y[k,] / R[k,k], note that X[k,] starts with 0 so += is same as =
x.viewRow(k).assign(y.viewRow(k), Functions.plusMult(1 / r.get(k, k))); // Y[0:(k-1),] -= R[0:(k-1),k] * X[k,]
Vector rColumn = r.viewColumn(k).viewPart(0, k);
for (int c = 0; c < cols; c++) {
y.viewColumn(c).viewPart(0, k).assign(rColumn, Functions.plusMult(-x.get(k, c)));
}
}
return x;
} /**
* Returns a rough string rendition of a QR.
*/
@Override
public String toString() {
return String.format(Locale.ENGLISH, "QR(%d x %d,fullRank=%s)", rows, columns, hasFullRank());
}
}

Mahout源码分析之 -- QR矩阵分解的更多相关文章

  1. Mahout源码分析之 -- 文档向量化TF-IDF

    fesh个人实践,欢迎经验交流!Blog地址:http://www.cnblogs.com/fesh/p/3775429.html Mahout之SparseVectorsFromSequenceFi ...

  2. Mahout源码分析:并行化FP-Growth算法

    FP-Growth是一种常被用来进行关联分析,挖掘频繁项的算法.与Aprior算法相比,FP-Growth算法采用前缀树的形式来表征数据,减少了扫描事务数据库的次数,通过递归地生成条件FP-tree来 ...

  3. mahout源码分析之Decision Forest 三部曲之二BuildForest(1)

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. BuildForest是在mahout-examples-0.7-job.jar包的org\apache ...

  4. mahout源码分析之DistributedLanczosSolver(五)Job over

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 1. Job 篇 接上篇,分析到EigenVerificationJob的run方法: public i ...

  5. mahout源码分析之DistributedLanczosSolver(六)完结篇

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 接上篇,分析完3个Job后得到继续往下:其实就剩下两个函数了: List<Map.Entry< ...

  6. mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 首先来总结一下 mahout算法源码分析之Collaborative Filtering with AL ...

  7. mahout算法源码分析之Collaborative Filtering with ALS-WR拓展篇

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 额,好吧,心头的一块石头总算是放下了.关于Collaborative Filtering with AL ...

  8. zxing源码分析——QR码部分

    Android应用横竖屏切换 zxing源码分析——DataMatrix码部分 zxing源码分析——QR码部分 2013-07-10 17:16:03|  分类: 默认分类 |  标签: |字号大中 ...

  9. mahout算法源码分析之Collaborative Filtering with ALS-WR 并行思路

    Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. mahout算法源码分析之Collaborative Filtering with ALS-WR 这个算 ...

随机推荐

  1. XPath注入笔记

    XPath注入 XQuery注入 测试语句:'or '1'='1 利用工具: Xcat介绍 Xcat是python的命令行程序利用Xpath的注入漏洞在Web应用中检索XML文档 下载地址:https ...

  2. js中逻辑为false的8种情况

    如果对象无初始值或者其值为 0.-0.null."".false.undefined 或者 NaN,那么对象的逻辑值为 false. typeof 返回的是字符串,有六种可能:&q ...

  3. 苹果Mac OS X显示隐藏文件的方法

    苹果Mac OS X显示隐藏文件的方法有很多种,这里介绍一种最简单的, 方法/步骤     打开“终端”,根据自己的版本选择命令   早期的OS X(10.6~10.8)系统可以使用如下两条命令来开始 ...

  4. C#特性学习笔记二

    实例探讨: 自定义了一个特性类: [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)] class WahAttribute ...

  5. iPhone SlideShow

    If you found any question when you use the Slideshow, don't hesitate to leave a message please.

  6. OpenCV GPU CUDA OpenCL 配置

    首先,正确安装OpenCV,并且通过测试. 我理解GPU的环境配置由3个主要步骤构成. 1. 生成关联文件,即makefile或工程文件 2. 编译生成与使用硬件相关的库文件,包括动态.静态库文件. ...

  7. SQL Server 2012将数据库备份到网络中的共享文件夹

    把计算机computer1 中的数据库备份到计算机computer2(IP:192.168.0.130)中的一个共享文件夹下 在computer2中的F盘下建一个共享文件夹叫DBBackupShare ...

  8. 我的ZJ解题心得

    想要学好程序设计第一是要养成你的编程思维,也就是你对编程的一种概念和思维定式,长期的解题会让你产生解题经验进而形成一种思维定式,比如看到一个题目就立即想出这题要用什么方法解题这样.编程思维我认为还包括 ...

  9. Python基础篇【第2篇】: Python文件操作

    Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...

  10. jquery.easypiechart.js简介

    此插件主要是用来统计新的访问.跳出率.服务器负载.使用的RAM等,功能很强大,带有HTML5的动画效果,效果非常炫,看效果吧easyPieChart一款新型的EASY饼图数据统计Jquery插件截图: ...