• 粉丝日志首页

RHadoop实践系列之二:RHadoop安装与使用

RHadoop实践系列文章,包含了R语言与Hadoop结合进行海量数据分析。Hadoop主要用来存储海量数据,R语言完成MapReduce 算法,用来替代Java的MapReduce实现。有了RHadoop可以让广大的R语言爱好者,有更强大的工具处理大数据1G, 10G, 100G, TB, PB。 由于大数据所带来的单机性能问题,可能会一去不复返了。

RHadoop实践是一套系列文章,主要包括”Hadoop环境搭建”,”RHadoop安装与使用”,R实现MapReduce的协同过滤算法”,”HBase和rhbase的安装与使用”。对于单独的R语言爱好者,Java爱好者,或者Hadoop爱好者来说,同时具备三种语言知识并不容 易。此文虽为入门文章,但R,Java,Hadoop基础知识还是需要大家提前掌握。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/rhadoop-rhadoop/

rhadoop-rhadoop

第二篇 RHadoop安装与使用部分,分为3个章节。

1. 环境准备
2. RHadoop安装
3. RHadoop程序用例

每一章节,都会分为”文字说明部分”和”代码部分”,保持文字说明与代码的连贯性。

注:Hadoop环境搭建的详细记录,请查看 同系列上一篇文章 “RHadoop实践系列文章之Hadoop环境搭建”。
由于两篇文章并非同一时间所写,hadoop版本及操作系统,分步式环境都略有不同。
两篇文章相互独立,请大家在理解的基础上动手实验,不要完成依赖两篇文章中的运行命令。

环境准备

文字说明部分:

首先环境准备,这里我选择了Linux Ubuntu操作系统12.04的64位版本,大家可以根据自己的使用习惯选择顺手的Linux。

但JDK一定要用Oracle SUN官方的版本,请从官网下载,操作系统的自带的OpenJDK会有各种不兼容。JDK请选择1.6.x的版本,JDK1.7版本也会有各种的不兼容情况。
http://www.oracle.com/technetwork/java/javase/downloads/index.html

Hadoop的环境安装,请参考RHadoop实践系统”Hadoop环境搭建”的一文。

R语言请安装2.15以后的版本,2.14是不能够支持RHadoop的。
如果你也使用Linux Ubuntu操作系统12.04,请先更新软件包源,否则只能下载到2.14版本的R。

代码部分:

1. 操作系统Ubuntu 12.04 x64

~ uname -a
Linux domU-00-16-3e-00-00-85 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

2 JAVA环境

~ java -version

java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02, mixed mode)

3 HADOOP环境(这里只需要hadoop)

hadoop-1.0.3  hbase-0.94.2  hive-0.9.0  pig-0.10.0  sqoop-1.4.2  thrift-0.8.0  zookeeper-3.4.4

4 R的环境

R version 2.15.3 (2013-03-01) -- "Security Blanket"
Copyright (C) 2013 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-pc-linux-gnu (64-bit)

4.1 如果是Ubuntu 12.04,请更新源再下载R2.15.3版本

sh -c "echo deb http://mirror.bjtu.edu.cn/cran/bin/linux/ubuntu precise/ >>/etc/apt/sources.list"
apt-get update
apt-get install r-base

RHadoop安装

文字说明部分:

RHadoop是RevolutionAnalytics的工程的项目,开源实现代码在GitHub社区可以找到。RHadoop包含三个R包 (rmr,rhdfs,rhbase),分别是对应Hadoop系统架构中的,MapReduce, HDFS, HBase 三个部分。由于这三个库不能在CRAN中找到,所以需要自己下载。
https://github.com/RevolutionAnalytics/RHadoop/wiki

接下我们需要先安装这三个库的依赖库。
首先是rJava,上个章节我们已经配置好了JDK1.6的环境,运行R CMD javareconf命令,R的程序从系统变量中会读取Java配置。然后打开R程序,通过install.packages的方式,安装rJava。

然后,我还要安装其他的几个依赖库,reshape2,Rcpp,iterators,itertools,digest,RJSONIO,functional,通过install.packages都可以直接安装。

接下安装rhdfs库,在环境变量中增加 HADOOP_CMD 和 HADOOP_STREAMING 两个变量,可以用export在当前命令窗口中增加。但为下次方便使用,最好把变量增加到系统环境变更/etc/environment文件中。再用 R CMD INSTALL安装rhdfs包,就可以顺利完成了。

安装rmr库,使用R CMD INSTALL也可以顺利完成了。

安装rhbase库,后面”HBase和rhbase的安装与使用”文章中会继续介绍,这里暂时跳过。

最后,我们可以查看一下,RHADOOP都安装了哪些库。
由于我的硬盘是外接的,使用mount和软连接(ln -s)挂载了R类库的目录,所以是R的类库在/disk1/system下面
/disk1/system/usr/local/lib/R/site-library/
一般R的类库目录是/usr/lib/R/site-library或者/usr/local/lib/R/site-library,用户也可以使用whereis R的命令查询,自己电脑上R类库的安装位置

代码部分:

1. 下载RHadoop相关的3个程序包

https://github.com/RevolutionAnalytics/RHadoop/wiki/Downloads

rmr-2.1.0
rhdfs-1.0.5
rhbase-1.1

2. 复制到/root/R目录

~/R# pwd
/root/R

~/R# ls
rhbase_1.1.tar.gz  rhdfs_1.0.5.tar.gz  rmr2_2.1.0.tar.gz

3. 安装依赖库

命令行执行
~ R CMD javareconf 
~ R

启动R程序
install.packages("rJava")
install.packages("reshape2")
install.packages("Rcpp")
install.packages("iterators")
install.packages("itertools")
install.packages("digest")
install.packages("RJSONIO")
install.packages("functional")

4. 安装rhdfs库

~ export HADOOP_CMD=/root/hadoop/hadoop-1.0.3/bin/hadoop
~ export HADOOP_STREAMING=/root/hadoop/hadoop-1.0.3/contrib/streaming/hadoop-streaming-1.0.3.jar (rmr2会用到)
~ R CMD INSTALL /root/R/rhdfs_1.0.5.tar.gz 

4.1 最好把HADOOP_CMD设置到环境变量

~ vi /etc/environment

    HADOOP_CMD=/root/hadoop/hadoop-1.0.3/bin/hadoop
    HADOOP_STREAMING=/root/hadoop/hadoop-1.0.3/contrib/streaming/hadoop-streaming-1.0.3.jar

. /etc/environment

5. 安装rmr库

~  R CMD INSTALL rmr2_2.1.0.tar.gz 

6. 安装rhbase库 (暂时跳过)

7. 所有的安装包

~ ls /disk1/system/usr/local/lib/R/site-library/
digest  functional  iterators  itertools  plyr  Rcpp  reshape2  rhdfs  rJava  RJSONIO  rmr2  stringr

RHadoop程序用例

文字说明部分:

安装好rhdfs和rmr两个包后,我们就可以使用R尝试一些hadoop的操作了。

首先,是基本的hdfs的文件操作。

查看hdfs文件目录
hadoop的命令:hadoop fs -ls /user
R语言函数:hdfs.ls(”/user/“)

