【机器学习】QQ-plot深入理解与实现
QQ-plot深入理解与实现
最近在看关于CSI(Channel State Information)相关的论文,发现论文中用到了QQ-plot。Sigh!我承认我是第一次见到这个名词,异常陌生。维基百科给出了如下定义:
“在统计学中,QQ-plot(Q代表分位数Quantile)是一种通过画出分位数来比较两个概率分布的图形方法。首先选定区间长度,点(x,y)对应于第一个分布(x轴)的分位数和第二个分布(y轴)相同的分位数。因此画出的是一条含参数的曲线,参数为区间个数。如果被比较的两个分布比较相似,则其QQ图近似地位于y=x上。如果两个分布线性相关,则QQ图上的点近似地落在一条直线上,但并不一定是y=x这条线。QQ图同样可以用来估计一个分布的位置参数。”
这段话刚开始看的时候,的确不是很清楚,难以理解。我也在网上找了一些资料,最有用的当属网上的一本在线电子书《Online Statistics
Education: An Interactive Multimedia Course of Study》,里面的Chanpter8专门有讲解QQ-plot。本文中主要借鉴了这门书中的内容,以更浅显易懂的语言来讲清楚QQ-plot,我学习的过程中也用Matlab做了一些试验,文中将代码一并附上。
QQ-plot其实是Quantile-Quantile Plot的缩写,Quantile分位现在理解没有关系,看到最后你就会理解它的意思了。QQ-plot的目的是什么呢?是为了验证两组数据的分布是否相同或者相似,因此在实际中很多情况都会用到。为了讲清楚QQ-plot,我们先来介绍另外两种以图形的方式评价数据分布情况的方法:直方图(histogram)和 经验累积分布函数(empirical cumulative distribution
function, eCDF)。
我们考虑一个随机变量X服从[0,1]区间内均匀分布,我们任取n个数据{ x1,x2...,xnx1,x2...,xn }。本例中n=100,直方图频率分布如图1所示。直方图的概率分布与bins的个数有关(bins为10,5,3)。不同的bins对应的图形也不同,图bins=10的时候还呈现锯齿状,但是bins=3的时候就趋于平稳,所以根据直方图来看累积分布不是很靠谱。随后,我们又使用eCDF对数据进行分析,如图2所示。黄色部分即为eCDF与理论CDF的误差,根据大数定理,当n取值越大,误差越小。

图1. 直方图统计

图2. eCDF vs 理论CDF
相关代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
data%生成100个再[0,1]均匀分布的随机数figuresubplot(3,1,1);hist(data,10);%bins=10xlabel('x');ylabel('Frequency');subplot(3,1,2);hist(data,5);%bins=5xlabel('x');ylabel('Frequency');subplot(3,1,3);hist(data,3);%bins=3xlabel('x');ylabel('Frequency');theory_y=data;figure[F,X]=ecdf(data);%ECDFplot(X,F,'-k','LineWidth',3);holdplot(data,theory_y,'-b','LineWidth',3);legend('Empirical,'Theoretical,2);hold%------两曲线之间填充颜色-------theory_y=sort(theory_y);theory_y=[theory_y(1);theory_y];%Note:100数据进行ECDF会产生101个数的ECDF坐标,因此为了填充颜色,这里更改theory_y的维数fill([X',fliplr(X')],[theory_y',fliplr(F')],'y');xlabel('x');ylabel('F(x)'); |
好了,到现在开始要说QQ-plot了。我们用如下两个例子来说明:QQ-plot for 平均分布 & QQ-plot for 正态分布。
QQ-plot for 平均分布:
Sample中有n个数据, x1,x2,...,xnx1,x2,...,xn 。我们首先对数据进行排序,使之满足 x1<x2<...<xnx1<x2<...<xn 。我们将x所在区间[0,1]进行n等分。即变为 [0,1n],(1n,2n],...,(n−1n,1][0,1n],(1n,2n],...,(n−1n,1]n个自区间。为了符合平均分布,我们期望第q个数据的值坐落在第q个子区间的中间值,也就是
现在我们可以理解Quantile-Quantile(q-q) Plot了,第1个Q是Data Sample的分位即 x1,x2,...,xnx1,x2,...,xn ;第2个Q便是期望 EqEq 。因此QQ-plot其实就是n个点的集合
因此在QQ-plot for平均分布中,当QQ点越接近y=x时,那么数据越接近平均分布。下面我们考虑表1中的5组数据,以及随机生成50个,500个,1000个数据的QQ-plot图,如图3所示。可以看出,当sample size越大,QQ-plot越接近y=x。
表1. Computing the Expected Quantile Values.
| Data (x) | Rank (q) |
Middle of the qth Interval |
|---|---|---|
|
0.03 0.24 0.41 0.59 0.67 |
1 2 3 4 5 |
0.1 0.3 0.5 0.7 0.9 |

