The R Package of fast random SVD

基于Rcpp的快速随机奇异值分解包

李家郡

目录

为什么要用Rcpp

算法简介

制作R包的流程与注意事项

1 . 为什么用Rcpp

斐波那契数列运行效率对比

结合其他语言的原因

效率

  • 观点1 程序员时间宝贵,有限时间写越短代码越好

  • 观点2 学习R干嘛,cpp运行速度快,那都用cpp开发不就行了

结合其他语言的特性

  • c++的特性
  • Java的特性
  • python的特性
  • markdown的特性
  • 未来c#?PPT

2.算法简介

随机分解算法原理解释

  • 将n×n的矩阵正交投影到n×s的低维空间,分解低维矩阵近似计算奇异值

  • LU分解替代QR分解进一步加速

  • Count Sketch替代Gaussian Sketch

  • 提速关键在于降维与利用稀疏性

常用的矩阵运算库推荐

Armadillo

RcppArmadillo

优点 矩阵分解快、语法接近Matlab、可链接多库

缺点 稀疏矩阵支持度不强,并行能力弱

Eigen

RcppEigen

优点 稀疏支持好

缺点 分解速度太慢

MKL

优点 快

缺点 不开源、与R耦合度低、配置麻烦

Rpackage文件简介

文件目录

frSVD
│  DESCRIPTION              /描述文件,涉及到依赖关系
│  frSVD.Rproj
│  NAMESPACE                /添加useDynLib(mypackage),链接库载入、函数数据集全局可用
│
├─man
│      frSVD.rd             /帮助文档
│
├─R
│      RcppExports.R        /主文件,自动生成
│
└─src
        frpca.h
        frsvd.cpp
        frSVD.dll           /链接文件
        frsvd.o
        Makevars
        Makevars.win        /添加Rcpp中c++库的链接
        RcppExports.cpp
        RcppExports.o

Description

Package: package name        /表示包的名称  
Type: Package             /表示R-Project的类型,R包对应的为“Package”  
Title: What the package does (short line)     /标题,简要描述R包功能  
Version: 1.0                            /记录R包的版本信息  
Author: Who wrote it                    /记录R包的作者  
Maintainer: Who to complain to <yourfault@somewhere.net>   /记录R包的维护者  
Description: More about what it does (maybe more than one line)  /详细描述R包的功能  
License: GPL      /表示R包的使用许可(General Public License)
Encoding: UTF-8
Imports:   Rcpp, RcppArmadillo /使用的一些其他的包的名字,如这里用了RcppArmadillo
LinkingTo: Rcpp, RcppArmadillo /连接
SystemRequirements: C++11  /重点!使用Armadillo有可能需要C++11标准编译

frSVD.rd包帮助描述部分

\name{mypackage-package}
\alias{mypackage-pakage}
\docType{mypackage}
\title{what the package does(short line)}
\description{More about what it does}
\details{
\tabular{ll}{Package、Type、Version、Date、License、LazyLoad}
}
\author{who wrote it}
\value{
  \item{函数返回变量}{ 返回变量类型说明}
}
\references{
Xu Fen, Yuyang Xie, Mingye Song Wenjian Yu, Jie Tang(2018). Fast Randomized PCA for Sparse Data. Proceedings of Machine Learning Research;see also https://arxiv.org/pdf/1810.06825.pdf
}
……

frSVD.rd函数帮助描述部分

\name{mypackage-package}
\alias{mypackage-pakage}
\docType{mypackage}
\title{what the package does(short line)}
\description{More about what it does}
\usage{usage example}
\arguments{参数
  \item{参数名}{参数解释}
}
\examples{}

frSVD.cpp外置部分

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
#include "frpca.h"
#include <Rcpparmadillo.h>
#include <Rcpp.h>
#include <iostream>

using namespace Rcpp;

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
RcppExport SEXP frSVD(arma::sp_mat& X,int k,int q=5) {
  frpca::frPCA fsvd(X,k,q);
  return Rcpp::List::create(
    Rcpp::Named("d")     = fsvd.singularValues(),
    Rcpp::Named("u")     = fsvd.matrixU(),
    Rcpp::Named("v")     = fsvd.matrixV(),
    Rcpp::Named("niter") = (q-1)/2,
    Rcpp::Named("rank")  = k);
}

R包发布

SCAN

麻烦,需要大量严格测试以及对包详尽的描述。
(这些描述将存储在 vignettes文件夹中,可在主项目目录中创建该文件夹) 模拟测试并记录后,进入Build > Build Source Package 路径创建源码包。 在https://cran.r-project.org/submit.html提交源代码包

GitHub

较容易(gitHub是一个面向开源及私有软件项目的托管平台)
在 GitHub 上发布包最简单的方法是创建一个新的仓库,然后将主文件夹的内容上传至该仓库

devtools::install_github("llijiajun/frSVD")

本包使用说明

对比svds

小结

建议

  • 算法时间效率提高不仅限于算法本身,编程优化手段也很重要
  • 研究算法最终目的还是将其投入实战,这是开发R包的根本目的

参考文献

  • [1] Xu Fen, Yuyang Xie, Mingye Song Wenjian Yu, Jie Tang. Fast Randomized PCA for Sparse Data. Proceedings of Machine Learning Research 80:1-16,2018.

  • [2] N. Halko, P. G. Martinsson, and J. A. Tropp. Finding structure with randomness: Probabilistic algorithms for constructing approximate matrix decompositions. SIAM Review, 53(2):217–288, 2011.

  • [3] http://arma.sourceforge.net/

  • [4] https://cosx.org/2013/12/rcpp-introduction/

  • [5] 德克·埃德比特尔著,寇强 张晔译. Rcpp: R与C++的无缝整合

谢谢欣赏