当前位置: 首页 > news >正文

算法数学加油站:一元高斯分布(正态分布)Python精美科研绘图(PDF、CDF、PPF、ECDF曲线;QQ图)

这类博客针对算法学习时可能遇到的数学知识补充,但不会太多废话,主要是公式结合Python代码精美绘图理解!

本期重点:

参数:期望、标准差曲线:概率密度曲线PDF、累积概率密度函数CDF、百分点函数PPF应用:68-95-99.7法则、参数估计、经验分布函数ECDF、QQ图。

一、一元高斯分布基本知识

一元高斯分布,也即正态分布!

①PDF函数(对应概率密度):

期望影响PDF曲线的位置(位置参数),方差影响PDF的形状(形状参数),方差越大曲线越扁平,越小曲线越瘦高。

PDF曲线下的总面积为“1”,即PDF函数积分结果为“1”,这也是分母除以根号下2pi的缘故。

②CDF函数(对应概率值):

标准一元高斯分布的PDF和CDF曲线如下(y轴含义不同):

③百分点函数PPF(CDF的逆函数):

④Z分数(一种标准化度量尺度):

Z分数也叫标准分数,运算为如下:

这个过程也叫数据的标准化,样本数据的Z分数构成的分布——均值为0,方差为1,标准正态分布的Z值大小上等于样本X值,只不过Z分数无单位。(每一个x对应一个z,所有的z值数量与样本x数量对应)

标准正态分布中,以  z 值(在标准正态中z其实就是样本值x)为节点划分四类面积。z取不同值时,四类面积(概率值)不同,对应有一个 标准概率表格 ,这个表格在 Z检验(Z-test) 常被用到。
Z分数可以看作一种 标准化的“距离度量”。原始样本X的Z分数表示 距离均值若干倍的标准差偏移,如某个样本数据点x对应z值为3,说明这个数据点距均值有3倍的标准差偏移(右偏)——表示一个 偏移的倍数!!!
有了Z分数,不同分布、不同单位的样本数据有了可比性,如下是鸢尾花数据集四个特征的Z分数:(横轴是Z分数值,纵轴是概率密度)
#导入库与数据集
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_iris
from statsmodels.distributions.empirical_distribution import ECDF
from scipy.stats import norm
import scipyiris = load_iris()
X = iris.data
y = iris.target
feature_names = ['Sepal length, $X_1$','Sepal width, $X_2$','Petal length, $X_3$','Petal width, $X_4$']x_array = np.linspace(0,8,100)
# Convert X array to dataframe
X_df = pd.DataFrame(X, columns=feature_names)

计算Z分数然后绘制图像代码如下: 

# %% generate Z score
z_array = np.linspace(-4, 4, 100)
Z_score_df = (X_df - X_df.mean()) / X_df.std()for feature in feature_names:sample = Z_score_df[feature]hist = np.histogram(sample, bins=40, range=(-4, 4))hist_dist = scipy.stats.rv_histogram(hist)mu = sample.mean()std = sample.std()N_pdf = norm.pdf(z_array, loc=mu, scale=std)epdf_y = hist_dist.pdf(z_array)fig, ax = plt.subplots()# plot empirical PDFplt.step(z_array, epdf_y, color='#0070C0')ax.fill_between(z_array, epdf_y, step="pre", color='#DBEEF3')plt.axvline(x=mu, color='r', linestyle='--')plt.axvline(x=mu + std, color='r', linestyle='--')plt.axvline(x=mu - std, color='r', linestyle='--')# plot parametric (normal) PDFplt.plot(z_array, N_pdf, 'r')plt.xlabel(feature.replace('X', 'Z') + ' ($\sigma$)')plt.ylabel('PDF, probability density')plt.gca().spines['right'].set_visible(False)plt.gca().spines['top'].set_visible(False)plt.gca().yaxis.set_ticks_position('left')plt.gca().xaxis.set_ticks_position('bottom')plt.xlim(-4, 4)plt.ylim(0, 1)plt.yticks(np.linspace(0, 1, 6))plt.grid(color=[0.7, 0.7, 0.7])plt.show()

