(erbqi)导语 QQ图全称 Quantile-Quantile图,也就是分位数-分位数图,简单理解就是把两个分布相同分位数的值,构成点(x,y)绘图;如果两个分布很接近,那个点(x,y)会分布在y=x直线附近;反之则不;可以通过QQ图从整体评估回归模型的预测效果
 

QQ图一般有两种,正态QQ图和普通QQ图,区别在于正态QQ图中其中有一个分布是正态分布,下面来看下这两种分布

正态QQ图

下图来自这里                                                  使用Filliben's estimate来确定n分点

下面我们尝试绘制正态QQ图

使用开源库自带函数,很简单,但是可能一些细节看不到

import numpy as np
from matplotlib import pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
# 用正态分布随机生死100个数据
x = np.round(np.random.normal(loc=0.0, scale=1.0, size=100),2)
from scipy.stats import probplot
f = plt.figure(figsize=(8, 6))
ax = f.add_subplot(111)
probplot(x, plot=ax)
plt.show()

下面展开一些细节,为下面我们的普通QQ做点铺垫

import sys,os
import pandas as pd
import numpy as np
from scipy.stats import norm,linregress
from matplotlib import pyplot as plt
# 返回长度为len(x)的order_statistic_medians
def calc_uniform_order_statistic_medians(x):
N = len(x)
osm_uniform = np.zeros(N, dtype=np.float64)
osm_uniform[-1] = 0.5**(1.0 / N)
osm_uniform[0] = 1 - osm_uniform[-1]
i = np.arange(2, N)
osm_uniform[1:-1] = (i - 0.3175) / (N + 0.365)
return osm_uniform
# 用正态分布随机生死100个数据
x = np.round(np.random.normal(loc=0.0, scale=1.0, size=100),2)
osm_uniform = calc_uniform_order_statistic_medians(x)
# ppf(Percent point function) 是 cdf(Cumulative distribution function) 的逆函数,就是取对应分位数对应的值
osm = norm.ppf(osm_uniform)
osr = np.sort(x)
# 计算osm和osr组合的样本的线性回归的 斜率 截距 等信息
slope, intercept, rvalue, pvalue, stderr = linregress(osm, osr) plt.figure(figsize=(10,8))
plt.plot(osm, osr, 'bo', osm, slope*osm + intercept, 'r-')
plt.legend()
plt.show()

左图是100个采样点,右图是1000个采样点,对比可以发现 ,1000个采样点的分布更接近直线y=x,也就是更拟合正态分布

普通QQ图和正态不同的地方在于参考系不是正态分布而可能是任意分布的数据集,这正是我们要用的

下图来自这里

下图是一个场景,虚线是真实的网络变化,实线是简单的平滑预测的结果,我希望通过普通QQ图看下简单的平滑预测的拟合效果

先看下两个曲线的cdf图( Fx(x)=P(X≤x) ),

这个图的累计分布点是np.linspace(min(X), max(X), len(X))计算来的,看起来有点怪

我们重新计算以原始数据为累计分布点的cdf图,发现有趣的地方了吗?

在两个曲线的数量一致的情况下,我们把两组数据从小到大排序之后,相同位置对应的cdf的值是一样的,

所以两个曲线的数量一致的情况下,QQ图只需要从小到大排序即可

可以看到,正式的网络曲线和平滑预测曲线的QQ图的斜率只有0.79,说明平滑预测的分布和源数据的分布差别还是挺大的。

最后是代码

httpspeedavg = np.array([1821000, 2264000, 2209000, 2203000, 2306000, 2005000, 2428000,
2246000, 1642000, 721000, 1125000, 1335000, 1367000, 1760000,
1807000, 1761000, 1767000, 1723000, 1883000, 1645000, 1548000,
1608000, 1372000, 1532000, 1485000, 1527000, 1618000, 1640000,
1199000, 1627000, 1620000, 1770000, 1741000, 1744000, 1986000,
1931000, 2410000, 2293000, 2199000, 1982000, 2036000, 2462000,
2246000, 2071000, 2220000, 2062000, 1741000, 1624000, 1872000,
1621000, 1426000, 1723000, 1735000, 1443000, 1735000, 2053000,
1811000, 1958000, 1828000, 1763000, 2185000, 2267000, 2134000,
2253000, 1719000, 1669000, 1973000, 1615000, 1839000, 1957000,
1809000, 1799000, 1706000, 1549000, 1546000, 1692000, 2335000,
2611000, 1855000, 2092000, 2029000, 1695000, 1379000, 2400000,
2522000, 2140000, 2614000, 2399000, 2376000]) def smooth_(squences,period=5):
res = []
gap = period/2
right = len(squences)
for i in range(right):
res.append(np.mean(squences[i-gap if i-gap > 0 else 0:i+gap if i+gap < right else right]))
return res httpavg = np.round((1.0*httpspeedavg/1024/1024).tolist(),2)
smooth = np.round(smooth_((1.0*httpspeedavg/1024/1024).tolist(),5),2) f = plt.figure(figsize=(8, 6))
ax = f.add_subplot(111)
probplot(smooth, plot=ax)
# plt.show() f = plt.figure(figsize=(8, 6))
ax = f.add_subplot(111)
probplot(httpavg, plot=ax)
# plt.show() import statsmodels.api as sm
plt.figure(figsize=(15,8))
ecdf = sm.distributions.ECDF(httpavg)
x = np.linspace(min(httpavg), max(httpavg), len(httpavg))
y = ecdf(x)
plt.plot(x, y, label='httpavg',color='blue',marker='.')
ecdf1 = sm.distributions.ECDF(smooth)
x1 = np.linspace(min(smooth), max(smooth), len(smooth))
y1 = ecdf1(x1)
plt.plot(x1, y1, label='smooth',color='red',marker='.')
plt.legend(loc='best')
# plt.show()
def cdf(l):
res = []
length = len(l)
for i in range(length):
res.append(1.0*(i+1)/length)
return res
plt.figure(figsize=(15,8))
x = np.sort(httpavg)
y = cdf(x)
plt.plot(x, y, label='httpavg',color='blue',marker='.')
x1 = np.sort(smooth)
y1 = cdf(x1)
plt.plot(x1, y1, label='smooth',color='red',marker='.')
plt.legend(loc='best')
# plt.show()
from scipy.stats import norm,linregress
plt.figure(figsize=(10,8))
httpavg = np.sort(httpavg)
smooth = np.sort(smooth)
slope, intercept, rvalue, pvalue, stderr = linregress(httpavg, smooth)
plt.plot(httpavg, smooth, 'bo', httpavg, slope*httpavg + intercept, 'r-')
xmin = np.amin(httpavg)
xmax = np.amax(httpavg)
ymin = np.amin(smooth)
ymax = np.amax(smooth)
posx = xmin + 0.50 * (xmax - xmin)
posy = ymin + 0.01 * (ymax - ymin)
plt.text(posx, posy, "$R^2=%1.4f$ y = %.2f *x + %.2f" % (rvalue,slope,intercept))
plt.plot(httpavg,httpavg,color='green',label='y=x')
plt.legend(loc='best')
# plt.show()