图3. QQplot for uniform data
相关代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
A=[0.03,0.24,0.41,0.59,0.67];B=unifrnd(0,1,1,50);C=unifrnd(0,1,1,500);D=unifrnd(0,1,1,1000);subplot(2,2,1);gqqplot(A,'unif');title('Sample);subplot(2,2,2);gqqplot(B,'unif');title('Sample);subplot(2,2,3);gqqplot(C,'unif');title('Sample);subplot(2,2,4);gqqplot(D,'unif');title('Sample); |
QQ-plot for 正态分布:
这个就简单了,跟上面是一样的道理。我们取Z为标准的正态分布, μ=0,σ=1μ=0,σ=1 。现将n个数据进行排序,再做出相应的QQ-plot点的集合
同样我们给出了表2,5组正态分布的数据以及其相应的期望值。为了比较,我们也随机产生了n为50,500,1000的正态分布随机数进行QQ-plot,如图4所示。
表2. Computing the expected quantile values for normal data.
| Data (z) | Rank (q) |
Middle of the qth Interval |
Normal(q) |
|---|---|---|---|
|
-1.96 -.78 .31 1.15 1.62 |
1 2 3 4 5 |
0.1 0.3 0.5 0.7 0.9 |
-1.28 -0.52 0.00 0.52 1.28 |

