您正在查看: 标签 r 下的文章

在Ubuntu 16.04的R语言环境中通过安装KerasR包使用Keras深度学习框架

Overview

因为想尝试一些深度学习模型,就用Keras开始建模(为什么使用Keras?)。而且由于之前使用的极其模型都是基于R语言的,所以我们依然尝试使用R语言版本的Keras来训练深度学习模型。

KerasR语言接口

Keras本身就是一个基于TensorflowTheano以及CNTK编写的纯Python框架,因为方便易用,所以使用广泛,为了让R语言开发者也能在R中使用KerasTaylor Arnold写了kerasR包,而RStudio公司开发了keras包,关于这两个包的区别,参见keras: Deep Learning in R

这里我使用kerasR包为例,在Ubuntu 16.04的R中安装Keras,并提供一些链接进一步学习使用kerasRKeras

安装过程

安装pip

pip是一个很方面易用的Python包管理工具,使用pip``可以很方便地安装TensorflowKeras`。
使用下面的命令安装:

sudo apt-get install python-pip

默认你已经安装了Python,如果没装Python,使用下面的命令一起装了:

sudo apt-get install python-pip python-dev build-essential 

安装之后查看pip的版本信息:

pip -V

想要升级pip

sudo pip install --upgrade pip 

注意:装了最新版本的pip(或者是升级到最新版本的pip),可能会报错,参考Python包管理软件pip更新后报错

安装Tensorflow

因为Keras本身是Tensorflow运行的机器学习框架,所以安装Keras之前先安装Tensorflow

sudo pip install tensorflow

这里我是用了系统权限sudo,如果没有系统权限,也可以不用。
如果想安装指定版本的Tensorflow,可以用下面的命令安装:

sudo pip install tensorflow==1.2.1

如果想安装GPU版本的Tensorflow,可以用下面的命令安装:

sudo pip install tensorflow-gpu

在安装Tensorflow的过程中可能会报类似于下面的错误:

Cannot uninstall 'enum34'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

这是因为安装Tensorflow需要安装enum34,在安装enum34时需要删除旧的enum34。而在删除旧的enum34时,版本依赖多,不能系统清晰的删除。所以需要手动安装enum34并忽略已经安装的版本:

sudo pip install nibabel --ignore-installed nibabel

然后重新安装Tensorflow就可以了。

安装Keras

sudo pip install keras

安装成功后,打开python命令行,导入一下Tensorflow

>>> import keras as kr
Using TensorFlow backend.

说明Keras已经装好。

安装kerasR

先打开R语言命令行(最后使用sudo,这样可以将R包安装到系统目录):

sudo R

安装kerasR

install.packages("kerasR")

安装成功后,导入kerasR,并检查状态:

library("kerasR")
keras_init()

如果不报错,就说明安装成功。

如果报了类似于下面的错误:

>> keras not available
>> See reticulate::use_python() to set python path, 
>> then use kerasR::keras_init() to retry

就说明要么是KerasTensorflow没装好,要么是R找不到Python的路径。一般来说Python装在系统路径中,不会找不到。以防万一,可以查看下自己的Python路径,手动使用reticulate::use_python()函数加进去。比如在Ubuntu下面,一般是在/usr/bin/python,那就可以用下面的命令安装:

reticulate::use_python("/usr/bin/python")

使用kerasR

安装好之后,可以参考下面的链接来在真实数据集上运行几个例子:

因为kerasR只是Keras的一个R语言接口,所以使用kerasR之前还是要对Keras有一些了解。可以查看下面的链接快速了解Keras

如果想快速上手一些Keras模型,可以查看下面的链接:

参考文献

R脚本在Windows和Mac上的一点不兼容

Overview

今天在Mac上运行一个在Windows中处理过的R脚本,不能正常运行,错误信息指向明确。

问题描述

使用./H_gr500_tune.R运行,报下面的错误:

env: Rscript\r: No such file or directory

打开这个脚本,头几行内容如下:

#!/usr/bin/env Rscript
library(e1071)
library(plyr)
library(ROCR)

并没有发现异常,很明显是因为Windows下换行符\r\n引起的,但是使用sublime查找这个脚本,能查找\n,却查不到有\r,所以没办法在sublime中手动去掉\r
可能sublime在显示的时候自动把\r\n处理成了\n,但脚本中\r确实是存在的,所以尽管看不到,但运行脚本时会报错。

解决方案

使用下面的命令行,去掉\r,并生成一个新文件H_gr500_tune1.R

cat H_gr500_tune.R | tr -d "\r" > H_gr500_tune1.R

重新运行H_gr500_tune1.R,一切正常。

小结

Windows下拿过来的脚本,最好都check一下换行符的问题,不管会不会有问题,看一下总没错...

一个R语言版本跟caret包不兼容的问题

Overview

最近在一台新的电脑上运行一个R脚本时,报了一个很奇怪的错误。因为类似的脚本已经运行了很多次,所以很快就可以确定是电脑的R环境不兼容引起的问题。

问题描述

脚本在运行时需要载入caret包,结果载入过程中报下面的错误:

Loading required package: gplots

Attaching package: ‘gplots’

The following object is masked from ‘package:stats’:

    lowess

Loading required package: methods
Warning message:
package ‘gplots’ was built under R version 3.2.4
Loading required package: lattice
Loading required package: ggplot2
Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) :
  there is no package called ‘recipes’
In addition: Warning messages:
1: package ‘caret’ was built under R version 3.2.5
2: package ‘lattice’ was built under R version 3.2.5
3: package ‘ggplot2’ was built under R version 3.2.5
4: replacing previous import by ‘plyr::ddply’ when loading ‘caret’
Error: package or namespace load failed for ‘caret’
Execution halted

别被上面的信息迷惑了,里面出现了ggplot2lattice包,是因为这些包都是caret的依赖包。caret非常的大,有很多依赖包。看到上面的信息,第一时间会选择用install.packages("recipes")安装,但提示信息时recipes不存在。

解决方案

查阅了一些资料后,发现caret兼容的最低R语言版本为3.2.3,然后我看了下我的R语言版本:3.2.2...
R官网上,下载了一个3.3.3,安装之后,重新装了一下需要的包,一切正常。

小结

如果安装的环境太老,有的时候还是会有一些不兼容的问题。所以如果出现了一些重大的版本,最好还是要更新一下,因为很可能后面的包就开始基于新的版本开发了。虽然我也不喜欢追求最新的,但也别太旧...

Mac下R语言导入xlsx包报错的解决方案

Overview

最近把系统更新到了最新版本(10.12.3),又安装了一个新的语言Julia,再使用R的时候,发现命令行已经不能通过R命令进入了,连*.R文件都不再能被R语言关联了。具体原因未知,于是先下了一个最新的R-3.3.3,顺带删了Julia,所有的library都要重新安装,结果安装好xlsx后导入的时候报了错。
各种解决方法都尝试了,还是不行。考虑到可能是R的版本太新了,就把R-3.3.3卸载了,重新装了一个R-3.2.3版本,依然存在同样的问题,又过了一遍解决方法,解决了。

问题描述

> library("xlsx")
载入需要的程辑包:xlsxjars
JavaVM: requested Java version ((null)) not available. Using Java at "" instead.
JavaVM: Failed to load JVM: /bundle/Libraries/libserver.dylib
JavaVM FATAL: Failed to load the jvm library.
Error : loadNamespace()里算'xlsx'时.onLoad失败了,详细内容:
  调用: .jinit()
  错误: JNI_GetCreatedJavaVMs returned -1

错误: ‘xlsx’程辑包或名字空间载入失败,

实际上,载入xlsx需要载入rJavaxlsxjars两个包,单独载入rJavaxlsxjars时都不会报错,只有载入xlsx时才会报错。

配置环境

用下面的命令查看自己的配置环境:

  • 操作系统版本:

    > sw_vers
    ProductName:    Mac OS X
    ProductVersion: 10.12.3
    BuildVersion:   16D32
    
  • Java版本:

    > java -version
    java version "1.8.0_25"
    Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
    Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
    
  • Java路径:

    > which java
     /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java
    
  • JAVA HOME:

    > /usr/libexec/java_home
    /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home
    
  • R 版本:

    >R --version
    R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree"
    Copyright (C) 2015 The R Foundation for Statistical Computing
    Platform: x86_64-apple-darwin13.4.0 (64-bit)
    
  • R 配置情况:

    >sudo R CMD javareconf
    Java interpreter : /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java
    Java version     : 1.8.0_25
    Java home path   : /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre
    Java compiler    : /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/javac
    Java headers gen.: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/javah
    Java archive tool: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/jar
    Non-system Java on OS X
    
    trying to compile and link a JNI program
    detected JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/darwin
    detected JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/../include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/../include/darwin -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c conftest.c -o conftest.o
    clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o conftest.so conftest.o -L/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/server -ljvm -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
    
    
    JAVA_HOME        : /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre
    Java library path: $(JAVA_HOME)/lib/server
    JNI cpp flags    : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/darwin
    JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
    Updating Java configuration in /Library/Frameworks/R.framework/Resources
    Done.    
    

    这个命令最好要用sudo执行,否则可能会在配置的过程中出现权限问题,报下面的错误:

    Java interpreter :     /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/bin/java
    Java version     : 1.8.0_25
    Java home path   :     /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home
    Java compiler    :     /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/javac
    Java headers gen.:     /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/javah
    Java archive tool:     /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/jar
    System Java on OS X
    
    trying to compile and link a JNI program
    detected JNI cpp flags    : -    I/System/Library/Frameworks/JavaVM.framework/Headers
    detected JNI linker flags : -framework JavaVM
    clang -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/System/Library/Frameworks/JavaVM.framework/Headers -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include    -fPIC  -Wall -mtune=core2 -g -O2  -c conftest.c -o conftest.o
    conftest.c:1:10: fatal error: 'jni.h' file not found
    #include <jni.h>
         ^
    1 error generated.
    make: *** [conftest.o] Error 1
    Unable to compile a JNI program
    

解决方法

报错信息其实很明显,就是找不到jvm的位置。我花了很久的时间重新配置了JAVA_HOME,依然不行,最后发现是因为rJava包的安装问题。

  • 在linux shell命令行,执行下面的命令(其实刚才检查的时候已经执行过了):
    sudo R CMD javareconf
    
  • 打开R命令行(最好在sudo下打开),用下面的命令重新安装rJava包:
    install.packages("rJava",type='source')
    

重新载入rJava包,就可以了。

一点小问题

之前的问题是解决了,但是会有点后遗症:以后无论是在启用R命令行或者运行R语言脚本的时候,如果要导入rJava包,都需要使用sudo命令,否则就会报下面的错误:

Error : loadNamespace()里算'rJava'时.onLoad失败了,详细内容:
  调用: dyn.load(file, DLLpath = DLLpath, ...)
  错误: 无法载入共享目标对象‘/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so’::
  dlopen(/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so, 6): Library not loaded: @rpath/libjvm.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so
  Reason: image not found
错误: ‘rJava’程辑包或名字空间载入失败,

因为没有sudo权限,没办法访问/Library/Frameworks/R.framework/Versions/3.2/Resources/library/rJava/libs/rJava.so。暂时没有更好的解决方案,找到之后再加上。

参考网址

Ubuntu 14.04 安装R和R packages

Overview

虽然已经用了很久的R语言,但一直没整理过,正好需要在我们的云服务器上安装R,所以一并记录下来了。下面的过程虽然是在Ubuntu 14.04上安装的,但是对于其他版本的系统,RR packages的安装都大同小异。

1. 安装R

1.1 添加源

Ubuntu 14.04中的R版本比较旧,默认安装可能会出很多问题(我试过了)。所以最好添加一个新的源。

etc/apt/source.list中添加如下信息:

deb http://<my.favorite.cran.mirror>/bin/linux/ubuntu trusty/

这里的<my.favorite.cran.mirror>换成一个适合你的镜像地址,可以从https://cran.r-project.org/mirrors.html找到所有的镜像,比如我选择了厦门大学的镜像:http://mirrors.xmu.edu.cn/CRAN/,那么在etc/apt/source.list中添加:

deb http://mirrors.xmu.edu.cn/CRAN/bin/linux/ubuntu trusty/

1.2 更新源

sudo apt-get update

不出意外会遇到一个错误:

W: GPG 错误:http://mirrors.xmu.edu.cn trusty/ Release: 由于没有公钥,无法验证下列签名: NO_PUBKEY 51716619E084DAB9

运行下面的命令:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 51716619E084DAB9

之后重新更新源:

sudo apt-get update

就可以顺利更新了。

1.3 安装

sudo apt-get install r-base

如果要从源码安装R,使用下面的命令:

sudo apt-get install r-base-dev

2. 安装 R packages

直接在命令行输入R,就可以进入R语言的命令行交互模式,使用几个命令可以快速熟悉一下R。

  1. 如果你想查看一个函数的用法,比如mean函数(R中用来求均值的函数),可以使用

     help(mean)
    

    或者

     ?mean
    
  2. .libPaths(),查看R中包安装的目录,在我的Ubuntu14.04下,有三个输出下面的内容:

     [1] "/usr/local/lib/R/site-library" "/usr/lib/R/site-library"
     [3] "/usr/lib/R/library"
    

    说明上面三个目录都可以作为R packages安装的目录,其中,如果你在安装包时不指定,默认会安装在第一个目录/usr/local/lib/R/site-library,而/usr/lib/R/libraryR自带包的所在目录。

  3. library(),可以查看R中以及安装的所有包,这个函数会去.libPaths()中列出的所有目录查看,并按照目录将各种包列出来:

     Packages in library ‘/usr/local/lib/R/site-library’:
    
     digest                  Create Compact Hash Digests of R Objects
     entropy                 Estimation of Entropy, Mutual Information and Related Quantities
     FSelector               Selecting attributes
     randomForest            Breiman and Cutler's Random Forests for Classification and Regression
     RWeka                   R/Weka interface
     RWekajars               R/Weka interface jars
     Packages in library ‘/usr/lib/R/site-library’:
     rJava                   Low-level R to Java interface
     Packages in library ‘/usr/lib/R/library’:
     base                    The R Base Package
     boot                    Bootstrap Functions (originally by Angelo Canty for S)
     class                   Functions for Classification
     cluster                 Cluster Analysis Extended Rousseeuw et al.
     codetools               Code Analysis Tools for R
     compiler                The R Compiler Package
     ...
    

    这里省略了一些包,并没有全部列出来,你可能很好奇,rJava这个包为什么会比较特别,安装在了一个其他包都不在的地方。下面在介绍FSelector包安装的时候会讲到。

  4. install.packages("mypackage"),用来安装的函数,默认会安装在.libPaths()列出来的第一个目录下。这个函数也提供了参数lib用来指定你要把包安装的位置。

  5. library("mypackage"),载入一个已经安装的包,如果还没有安装这个包,则会报错,程序中断。

  6. require("mypackage"),载入一个已经安装的包,如果还没有安装这个包,则显示警告信息,然后程序继续向下执行。(与library("mypackage")相比,require强烈不推荐)。

  7. remove.packages("mypackage"),卸载package。

  8. update.packages( ),更新package,可以定期执行。

  1. 安装Bioconductor 包

    Bioconductor提供了一个函数用来安装Bioconductor 包

    • 首先,载入这个安装函数:

       source("http://bioconductor.org/biocLite.R")
      
    • 之后,就可以用这个函数安装 Bioconductor 包了:

       biocLite("mypackage")
      
  2. 下面还有一些方法,不太常用,列出来参考:

    下面的内容主要摘自:【R】Linux安装R语言包(Installing R packages on Linux)

    • getOption("defaultPackages"):查看启动R时自动载入的包。
    • vignette('mypackage'):有的包,特别是bioconductor的包有vignette,用函数查看
    • openVignette('mypackage'):这个函数也可以查看vignette,更好用一些
    • RSiteSearch("helpinfor"):搜索R网站上的“helpinfor”相关信息
    • help.start():查看已经安装包的详细HTML文档
    • search():查看当前载入的包
    • sessionInfo():查看R中载入的包
    • methods():查看某个S3泛型函数中所有的方法或者一个类中所有的方法(S3:S version 3)
    • showMethods(class = "myClass"):查看S4类的方法
    • findMethods("myMethods"):查看method的代码
    • class(myObject):查看某个对象的类
    • getClass(“class/package”):查看某个class或者包的具体内容
    • getSlots("class"):查看某个class的slot
    • slotNames(MyObject):查看某个对象的slot。
    • Myobject@slotNames:访问对象Myobject的slot值,这个@可以连续用。

    查询包内信息:

    • ?function/method:查看某个“函数”或者“方法”的详细内容
    • class?graph::graph:查看“组”的详细内容的一个例子。这个例子的来源是查询graph包时候,查看其中class的信息,输入??graph后出现一个graph::graph-class。
    • ls("package:mypackage"):查看"mypackage"中的所有对象。

参考资料