查看hadoop数据文件
hadoop的命令:hadoop fs -cat /user/hdfs/o_same_school/part-m-00000
R语言函数:hdfs.cat(”/user/hdfs/o_same_school/part-m-00000″)

接下来,我们执行一个rmr算法的任务

普通的R语言程序:

> small.ints = 1:10
> sapply(small.ints, function(x) x^2)

MapReduce的R语言程序:

> small.ints = to.dfs(1:10)
> mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))
> from.dfs("/tmp/RtmpWnzxl4/file5deb791fcbd5")

因为MapReduce只能访问HDFS文件系统,先要用to.dfs把数据存储到HDFS文件系统里。MapReduce的运算结果再用from.dfs函数从HDFS文件系统中取出。

第二个,rmr的例子是wordcount,对文件中的单词计数

> input<- '/user/hdfs/o_same_school/part-m-00000'
> wordcount = function(input, output = NULL, pattern = " "){

  wc.map = function(., lines) {
            keyval(unlist( strsplit( x = lines,split = pattern)),1)
    }

    wc.reduce =function(word, counts ) {
            keyval(word, sum(counts))
    }         

    mapreduce(input = input ,output = output, input.format = "text",
        map = wc.map, reduce = wc.reduce,combine = T)
}

> wordcount(input)
> from.dfs("/tmp/RtmpfZUFEa/file6cac626aa4a7")

我在HDFS上提前放置了数据文件/user/hdfs/o_same_school/part-m-00000。写wordcount的MapReduce函数,执行wordcount函数,最后用from.dfs从HDFS中取得结果。

代码部分:

1. rhdfs包的使用

启动R程序
> library(rhdfs)

Loading required package: rJava
HADOOP_CMD=/root/hadoop/hadoop-1.0.3/bin/hadoop
Be sure to run hdfs.init()

> hdfs.init()

1.1 命令查看hadoop目录

~ hadoop fs -ls /user

Found 4 items
drwxr-xr-x   - root supergroup          0 2013-02-01 12:15 /user/conan
drwxr-xr-x   - root supergroup          0 2013-03-06 17:24 /user/hdfs
drwxr-xr-x   - root supergroup          0 2013-02-26 16:51 /user/hive
drwxr-xr-x   - root supergroup          0 2013-03-06 17:21 /user/root

1.2 rhdfs查看hadoop目录

> hdfs.ls("/user/")

  permission owner      group size          modtime        file
1 drwxr-xr-x  root supergroup    0 2013-02-01 12:15 /user/conan
2 drwxr-xr-x  root supergroup    0 2013-03-06 17:24  /user/hdfs
3 drwxr-xr-x  root supergroup    0 2013-02-26 16:51  /user/hive
4 drwxr-xr-x  root supergroup    0 2013-03-06 17:21  /user/root

1.3 命令查看hadoop数据文件

~ hadoop fs -cat /user/hdfs/o_same_school/part-m-00000

10,3,tsinghua university,2004-05-26 15:21:00.0
23,4007,北京第一七一中学,2004-05-31 06:51:53.0
51,4016,大连理工大学,2004-05-27 09:38:31.0
89,4017,Amherst College,2004-06-01 16:18:56.0
92,4017,斯坦福大学,2012-11-28 10:33:25.0
99,4017,Stanford University Graduate School of Business,2013-02-19 12:17:15.0
113,4017,Stanford University,2013-02-19 12:17:15.0
123,4019,St Paul's Co-educational College - Hong Kong,2004-05-27 18:04:17.0
138,4019,香港苏浙小学,2004-05-27 18:59:58.0
172,4020,University,2004-05-27 19:14:34.0
182,4026,ff,2004-05-28 04:42:37.0
183,4026,ff,2004-05-28 04:42:37.0
189,4033,tsinghua,2011-09-14 12:00:38.0
195,4035,ba,2004-05-31 07:10:24.0
196,4035,ma,2004-05-31 07:10:24.0
197,4035,southampton university,2013-01-07 15:35:18.0
246,4067,美国史丹佛大学,2004-06-12 10:42:10.0
254,4067,美国史丹佛大学,2004-06-12 10:42:10.0
255,4067,美国休士顿大学,2004-06-12 10:42:10.0
257,4068,清华大学,2004-06-12 10:42:10.0
258,4068,北京八中,2004-06-12 17:34:02.0
262,4068,香港中文大学,2004-06-12 17:34:02.0
310,4070,首都师范大学初等教育学院,2004-06-14 15:35:52.0
312,4070,北京师范大学经济学院,2004-06-14 15:35:52.0

1.4 rhdfs查看hadoop数据文件

>  hdfs.cat("/user/hdfs/o_same_school/part-m-00000")

 [1] "10,3,tsinghua university,2004-05-26 15:21:00.0"
 [2] "23,4007,北京第一七一中学,2004-05-31 06:51:53.0"
 [3] "51,4016,大连理工大学,2004-05-27 09:38:31.0"
 [4] "89,4017,Amherst College,2004-06-01 16:18:56.0"
 [5] "92,4017,斯坦福大学,2012-11-28 10:33:25.0"
 [6] "99,4017,Stanford University Graduate School of Business,2013-02-19 12:17:15.0"
 [7] "113,4017,Stanford University,2013-02-19 12:17:15.0"
 [8] "123,4019,St Paul's Co-educational College - Hong Kong,2004-05-27 18:04:17.0"
 [9] "138,4019,香港苏浙小学,2004-05-27 18:59:58.0"
[10] "172,4020,University,2004-05-27 19:14:34.0"
[11] "182,4026,ff,2004-05-28 04:42:37.0"
[12] "183,4026,ff,2004-05-28 04:42:37.0"
[13] "189,4033,tsinghua,2011-09-14 12:00:38.0"
[14] "195,4035,ba,2004-05-31 07:10:24.0"
[15] "196,4035,ma,2004-05-31 07:10:24.0"
[16] "197,4035,southampton university,2013-01-07 15:35:18.0"
[17] "246,4067,美国史丹佛大学,2004-06-12 10:42:10.0"
[18] "254,4067,美国史丹佛大学,2004-06-12 10:42:10.0"
[19] "255,4067,美国休士顿大学,2004-06-12 10:42:10.0"
[20] "257,4068,清华大学,2004-06-12 10:42:10.0"
[21] "258,4068,北京八中,2004-06-12 17:34:02.0"
[22] "262,4068,香港中文大学,2004-06-12 17:34:02.0"
[23] "310,4070,首都师范大学初等教育学院,2004-06-14 15:35:52.0"
[24] "312,4070,北京师范大学经济学院,2004-06-14 15:35:52.0"

2. rmr2包的使用

启动R程序
> library(rmr2)

Loading required package: Rcpp
Loading required package: RJSONIO
Loading required package: digest
Loading required package: functional
Loading required package: stringr
Loading required package: plyr
Loading required package: reshape2

2.1 执行r任务

> small.ints = 1:10
> sapply(small.ints, function(x) x^2)

[1]   1   4   9  16  25  36  49  64  81 100

2.2 执行rmr2任务

> small.ints = to.dfs(1:10)

13/03/07 12:12:55 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/03/07 12:12:55 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
13/03/07 12:12:55 INFO compress.CodecPool: Got brand-new compressor

> mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))

