Mahout源码分析之 -- QR矩阵分解
一、算法原理
请参考我在大学时写的《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矩阵分解的更多相关文章
- Mahout源码分析之 -- 文档向量化TF-IDF
fesh个人实践,欢迎经验交流!Blog地址:http://www.cnblogs.com/fesh/p/3775429.html Mahout之SparseVectorsFromSequenceFi ...
- Mahout源码分析:并行化FP-Growth算法
FP-Growth是一种常被用来进行关联分析,挖掘频繁项的算法.与Aprior算法相比,FP-Growth算法采用前缀树的形式来表征数据,减少了扫描事务数据库的次数,通过递归地生成条件FP-tree来 ...
- 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 ...
- mahout源码分析之DistributedLanczosSolver(五)Job over
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 1. Job 篇 接上篇,分析到EigenVerificationJob的run方法: public i ...
- mahout源码分析之DistributedLanczosSolver(六)完结篇
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 接上篇,分析完3个Job后得到继续往下:其实就剩下两个函数了: List<Map.Entry< ...
- mahout算法源码分析之Collaborative Filtering with ALS-WR (四)评价和推荐
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 首先来总结一下 mahout算法源码分析之Collaborative Filtering with AL ...
- mahout算法源码分析之Collaborative Filtering with ALS-WR拓展篇
Mahout版本:0.7,hadoop版本:1.0.4,jdk:1.7.0_25 64bit. 额,好吧,心头的一块石头总算是放下了.关于Collaborative Filtering with AL ...
- zxing源码分析——QR码部分
Android应用横竖屏切换 zxing源码分析——DataMatrix码部分 zxing源码分析——QR码部分 2013-07-10 17:16:03| 分类: 默认分类 | 标签: |字号大中 ...
- 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 这个算 ...
随机推荐
- Git的配置及常用命令
Git配置 git config --global user.name "<username>" git config --global user.email &quo ...
- VISIBLE、INVISIBLE、GONE的区别
VISIBLE:设置控件可见 INVISIBLE:设置控件不可见 GONE:设置控件隐藏 而INVISIBLE和GONE的主要区别是:当控件visibility属性为INVISIBLE时,界面保留了v ...
- CSS之利用text-indent隐藏文字用图片当Login
html: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- RequestContextListener作用
spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype ...
- MongoDB快速上手
1. MongoDB简介 MongoDB是一个跨平台的基于Key_Value键值对形式保存数据的NoSQL文档类型数据库. NoSQL(not only sql)数据库,泛指非关系型数据库. 1.1 ...
- mac android studio 编译时报Class JavaLaunchHelper is implemented in both
Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Cont ...
- IOCP之客户端及消息传递
上篇说到IOCP的精简实现,这篇来讲IOCP客户端和消息传递 在ConnectEx代码之前,CreateIoCompletionPort的第三个参数,把socket句柄+0x01000000作为传递 ...
- ADO.NET数据库操作助手类
SQL语句操作增删查改助手类 using System; using System.Collections.Generic; using System.Configuration; using Sys ...
- ThinkPHP + Discuz 整合方法
ThinkPHP + Discuz 整合方法以下是Discuz6的整合方法,discuz5请按照里面的说明进行相应的修改,也可以使用了. 1.在项目的action目录下信件PublicAction.c ...
- ISO 14229 简介 转载
作者:autogeek 原文链接:http://www.cnblogs.com/autogeek/p/4458591.html 前言 由于工作中经常用到ISO-14229,因此决定对该协议做个总体介绍 ...