- ---
- [cousera数据科学]R Programming WEEKW 4
- ---
- ## 第四课 仿真模拟和代码优化
- 1.仿真模拟相关
- 先介绍了个不相干但用处极大的函数str,基本上那些不明觉厉的function的output我都愿意用它来看看内容。比如glm的结果。
- 然后是关于随机数的四个函数:
- d for density,
- r for random number generation,
- p for culmulative distribution
- q for quantile function
- ```{r}
- rnorm( 5) # 标准正太分布,生成随机数5个
- dnorm( c(0,100000) ) # x的正太分布密度函数值-记得那些年我们学的钟型曲线吗?x=0就是钟的顶点
- pnorm( c(0,3)) # 分布函数,密度函数的积分
- qnorm( c( 0.5, 0.9, 0.95, 0.99) ) #给定累计概率值,找到那个x,注意这都不是双侧概率哈
- rpois #泊松分布
- ```
- 另外set.seed(n)会控制每次生成同样的一组随机数,这样过程可重复。
- 模拟这事儿我用不着,这里偷懒不继续了。
- 2.Profiling R Code
- 为什么我的代码运行得这么慢?这是个让人鸡冻的话题~~~~~
- profiling 是一种系统的检验代码每一部分运行速度的方式,可以帮助你优化代码,让他们更有效率……
- 3.第一招system.time()
- 流逝时间: 实际所用时间
- 用户时间: CPU运算时间
- 下面这个例子平易近人,
- ```{r}
- system.time( readLines("http://www.jhsph.edu")) #用户时间短,流逝时间看人品和网速
- hilbert <- function(n) {
- i <- 1:n
- 1/outer( i-1, i, "+")
- }
- x <- hilbert(500)
- system.time( svd(x)) # 看机器性能,土豪机的流失时间应该比较短吧
- #另一种用法
- system.time( {
- n <- 1000
- r <- numeric(n)
- for ( i in 1:n ) {
- x <- rnorm(n)
- r <- mean(x)
- }
- })
- #个人觉得方便的用法
- ptm <- proc.time()
- n <- 1000
- r <- numeric(n)
- for ( i in 1:n ) {
- x <- rnorm(n)
- r <- mean(x)
- }
- proc.time()-ptm
- ```
- 以下部分是玄学:
- 多核/分布式可以缩短elapsted time,因为user time可以并行。
- lecturer说,很多线性计算比如regression,prediction或者矩阵计算之类所用的算法包括在 Multi-threaded BLAS libraries里面,这些库已经为多核计算优化过了。(BLAS,全称Basic Linear Algebra Subprograms,即基础线性代数子程序库,里面拥有大量已经编写好的关于线性代数运算的程序,包括veclib/Accelerate, ATLAS, ACML, MKL对应mac,AMD和INTEL)
- 这难道意味着R是支持多线程的?之前听说R是不支持多核的啊,还是说R只有部分运算可以利用多线程技术?
- 求高手解答。。。另外线程的个数大于等于核的个数哈
- 还提到了parallel包,不光可以利用多核,还可以多台计算机并行。依然不明觉厉。
- 4.The R Profiler 第二招
- 不能跟system.time()一起用
- Rprof() 跟踪函数调用栈里函数的时间消耗:
- 以0.02秒为间隔抽样,看当前有效函数是哪个,结果写入Rprof.out,这相当于一个日志系统。
- summaryRprof() by.total用总时间除以每个函数运行的时间; by.self去掉调用栈里面上层function。
- (call stack调用堆栈:调用堆栈是一个方法列表,按调用顺序保存所有在运行期被调用的方法)
- 另外,C和Fortran代码不能显示在这里面。
- ```{r}
- # forms matrix of powers of the vector x , through degree dg
- powers1 <- function(x, dg) {
- pw <- matrix( x, nrow=length(x))
- prod <- x # current product
- for ( i in 2:dg) {
- prod <- prod * x
- pw <- cbind(pw, prod)
- }
- return(pw)
- }
- x <- runif(1000000)
- Rprof()
- invisible( powers1(x,8))
- Rprof(NULL)
- summaryRprof()
- summaryRprof()$sample.interval
- ```
- 补充一下我对计算效率的看法~
- 首先说,对于r里面固定的算法,比如SVM,glm这些,对一般玩家来说,就算很慢也没有什么优化的空间,除非你具备重写包的能力(那就不是一般玩家了吧)
- 那么效率提高在哪里效果最大呢?我感觉应该在数据的处理过程中,或者叫ETL的时候,
- 但是有时候,提升的方法是显而易见的,向量化一定比for循环好,plyr的某些模块比R本身好,等等。比如我之前做的,https://bbs.pinggu.org/thread-3042778-1-1.html,不需要用system.time,几个量级的提升是直接能感受到的。
- 那么什么问题值得用这种优化呢?
- 那些处理流程比较复杂,又没有比较直接的代码可以几行搞掂,这就需要分析代码效率了。
- 比如我认识的一个牛人,用R实现一篇paper上的一种page rank的时候,一开始很慢,但是他分析发现开销集中在算一个矩阵上,于是改进了一下算法绕过去(好像是类似做了两个索引或者辅助列之类的),就快了很多。
- 就个人经验来说,解决问题最首要的还是分析应用场景和条件,数据分析师还不太会面临时间敏感的任务,离线数据算的慢一点也能接受,再不成,申请台服务器,分批的处理,也能凑合过去了。但是如果要做高频金融交易之类的,也可以不必坚持用R,而依赖更高效的处理手段,至于啥更快?python?c?matlab?我就不懂了,希望能获得更多答案。总之我觉得作为数据分析师/potential数据科学家,只在单机环境下玩是不幸福的,一定要搞分布式才能跟生产系统对接,工作的价值才能更大。嗯嗯~


雷达卡




京公网安备 11010802022788号