packageJobJar: [/tmp/RtmpWnzxl4/rmr-local-env5deb2b300d03, /tmp/RtmpWnzxl4/rmr-global-env5deb398a522b, /tmp/RtmpWnzxl4/rmr-streaming-map5deb1552172d, /root/hadoop/tmp/hadoop-unjar7838617732558795635/] [] /tmp/streamjob4380275136001813619.jar tmpDir=null
13/03/07 12:12:59 INFO mapred.FileInputFormat: Total input paths to process : 1
13/03/07 12:12:59 INFO streaming.StreamJob: getLocalDirs(): [/root/hadoop/tmp/mapred/local]
13/03/07 12:12:59 INFO streaming.StreamJob: Running job: job_201302261738_0293
13/03/07 12:12:59 INFO streaming.StreamJob: To kill this job, run:
13/03/07 12:12:59 INFO streaming.StreamJob: /disk1/hadoop/hadoop-1.0.3/libexec/../bin/hadoop job  -Dmapred.job.tracker=hdfs://r.qa.tianji.com:9001 -kill job_201302261738_0293
13/03/07 12:12:59 INFO streaming.StreamJob: Tracking URL: http://192.168.1.243:50030/jobdetails.jsp?jobid=job_201302261738_0293
13/03/07 12:13:00 INFO streaming.StreamJob:  map 0%  reduce 0%
13/03/07 12:13:15 INFO streaming.StreamJob:  map 100%  reduce 0%
13/03/07 12:13:21 INFO streaming.StreamJob:  map 100%  reduce 100%
13/03/07 12:13:21 INFO streaming.StreamJob: Job complete: job_201302261738_0293
13/03/07 12:13:21 INFO streaming.StreamJob: Output: /tmp/RtmpWnzxl4/file5deb791fcbd5

> from.dfs("/tmp/RtmpWnzxl4/file5deb791fcbd5")

$key
NULL

$val
       v
 [1,]  1   1
 [2,]  2   4
 [3,]  3   9
 [4,]  4  16
 [5,]  5  25
 [6,]  6  36
 [7,]  7  49
 [8,]  8  64
 [9,]  9  81
[10,] 10 100

2.3 wordcount执行rmr2任务

> input<- '/user/hdfs/o_same_school/part-m-00000'
> wordcount = function(input, output = NULL, pattern = " "){

    wc.map = function(., lines) {
            keyval(unlist( strsplit( x = lines,split = pattern)),1)
    }

    wc.reduce =function(word, counts ) {
            keyval(word, sum(counts))
    }         

    mapreduce(input = input ,output = output, input.format = "text",
        map = wc.map, reduce = wc.reduce,combine = T)
}

> wordcount(input)

packageJobJar: [/tmp/RtmpfZUFEa/rmr-local-env6cac64020a8f, /tmp/RtmpfZUFEa/rmr-global-env6cac73016df3, /tmp/RtmpfZUFEa/rmr-streaming-map6cac7f145e02, /tmp/RtmpfZUFEa/rmr-streaming-reduce6cac238dbcf, /tmp/RtmpfZUFEa/rmr-streaming-combine6cac2b9098d4, /root/hadoop/tmp/hadoop-unjar6584585621285839347/] [] /tmp/streamjob9195921761644130661.jar tmpDir=null
13/03/07 12:34:41 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/03/07 12:34:41 WARN snappy.LoadSnappy: Snappy native library not loaded
13/03/07 12:34:41 INFO mapred.FileInputFormat: Total input paths to process : 1
13/03/07 12:34:41 INFO streaming.StreamJob: getLocalDirs(): [/root/hadoop/tmp/mapred/local]
13/03/07 12:34:41 INFO streaming.StreamJob: Running job: job_201302261738_0296
13/03/07 12:34:41 INFO streaming.StreamJob: To kill this job, run:
13/03/07 12:34:41 INFO streaming.StreamJob: /disk1/hadoop/hadoop-1.0.3/libexec/../bin/hadoop job  -Dmapred.job.tracker=hdfs://r.qa.tianji.com:9001 -kill job_201302261738_0296
13/03/07 12:34:41 INFO streaming.StreamJob: Tracking URL: http://192.168.1.243:50030/jobdetails.jsp?jobid=job_201302261738_0296
13/03/07 12:34:42 INFO streaming.StreamJob:  map 0%  reduce 0%
13/03/07 12:34:59 INFO streaming.StreamJob:  map 100%  reduce 0%
13/03/07 12:35:08 INFO streaming.StreamJob:  map 100%  reduce 17%
13/03/07 12:35:14 INFO streaming.StreamJob:  map 100%  reduce 100%
13/03/07 12:35:20 INFO streaming.StreamJob: Job complete: job_201302261738_0296
13/03/07 12:35:20 INFO streaming.StreamJob: Output: /tmp/RtmpfZUFEa/file6cac626aa4a7

> from.dfs("/tmp/RtmpfZUFEa/file6cac626aa4a7")

$key
 [1] "-"
 [2] "04:42:37.0"
 [3] "06:51:53.0"
 [4] "07:10:24.0"
 [5] "09:38:31.0"
 [6] "10:33:25.0"
 [7] "10,3,tsinghua"
 [8] "10:42:10.0"
 [9] "113,4017,Stanford"
[10] "12:00:38.0"
[11] "12:17:15.0"
[12] "123,4019,St"
[13] "138,4019,香港苏浙小学,2004-05-27"
[14] "15:21:00.0"
[15] "15:35:18.0"
[16] "15:35:52.0"
[17] "16:18:56.0"
[18] "172,4020,University,2004-05-27"
[19] "17:34:02.0"
[20] "18:04:17.0"
[21] "182,4026,ff,2004-05-28"
[22] "183,4026,ff,2004-05-28"
[23] "18:59:58.0"
[24] "189,4033,tsinghua,2011-09-14"
[25] "19:14:34.0"
[26] "195,4035,ba,2004-05-31"
[27] "196,4035,ma,2004-05-31"
[28] "197,4035,southampton"
[29] "23,4007,北京第一七一中学,2004-05-31"
[30] "246,4067,美国史丹佛大学,2004-06-12"
[31] "254,4067,美国史丹佛大学,2004-06-12"
[32] "255,4067,美国休士顿大学,2004-06-12"
[33] "257,4068,清华大学,2004-06-12"
[34] "258,4068,北京八中,2004-06-12"
[35] "262,4068,香港中文大学,2004-06-12"
[36] "312,4070,北京师范大学经济学院,2004-06-14"
[37] "51,4016,大连理工大学,2004-05-27"
[38] "89,4017,Amherst"
[39] "92,4017,斯坦福大学,2012-11-28"
[40] "99,4017,Stanford"
[41] "Business,2013-02-19"
[42] "Co-educational"
[43] "College"
[44] "College,2004-06-01"
[45] "Graduate"
[46] "Hong"
[47] "Kong,2004-05-27"
[48] "of"
[49] "Paul's"
[50] "School"
[51] "University"
[52] "university,2004-05-26"
[53] "university,2013-01-07"
[54] "University,2013-02-19"
[55] "310,4070,首都师范大学初等教育学院,2004-06-14"

$val
 [1] 1 2 1 2 1 1 1 4 1 1 2 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[39] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

转载请注明出处:
http://blog.fens.me/rhadoop-rhadoop/

