QQ-plot深入理解与实现

26JUN
June 26, 2013

最近在看关于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
= unifrnd(0,1,1,100)';
%生成100个再[0,1]均匀分布的随机数
figure
subplot(3,1,1);
hist(data,10);%bins=10
xlabel('x');
ylabel('Frequency');
subplot(3,1,2);
hist(data,5);%bins=5
xlabel('x');
ylabel('Frequency');
subplot(3,1,3);
hist(data,3);%bins=3
xlabel('x');
ylabel('Frequency');
theory_y=data;
figure
[F,X]=ecdf(data);%ECDF
plot(X,F,'-k','LineWidth',3);
hold
on;
plot(data,theory_y,'-b','LineWidth',3);
legend('Empirical
CDF'
,'Theoretical
CDF'
,2);
hold
on;
%------两曲线之间填充颜色-------
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个子区间的中间值,也就是

Eq=q−0.5nEq=q−0.5n

现在我们可以理解Quantile-Quantile(q-q) Plot了,第1个Q是Data Sample的分位即 x1,x2,...,xnx1,x2,...,xn ;第2个Q便是期望 EqEq 。因此QQ-plot其实就是n个点的集合

(q−0.5n,xq),�forq=1,2,...,n(q−0.5n,xq),�forq=1,2,...,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 

q
th 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
size n = 5'
);
subplot(2,2,2);
gqqplot(B,'unif');
title('Sample
size n = 50'
);
subplot(2,2,3);
gqqplot(C,'unif');
title('Sample
size n = 500'
);
subplot(2,2,4);
gqqplot(D,'unif');
title('Sample
size n = 1000'
);

QQ-plot for 正态分布:

这个就简单了,跟上面是一样的道理。我们取Z为标准的正态分布, μ=0,σ=1μ=0,σ=1 。现将n个数据进行排序,再做出相应的QQ-plot点的集合

(Φ−1(q−0.5n),xq),�forq=1,2,...,n(Φ−1(q−0.5n),xq),�forq=1,2,...,n

同样我们给出了表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

q
th 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
size n = 5'
);
subplot(2,2,2);
gqqplot(F,'norm');
title('Sample
size n = 50'
);
subplot(2,2,3);
gqqplot(G,'norm');
title('Sample
size n = 500'
);
subplot(2,2,4);
gqqplot(H,'norm');
title('Sample
size n = 1000'
);

好吧,到此为止,讲的差不多了,其实不难的。最后我们再来看一遍维基百科上对QQ-plot的定义:

“在统计学中,QQ-plot(Q代表分位数Quantile)是一种通过画出分位数来比较两个概率分布的图形方法。首先选定区间长度,点(x,y)对应于第一个分布(x轴)的分位数和第二个分布(y轴)相同的分位数。因此画出的是一条含参数的曲线,参数为区间个数。如果被比较的两个分布比较相似,则其QQ图近似地位于y=x上。如果两个分布线性相关,则QQ图上的点近似地落在一条直线上,但并不一定是y=x这条线。QQ图同样可以用来估计一个分布的位置参数。”

Sigh!应该理解了... 关于gqqplot函数的使用,请参考 http://ackjack.com/?p=56

Posted
by sinknode
  Math
& Matlab
  matlabQQ-plot
 1
Comment

