SparkR:数据科学家的新利器

2015-10-27 孙锐 程序员电

背景说明: SPARK作为大数据运算中最核心和常用框架之一,但有其自身特点,数据科学中最常用的语 言是R和python,在SPARK最新发布的1.4版中,加了一个新的模块SparkR,让SPARK框支持R语言,那么熟悉R语言人员可以直接操作SPARK。 SparkR是AMPLab发布的一个R开发包,为Apache Spark提供了轻量的前端。SparkR提供了Spark中弹性分

背景说明:


SPARK作为大数据运算中最核心和常用框架之一,但有其自身特点,数据科学中最常用的语 言是R和python,在SPARK最新发布的1.4版中,加了一个新的模块SparkR,让SPARK框支持R语言,那么熟悉R语言人员可以直接操作SPARK。

SparkR是AMPLab发布的一个R开发包,为Apache Spark提供了轻量的前端。SparkR提供了Spark中弹性分布式数据集(RDD)的API,用户可以在集群上通过R shell交互性的运行job。例如,我们可以在HDFS上读取或写入文件,也可以使用 lapply 来定义对应每一个RDD元素的运算。

 
它们之间流程如下:


sparkR1

项目背景

R是非常流行的数据统计分析和制图的语言及环境,有一项调查显示,R语言在数据科学家中使用的程度仅次于SQL。但目前R语言的核心运行环境是单线程的,能处理的数据量受限于单机的内存容量,大数据时代的海量数据处理对R构成了挑战。

为了解决R的可伸缩性问题,R社区已经有一些方案,比如parallel和snow包,可以在计算机集群上并行运行R代码。但它们的缺陷在于没有解决数据分布式存储,数据仍然需要在主节点集中表示,分片后再传输给工作节点,不适用于大数据处理的场景。另外,数据处理模型过于简单,即数据分片在工作节点处理后,结果收集回主节点,缺少一个象MapReduce那样通用的分布式数据编程模型。

Hadoop是流行的大数据处理平台,它的HDFS分布式文件系统和之上的MapReduce编程模型比较好地解决了大数据分布式存储和处理的问题。RHadoop项目的出现使得用户具备了在R中使用Hadoop处理大数据的能力。

Apache顶级开源项目Spark是Hadoop之后备受关注的新一代分布式计算平台。和Hadoop相比,Spark提供了分布式数据集的抽象,编程模型更灵活和高效,能够充分利用内存来提升性能。为了方便数据科学家使用Spark进行数据挖掘,社区持续往Spark中加入吸引数据科学家的各种特性,例如0.7.0版本中加入的python API (PySpark);1.3版本中加入的DataFrame等。