打赏作者

[转] 数据科学家面试常见的77个问题

随着大数据概念的火热,数据科学家这一职位应时而出,那么成为数据科学家要满足什么条件?

或许我们可以从国外的数据科学家面试问题中得到一些参考,下面是中国统计网为大家翻译的数据科学家面试常见的77个问题。

下面是77个关于数据分析或者数据科学家招聘的时候会常会的几个问题,供各位同行参考。

1、你处理过的最大的数据量?你是如何处理他们的?处理的结果。
2、告诉我二个分析或者计算机科学相关项目?你是如何对其结果进行衡量的?
3、什么是:提升值、关键绩效指标、强壮性、模型按合度、实验设计、2/8原则?
4、什么是:协同过滤、n-grams, map reduce、余弦距离?
5、如何让一个网络爬虫速度更快、抽取更好的信息以及更好总结数据从而得到一干净的数据库?
6、如何设计一个解决抄袭的方案?
7、如何检验一个个人支付账户都多个人使用?
8、点击流数据应该是实时处理?为什么?哪部分应该实时处理?
9、你认为哪个更好:是好的数据还是好模型?同时你是如何定义“好”?存在所有情况下通用的模型吗?有你没有知道一些模型的定义并不是那么好?
10、什么是概率合并(AKA模糊融合)?使用SQL处理还是其它语言方便?对于处理半结构化的数据你会选择使用哪种语言?
11、你是如何处理缺少数据的?你推荐使用什么样的处理技术?
12、你最喜欢的编程语言是什么?为什么?
13、对于你喜欢的统计软件告诉你喜欢的与不喜欢的3个理由。
14、SAS, R, Python, Perl语言的区别是?
15、什么是大数据的诅咒?
16、你参与过数据库与数据模型的设计吗?
17、你是否参与过仪表盘的设计及指标选择?你对于商业智能和报表工具有什么想法?
18、你喜欢TD数据库的什么特征?
19、如何你打算发100万的营销活动邮件。你怎么去优化发送?你怎么优化反应率?能把这二个优化份开吗?
20、如果有几个客户查询ORACLE数据库的效率很低。为什么?你做什么可以提高速度10倍以上,同时可以更好处理大数量输出?
21、如何把非结构化的数据转换成结构化的数据?这是否真的有必要做这样的转换?把数据存成平面文本文件是否比存成关系数据库更好?
22、什么是哈希表碰撞攻击?怎么避免?发生的频率是多少?
23、如何判别mapreduce过程有好的负载均衡?什么是负载均衡?
24、请举例说明mapreduce是如何工作的?在什么应用场景下工作的很好?云的安全问题有哪些?
25、(在内存满足的情况下)你认为是100个小的哈希表好还是一个大的哈希表,对于内在或者运行速度来说?对于数据库分析的评价?
26、为什么朴素贝叶斯差?你如何使用朴素贝叶斯来改进爬虫检验算法?
27、你处理过白名单吗?主要的规则?(在欺诈或者爬行检验的情况下)
28、什么是星型模型?什么是查询表?
29、你可以使用excel建立逻辑回归模型吗?如何可以,说明一下建立过程?
30、在SQL, Perl, C++, Python等编程过程上,待为了提升速度优化过相关代码或者算法吗?如何及提升多少?
31、使用5天完成90%的精度的解决方案还是花10天完成100%的精度的解决方案?取决于什么内容?
32、定义:QA(质量保障)、六西格玛、实验设计。好的与坏的实验设计能否举个案例?
33、普通线性回归模型的缺陷是什么?你知道的其它回归模型吗?
34、你认为叶数小于50的决策树是否比大的好?为什么?
35、保险精算是否是统计学的一个分支?如果不是,为何如何?
36、给出一个不符合高斯分布与不符合对数正态分布的数据案例。给出一个分布非常混乱的数案例。
37、为什么说均方误差不是一个衡量模型的好指标?你建议用哪个指标替代?
38、你如何证明你带来的算法改进是真的有效的与不做任何改变相比?你对A/B测试熟吗?
39、什么是敏感性分析?拥有更低的敏感性(也就是说更好的强壮性)和低的预测能力还是正好相反好?你如何使用交叉验证?你对于在数据集中插入噪声数据从而来检验模型的敏感性的想法如何看?
40、对于一下逻辑回归、决策树、神经网络。在过去15年中这些技术做了哪些大的改进?
41、除了主成分分析外你还使用其它数据降维技术吗?你怎么想逐步回归?你熟悉的逐步回归技术有哪些?什么时候完整的数据要比降维的数据或者样本好?
42、你如何建议一个非参数置信区间?
43、你熟悉极值理论、蒙特卡罗逻辑或者其它数理统计方法以正确的评估一个稀疏事件的发生概率?
44、什么是归因分析?如何识别归因与相关系数?举例。
45、如何定义与衡量一个指标的预测能力?
46、如何为欺诈检验得分技术发现最好的规则集?你如何处理规则冗余、规则发现和二者的本质问题?一个规则集的近似解决方案是否可行?如何寻找一个可行的近似方案?你如何决定这个解决方案足够好从而可以停止寻找另一个更好的?
47、如何创建一个关键字分类?
48、什么是僵尸网络?如何进行检测?
49、你有使用过API接口的经验吗?什么样的API?是谷歌还是亚马逊还是软件即时服务?
50、什么时候自己编号代码比使用数据科学者开发好的软件包更好?
51、可视化使用什么工具?在作图方面,你如何评价Tableau?R?SAS?在一个图中有效展现五个维度?
52、什么是概念验证?
53、你主要与什么样的客户共事:内部、外部、销售部门/财务部门/市场部门/IT部门的人?有咨询经验吗?与供应商打过交道,包括供应商选择与测试。
54、你熟悉软件生命周期吗?及IT项目的生命周期,从收入需求到项目维护?
55、什么是cron任务?
56、你是一个独身的编码人员?还是一个开发人员?或者是一个设计人员?
57、是假阳性好还是假阴性好?
58、你熟悉价格优化、价格弹性、存货管理、竞争智能吗?分别给案例。
59、Zillow’s算法是如何工作的?
60、如何检验为了不好的目的还进行的虚假评论或者虚假的FB帐户?
61、你如何创建一个新的匿名数字帐户?
62、你有没有想过自己创业?是什么样的想法?
63、你认为帐号与密码输入的登录框会消失吗?它将会被什么替代?
64、你用过时间序列模型吗?时滞的相关性?相关图?光谱分析?信号处理与过滤技术?在什么样的场景下?
65、哪位数据科学有你最佩服?从哪开始?
66、你是怎么开始对数据科学感兴趣的?
67、什么是效率曲线?他们的缺陷是什么,你如何克服这些缺陷?
68、什么是推荐引擎?它是如何工作的?
69、什么是精密测试?如何及什么时候模拟可以帮忙我们不使用精密测试?
70、你认为怎么才能成为一个好的数据科学家?
71、你认为数据科学家是一个艺术家还是科学家?
72、什么是一个好的、快速的聚类算法的的计算复杂度?什么好的聚类算法?你怎么决定一个聚类的聚数?
73、给出一些在数据科学中“最佳实践的案例”。
74、什么让一个图形使人产生误解、很难去读懂或者解释?一个有用的图形的特征?
75、你知道使用在统计或者计算科学中的“经验法则”吗?或者在商业分析中。
76、你觉得下一个20年最好的5个预测方法是?
77、你怎么马上就知道在一篇文章中(比如报纸)发表的统计数字是错误,或者是用作支撑作者的论点,而不是仅仅在罗列某个事物的信息?例如,对于每月官方定期在媒体公开发布的失业统计数据,你有什么感想?怎样可以让这些数据更加准确??数据科学家面试常见的77个问题

