数据科学家的工具箱笔记

JHK数据科学系列课程的课程笔记,这是前两门课《数据科学家的工具箱》和《R语言编程》

数据科学家的工具箱

目标

我们的目标

Types of Questions

descriptive analyses

Describe a set of data

exploratory analysis

Find relationships you didn't know about

inferential analysis

use a relatively small sample of data to say something about a bigger population

predictive analysis

To use the data on some objects to predict values for another object

casual analysis

To find out what happens to one variable when you make another variable change

mechanistic analysis

Understand the exact changes in variables that lead to changes in other variables for individual objects

The data is the second most important thing,the most important thing in data science is the question

R语言

方法

参数匹配

位置匹配
名称匹配
部分匹配
给定参数后匹配的顺序:

  1. Check for exact match for a named argument
  2. Check for a partial match
  3. Check for a positional match

Lazy Evaluation

传递给方法的参数,只有在用的时候才去求值。

"..."变长参数

  1. 在不想拷贝原始方法的全部参数的时候,用于扩展方法

    myplot <- function(x, y, type = "l", ...) {
    plot(x, y, type = type, ...)
    }

  2. 传递额外的参数

    mean
    function(x, ...)
    UseMethod("mean")

  3. 在预先不知道参数数目的时候使用

    args(paste)
    function(..., sep = " ", collapse = NULL)
    paste("a", "b", sep = ":")
    [1] "a:b"

编码标准

  1. Always use text files / text editor
  2. Indent your code
  3. Limit the width of your code (80 columns?)
  4. Limit the length of individual functions

Lexical Scoping

这部分很重要,详细参考课件Scoping Rules

Loop Function

apply

用来对一个数组使用同一个方法(或者通常使用匿名方法)求值。

  • 通常用来对矩阵的行或者列使用一个函数
  • 可以生成数组,例如求一个矩阵数组的平均值
  • 并不比使用循环快,但是一行就能完成

apply(X, MARGIN, FUN, ...)

lapply

遍历一个list,并对每一个元素都调用一个方法

sapply

和lapply一样,但是尝试简化结果(如果可能的话)

  • 如果结果是个list,其中的元素都是长度为1,那么返回一个vector
  • 如果结果是个list,其中的元素都是长度是长度相等(>1)的向量,那么返回一个matrix
  • 如果不行的话,返回一个list

tapply

对一个向量的子集使用一个方法,不清楚为什么叫做tapply

tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

根据index参数指定的不同的级别,对X中的每种级别使用FUN求值。

> x <- c(rnorm(10), runif(10), rnorm(10, 1))
> f <- gl(3, 10)
> f
[1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3
[24] 3 3 3 3 3 3 3
Levels: 1 2 3
> tapply(x, f, mean)
1  2  3
0.1144464 0.5163468 1.2463678

mapply

lapply的多变量版本

split

split接收一个向量或者其他对象,并按照一个factor或者一系列的factor把他们分组。

> str(split)
function(x, f, drop = FALSE, ...)
x is a vector (or list) or data frame
f is a factor (or coerced to one) or a list of factors
drop indicates whether empty factors levels should be dropped

split经常与lapply同时使用。

> lapply(split(x, f), mean)
$‘1‘
[1] 0.1144464
$‘2‘
[1] 0.5163468
$‘3‘
[1] 1.246368

Debugging

  • traceback: 打印方法的调用堆栈
  • debug: 标记一个函数为“debug”模式,可以一次执行一行
  • browser: 暂停函数的执行,进入debug模式
  • trace: 允许在函数中指定位置插入调试代码
  • recover: allows you to modify the error behavior so that you can browse the function call stack

生成随机数

概率函数

形如: [dpqr]distribution_abbreviation()

其中第一个字母表示所指分布的某一方面:

 d=密度函数(density)
 p=分布函数(distribution function)
 q=分位数函数(quantile function)
 r=生成随机数

set.seed() 函数设置随机数种子确保复现性(reproducibility)

随机采样

sample函数从一个对象几何中随机抽取

Profiling

profiling是使用系统的方法来检查程序的不同部分花费了多少时间,在优化代码时特别有用

优化的一般原则

  • 首先设计,然后优化
  • 记住,早期的优化是万恶之源
  • 测量(收集数据),不要猜测

使用system.time()

输入任意的R表达式,返回其执行所需时间(秒)

返回proc_time类的一个对象

user time: time charged to the CPU(s) for this expression
elapsed time: "wall clock" time

## Elapsed time > user time
system.time(readLines("http://www.jhsph.edu"))

user system elapsed 
0.004  0.002  0.431

## Elapsed time < user time
hilbert <- function(n) { 
    i <- 1:n
    1/ outer(i - 1, i, "+”)
}
x <- hilbert(1000)
system.time(svd(x))

user system elapsed 
1.605 0.094 0.742
  • 通常情况下,user time and elapsed time are relatively close, for straight computing tasks
  • Elapsed time 可能会大于user time,如果CPU在等待任务上花费了较多时间的话
  • Elapsed time 可能会小于user time,如果你的机器拥有并能够使用多个处理器(核心)的话
    • Multi-threaded BLAS libraries (vecLib/Accelerate, ATLAS, ACML, MKL)
    • Parallel processing via the parallelpackage

The R Profiler

  • Rprof()函数在R中开始profile
  • summaryRprof()函数总结Rprof()函数的输出
  • 注意:Rprof()的默认采样间隔是0.02秒,以0.02秒的间隔跟踪函数调用堆栈

example:

## lm(y ~ x)
sample.interval=10000
"list" "eval" "eval" "model.frame.default" "model.frame" "eval" "eval" "lm"
"list" "eval" "eval" "model.frame.default" "model.frame" "eval" "eval" "lm"
"list" "eval" "eval" "model.frame.default" "model.frame" "eval" "eval" "lm"
"list" "eval" "eval" "model.frame.default" "model.frame" "eval" "eval" "lm"
"na.omit" "model.frame.default" "model.frame" "eval" "eval" "lm"
"na.omit" "model.frame.default" "model.frame" "eval" "eval" "lm"
"na.omit" "model.frame.default" "model.frame" "eval" "eval" "lm"
"na.omit" "model.frame.default" "model.frame" "eval" "eval" "lm"
"na.omit" "model.frame.default" "model.frame" "eval" "eval" "lm"
"na.omit" "model.frame.default" "model.frame" "eval" "eval" "lm"
"na.omit" "model.frame.default" "model.frame" "eval" "eval" "lm"
"lm.fit" "lm"
"lm.fit" "lm"
"lm.fit" "lm"

summaryRprof有两种方式归一化数据:

  • "by.total" 每个方法中花费的时间除以整个运行的时间
  • "by.self" 一样的作用,但是首先减去花费在方法调用上的时间
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容