@evilking
2018-03-03T16:07:46.000000Z
字数 3181
阅读 1332
R基础篇
R作为统计语言,生来就对数学有良好的支持,一个函数就能实现一种数学计算
本篇只是挑选出了一些常用的数学运算来介绍
望读者阅读本篇的同时,结合http://blog.fens.me/r-mathematics/的介绍,会对R语言中的数学元素部分有更系统的理解
函数 | 描述 |
---|---|
exp() | 以自然常数e为底的指数函数 |
log() | 自然对数 |
log10() | 以10为底的常用对数 |
sqrt() | 平方根 |
abs() | 绝对值 |
sin(),cos(),tan() | 三角函数 |
min(),max() | 向量的最小值、最大值 |
which.min(),which.max() | 向量的最小、最大元素的位置索引 |
median() | 中位数 |
quantile() | 分位数 |
mean() | 平均 |
weighted.mean() | 加权平均 |
pmin(),pmax() | 把多个等长度的向量按元素逐个对比,返回所有向量的最小(最大)的值 |
sum(),prod() | 把一个向量的所有元素求和(求积) |
cumsum(),cumprod() | 把一个向量的前k个元素累计求和(求积) |
round(),floor(),ceiling(),trund() | 分别是四舍五入取整、向下取整、向上取整和直接截断取整 |
factorial() | 阶乘 |
> exp(2)
[1] 7.389056
> log(7.389056)
[1] 2
> sqrt(4)
[1] 2
> abs(-3)
[1] 3
> sin(3.1415926/2) # pi ~= 3.1415926
[1] 1
> cos(3.1415926)
[1] -1
> min(3,7)
[1] 3
> max(3,7)
[1] 7
> median(c(1:5)) #取中位数
[1] 3
> quantile(c(1:5)) #计算分位数的值
0% 25% 50% 75% 100%
1 2 3 4 5
> mean(c(1:10)) #求平均
[1] 5.5
> weighted.mean(c(1:10),c(rep(c(1,2,3),c(3,3,3)),1)) #对1:10作加权平均
[1] 6.210526
> which.min(c(3,7)) #最小值的索引
[1] 1
> which.max(c(3,7)) #最大值的索引
[1] 2
> pmin(c(3,4,5),c(3,5,4)) #对应位置的最小值“
[1] 3 4 4
> pmax(c(3,4,5),c(3,5,4)) #对应索引的最大值
[1] 3 5 5
> sum(c(1,2,3)) #求和
[1] 6
> prod(c(1,2,3)) #连乘
[1] 6
> cumsum(c(1,2,3,4)) #累积和
[1] 1 3 6 10
> cumprod(c(1,2,3,4)) #累积乘
[1] 1 2 6 24
> round(3.14) #四舍五入
[1] 3
> floor(3.14) #向下取整
[1] 3
> ceiling(3.14) #向上取整
[1] 4
> trunc(3.9)
[1] 3
> factorial(4) #4!阶乘
[1] 24
>
> D(expression(exp(x^2)), "x") #对x求导
exp(x^2) * (2 * x)
> D(expression(x^2+y^2+x*y),"x") #对x求偏导
2 * x + y
> D(expression(x^2+y^2+x*y),'y' ) #对y求偏导
2 * y + x
> integrate(function(x) x^2, 0, 1) #求定积分
0.3333333 with absolute error < 3.7e-15
>
第一个表达式是求导,同样可以求偏导;对
最后一个表达式是求积分,但只能对一元函数进行运算;对函数
如果要求函数x^2 + y^2 + x*y 在(2,3)处的关于x的一阶偏导数的值呢?
> x <- 2
> y <- 3
> eval(x^2 + y^2 + x*y) #求解表达式
[1] 19
> eval( D( expression(x^2 + y^2 + x*y),"x") ) #先求一阶偏导的表达式然后再求值
[1] 7
>
对于求导,还可以用deriv()函数:
> Df <- deriv(z ~ sin(x^2/2 - y^2/4)*cos(2*x - exp(y)), c('x','y'),func = T, hessian = T)
> Df(c(-1:3),1)
[1] 0.001457906 0.225566580 0.186279732 0.280503646 0.886217096
attr(,"gradient")
x y
[1,] -0.5005089 0.6696472
[2,] -0.2032578 0.7179512
[3,] 1.0551597 -0.8073411
[4,] -1.9879397 2.5891741
[5,] 1.0751438 0.1189299
attr(,"hessian")
, , x
x y
[1,] 3.8740025 -1.657639
[2,] -1.7856566 0.828296
[3,] 2.3486658 -1.265040
[4,] -0.9280407 0.705792
[5,] -11.8267537 6.717684
, , y
x y
[1,] -1.657639 -1.97522112
[2,] 0.828296 0.07674176
[3,] -1.265040 -0.49707495
[4,] 0.705792 0.91080970
[5,] 6.717684 -6.82029169
>
deriv()函数进行求导运算,括号内的参数分别是求导函数、自变量和两个逻辑参数
Df(c(-1:3),1)
表示求五个点处的函数值和对应的梯度向量,若上面参数hessian=T
则还有海森矩阵
关于梯度向量和海森矩阵,在后面的数学基础篇会专门讲解
解线性方程组,本质是求解
> (a <- matrix(c(1,3,2,4),nrow = 2))
[,1] [,2]
[1,] 1 2
[2,] 3 4
> (b <- c(2,4))
[1] 2 4
> solve(a,b) #求解线性方程组
[1] 0 1
> solve(a) #求矩阵a的逆矩阵
[,1] [,2]
[1,] -2.0 1.0
[2,] 1.5 -0.5
> sweep(a,1,c(2,5),"*") #数值分析批量运算
[,1] [,2]
[1,] 2 4
[2,] 15 20
>
上面几个例子中对矩阵的操作在前面的矩阵与数组篇已经详细讲解了,这里就不在细说
sweep(a,d,v,f)函数可做数值分析批量运算,即对矩阵a,按照d(d为1则按行,d为2则按列),每行分别应用函数f,参数为向量v中对应行的值
上面矩阵a按每行分别乘以(2,5)
,则(1 2)*2 = (2 4)
,(3 4)*5 = (15 20)
> x <- c(1,2,5)
> y <- c(5,1,8,9)
> union(x,y) #并集
[1] 1 2 5 8 9
> intersect(x,y) #交集
[1] 1 5
> setdiff(x,y) #差集
[1] 2
> setequal(x,y) #检验两个集合是否相等
[1] FALSE
> 2%in%x #检验指定元素是否在集合中
[1] TRUE
> choose(5,2) #检验从5个元素中抽取2个元素的方法数
[1] 10
> choose(c(5,10,20),c(3,4,5)) #可向量化运算
[1] 10 210 15504
>
集合具有唯一性
choose(n,k)函数对应数学上的排列组合,从n个元素中取k个元素,有多少种取法,即
上述choose(5,2)
按照计算公式得5*4/(2*1) = 10
关于集合的数学基础我们会专门在后面的数学基础知识篇中进行讲解