[转] select count(*)的思考

select count(*)的思考

原文:MYSQL性能调优与架构设计

 

举例:

这里我们就拿一个看上去很简单的功能来分析一下。

需求:一个论坛帖子总量的统计

附加要求:实时更新

 

在很多人看来,这个功能非常容易实现,不就是执行一条SELECT COUNT(*)的Query 就可以得到结果
了么?是的,确实只需要如此简单的一个Query 就可以得到结果。但是,如果我们采用不是MyISAM 存储
引擎,而是使用的Innodb 的存储引擎,那么大家可以试想一下,如果存放帖子的表中已经有上千万的帖
子的时候,执行这条Query 语句需要多少成本?恐怕再好的硬件设备,恐怕都不可能在10 秒之内完成一

次查询吧。如果我们的访问量再大一点,还有人觉得这是一件简单的事情么?

 

既然这样查询不行,那我们是不是该专门为这个功能建一个表,就只有一个字段,一条记录,就存
放这个统计量,每次有新的帖子产生的时候,都将这个值增加1,这样我们每次都只需要查询这个表就可
以得到结果了,这个效率肯定能够满足要求了。确实,查询效率肯定能够满足要求,可是如果我们的系
统帖子产生很快,在高峰时期可能每秒就有几十甚至上百个帖子新增操作的时候,恐怕这个统计表又要
成为大家的噩梦了。要么因为并发的问题造成统计结果的不准确,要么因为锁资源争用严重造成整体性

能的大幅度下降。

 

其实这里问题的焦点不应该是实现这个功能的技术细节,而是在于这个功能的附加要求“实时更
新”上面。当一个论坛的帖子数量很大了之后,到底有多少人会关注这个统计数据是否是实时变化的?
有多少人在乎这个数据在短时间内的不精确性?我想恐怕不会有人会傻傻的盯着这个统计数字并追究当
自己发了一个帖子然后回头刷新页面发现这个统计数字没有加1 吧?即使明明白白的告诉用户这个统计

数据是每过多长时间段更新一次,那有怎样?难道会有很多用户就此很不爽么?

 

只要去掉了这个“实时更新”的附加条件,我们就可以非常容易的实现这个功能了。就像之前所提
到的那样,通过创建一个统计表,然后通过一个定时任务每隔一定时间段去更新一次里面的统计值,这

样既可以解决统计值查询的效率问题,又可以保证不影响新发贴的效率,一举两得。

 

实际上,在我们应用的系统中还有很多很多类似的功能点可以优化。如某些场合的列表页面参与列

表的数据量达到一个数量级之后,完全可以不用准确的显示这个列表总共有多少条信息,总共分了多少页,
而只需要一个大概的估计值或者一个时间段之前的统计值。这样就省略了我们的分页程序需要在分

以前实时COUNT 出满足条件的记录数。

 

其实,在很多应用系统中,实时和准实时,精确与基本准确,在很多地方所带来的性能消耗可能是
几个性能的差别。在系统性能优化中,应该尽量分析出那些可以不实时和不完全精确的地方,作出一些
相应的调整,可能会给大家带来意想不到的巨大性能提升。

R数据处理 – 自定义方法

需求:v<-c(1,2,3,4,5,5,5,5),得到打分为5的数字。

#1. 基本操作法

(v[v==5])

 

#2. 通过function封装后,Filter调用

isGoodNumber<-function(x){
if (x==5) return(TRUE)
else return(FALSE)
}

(Filter(isGoodNumber,v))

 

#3.通过function封装后,mapply调用

(v[mapply(isGoodNumber,v)])

 

#4.  通过function封装后,Vectorize变换function,再调用

(v[Vectorize(isGoodNumber)(v)])

常用连续型分布介绍及R语言实现

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-density/

r-density

前言

随机变量在我们的生活中处处可见,如每日天气,股价涨跌,彩票中奖等,这些事情都是事前不可预言其结果的,就算在相同的条件下重复进行试验,其结果未必相同。数学家们总结了这种规律,用概率分布来描述随机变量取值。

就算股价不能预测,但如果我们知道它的概率分布,那么有90%的可能我们可以猜出答案。

目录

  1. 正态分布
  2. 指数分步
  3. γ(伽玛)分布
  4. weibull分布
  5. F分布
  6. T分布
  7. β(贝塔)分布
  8. χ²(卡方)分布
  9. 均匀分布

1. 正态分布

正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。

若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。因其曲线呈钟形,因此人们又经常称之为钟形曲线。我们通常所说的标准正态分布是μ = 0,σ = 1的正态分布。

1). 概率密度函数

norm-distribution


set.seed(1)
x <- seq(-5,5,length.out=100)
y <- dnorm(x,0,1)
  
plot(x,y,col="red",xlim=c(-5,5),ylim=c(0,1),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Normal Density Distribution")

lines(x,dnorm(x,0,0.5),col="green")
lines(x,dnorm(x,0,2),col="blue")
lines(x,dnorm(x,-2,1),col="orange")

legend("topright",legend=paste("m=",c(0,0,0,-2)," sd=", c(1,0.5,2,1)), lwd=1, col=c("red", "green","blue","orange"))

norm

2). 累积分布函数

norm-distribution-cum


set.seed(1)
x <- seq(-5,5,length.out=100)
y <- pnorm(x,0,1)

plot(x,y,col="red",xlim=c(-5,5),ylim=c(0,1),type='l',
     xaxs="i", yaxs="i",ylab='density',xlab='',
     main="The Normal Cumulative Distribution")

lines(x,pnorm(x,0,0.5),col="green")
lines(x,pnorm(x,0,2),col="blue")
lines(x,pnorm(x,-2,1),col="orange")

legend("bottomright",legend=paste("m=",c(0,0,0,-2)," sd=", c(1,0.5,2,1)), lwd=1,col=c("red", "green","blue","orange"))

norm2

3). 分布检验

Shapiro-Wilk正态分布检验: 用来检验是否数据符合正态分布,类似于线性回归的方法一样,是检验其于回归曲线的残差。该方法推荐在样本量很小的时候使用,样本在3到5000之间。

该检验原假设为H0:数据集符合正态分布,统计量W为:

shapiro-wilk-test

  • 统计量W 最大值是1,越接近1,表示样本与正态分布匹配
  • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
  • R语言程序

    
    > set.seed(1)
    > S<-rnorm(1000)
    > shapiro.test(S)
    	Shapiro-Wilk normality test
    data:  S
    W = 0.9988, p-value = 0.7256
    

    结论: W接近1,p-value>0.05,不能拒绝原假设,所以数据集S符合正态分布!

    Kolmogorov-Smirnov连续分布检验:检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

    该检验原假设为H0:数据集符合正态分布,H1:样本所来自的总体分布不符合正态分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

    统计量D为: D=max|F0(x) - Fn(x)|

    • D值越小,越接近0,表示样本数据越接近正态分布
    • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
    
    > set.seed(1)
    > S<-rnorm(1000)
    > ks.test(S, "pnorm")
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.0211, p-value = 0.7673
    alternative hypothesis: two-sided
    

    结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合正态分布!

    2. 指数分布

    指数分布(Exponential distribution)用来表示独立随机事件发生的时间间隔,比如旅客进机场的时间间隔、中文维基百科新条目出现的时间间隔等等。

    许多电子产品的寿命分布一般服从指数分布。有的系统的寿命分布也可用指数分布来近似。它在可靠性研究中是最常用的一种分布形式。指数分布是伽玛分布和weibull分布的特殊情况,产品的失效是偶然失效时,其寿命服从指数分布。

    指数分布可以看作当weibull分布中的形状系数等于1的特殊分布,指数分布的失效率是与时间t无关的常数,所以分布函数简单。

    1). 概率密度函数

    Exponential-distribution

    其中λ > 0是分布的一个参数,常被称为率参数(rate parameter)。即每单位时间发生该事件的次数。指数分布的区间是[0,∞)。 如果一个随机变量X 呈指数分布,则可以写作:X ~ Exponential(λ)。

    
    set.seed(1)
    x<-seq(-1,2,length.out=100)
    y<-dexp(x,0.5)
    
    plot(x,y,col="red",xlim=c(0,2),ylim=c(0,5),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Exponential Density Distribution")
    lines(x,dexp(x,1),col="green")
    lines(x,dexp(x,2),col="blue")
    lines(x,dexp(x,5),col="orange")
    
    legend("topright",legend=paste("rate=",c(.5, 1, 2,5)), lwd=1,col=c("red", "green","blue","orange"))
    

    exp

    2). 累积分布函数

    Exponential-distribution-cum

    
    set.seed(1)
    x<-seq(-1,2,length.out=100)
    y<-pexp(x,0.5)
    
    plot(x,y,col="red",xlim=c(0,2),ylim=c(0,1),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Exponential Cumulative Distribution Function")
    lines(x,pexp(x,1),col="green")
    lines(x,pexp(x,2),col="blue")
    lines(x,pexp(x,5),col="orange")
    
    legend("bottomright",legend=paste("rate=",c(.5, 1, 2,5)), lwd=1, col=c("red", "green","blue","orange"))
    

    exp2

    3). 分布检验

    Kolmogorov-Smirnov连续分布检验:检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

    该检验原假设为H0:数据集符合指数分布,H1:样本所来自的总体分布不符合指数分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

    统计量D为: D=max|F0(x) - Fn(x)|

    • D值越小,越接近0,表示样本数据越接近指数分布
    • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
    
    > set.seed(1)
    > S<-rexp(1000)
    > ks.test(S, "pexp")
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.0387, p-value = 0.1001
    alternative hypothesis: two-sided
    

    结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合指数分布!

    3. γ(伽玛)分布

    伽玛分布(Gamma)是著名的皮尔逊概率分布函数簇中的重要一员,称为皮尔逊Ⅲ型分布。它的曲线有一个峰,但左右不对称。

    伽玛分布中的参数α,称为形状参数,β称为尺度参数。

    gamma0

    伽玛函数为:

    gamma-fo

    伽玛函数是阶乘在实数上的泛化。

    1). 概率密度函数

    gamma

    
    set.seed(1)
    x<-seq(0,10,length.out=100)
    y<-dgamma(x,1,2)
    
    plot(x,y,col="red",xlim=c(0,10),ylim=c(0,2),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Gamma Density Distribution")
    
    lines(x,dgamma(x,2,2),col="green")
    lines(x,dgamma(x,3,2),col="blue")
    lines(x,dgamma(x,5,1),col="orange")
    lines(x,dgamma(x,9,1),col="black")
    
    legend("topright",legend=paste("shape=",c(1,2,3,5,9)," rate=", c(2,2,2,1,1)), lwd=1, col=c("red", "green","blue","orange","black"))
    

    gamma

    2). 累积分布函数

    gamma2

    
    set.seed(1)
    x<-seq(0,10,length.out=100)
    y<-pgamma(x,1,2)
    
    plot(x,y,col="red",xlim=c(0,10),ylim=c(0,1),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Gamma Cumulative Distribution Function")
    
    lines(x,pgamma(x,2,2),col="green")
    lines(x,pgamma(x,3,2),col="blue")
    lines(x,pgamma(x,5,1),col="orange")
    lines(x,pgamma(x,9,1),col="black")
    
    legend("bottomright",legend=paste("shape=",c(1,2,3,5,9)," rate=", c(2,2,2,1,1)), lwd=1, col=c("red", "green","blue","orange","black"))
    

    gamma2

    3). 分布检验

    Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

    该检验原假设为H0:数据集符合伽玛分布,H1:样本所来自的总体分布不符合伽玛分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

    统计量D为: D=max|F0(x) - Fn(x)|

    • D值越小,越接近0,表示样本数据越接近伽玛分布
    • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
    
    > set.seed(1)
    > S<-rgamma(1000,1)
    > ks.test(S, "pgamma", 1)
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.0363, p-value = 0.1438
    alternative hypothesis: two-sided
    

    结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合shape=1伽玛分布!

    检验失败:

    
    > ks.test(S, "pgamma", 2)
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.3801, p-value < 2.2e-16
    alternative hypothesis: two-sided
    

    结论:D值不够小, p-value<0.05,拒绝原假设,所以数据集S符合shape=2伽玛分布!

    4. weibull分布

    weibull(韦伯)分布,又称韦氏分布或威布尔分布,是可靠性分析和寿命检验的理论基础。Weibull分布能被应用于很多形式,分布由形状、尺度(范围)和位置三个参数决定。其中形状参数是最重要的参数,决定分布密度曲线的基本形状,尺度参数起放大或缩小曲线的作用,但不影响分布的形状。

    Weibull分布通常用在故障分析领域( field of failure analysis)中;尤其是它可以模拟(mimic) 故障率(failture rate)持续( over time)变化的分布。故障率为:

    • 一直为常量(constant over time), 那么 α = 1, 暗示在随机事件中发生
    • 一直减少(decreases over time),那么α < 1, 暗示"早期失效(infant mortality)"
    • 一直增加(increases over time),那么α > 1, 暗示"耗尽(wear out)" - 随着时间的推进,失败的可能性变大

    1). 概率密度函数

    weibull

    
    set.seed(1)
    x<- seq(0, 2.5, length.out=1000)
    y<- dweibull(x, 0.5)
    
    plot(x, y, type="l", col="blue",xlim=c(0, 2.5),ylim=c(0, 6),
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Weibull Density Distribution")
    
    lines(x, dweibull(x, 1), type="l", col="red")
    lines(x, dweibull(x, 1.5), type="l", col="magenta")
    lines(x, dweibull(x, 5), type="l", col="green")
    lines(x, dweibull(x, 15), type="l", col="purple")
    legend("topright", legend=paste("shape =", c(.5, 1, 1.5, 5, 15)), lwd=1,col=c("blue", "red", "magenta", "green","purple"))
    

    weibull

    2). 累积分布函数

    weibull2

    
    set.seed(1)
    x<- seq(0, 2.5, length.out=1000)
    y<- pweibull(x, 0.5)
    
    plot(x, y, type="l", col="blue",xlim=c(0, 2.5),ylim=c(0, 1.2),
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Weibull Cumulative Distribution Function")
    
    lines(x, pweibull(x, 1), type="l", col="red")
    lines(x, pweibull(x, 1.5), type="l", col="magenta")
    lines(x, pweibull(x, 5), type="l", col="green")
    lines(x, pweibull(x, 15), type="l", col="purple")
    legend("bottomright", legend=paste("shape =", c(.5, 1, 1.5, 5, 15)), lwd=1, col=c("blue", "red", "magenta", "green","purple"))
    

    weibull2

    3). 分布检验

    Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

    该检验原假设为H0:数据集符合weibull分布,H1:样本所来自的总体分布不符合weibull分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

    统计量D为: D=max|F0(x) - Fn(x)|

    • D值越小,越接近0,表示样本数据越接近weibull分布
    • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
    
    > set.seed(1)
    > S<-rweibull(1000,1)
    > ks.test(S, "pweibull",1)
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.0244, p-value = 0.5928
    alternative hypothesis: two-sided
    

    结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合shape=1的weibull分布!

    5. F分布

    F-分布(F-distribution)是一种连续概率分布,被广泛应用于似然比率检验,特别是ANOVA中。F分布定义为:设X、Y为两个独立的随机变量,X服从自由度为k1的卡方分布,Y服从自由度为k2的卡方分布,这2 个独立的卡方分布被各自的自由度除以后的比率这一统计量的分布。即: 上式F服从第一自由度为k1,第二自由度为k2的F分布。

    F分布的性质

    • 它是一种非对称分布
    • 它有两个自由度,即n1 -1和n2-1,相应的分布记为F( n1 –1, n2-1), n1 –1通常称为分子自由度, n2-1通常称为分母自由度
    • F分布是一个以自由度n1 –1和n2-1为参数的分布族,不同的自由度决定了F 分布的形状
    • F分布的倒数性质:Fα,df1,df2=1/F1-α,df1,df2[1]

    1). 概率密度函数

    f

    B是Beta函数(beta function)

    
    set.seed(1)
    x<-seq(0,5,length.out=1000)
    y<-df(x,1,1,0)
    
    plot(x,y,col="red",xlim=c(0,5),ylim=c(0,1),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The F Density Distribution")
    
    lines(x,df(x,1,1,2),col="green")
    lines(x,df(x,2,2,2),col="blue")
    lines(x,df(x,2,4,4),col="orange")
    
    legend("topright",legend=paste("df1=",c(1,1,2,2),"df2=",c(1,1,2,4)," ncp=", c(0,2,2,4)), lwd=1, col=c("red", "green","blue","orange"))
    

    f

    2). 累积分布函数

    f2

    I是不完全Beta函数

    
    set.seed(1)
    x<-seq(0,5,length.out=1000)
    y<-df(x,1,1,0)
    
    plot(x,y,col="red",xlim=c(0,5),ylim=c(0,1),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The F Cumulative Distribution Function")
    
    lines(x,pf(x,1,1,2),col="green")
    lines(x,pf(x,2,2,2),col="blue")
    lines(x,pf(x,2,4,4),col="orange")
    
    legend("topright",legend=paste("df1=",c(1,1,2,2),"df2=",c(1,1,2,4)," ncp=", c(0,2,2,4)), lwd=1, col=c("red", "green","blue","orange"))
    

    f2

    3). 分布检验

    Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

    该检验原假设为H0:数据集符合F分布,H1:样本所来自的总体分布不符合F分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

    统计量D为: D=max|F0(x) - Fn(x)|

    • D值越小,越接近0,表示样本数据越接近F分布
    • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
    
    > set.seed(1)
    > S<-rf(1000,1,1,2)
    > ks.test(S, "pf", 1,1,2)
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.0113, p-value = 0.9996
    alternative hypothesis: two-sided
    

    结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合df1=1, df2=1, ncp=2的F分布!

    6. T分布

    学生t-分布(Student's t-distribution),可简称为t分布。应用在估计呈正态分布的母群体之平均数。它是对两个样本均值差异进行显著性测试的学生t检定的基础。学生t检定改进了Z检定(Z-test),因为Z检定以母体标准差已知为前提。虽然在样本数量大(超过30个)时,可以应用Z检定来求得近似值,但Z检定用在小样本会产生很大的误差,因此必须改用学生t检定以求准确。

    在母体标准差未知的情况下,不论样本数量大或小皆可应用学生t检定。在待比较的数据有三组以上时,因为误差无法压低,此时可以用变异数分析(ANOVA)代替学生t检定。

    1). 概率密度函数

    t

    v 等于n − 1。 T的分布称为t-分布。参数\nu 一般被称为自由度。
    γ 是伽玛函数。

    
    set.seed(1)
    x<-seq(-5,5,length.out=1000)
    y<-dt(x,1,0)
    
    plot(x,y,col="red",xlim=c(-5,5),ylim=c(0,0.5),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The T Density Distribution")
    
    lines(x,dt(x,5,0),col="green")
    lines(x,dt(x,5,2),col="blue")
    lines(x,dt(x,50,4),col="orange")
    
    legend("topleft",legend=paste("df=",c(1,5,5,50)," ncp=", c(0,0,2,4)), lwd=1, col=c("red", "green","blue","orange"))
    

    t

    2). 累积分布函数

    t2

    v 等于n − 1。 T的分布称为t-分布。参数\nu 一般被称为自由度。
    γ 是伽玛函数。

    
    set.seed(1)
    x<-seq(-5,5,length.out=1000)
    y<-pt(x,1,0)
    
    plot(x,y,col="red",xlim=c(-5,5),ylim=c(0,0.5),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The T Cumulative Distribution Function")
    
    lines(x,pt(x,5,0),col="green")
    lines(x,pt(x,5,2),col="blue")
    lines(x,pt(x,50,4),col="orange")
    
    legend("topleft",legend=paste("df=",c(1,5,5,50)," ncp=", c(0,0,2,4)), lwd=1, col=c("red", "green","blue","orange"))
    

    t2

    3). 分布检验

    Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

    该检验原假设为H0:数据集符合T分布,H1:样本所来自的总体分布不符合T分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

    统计量D为: D=max|F0(x) - Fn(x)|

    • D值越小,越接近0,表示样本数据越接近T分布
    • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
    
    > set.seed(1)
    > S<-rt(1000, 1,2)
    > ks.test(S, "pt", 1, 2)
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.0253, p-value = 0.5461
    alternative hypothesis: two-sided
    

    结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合df1=1, ncp=2的T分布!

    7. β(贝塔Beta)分布

    贝塔分布(Beta Distribution)是指一组定义在(0,1)区间的连续概率分布,Beta分布有α和β两个参数α,β>0,其中α为成功次数加1,β为失败次数加1。

    Beta分布的一个重要应该是作为伯努利分布和二项式分布的共轭先验分布出现,在机器学习和数理统计学中有重要应用。贝塔分布中的参数可以理解为伪计数,伯努利分布的似然函数可以表示为,表示一次事件发生的概率,它为贝塔有相同的形式,因此可以用贝塔分布作为其先验分布。

    1). 概率密度函数

    beta

    随机变量X服从参数为a, β,服从Beta分布
    γ 是伽玛函数

    
    set.seed(1)
    x<-seq(-5,5,length.out=10000)
    y<-dbeta(x,0.5,0.5)
      
    plot(x,y,col="red",xlim=c(0,1),ylim=c(0,6),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Beta Density Distribution")
    
    lines(x,dbeta(x,5,1),col="green")
    lines(x,dbeta(x,1,3),col="blue")
    lines(x,dbeta(x,2,2),col="orange")
    lines(x,dbeta(x,2,5),col="black")
    
    legend("top",legend=paste("a=",c(.5,5,1,2,2)," b=", c(.5,1,3,2,5)), lwd=1,col=c("red", "green","blue","orange","black"))
    

    beta

    2). 累积分布函数

    beta2

    I是正则不完全Beta函数

    
    set.seed(1)
    x<-seq(-5,5,length.out=10000)
    y<-pbeta(x,0.5,0.5)
    
    plot(x,y,col="red",xlim=c(0,1),ylim=c(0,1),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Beta Cumulative Distribution Function")
    
    lines(x,pbeta(x,5,1),col="green")
    lines(x,pbeta(x,1,3),col="blue")
    lines(x,pbeta(x,2,2),col="orange")
    lines(x,pbeta(x,2,5),col="black")
    
    legend("topleft",legend=paste("a=",c(.5,5,1,2,2)," b=", c(.5,1,3,2,5)), lwd=1,col=c("red", "green","blue","orange","black"))
    

    beta2

    3). 分布检验

    Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

    该检验原假设为H0:数据集符合Beta分布,H1:样本所来自的总体分布不符合Beta分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

    统计量D为: D=max|F0(x) - Fn(x)|

    • D值越小,越接近0,表示样本数据越接近Beta分布
    • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
    
    > set.seed(1)
    > S<-rbeta(1000,1,2)
    > ks.test(S, "pbeta",1,2)
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.0202, p-value = 0.807
    alternative hypothesis: two-sided
    

    结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合shape1=1, shape2=2的Beta分布!

    8. χ²(卡方)分布

    若n个相互独立的随机变量ξ₁、ξ₂、……、ξn ,均服从标准正态分布(也称独立同分布于标准正态分布),则这n个服从标准正态分布的随机变量的平方和构成一新的随机变量,其分布规律称为χ²分布(chi-square distribution)。其中参数n称为自由度,自由度不同就是另一个χ²分布,正如正态分布中均值或方差不同就是另一个正态分布一样。

    1). 概率密度函数

    chi-square

    γ 是伽玛函数

    
    set.seed(1)
    x<-seq(0,10,length.out=1000)
    y<-dchisq(x,1)
    
    plot(x,y,col="red",xlim=c(0,5),ylim=c(0,2),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Chisq Density Distribution")
    
    lines(x,dchisq(x,2),col="green")
    lines(x,dchisq(x,3),col="blue")
    lines(x,dchisq(x,10),col="orange")
    
    legend("topright",legend=paste("df=",c(1,2,3,10)), lwd=1, col=c("red", "green","blue","orange"))
    

    x2

    2). 累积分布函数

    chi-square2

    γ 是伽玛函数

    
    set.seed(1)
    x<-seq(0,10,length.out=1000)
    y<-pchisq(x,1)
    
    plot(x,y,col="red",xlim=c(0,10),ylim=c(0,1),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Chisq Cumulative Distribution Function")
    
    lines(x,pchisq(x,2),col="green")
    lines(x,pchisq(x,3),col="blue")
    lines(x,pchisq(x,10),col="orange")
    
    legend("topleft",legend=paste("df=",c(1,2,3,10)), lwd=1, col=c("red", "green","blue","orange"))
    

    x22

    3). 分布检验

    Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

    该检验原假设为H0:数据集符合卡方分布,H1:样本所来自的总体分布不符合卡方分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

    统计量D为: D=max|F0(x) - Fn(x)|

    • D值越小,越接近0,表示样本数据越接近卡方分布
    • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
    
    > set.seed(1)
    > S<-rchisq(1000,1)
    > ks.test(S, "pchisq",1)
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.0254, p-value = 0.5385
    alternative hypothesis: two-sided
    

    结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合df=1的卡方分布!

    9. 均匀分布

    均匀分布(Uniform distribution)是均匀的,不偏差的一种简单的概率分布,分为:离散型均匀分布与连续型均匀分布。

    1). 概率密度函数

    uniform

    
    set.seed(1)
    x<-seq(0,10,length.out=1000)
    y<-dunif(x,0,1)
    
    plot(x,y,col="red",xlim=c(0,10),ylim=c(0,1.2),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Uniform Density Distribution")
    lines(x,dnorm(x,0,0.5),col="green")
    lines(x,dnorm(x,0,2),col="blue")
    lines(x,dnorm(x,-2,1),col="orange")
    lines(x,dnorm(x,4,2),col="purple")
    
    legend("topright",legend=paste("m=",c(0,0,0,-2,4)," sd=", c(1,0.5,2,1,2)), lwd=1, col=c("red", "green","blue","orange","purple"))
    

    unif

    2). 累积分布函数

    uniform2

    
    set.seed(1)
    x<-seq(0,10,length.out=1000)
    y<-punif(x,0,1)
    
    plot(x,y,col="red",xlim=c(0,10),ylim=c(0,1.2),type='l',
         xaxs="i", yaxs="i",ylab='density',xlab='',
         main="The Uniform Cumulative Distribution Function")
    
    lines(x,punif(x,0,0.5),col="green")
    lines(x,punif(x,0,2),col="blue")
    lines(x,punif(x,-2,1),col="orange")
    
    legend("bottomright",legend=paste("m=",c(0,0,0,-2)," sd=", c(1,0.5,2,1)), lwd=1, col=c("red", "green","blue","orange","purple"))
    

    unif2

    3). 分布检验

    Kolmogorov-Smirnov连续分布检验: 检验单一样本是不是服从某一预先假设的特定分布的方法。以样本数据的累计频数分布与特定理论分布比较,若两者间的差距很小,则推论该样本取自某特定分布族。

    该检验原假设为H0:数据集符合均匀分布,H1:样本所来自的总体分布不符合均匀分布。令F0(x)表示预先假设的理论分布,Fn(x)表示随机样本的累计概率(频率)函数.

    统计量D为: D=max|F0(x) - Fn(x)|

    • D值越小,越接近0,表示样本数据越接近均匀分布
    • p值,如果p-value小于显著性水平α(0.05),则拒绝H0
    
    > set.seed(1)
    > S<-runif(1000)
    > ks.test(S, "punif")
    	One-sample Kolmogorov-Smirnov test
    data:  S
    D = 0.0244, p-value = 0.5928
    alternative hypothesis: two-sided
    

    结论: D值很小, p-value>0.05,不能拒绝原假设,所以数据集S符合均匀分布!

    在我们掌握了,这几种常用的连续型分布后,我们就可以基于这些分布来建模了,很多的算法模型就能解释通了!!

    参考资料

    转载请注明出处:
    http://blog.fens.me/r-density/

    打赏作者