这样不同的四个特征用Z分数标准化后,变得可比!!


68-95-99.7法则不说了,大家都知道68%、95%、99.7%分别对应距离均值1倍、2倍、3倍标准差的偏移。


二、参数估计——估计概率密度

机器学习中,概率密度估计是一个常见问题——从离散的样本数据中估计得到连续的概率密度函数曲线。

#%% compare PDF curves
for feature in feature_names:sample = X_df[feature]hist = np.histogram(sample, bins=30, range = (0,8))hist_dist = scipy.stats.rv_histogram(hist)mu  = sample.mean()std = sample.std()N_pdf = norm.pdf(x_array, loc = mu, scale = std)epdf_y = hist_dist.pdf(x_array)fig, ax = plt.subplots()# plot empirical PDFplt.step(x_array,epdf_y, color = '#0070C0')ax.fill_between(x_array, epdf_y, step="pre", color = '#DBEEF3')plt.axvline(x=mu, color = 'r', linestyle = '--')plt.axvline(x=mu + std, color = 'r', linestyle = '--')plt.axvline(x=mu - std, color = 'r', linestyle = '--')# plot parametric (normal) PDFplt.plot(x_array,N_pdf, 'r')plt.xlabel(feature)plt.ylabel('PDF, probability density')plt.gca().spines['right'].set_visible(False)plt.gca().spines['top'].set_visible(False)plt.gca().yaxis.set_ticks_position('left')plt.gca().xaxis.set_ticks_position('bottom')plt.xlim(0,8)plt.ylim(0,1)plt.yticks(np.linspace(0,1,5))plt.grid(color = [0.7,0.7,0.7])plt.show()
用一元高斯分布估计单一特征概率密度函数很简单;但是问题很明显,如上图鸢尾花数据集前两个特征估计效果很好,但是 后两个特征似乎用一元高斯分布进行估计不太合适。——后续将会用 核密度估计解决这一问题。

三、经验分布函数(ECDF)

经验分布函数(ECDF)是一个用来描述样本数据分布情况的统计工具,可以理解为数据的实际概率分布

  • 将数据按大小排序
  • 计算每个数据点对应的累积比例,形成类似阶梯函数的曲线
  • 横坐标为样本数据取值,纵坐标表示小于等于横坐标的数据比例(实际的)
  • 双射函数,每个输入正好有一个输出,每个输出值正好都有一个输入值
  • 与CDF分布函数(估计的、理想的)比较,以检验数据是否符合某种假设的分布。下面是鸢尾花4个特征的ECDF和CDF对比图代码和结果:
  • #%% compare CDF curves
    for feature in feature_names:sample = X_df[feature]mu  = sample.mean()std = sample.std()N_cdf = norm.cdf(x_array, loc = mu, scale = std)ecdf = ECDF(sample)ecdf_y = ecdf(x_array)fig, ax = plt.subplots()# plot empirical CDFplt.step(x_array,ecdf_y)# plot parametric (normal) CDFplt.plot(x_array,N_cdf, 'r')plt.axvline(x=mu, color = 'r', linestyle = '--')plt.axvline(x=mu + std, color = 'r', linestyle = '--')plt.axvline(x=mu - std, color = 'r', linestyle = '--')plt.xlabel(feature)plt.ylabel('CDF, probability')plt.gca().spines['right'].set_visible(False)plt.gca().spines['top'].set_visible(False)plt.gca().yaxis.set_ticks_position('left')plt.gca().xaxis.set_ticks_position('bottom')plt.xlim(0,8)plt.ylim(0,1)plt.yticks(np.linspace(0,1,5))plt.grid(color = [0.7,0.7,0.7])plt.show()
  • 据此更可以形象的看出,后两个鸢尾花特征的数据分布是不太适合用一元高斯分布进行描述的!


 三、分位-分位图(QQ图)

  • “Q”代表分位数二分位数即中位数;四分位数把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数,例如第一四分位数(Q1),等于该样本中所有数值由小到大排列后第25%的数字;第二四分位数(Q2)即中位数;
  • QQ图是散点图,横坐标为假定分布(如标准正态)的分位数,纵坐标为待检验样本的分位数——类似于理想与实际;
  • 比较相似度,若完全符合假定分布则QQ图呈现理想y=x的对角线;
  • QQ图横坐标一般是正态分布,也可是其他分布;
  • 也用于检查数据是否符合某个分布的统计图形,可以看作ECDF曲线的另一种可视化方式