R和Spark的强强结合应运而生。2013年9月SparkR作为一个独立项目启动于加州大学伯克利分校的大名鼎鼎的AMPLAB实验室,与Spark源出同门。2014年1月,SparkR项目在github上开源(https://github.com/amplab-extras/SparkR-pkg)。随后,来自工业界的Alteryx、Databricks、Intel等公司和来自学术界的普渡大学,以及其它开发者积极参与到开发中来,最终在2015年4月成功地合并进Spark代码库的主干分支,并在Spark 1.4版本中作为重要的新特性之一正式宣布。

当前特性

SparkR往Spark中增加了R语言API和运行时支持。Spark的 API由Spark Core的API以及各个内置的高层组件(Spark Streaming,Spark SQL,ML Pipelines和MLlib,Graphx)的API组成,目前SparkR只提供了Spark的两组API的R语言封装,即Spark Core的RDD API和Spark SQL的DataFrame API。

需要指出的是,在Spark 1.4版本中,SparkR的RDD API被隐藏起来没有开放,主要是出于两点考虑:

  1. RDD API虽然灵活,但比较底层,R用户可能更习惯于使用更高层的API;
  2. RDD API的实现上目前不够健壮,可能会影响用户体验,比如每个分区的数据必须能全部装入到内存中的限制,对包含复杂数据类型的RDD的处理可能会存在问题等。

目前社区正在讨论是否开放RDD API的部分子集,以及如何在RDD API的基础上构建一个更符合R用户习惯的高层API。

RDD API

用户使用SparkR RDD API在R中创建RDD,并在RDD上执行各种操作。

目前SparkR RDD实现了Scala RDD API中的大部分方法,可以满足大多数情况下的使用需求:

SparkR支持的创建RDD的方式有:

  • 从R list或vector创建RDD(parallelize())
  • 从文本文件创建RDD(textFile())
  • 从object文件载入RDD(objectFile())

SparkR支持的RDD的操作有:

  • 数据缓存,持久化控制:cache(),persist(),unpersist()
  • 数据保存:saveAsTextFile(),saveAsObjectFile()
  • 常用的数据转换操作,如map(),flatMap(),mapPartitions()等
  • 数据分组、聚合操作,如partitionBy(),groupByKey(),reduceByKey()等
  • RDD间join操作,如join(), fullOuterJoin(), leftOuterJoin()等
  • 排序操作,如sortBy(), sortByKey(), top()等
  • Zip操作,如zip(), zipWithIndex(), zipWithUniqueId()
  • 重分区操作,如coalesce(), repartition()
  • 其它杂项方法

和Scala RDD API相比,SparkR RDD API有一些适合R的特点:

  • SparkR RDD中存储的元素是R的数据类型。
  • SparkR RDD transformation操作应用的是R函数。
  • RDD是一组分布式存储的元素,而R是用list来表示一组元素的有序集合,因此SparkR将RDD整体上视为一个分布式的list。Scala API 中RDD的每个分区的数据由iterator来表示和访问,而在SparkR RDD中,每个分区的数据用一个list来表示,应用到分区的转换操作,如mapPartitions(),接收到的分区数据是一个list而不是iterator。
  • 为了符合R用户经常使用lapply()对一个list中的每一个元素应用某个指定的函数的习惯,SparkR在RDD类上提供了SparkR专有的transformation方法:lapply()、lapplyPartition()、lapplyPartitionsWithIndex(),分别对应于Scala API的map()、mapPartitions()、mapPartitionsWithIndex()。

DataFrame API

Spark 1.3版本引入了DataFrame API。相较于RDD API,DataFrame API更受社区的推崇,这是因为:

  1. DataFrame的执行过程由Catalyst优化器在内部进行智能的优化,比如过滤器下推,表达式直接生成字节码。
  2. 基于Spark SQL的外部数据源(external data sources) API访问(装载,保存)广泛的第三方数据源。
  3. 使用R或Python的DataFrame API能获得和Scala近乎相同的性能。而使用R或Python的RDD API的性能比起Scala RDD API来有较大的性能差距。

Spark的DataFrame API是从R的 Data Frame数据类型和Python的pandas库借鉴而来,因而对于R用户而言,SparkR的DataFrame API是很自然的。更重要的是,SparkR DataFrame API性能和Scala DataFrame API几乎相同,所以推荐尽量用SparkR DataFrame来编程。

目前SparkR的DataFrame API已经比较完善,支持的创建DataFrame的方式有:

  • 从R原生data.frame和list创建
  • 从SparkR RDD创建
  • 从特定的数据源(JSON和Parquet格式的文件)创建
  • 从通用的数据源创建
  • 将指定位置的数据源保存为外部SQL表,并返回相应的DataFrame
  • 从Spark SQL表创建
  • 从一个SQL查询的结果创建

支持的主要的DataFrame操作有:

·数据缓存,持久化控制:cache(),persist(),unpersist()

  • 数据保存:saveAsParquetFile(), saveDF() (将DataFrame的内容保存到一个数据源),saveAsTable() (将DataFrame的内容保存存为数据源的一张表)
  • 集合运算:unionAll(),intersect(), except()
  • Join操作:join(),支持inner、full outer、left/right outer和semi join。
  • 数据过滤:filter(), where()
  • 排序:sortDF(), orderBy()
  • 列操作:增加列- withColumn(),列名更改- withColumnRenamed(),选择若干列 -select()、selectExpr()。为了更符合R用户的习惯,SparkR还支持用$、[]、[[]]操作符选择列,可以用$<列名> <- 的语法来增加、修改和删除列
  • RDD map类操作:lapply()/map(),flatMap(),lapplyPartition()/mapPartitions(),foreach(),foreachPartition()
  • 数据聚合:groupBy(),agg()
  • 转换为RDD:toRDD(),toJSON()
  • 转换为表:registerTempTable(),insertInto()
  • 取部分数据:limit(),take(),first(),head()

编程示例

总体上看,SparkR程序和Spark程序结构很相似。

基于RDD API的示例

要基于RDD API编写SparkR程序,首先调用sparkR.init()函数来创建SparkContext。然后用SparkContext作为参数,调用parallelize()或者textFile()来创建RDD。有了RDD对象之后,就可以对它们进行各种transformation和action操作。下面的代码是用SparkR编写的Word Count示例:

library(SparkR)
#初始化SparkContext
sc <- sparkR.init("local", "RWordCount") 
#从HDFS上的一个文本文件创建RDD           
lines <- textFile(sc, "hdfs://localhost:9000/my_text_file")
#调用RDD的transformation和action方法来计算word count
#transformation用的函数是R代码
words <- flatMap(lines, function(line) { strsplit(line, " ")[[1]] })
wordCount <- lapply(words, function(word) { list(word, 1L) })
counts <- reduceByKey(wordCount, "+", 2L)
output <- collect(counts)

基于DataFrame API的示例

基于DataFrame API的SparkR程序首先创建SparkContext,然后创建SQLContext,用SQLContext来创建DataFrame,再操作DataFrame里的数据。下面是用SparkR DataFrame API计算平均年龄的示例:

library(SparkR)
#初始化SparkContext和SQLContext
sc <- sparkR.init("local", "AverageAge") 
sqlCtx <- sparkRSQL.init(sc)
#从当前目录的一个JSON文件创建DataFrame
df <- jsonFile(sqlCtx, "person.json")
#调用DataFrame的操作来计算平均年龄
df2 <- agg(df, age="avg")
averageAge <- collect(df2)[1, 1]

对于上面两个示例要注意的一点是SparkR RDD和DataFrame API的调用形式和Java/Scala API有些不同。假设rdd为一个RDD对象,在Java/Scala API中,调用rdd的map()方法的形式为:rdd.map(…),而在SparkR中,调用的形式为:map(rdd, …)。这是因为SparkR使用了R的S4对象系统来实现RDD和DataFrame类。

架构

SparkR主要由两部分组成:SparkR包和JVM后端。SparkR包是一个R扩展包,安装到R中之后,在R的运行时环境里提供了RDD和DataFrame API。


图1 SparkR软件栈

SparkR的整体架构如图2所示。


图2 SparkR架构

R JVM后端

SparkR API运行在R解释器中,而Spark Core运行在JVM中,因此必须有一种机制能让SparkR API调用Spark Core的服务。R JVM后端是Spark Core中的一个组件,提供了R解释器和JVM虚拟机之间的桥接功能,能够让R代码创建Java类的实例、调用Java对象的实例方法或者Java类的静态方法。JVM后端基于Netty实现,和R解释器之间用TCP socket连接,用自定义的简单高效的二进制协议通信。

R Worker

SparkR RDD API和Scala RDD API相比有两大不同:SparkR RDD是R对象的分布式数据集,SparkR RDD transformation操作应用的是R函数。SparkR RDD API的执行依赖于Spark Core但运行在JVM上的Spark Core既无法识别R对象的类型和格式,又不能执行R的函数,因此如何在Spark的分布式计算核心的基础上实现SparkR RDD API是SparkR架构设计的关键。

SparkR设计了Scala RRDD类,除了从数据源创建的SparkR RDD外,每个SparkR RDD对象概念上在JVM端有一个对应的RRDD对象。RRDD派生自RDD类,改写了RDD的compute()方法,在执行时会启动一个R worker进程,通过socket连接将父RDD的分区数据、序列化后的R函数以及其它信息传给R worker进程。R worker进程反序列化接收到的分区数据和R函数,将R函数应到到分区数据上,再把结果数据序列化成字节数组传回JVM端。

从这里可以看出,与Scala RDD API相比,SparkR RDD API的实现多了几项开销:启动R worker进程,将分区数据传给R worker和R worker将结果返回,分区数据的序列化和反序列化。这也是SparkR RDD API相比Scala RDD API有较大性能差距的原因。

DataFrame API的实现

由于SparkR DataFrame API不需要传入R语言的函数(UDF()方法和RDD相关方法除外),而且DataFrame中的数据全部是以JVM的数据类型存储,所以和SparkR RDD API的实现相比,SparkR DataFrame API的实现简单很多。R端的DataFrame对象就是对应的JVM端DataFrame对象的wrapper,一个DataFrame方法的实现基本上就是简单地调用JVM端DataFrame的相应方法。这种情况下,R Worker就不需要了。这是使用SparkR DataFrame API能获得和ScalaAPI近乎相同的性能的原因。

当然,DataFrame API还包含了一些RDD API,这些RDD API方法的实现是先将DataFrame转换成RDD,然后调用RDD 的相关方法。

展望

SparkR目前来说还不是非常成熟,一方面RDD API在对复杂的R数据类型的支持、稳定性和性能方面还有较大的提升空间,另一方面DataFrame API在功能完备性上还有一些缺失,比如对用R代码编写UDF的支持、序列化/反序列化对嵌套类型的支持,这些问题相信会在后续的开发中得到改善和解决。如何让DataFrame API对熟悉R原生Data Frame和流行的R package如dplyr的用户更友好是一个有意思的方向。此外,下一步的开发计划包含几个大的特性,比如普渡大学正在做的在SparkR中支持Spark Streaming,还有Databricks正在做的在SparkR中支持ML pipeline等。SparkR已经成为Spark的一部分,相信社区中会有越来越多的人关注并使用SparkR,也会有更多的开发者参与对SparkR的贡献,其功能和使用性将会越来越强。

总结

Spark将正式支持R API对熟悉R语言的数据科学家是一个福音,他们可以在R中无缝地使用RDD和Data Frame API,借助Spark内存计算、统一软件栈上支持多种计算模型的优势,高效地进行分布式数据计算和分析,解决大规模数据集带来的挑战。工欲善其事,必先利其器,SparkR必将成为数据科学家在大数据时代的又一门新利器。

孙锐,英特尔大数据团队工程师,HIVE和Shark项目贡献者,SparkR主力贡献者之一。

版权声明:
本网站所有内容来源注明为“梅斯医学”或“MedSci原创”的文字、图片和音视频资料,版权均属于梅斯医学所有。非经授权,任何媒体、网站或个人不得转载,授权转载时须注明来源为“梅斯医学”。其它来源的文章系转载文章,或“梅斯号”自媒体发布的文章,仅系出于传递更多信息之目的,本站仅负责审核内容合规,其内容不代表本站立场,本站不负责内容的准确性和版权。如果存在侵权、或不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
在此留言
评论区 (4)
#插入话题
  1. [GetPortalCommentsPageByObjectIdResponse(id=1989385, encodeId=2f9f1989385a0, content=<a href='/topic/show?id=7033165e692' target=_blank style='color:#2F92EE;'>#SpA#</a>, beContent=null, objectType=article, channel=null, level=null, likeNumber=26, replyNumber=0, topicName=null, topicId=null, topicList=[TopicDto(id=16576, encryptionId=7033165e692, topicName=SpA)], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=db5b227, createdName=gostraight, createdTime=Mon Oct 10 13:12:00 CST 2016, time=2016-10-10, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=2045251, encodeId=09c92045251a8, content=<a href='/topic/show?id=99465e75960' target=_blank style='color:#2F92EE;'>#数据科学#</a>, beContent=null, objectType=article, channel=null, level=null, likeNumber=44, replyNumber=0, topicName=null, topicId=null, topicList=[TopicDto(id=57759, encryptionId=99465e75960, topicName=数据科学)], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=8e4c53, createdName=jiyangfei, createdTime=Fri Aug 26 19:12:00 CST 2016, time=2016-08-26, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=41718, encodeId=1a1d41e185f, content=赞, beContent=null, objectType=article, channel=null, level=null, likeNumber=105, replyNumber=0, topicName=null, topicId=null, topicList=[], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=8b911658392, createdName=梦想天空, createdTime=Wed Oct 28 09:05:00 CST 2015, time=2015-10-28, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=41474, encodeId=9e40414e44c, content=好文, beContent=null, objectType=article, channel=null, level=null, likeNumber=172, replyNumber=0, topicName=null, topicId=null, topicList=[], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=ba2f1613431, createdName=wention47, createdTime=Tue Oct 27 09:37:00 CST 2015, time=2015-10-27, status=1, ipAttribution=)]
    2016-10-10 gostraight
  2. [GetPortalCommentsPageByObjectIdResponse(id=1989385, encodeId=2f9f1989385a0, content=<a href='/topic/show?id=7033165e692' target=_blank style='color:#2F92EE;'>#SpA#</a>, beContent=null, objectType=article, channel=null, level=null, likeNumber=26, replyNumber=0, topicName=null, topicId=null, topicList=[TopicDto(id=16576, encryptionId=7033165e692, topicName=SpA)], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=db5b227, createdName=gostraight, createdTime=Mon Oct 10 13:12:00 CST 2016, time=2016-10-10, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=2045251, encodeId=09c92045251a8, content=<a href='/topic/show?id=99465e75960' target=_blank style='color:#2F92EE;'>#数据科学#</a>, beContent=null, objectType=article, channel=null, level=null, likeNumber=44, replyNumber=0, topicName=null, topicId=null, topicList=[TopicDto(id=57759, encryptionId=99465e75960, topicName=数据科学)], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=8e4c53, createdName=jiyangfei, createdTime=Fri Aug 26 19:12:00 CST 2016, time=2016-08-26, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=41718, encodeId=1a1d41e185f, content=赞, beContent=null, objectType=article, channel=null, level=null, likeNumber=105, replyNumber=0, topicName=null, topicId=null, topicList=[], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=8b911658392, createdName=梦想天空, createdTime=Wed Oct 28 09:05:00 CST 2015, time=2015-10-28, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=41474, encodeId=9e40414e44c, content=好文, beContent=null, objectType=article, channel=null, level=null, likeNumber=172, replyNumber=0, topicName=null, topicId=null, topicList=[], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=ba2f1613431, createdName=wention47, createdTime=Tue Oct 27 09:37:00 CST 2015, time=2015-10-27, status=1, ipAttribution=)]
  3. [GetPortalCommentsPageByObjectIdResponse(id=1989385, encodeId=2f9f1989385a0, content=<a href='/topic/show?id=7033165e692' target=_blank style='color:#2F92EE;'>#SpA#</a>, beContent=null, objectType=article, channel=null, level=null, likeNumber=26, replyNumber=0, topicName=null, topicId=null, topicList=[TopicDto(id=16576, encryptionId=7033165e692, topicName=SpA)], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=db5b227, createdName=gostraight, createdTime=Mon Oct 10 13:12:00 CST 2016, time=2016-10-10, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=2045251, encodeId=09c92045251a8, content=<a href='/topic/show?id=99465e75960' target=_blank style='color:#2F92EE;'>#数据科学#</a>, beContent=null, objectType=article, channel=null, level=null, likeNumber=44, replyNumber=0, topicName=null, topicId=null, topicList=[TopicDto(id=57759, encryptionId=99465e75960, topicName=数据科学)], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=8e4c53, createdName=jiyangfei, createdTime=Fri Aug 26 19:12:00 CST 2016, time=2016-08-26, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=41718, encodeId=1a1d41e185f, content=赞, beContent=null, objectType=article, channel=null, level=null, likeNumber=105, replyNumber=0, topicName=null, topicId=null, topicList=[], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=8b911658392, createdName=梦想天空, createdTime=Wed Oct 28 09:05:00 CST 2015, time=2015-10-28, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=41474, encodeId=9e40414e44c, content=好文, beContent=null, objectType=article, channel=null, level=null, likeNumber=172, replyNumber=0, topicName=null, topicId=null, topicList=[], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=ba2f1613431, createdName=wention47, createdTime=Tue Oct 27 09:37:00 CST 2015, time=2015-10-27, status=1, ipAttribution=)]
    2015-10-28 梦想天空

    0

  4. [GetPortalCommentsPageByObjectIdResponse(id=1989385, encodeId=2f9f1989385a0, content=<a href='/topic/show?id=7033165e692' target=_blank style='color:#2F92EE;'>#SpA#</a>, beContent=null, objectType=article, channel=null, level=null, likeNumber=26, replyNumber=0, topicName=null, topicId=null, topicList=[TopicDto(id=16576, encryptionId=7033165e692, topicName=SpA)], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=db5b227, createdName=gostraight, createdTime=Mon Oct 10 13:12:00 CST 2016, time=2016-10-10, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=2045251, encodeId=09c92045251a8, content=<a href='/topic/show?id=99465e75960' target=_blank style='color:#2F92EE;'>#数据科学#</a>, beContent=null, objectType=article, channel=null, level=null, likeNumber=44, replyNumber=0, topicName=null, topicId=null, topicList=[TopicDto(id=57759, encryptionId=99465e75960, topicName=数据科学)], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=8e4c53, createdName=jiyangfei, createdTime=Fri Aug 26 19:12:00 CST 2016, time=2016-08-26, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=41718, encodeId=1a1d41e185f, content=赞, beContent=null, objectType=article, channel=null, level=null, likeNumber=105, replyNumber=0, topicName=null, topicId=null, topicList=[], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=8b911658392, createdName=梦想天空, createdTime=Wed Oct 28 09:05:00 CST 2015, time=2015-10-28, status=1, ipAttribution=), GetPortalCommentsPageByObjectIdResponse(id=41474, encodeId=9e40414e44c, content=好文, beContent=null, objectType=article, channel=null, level=null, likeNumber=172, replyNumber=0, topicName=null, topicId=null, topicList=[], attachment=null, authenticateStatus=null, createdAvatar=, createdBy=ba2f1613431, createdName=wention47, createdTime=Tue Oct 27 09:37:00 CST 2015, time=2015-10-27, status=1, ipAttribution=)]
    2015-10-27 wention47

    好文

    0

相关资讯

临床严格自查埋单:乱象丛生,“坦白从宽”?

7月22日,根据国务院“最严谨的标准、最严格的监管、最严厉的处罚、最严肃的问责”要求,国家食药监总局(CFDA)发布了“关于开展药物临床试验数据自查核查工作”的117公告,并附以1622个药物临床试验数据自查核查品种清单,提交截止时间是8月25日。 不难想象,在“史上最严药物临床试验数据自查令”下达之后相关制药企业的集体慌乱状态。措手不及的不只是制药企业,还有围绕药物临床试验的CRO、药物临

美国将创建统一的公有云端基因组数据平台dbGap

  基因组学的科研人员正越来越多地使用云计算服务,谷歌的云计算服务就是其中之一 今年三月基因组学领域的科研工作者们迎来了一件大喜事:美国国立卫生研究院NIH取消了不准将其dbGap数据库中的基因组信息上传到云端的规定。这一规定设立于2007年,它的取消无疑为科研工作者存储和分析基因组信息提供了便利。 云计算服务通过按需付费模式提供海量的存储和计算资源。使用云服务要通过互联网

七种常见的回归分析技术,助力建模和数据分析

回归分析是建模和分析数据的重要工具。本文解释了回归分析的内涵及其优势,重点总结了应该掌握的线性回归、逻辑回归、多项式回归、逐步回归、岭回归、套索回归、ElasticNet回归等七种最常用的回归技术及其关键要素,最后介绍了选择正确的回归模型的关键因素。 什么是回归分析? 回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通常用于预测分析,时间序列模

人类基因组计划25年:给大科学六大启示

1989年,人类基因组计划开始前,班伯里学术峰会在纽约冷泉港实验室举行。图片来源:Cold Spring Harbor Lab. Library & Archives 25年前,新创建的美国人类基因组研究国家中心(NHGRI,现在的国家人类基因组研究所)和美国及国际合作伙伴联手,发起了“人类基因组计划”(HGP)。接下来发生的事情,代表了最具历史意义的科学努力之一:历经13年,对

Spark Streaming:大规模流式数据分析与数据挖掘利器

提到Spark Streaming,我们不得不说一下BDAS(Berkeley Data Analytics Stack),这个伯克利大学提出的关于数据分析的软件栈。从它的视角来看,目前的大数据处理可以分为如以下三个类型。 复杂的批量数据处理(batch data processing),通常的时间跨度在数十分钟到数小时之间。基于历史数据的交互式查询(interactive quer

药物临床试验数据“飞行检查”拉开序幕 市场可能就此洗牌

8 月 12 日上午,CFDA 召集的《药物临床试验数据自查核查工作会议》在北京新北纬饭店准时开始,本次会议参会人员为各省局代表以及总局 2015 年第 117 号公告所列进口药品相关企业代表(见:国家食品药品监督管理总局关于开展药物临床试验数据自查核查工作的公告(2015年第117号))。有业内人士表示,这次会议可能会是中国制药的十一届三中全会。 从现场照片来看,可以用人山人海来形容,由于所有