回归模型效果评估系列1-QQ图的更多相关文章

  1. 回归模型效果评估系列3-R平方

    决定系数(coefficient of determination,R2)是反映模型拟合优度的重要的统计量,为回归平方和与总平方和之比.R2取值在0到1之间,且无单位,其数值大小反映了回归贡献的相对程 ...

  2. 回归模型效果评估系列2-MAE、MSE、RMSE、MAPE(MAPD)

      MAE.MSE.RMSE.MAPE(MAPD)这些都是常见的回归预测评估指标,重温下它们的定义和区别以及优缺点吧     MAE(Mean Absolute Error) 平均绝对误差      ...

  3. 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)

    统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...

  4. python + sklearn ︱分类效果评估——acc、recall、F1、ROC、回归、距离

    之前提到过聚类之后,聚类质量的评价: 聚类︱python实现 六大 分群质量评估指标(兰德系数.互信息.轮廓系数) R语言相关分类效果评估: R语言︱分类器的性能表现评价(混淆矩阵,准确率,召回率,F ...

  5. 深度学习实践系列(1)- 从零搭建notMNIST逻辑回归模型

    MNIST 被喻为深度学习中的Hello World示例,由Yann LeCun等大神组织收集的一个手写数字的数据集,有60000个训练集和10000个验证集,是个非常适合初学者入门的训练集.这个网站 ...

  6. 如何在R语言中使用Logistic回归模型

    在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...

  7. Stanford机器学习笔记-6. 学习模型的评估和选择

    6. 学习模型的评估与选择 Content 6. 学习模型的评估与选择 6.1 如何调试学习算法 6.2 评估假设函数(Evaluating a hypothesis) 6.3 模型选择与训练/验证/ ...

  8. PP图和QQ图

     一. QQ图      分位数图示法(Quantile Quantile Plot,简称 Q-Q 图)       统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们 ...

  9. 数学建模及机器学习算法(一):聚类-kmeans(Python及MATLAB实现,包括k值选取与聚类效果评估)

    一.聚类的概念 聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好.我们事先并不知道数据的正确结果(类标),通过聚类算法来发现和挖掘数据本身的结 ...

随机推荐

  1. linux ubuntu 远程ssh登录

    当我们有一个Linux系统的时候,可能用到远程ssh登录,当你是没有界面的系统的时候也会用到,远程操作起来比较方便. 首先我们的电脑默认是不安装ssh的,就是无法通过ssh远程连接,所以要安装shh. ...

  2. linux mysql下忘记root密码解决办法

    1 修改MySQL的登录设置 # vi /etc/my.cnf 在[mysqld]的中加上一句:skip-grant-tables  2 重新启动mysqld # /etc/init.d/mysqld ...

  3. DOS、Mac 和 Unix 文件格式[转]

    DOS.Mac 和 Unix 文件格式 相信很多朋友都碰到过这三种文件格式的互换问题,今日又碰到这个问题,忽然想寻根问底,于是整理了本文档. 文件格式区别   我们先看看这三个家伙有啥区别.很久以前, ...

  4. 流API--缩减操作

    在Stream流操作中,比如说min(),max(),count()方法,这几个操作都会将一个流缩减成一个值,流API将这些操作称为特例缩减.另外,流API同时泛华了缩减这种概念,提供了reduce( ...

  5. mysql5.7安装配置,常用命令,常见问题

    1.安装配置 参考:http://www.cnblogs.com/Fiona20170420/p/6738185.html 1. 下载 2. 解压缩 3. 添加path环境变量,路径指向mysql所在 ...

  6. 错误: 非法字符: '\ufeff'

    单独设置出错的类的编码方式   改成普通的utf-8格式即可

  7. TOMCAT原理详解及请求过程

    Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat ...

  8. mac对比class文件

    下载反编译工具 wget https://varaneckas.com/jad/jad158g.mac.intel.zip 设置Beyond Compare 填写编译工具路径

  9. python之在线平台与量化投资

    0. 第一个量化策略 # 初始化函数,设定基准等等 def initialize(context): set_benchmark('000300.XSHG') g.security = get_ind ...

  10. mysql5.6默认情况下内存占用太大

    下载了mysql5.6.12 ,默认占用内存达400多M,  而原来使用的5.0 只有30M.. 解决方案:调整以下参数----------------performance_schema_max_t ...