星期二, 九月 27, 2011

利用XML包获取网站数据

很多时候我们需要从某个网站上获取原始数据,本例试图利用XML包来获取google top1000的表格数据。

首先读入必要的工具包
library(XML)
library(RColorBrewer)
利用readHTMLTable函数获取top1000的表格数据,并存入到raw变量中。
u = "http://www.google.com/adplanner/static/top1000/"
tables = readHTMLTable(u)
raw = tables[[2]]
colnames(raw)=c('Rank','Site','Category','Users','Reach','Views','Advertising?')

星期日, 九月 25, 2011

caret包应用之四:模型预测与检验

模型建立好后,我们可以利用predict函数进行预测,例如预测检测样本的前五个
predict(gbmFit1, newdata = testx)[1:5]
为了比较不同的模型,还可用装袋决策树建立第二个模型,命名为gbmFit2
gbmFit2= train(trainx, trainy,method = "treebag",trControl = fitControl)
models = list(gbmFit1, gbmFit2)
另一种得到预测结果的方法是使用extractPrediction函数,得到的部分结果如下显示

caret包应用之三:建模与参数优化

在进行建模时,需对模型的参数进行优化,在caret包中其主要函数命令是train。

首先得到经过特征选择后的样本数据,并划分为训练样本和检验样本
newdata4=newdata3[,Profile$optVariables]
inTrain = createDataPartition(mdrrClass, p = 3/4, list = FALSE)
trainx = newdata4[inTrain,]
testx = newdata4[-inTrain,]
trainy = mdrrClass[inTrain]
testy = mdrrClass[-inTrain]
然后定义模型训练参数,method确定多次交叉检验的抽样方法,number确定了划分的重数, repeats确定了反复次数。

caret包应用之二:特征选择

在进行数据挖掘时,我们并不需要将所有的自变量用来建模,而是从中选择若干最重要的变量,这称为特征选择(feature selection)。一种算法就是后向选择,即先将所有的变量都包括在模型中,然后计算其效能(如误差、预测精度)和变量重要排序,然后保留最重要的若干变量,再次计算效能,这样反复迭代,找出合适的自变量数目。这种算法的一个缺点在于可能会存在过度拟合,所以需要在此算法外再套上一个样本划分的循环。在caret包中的rfe命令可以完成这项任务。

caret包应用之一:数据预处理

在进行数据挖掘时,我们会用到R中的很多扩展包,各自有不同的函数和功能。如果能将它们综合起来应用就会很方便。caret包(Classification and Regression Training)就是为了解决分类和回归问题的数据训练而创建的一个综合工具包。下面的例子围绕数据挖掘的几个核心步骤来说明其应用。

本例涉及到的数据是一个医学实验数据,载入数据之后可以发现其样本数为528,自变量数为342,mdrrDescr为自变量数据框,mdrrClass为因变量。
library(caret)
data(mdrr)
本例的样本数据所涉及到的变量非常多,需要对变量进行初步降维。其中一种需要删除的变量是常数自变量,或者是方差极小的自变量,对应的命令是nearZeroVar,可以看到新数据集的自变量减少到了297个。

星期三, 九月 21, 2011

利用googleVis包实现环境数据可视化

本例的目的是按中国行政区划标注出每个省份所排放的生活废水,其结果与之前的一篇博文类似,但利用的工具是googleVis包,此工具包将Google Visualisation API与R进行连接,直接用R中的数据生成交互的可视化图形,而不用再将数据上传到google。 

首先,从公众环境研究中心得到各省的数据,然后在google网站找到各省对应的地理位置编码,在excel中制成表格,然后读入到data.frame中。并载入googleVis包

星期二, 九月 20, 2011

R语言中最强的神经网络包RSNNS

R语言中已经有许多用于神经网络的package。例如nnet、AMORE以及neuralnet,nnet提供了最常见的前馈反向传播神经网络算法。AMORE包则更进一步提供了更为丰富的控制参数,并可以增加多个隐藏层。neuralnet包的改进在于提供了弹性反向传播算法和更多的激活函数形式。但以上各包均围绕着BP网络,并未涉及到神经网络中的其它拓扑结构和网络模型。而新出炉的RSNNS包则在这方面有了极大的扩充。

Stuttgart Neural Network Simulator(SNNS)是德国斯图加特大学开发的优秀神经网络仿真软件,为国外的神经网络研究者所广泛采用。其手册内容极为丰富,同时支持友好的 Linux 平台。而RSNNS则是连接R和SNNS的工具,在R中即可直接调用SNNS的函数命令。

星期四, 九月 15, 2011

利用RQuantLib包计算期权价格

首先必须要提到的是QuantLib,它是用C++写的一个开源软件库,主要功能是为各类金融计算提供一个综合框架。而RQuantLib则是连接R和QuantLib的桥梁,目前的函数集主要包括了债券和金融衍生品的计算。

我们来计算一个欧式期权价格以了解QuantLib包的使用。期权价格可以看作是一个多元函数,其影响因素包括了标的资产价格(underlying)、执行价格(strike)、标的资产红利率(dividendYield)、无风险收益率(riskFreeRate)、标的资产波动率(volatility)、期权到期时间(maturity)以及期权类型。

星期日, 九月 11, 2011

利用optim最优化函数进行曲线拟合

R语言中对函数求极值有两种命令,较简单的是optimize函数,在确定搜索范围后可对一元函数求极值,例如:
f = function(x) 3*x^4 − 2*x^3 + 3*x^2 − 4*x + 5
optimize(f, lower=-20, upper=20)
$minimum
[1] 0.5972778
$objective
[1] 3.636756
在对多元函数求极值时,则需利用到更强大的optim函数,本例来自于《Introduction to Scientific Programming and Simulation Using R》,其中数据可从spuRs包中获得。本例的目标是对树木体积进行建模,自变量为树龄,函数形式为指数形式,其中包括了三个待定参数。

R语言中的微分运算

虽然R语言的主要功能是统计计算,但它也包含了基本的数值计算函数,可用来进行数值积分与微分。本例中计算对象的函数形式为f(x, y) = sin(x^2/2 − y^2/4) cos(2x − exp(y))

先在R中进行绘图,使我们了解此二元函数的三维图形
x = seq(-1,3, length.out=100)
y = seq(0,1, length.out=30)
g = expand.grid(x = x, y =y)
g$z = sin(g$x^2/2 - g$y^2/4)*cos(2*g$x - exp(g$y))
wireframe(z ~ x * y, data = g, scales = list(arrows = FALSE),drape = TRUE, colorkey = TRUE, screen = list(z = 30, x = -60))



然后用deriv命令进行求导运算,括号内的参数分别是求导函数、自变量和两个逻辑参数。其结果存为Df,它的类型为一个函数。

Df <- deriv(z ~ sin(x^2/2 - y^2/4)*cos(2*x - exp(y)),c('x', 'y'), func=T, hessian=F)

求下列五个点处的函数值和对应的梯度向量。这五个点分别为(-1,1),(0,1),(1,1),(2,1),(3,1)
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
数值积分的命令是integrate,但只能对一元函数进行运算。
integrand <- function(x) {1/((x+1)*sqrt(x))}
integrate(integrand, lower = 0, upper = Inf)

星期五, 九月 02, 2011

Lattice包中最常用的四种绘图

1.密度曲线图
densityplot(~ Sepal.Length ,groups=Species, data = iris,plot.points=FALSE)