图4. QQplot for normal data
代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
E=[-1.96,-0.78,0.31,1.15,1.62];F=randn(1,50);G=randn(1,500);H=randn(1,1000);subplot(2,2,1);gqqplot(E,'norm');title('Sample);subplot(2,2,2);gqqplot(F,'norm');title('Sample);subplot(2,2,3);gqqplot(G,'norm');title('Sample);subplot(2,2,4);gqqplot(H,'norm');title('Sample); |
好吧,到此为止,讲的差不多了,其实不难的。最后我们再来看一遍维基百科上对QQ-plot的定义:
“在统计学中,QQ-plot(Q代表分位数Quantile)是一种通过画出分位数来比较两个概率分布的图形方法。首先选定区间长度,点(x,y)对应于第一个分布(x轴)的分位数和第二个分布(y轴)相同的分位数。因此画出的是一条含参数的曲线,参数为区间个数。如果被比较的两个分布比较相似,则其QQ图近似地位于y=x上。如果两个分布线性相关,则QQ图上的点近似地落在一条直线上,但并不一定是y=x这条线。QQ图同样可以用来估计一个分布的位置参数。”
Sigh!应该理解了... 关于gqqplot函数的使用,请参考 http://ackjack.com/?p=56
【机器学习】QQ-plot深入理解与实现的更多相关文章
- GWAS: 曼哈顿图,QQ plot 图,膨胀系数( manhattan、Genomic Inflation Factor)
画曼哈顿图和QQ plot 首推R包“qqman”,简约方便.下面具体介绍以下. 一.画曼哈顿图 install.packages("qqman") library(qqman) ...
- 机器学习(四):通俗理解支持向量机SVM及代码实践
上一篇文章我们介绍了使用逻辑回归来处理分类问题,本文我们讲一个更强大的分类模型.本文依旧侧重代码实践,你会发现我们解决问题的手段越来越丰富,问题处理起来越来越简单. 支持向量机(Support Vec ...
- Python机器学习笔记:深入理解Keras中序贯模型和函数模型
先从sklearn说起吧,如果学习了sklearn的话,那么学习Keras相对来说比较容易.为什么这样说呢? 我们首先比较一下sklearn的机器学习大致使用流程和Keras的大致使用流程: skl ...
- 机器学习入门 一、理解机器学习+简单感知机(JAVA实现)
首先先来讲讲闲话 如果让你现在去搞机器学习,你会去吗?不会的话是因为你对这方面不感兴趣,还是因为你觉得这东西太难了,自己肯定学不来?如果你觉的太难了,很好,相信看完这篇文章,你就会有胆量踏入机器学习这 ...
- 菜鸟之路——机器学习之决策树个人理解及Python实现
最近开始学习机器学习,以下会记录我学习中遇到的问题以及我个人的理解 决策树算法,网上很多介绍,在这不复制粘贴.下面解释几个关键词就好. 信息熵(entropy):就是信息不确定性的多少 H(x)=-Σ ...
- 100天搞定机器学习|day37 无公式理解反向传播算法之精髓
100天搞定机器学习(Day1-34) 100天搞定机器学习|Day35 深度学习之神经网络的结构 100天搞定机器学习|Day36 深度学习之梯度下降算法 本篇为100天搞定机器学习之第37天,亦 ...
- ViewPager+Fragment的结合使用,实现QQ界面的理解
http://www.cssxt.com/html/2449/2449.html 效果如图: 实现代码解析:MainActivity.java1.引入布局文件2.4个标题控件的初始化以及点击事件的监听 ...
- 菜鸟之路——机器学习之非线性回归个人理解及python实现
关键词: 梯度下降:就是让数据顺着梯度最大的方向,也就是函数导数最大的放下下降,使其快速的接近结果. Cost函数等公式太长,不在这打了.网上多得是. 这个非线性回归说白了就是缩小版的神经网络. py ...
- 菜鸟之路——机器学习之线性回归个人理解及Python实现
这一节很简单,都是高中讲过的东西 简单线性回归:y=b0+b1x+ε.b1=(Σ(xi-x–)(yi-y–))/Σ(xi-x–)ˆ2 b0=y--b1x- 其中ε取 为均值为0的正态 ...
随机推荐
- elementUI 上传文件图片大小加了限制后 仍然上传了
https://blog.csdn.net/chanlingmai5374/article/details/80558444 看了这位老哥的说法 在看看文档 才发现自己没认真看文档 <el-u ...
- 关于topN问题的几种解决方案
在系统中,我们经常会遇到这样的需求:将大量(比如几十万.甚至上百万)的对象进行排序,然后只需要取出最Top的前N名作为排行榜的数据,这即是一个TopN算法.常见的解决方案有三种: (1)直接使用Lis ...
- Luogu P2532 [AHOI2012]树屋阶梯 卡特兰数
接着压位OvO... 我不会告诉你答案就是卡特兰数... 为什么呢? 首先,$ans[0]=1,ans[1]=1,ans[2]=2$ 对于$ans[3]$,我们可以发现他是这样来的: $ans[3]= ...
- Windows:获取本地时间
造冰箱的大熊猫@cnblogs 2019/6/4 #include <windows.h> int func() { SYSTEMTIME systime; GetLocalTime ( ...
- const 与指针 的用法
请找出下面程序中有哪些错误: 1 2 3 4 5 6 7 8 9 10 11 12 13 int main() { int i=10; int j=1; const int *p1; ...
- javascript数据结构之单链表
下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...
- Cannot find ./catalina.sh The file is absent or does not have execute permission This file is nee Linux上tomcat无法正常启动
上传了个tomcat7的压缩包上linux服务器,解压后,想直接启动,发现报错: Cannot find ./catalina.sh The file is absent or does not ha ...
- axios中出现两次请求,OPTIONS请求和GET请求
在项目中发现ajax中出现两次请求,OPTIONS请求和GET请求 查看到浏览器NetWork有两次请求,请求url一样: 查找原因是浏览器对简单跨域请求和复杂跨域请求的处理区别. XMLHttpRe ...
- 22.从上往下打印二叉树 Java
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 就是二叉树的层序遍历.借助一个队列就可以实现.使用两个队列一个存放节点,一个存放值.先将根节点加入到队列中,然后遍历队列中的 ...
- decimal模块 --数字的精度、保留小数位数、取整问题
开始之前需要注意一点是:精度值为数字的总位数,如:1.23, 精度值为3: 0.123,精度值也为3 1.更改默认精度值后,直接进行计算即可保留对应精度值 from decimal import ge ...