【机器学习】QQ-plot深入理解与实现的更多相关文章

  1. GWAS: 曼哈顿图,QQ plot 图,膨胀系数( manhattan、Genomic Inflation Factor)

    画曼哈顿图和QQ plot 首推R包“qqman”,简约方便.下面具体介绍以下. 一.画曼哈顿图 install.packages("qqman") library(qqman) ...

  2. 机器学习(四):通俗理解支持向量机SVM及代码实践

    上一篇文章我们介绍了使用逻辑回归来处理分类问题,本文我们讲一个更强大的分类模型.本文依旧侧重代码实践,你会发现我们解决问题的手段越来越丰富,问题处理起来越来越简单. 支持向量机(Support Vec ...

  3. Python机器学习笔记:深入理解Keras中序贯模型和函数模型

     先从sklearn说起吧,如果学习了sklearn的话,那么学习Keras相对来说比较容易.为什么这样说呢? 我们首先比较一下sklearn的机器学习大致使用流程和Keras的大致使用流程: skl ...

  4. 机器学习入门 一、理解机器学习+简单感知机(JAVA实现)

    首先先来讲讲闲话 如果让你现在去搞机器学习,你会去吗?不会的话是因为你对这方面不感兴趣,还是因为你觉得这东西太难了,自己肯定学不来?如果你觉的太难了,很好,相信看完这篇文章,你就会有胆量踏入机器学习这 ...

  5. 菜鸟之路——机器学习之决策树个人理解及Python实现

    最近开始学习机器学习,以下会记录我学习中遇到的问题以及我个人的理解 决策树算法,网上很多介绍,在这不复制粘贴.下面解释几个关键词就好. 信息熵(entropy):就是信息不确定性的多少 H(x)=-Σ ...

  6. 100天搞定机器学习|day37 无公式理解反向传播算法之精髓

     100天搞定机器学习(Day1-34) 100天搞定机器学习|Day35 深度学习之神经网络的结构 100天搞定机器学习|Day36 深度学习之梯度下降算法 本篇为100天搞定机器学习之第37天,亦 ...

  7. ViewPager+Fragment的结合使用,实现QQ界面的理解

    http://www.cssxt.com/html/2449/2449.html 效果如图: 实现代码解析:MainActivity.java1.引入布局文件2.4个标题控件的初始化以及点击事件的监听 ...

  8. 菜鸟之路——机器学习之非线性回归个人理解及python实现

    关键词: 梯度下降:就是让数据顺着梯度最大的方向,也就是函数导数最大的放下下降,使其快速的接近结果. Cost函数等公式太长,不在这打了.网上多得是. 这个非线性回归说白了就是缩小版的神经网络. py ...

  9. 菜鸟之路——机器学习之线性回归个人理解及Python实现

    这一节很简单,都是高中讲过的东西 简单线性回归:y=b0+b1x+ε.b1=(Σ(xi-x–)(yi-y–))/Σ(xi-x–)ˆ2       b0=y--b1x-    其中ε取 为均值为0的正态 ...

随机推荐

  1. 置换的玩笑——DFS&&暴力

    题目 链接 题意:一个$1$到$n$的序列被去掉空格,需要将其还原.例如$4111109876532$可还原成$4 \ 1 \  11 \  10 \  9 \  8 \  7 \  6 \  5 \ ...

  2. Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) D. Sequence Sorting

    链接: https://codeforces.com/contest/1241/problem/D 题意: You are given a sequence a1,a2,-,an, consistin ...

  3. Vue event.stopPropagation()和event.preventDefault()的使用

    定义和用法 1. event.stopPropagation()方法 阻止事件冒泡到父元素,阻止任何父事件处理程序被执行,但是它的默认事件仍然会执行.当调用这个方法的时候,如果点击了一个链接(a标签) ...

  4. hdu 2510

    Tiling_easy version Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  5. 【转载】从头到尾彻底理解KMP

    转自:http://blog.csdn.net/v_july_v/article/details/7041827 从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月 ...

  6. Zookeeper系列(十一)zookeeper的Leader选举详解(核心之一)

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6107600.html尊重原创,奇文共欣赏: 一.前言 前 ...

  7. python 快速排序-代码示例

    def quick_sort(alist, first, last): if first >= last: # 如果开始等于结尾,即就一个元素 return mid_value = alist[ ...

  8. 预处理、const、static与sizeof-为什么不把所有的函数都定义成内联函数

    1:内联是以代码膨胀(复制)为代价的,仅仅省去了函数调用的开销,从而提高函数的执行效率.如果执行函数体内代码的时间相比于函数调用的开销较大,那么效率的收获会很小.另一方面,每一处内联函数的调用都要复制 ...

  9. jwt token and shiro

    openapi可以完全开放访问,也可以使用jwt token进行简单的认证,还可以使用shiro支持更细致的权限管理. handler.yml配置了security和shiro两个handler: s ...

  10. POJ3009-Curling 2.0(WA)

    POJ3009-Curling 2.0 题意: 要求把一个冰壶从起点“2”用最少的步数移动到终点“3” 其中0为移动区域,1为石头区域,冰壶一旦想着某个方向运动就不会停止,也不会改变方向(想想冰壶在冰 ...