#%% QQ plot
import pylab
import scipy.stats as statsfor feature in feature_names:sample = X_df[feature]mu  = sample.mean()std = sample.std()fig = plt.figure(figsize=(7, 7))stats.probplot(sample, dist="norm", plot=pylab)plt.axhline(y=mu, color = 'r', linestyle = '--')plt.axhline(y=mu + std, color = 'r', linestyle = '--')plt.axhline(y=mu - std, color = 'r', linestyle = '--')plt.axhline(y=mu + 2*std, color = 'r', linestyle = '--')plt.axhline(y=mu - 2*std, color = 'r', linestyle = '--')plt.axvline(x=0, color = 'r', linestyle = '--')plt.axvline(x=1, color = 'r', linestyle = '--')plt.axvline(x=-1, color = 'r', linestyle = '--')plt.axvline(x=2, color = 'r', linestyle = '--')plt.axvline(x=-2, color = 'r', linestyle = '--')plt.xlabel('Theoretical (standard normal) quantiles')plt.ylabel('Empirical quantiles')pylab.show()


实际应用中,高斯分布常用于建模和分析连续数据;在数据分析机器学习中,高斯分布被广泛用于分类、聚类、离群点检测等问题!

仅仅一元高斯分布还不够,后续将继续二元、多元高斯分布、条件高斯分布、协方差矩阵等!

如有兴趣欢迎订阅该专栏,和我一起领略机器学习算法的奥妙!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • P1004 [NOIP2000 提高组] 方格取数
  • linux 9系统分区扩容
  • pymysql cursor使用教程
  • CSS学习1
  • 百度文库文章-暂存下-------题 目: 链式简单选择排序
  • 内存管理篇-17解开页表的神秘面纱-下
  • 【Redis】Redis 持久化 AOF、RDB—(七)
  • VS2019开发CAN上位机
  • 【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题
  • golang gin template模板渲染
  • 【Python报错已解决】`SyntaxError: can‘t assign to function call`
  • YOLOv9改进策略【模型轻量化】| ShufflenetV2,通过通道划分构建高效网络
  • 基于matlab的行人和车辆检测系统
  • 模型 ACT心理灵活六边形
  • 不同浏览器JS对数组末尾多余的逗号的处理
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [NodeJS] 关于Buffer
  • 11111111
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JS基础之数据类型、对象、原型、原型链、继承
  • js继承的实现方法
  • PHP 的 SAPI 是个什么东西
  • Spring核心 Bean的高级装配
  • 大快搜索数据爬虫技术实例安装教学篇
  • 大型网站性能监测、分析与优化常见问题QA
  • 给第三方使用接口的 URL 签名实现
  • 前端存储 - localStorage
  • 如何利用MongoDB打造TOP榜小程序
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 小程序 setData 学问多
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ###项目技术发展史
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (09)Hive——CTE 公共表达式
  • (14)Hive调优——合并小文件
  • (3)nginx 配置(nginx.conf)
  • (6)添加vue-cookie
  • (接口封装)
  • (算法设计与分析)第一章算法概述-习题
  • (原創) 未来三学期想要修的课 (日記)
  • (转)ABI是什么
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .Net 6.0--通用帮助类--FileHelper
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET CORE Aws S3 使用
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net core 连接数据库,通过数据库生成Modell
  • .NET 常见的偏门问题
  • .NET 读取 JSON格式的数据
  • .ui文件相关
  • @Transactional类内部访问失效原因详解
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用