随机SVD通过使用k + p个随机投影提取前k个奇异值/向量来分解矩阵.这对于大型矩阵来说效果非常好.
我的问题涉及从算法输出的奇异值.如果你做完整的SVD,为什么这些值不等于第一个k-奇异值?
下面我在R中有一个简单的实现.任何有关改善性能的建议都将受到赞赏.
rsvd = function(A, k=10, p=5) {
n = nrow(A)
y = A %*% matrix(rnorm(n * (k+p)), nrow=n)
q = qr.Q(qr(y))
b = t(q) %*% A
svd = svd(b)
list(u=q %*% svd$u, d=svd$d, v=svd$v)
}
> set.seed(10)
> A <- matrix(rnorm(500*500),500,500)
> svd(A)$d[1:15]
[1] 44.94307 44.48235 43.78984 43.44626 43.27146 43.15066 42.79720 42.54440 42.27439 42.21873 41.79763 41.51349 41.48338 41.35024 41.18068
> rsvd.o(A,10,5)$d
[1] 34.83741 33.83411 33.09522 32.65761 32.34326 31.80868 31.38253 30.96395 30.79063 30.34387 30.04538 29.56061 29.24128 29.12612 …Run Code Online (Sandbox Code Playgroud) 我有一些我想在Google地图图块上绘制的shapefile.最有效的方法是什么?一条路径可能是使用pkg RgoogleMaps,但是,我仍然不清楚如何执行此操作.我假设使用PlotonStaticMap重新格式化shapefile数据
基本上我想在R中执行对角平均.下面是一些改编自simsalabim包的代码来进行对角线平均.只有这个很慢.
有关矢量化而不是使用sapply的任何建议吗?
reconSSA <- function(S,v,group=1){
### S : matrix
### v : vector
N <- length(v)
L <- nrow(S)
K <- N-L+1
XX <- matrix(0,nrow=L,ncol=K)
IND <- row(XX)+col(XX)-1
XX <- matrix(v[row(XX)+col(XX)-1],nrow=L,ncol=K)
XX <- S[,group] %*% t(t(XX) %*% S[,group])
##Diagonal Averaging
.intFun <- function(i,x,ind) mean(x[ind==i])
RC <- sapply(1:N,.intFun,x=XX,ind=IND)
return(RC)
}
Run Code Online (Sandbox Code Playgroud)
对于数据,您可以使用以下内容
data(AirPassengers)
v <- AirPassengers
L <- 30
T <- length(v)
K <- T-L+1
x.b <- matrix(nrow=L,ncol=K)
x.b <- matrix(v[row(x.b)+col(x.b)-1],nrow=L,ncol=K)
S <- eigen(x.b %*% t(x.b))[["vectors"]]
out <- reconSSA(S, v, 1:10)
Run Code Online (Sandbox Code Playgroud) 真的很困惑为什么使用RcppArmadillo的QR输出与R的QR输出不同; 犰狳文献也没有给出明确的答案.基本上当我给R一个n*q的矩阵Y(比如1000 X 20)时,我得到的Q是1000 X 20和R 20 X 1000.这就是我需要的.但是当我在Armadillo中使用QR求解器时,它会让我回到Q 1000 X 1000和R 1000 X 20.我可以调用R的qr函数吗?我需要Q有维度nxq,而不是qx q.下面的代码是我正在使用的(它是更大功能的一部分).
如果有人可以建议如何在RcppEigen中做到这一点,那也会有所帮助.
library(inline)
library(RcppArmadillo)
src <- '
Rcpp::NumericMatrix Xr(Xs);
int q = Rcpp::as<int>(ys);
int n = Xr.nrow(), k = Xr.ncol();
arma::mat X(Xr.begin(), n, k, false);
arma::mat G, Y, B;
G = arma::randn(n,q);
Y = X*G;
arma::mat Q, R;
arma::qr(Q,R,Y);
return Rcpp::List::create(Rcpp::Named("Q")=Q,Rcpp::Named("R")=R,Rcpp::Named("Y")=Y);'
rsvd <- cxxfunction(signature(Xs="numeric", ys="integer"), body=src, plugin="RcppArmadillo")
Run Code Online (Sandbox Code Playgroud) r ×4
armadillo ×1
google-maps ×1
loops ×1
mapping ×1
math ×1
matrix ×1
performance ×1
rcpp ×1
shapefile ×1