百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

机器学习统计概率分布全面总结(Python)

toyiye 2024-06-21 12:36 11 浏览 0 评论

来源:算法进阶

本文约6000字,建议阅读10+分钟

本文将讨论我们经常遇到的概率分布,希望能从概念层面帮助大家建立总体认知。


在平时的科研中,我们经常使用统计概率的相关知识来帮助我们进行城市研究。因此,掌握一定的统计概率相关知识非常有必要。


本文涉及的概念包括:


  • 随机变量(Random Variable)
  • 密度函数(Density Functions)
  • 伯努利分布(Bernoulli Distribution)
  • 二项式分布(Binomial Distribution)
  • 均匀分布(Uniform Distribution)
  • 泊松分布(Poisson Distribution)
  • 正态分布(Normal Distribution)
  • 长尾分布(Long-Tailed Distribution)
  • 学生 t 检验分布(Student’s t-test Distribution)
  • 对数正态分布(Lognormal Distribution)
  • 指数分布(Exponential Distribution)
  • 威布尔分布(Weibull Distribution)
  • 伽马分布(Gamma Distribution)
  • 卡方分布(Chi-square Distribution)
  • 中心极限定理(Central Limit Theorem)


1. 随机变量


离散随机变量


随机实验的所有可能结果都是随机变量。一个随机变量集合用 表示。

如果实验可能的结果是可数的,那么它被称为离散随机变量。例如,如果你抛硬币 10 次,你能得到的正面数可以用一个数字表示。或者篮子里有多少苹果仍然是可数的。

连续随机变量

这些是不能以离散方式表示的值。例如,一个人可能有 1.7 米高,1米 80 厘米,1.6666666...米高等等。


2. 密度函数


我们使用密度函数来描述随机变量 的概率分布。

PMF:概率质量函数

返回离散随机变量 等于 的值的概率。所有值的总和等于 1。PMF 只能用于离散变量。

PMF。来源:https://en.wikipedia.org/wiki/Probability_mass_function


PDF:概率密度函数


它类似于连续变量的 PMF 版本。返回连续随机变量 X 在某个范围内的概率。


PDF。来源:https://byjus.com/maths/probability-density-function/


CDF:累积分布函数


返回随机变量 X 取小于或等于 x 的值的概率。


CDF(指数分布的累积分布函数)。来源:https://en.wikipedia.org/wiki/Cumulative_distribution_function


3. 离散分布


伯努利分布


我们只有一个试验(只有一个观察结果)和两个可能的结果。例如,抛硬币。

我们有一个真的(1)的结果和一个假的(0)的结果。假设我们接受正面为真(我们可以选择正面为真或成功)。那么,如果正面朝上的概率是 ,相反情况的概率就是 。


import seaborn as sns

from scipy.stats import bernoulli

# 单一观察值 

# 生成数据 (1000 points, possible outs: 1 or 0, probability: 50% for each)

data = bernoulli.rvs(size=1000,p=0.5)

# 绘制图形

ax = sns.distplot(data_bern,kde=False,hist_kws={"linewidth": 10,'alpha':1})

ax.set(xlabel='Bernouli', ylabel='freq')



二项式分布

伯努利分布是针对单个观测结果的。多个伯努利观测结果会产生二项式分布。例如,连续抛掷硬币。

试验是相互独立的。一个尝试的结果不会影响下一个。

二项式分布可以表示为

。 是试验次数, 是成功的概率。

让我们进行一个实验,我们连续抛掷一枚公平的硬币 20 次。

import matplotlib.pyplot as plt
from scipy.stats import binom
n = 20  
# 实验次数
p = 0.5 
# 成功的概率
r = list(range(n + 1)) 
# the number of success
# pmf值
pmf_list = [binom.pmf(r_i, n, p) for r_i in r ]
# 绘图
plt.bar(r, pmf_list)plt.show()



它看起来像正态分布,但请记住这些值是离散的。


现在这次,你有一枚欺诈硬币。你知道这个硬币正面向上的概率是 0.7。因此,p = 0.7。


带有偏差硬币的二项式分布


该分布显示出成功结果数量增加的概率增加。

: 成功的概率 : 实验次数 : 失败的概率

均匀分布

所有结果成功的概率相同。掷骰子,1 到 6。

掷 6 次。


data = np.random.uniform(1, 6, 6000)

掷 6000 次。


Poisson 分布

它是与事件在给定时间间隔内发生频率相关的分布。

, 是在指定时间间隔内预期发生的事件次数。它是在该时间间隔内发生的事件的已知平均值。 是事件在指定时间间隔内发生的次数。如果事件遵循泊松分布,则:


在泊松分布中,事件彼此独立。事件可以发生任意次数。两个事件不能同时发生。

如每 60 分钟接到 4 个电话。这意味着 60 分钟内通话的平均次数为 4。让我们绘制在 60 分钟内接到 0 到 10 个电话的概率。

import matplotlib.pyplot as plt
from scipy.stats 
import poisson
r = range(0,11) 
# 呼叫次数
lambda_val = 4 
# 均值
# 概率值
data = poisson.pmf(r, lambda_val)
# 绘图
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
ax.plot(r, data, 'bo', ms=8, label='poisson')
plt.ylabel("Probability", fontsize="12")
plt.xlabel("# Calls", fontsize="12")
plt.title("Poisson Distribution", fontsize="16")
ax.vlines(r, 0, data, colors='r', lw=5, alpha=0.5)


4. 连续分布


正态分布

最著名和最常见的分布(也称为高斯分布),是一种钟形曲线。它可以通过均值和标准差定义。正态分布的期望值是均值。

曲线对称。均值、中位数和众数相等。曲线下总面积为 1。

大约 68%的值落在一个标准差范围内。~95% 落在两个标准差范围内,~98.7% 落在三个标准差范围内。

import scipy

mean = 0

standard_deviation = 5

x_values = np. arange(-30, 30, 0.1)

y_values = scipy.stats.norm(mean, standard_deviation)

plt.plot(x_values, y_values. pdf(x_values))



正态分布的概率密度函数为:


是均值, 是常数, 是标准差。

QQ 图

我们可以使用 QQ 图来直观地检查样本与正态分布的接近程度。

计算每个数据点的 z 分数并对其进行排序,然后在 y 轴上表示它们。X 轴表示值的排名的分位数。

这个图上的点越接近对角线,分布就越接近正态分布。


import numpy as np

import statsmodels.api as sm

points = np.random.normal(0, 1, 1000)

fig = sm.qqplot(points, line ='45')

plt.show()


长尾分布


尾巴是分布的长而窄的部分,离群值就位于其中。当一侧尾巴不同于另一侧时,就称为偏斜。下图是长尾分布的 QQ 图。


import matplotlib.pyplot as plt


from scipy.stats import skewnorm


def generate_skew_data(n: int, max_val: int, skewness: int):    


  # Skewnorm function    


  random = skewnorm.rvs(a = skewness,loc=max_val, size=n)    


  plt.hist(random,30,density=True, color = 'red', alpha=0.1)    


  plt.show()






generate_skew_data(1000, 100, -5) # negative (-5)-> 左偏分布

generate_skew_data(1000, 100, 5) # positive (5)-> 右偏分布

学生 t 检验分布

正态但有尾(更厚、更长)。

t 分布和 z 分布。来源:https://www.geeksforgeeks.org/students-t-distribution-in-statistics/


t 分布是具有较厚尾部的正态分布。如果可用数据较少(约 30 个),则使用 t 分布代替正态分布。

在 t 分布中,自由度变量也被考虑在内。根据自由度和置信水平在 t 分布表中找到关键的 t 值。这些值用于假设检验。

t 分布表情移步:https://www.sjsu.edu/faculty/gerstman/StatPrimer/t-table.pdf。

对数正态分布

随机变量 X 的对数服从正态分布的分布。


import numpy as np

import matplotlib.pyplot as plt

from scipy import stats

X = np.linspace(0, 6, 1500)

std = 1

mean = 0

lognorm_distribution = stats.lognorm([std], loc=mean)

lognorm_distribution_pdf = lognorm_distribution.pdf(X)

fig, ax = plt.subplots(figsize=(8, 5))

plt.plot(X, lognorm_distribution_pdf, label="μ=0, σ=1")

ax.set_xticks(np.arange(min(X), max(X)))

plt.title("Lognormal Distribution")

plt.legend()plt.show()


指数分布


我们在 Poisson 分布中研究了在一定时间间隔内发生的事件。在指数分布中,我们关注的是两个事件之间经过的时间。如果我们把上面的例子倒过来,那么两个电话之间需要多长时间?


因此,如果 X 是一个随机变量,遵循指数分布,则累积分布函数为:





是均值, 是常数。


from scipy.stats import expon

import matplotlib.pyplot as plt

x = expon.rvs(scale=2, size=10000) # 2 calls

# 绘图

plt.hist(x, density=True, edgecolor='black')


x 轴表示时间间隔的百分比


韦伯分布

它是指时间间隔是可变的而不是固定的情况下使用的指数分布的扩展。在 Weibull 分布中,时间间隔被允许动态变化。

是形状参数,如果是正值,则事件发生的概率随时间而增加,反之亦然。 是尺度参数。


import matplotlib.pyplot as plt

x = np.arange(1,100.)/50.

def weib(x,n,a):    

  return (a / n) * (x / n)**(a - 1) * np.exp(-(x / n)**a)




count, bins, ignored = plt.hist(np.random.weibull(5.,1000))

x = np.arange(1,100.)/50.

scale = count.max()/weib(x, 1., 5.).max()

plt.plot(x, weib(x, 1., 5.)*scale)

plt.show()?


Gamma 分布


指与第 n 个事件发生所需的时间有关的分布,而指数分布则与首次事件发生的时间有关。


import numpy as np

import scipy.stats as stats

import matplotlib.pyplot as plt

#Gamma distributions

x = np.linspace(0, 60, 1000)

y1 = stats.gamma.pdf(x, a=5, scale=3)

y2 = stats.gamma.pdf(x, a=2, scale=5)

y3 = stats.gamma.pdf(x, a=4, scale=2)

# plots

plt.plot(x, y1, label='shape=5, scale=3')

plt.plot(x, y2, label='shape=2, scale=5')

plt.plot(x, y3, label='shape=4, scale=2')

#add legend

plt.legend()

#display 

plotplt.show()

Gamma 分布。X 轴表示随机变量 X 可能取到的潜在值,Y 轴表示分布的概率密度函数(PDF)值


Gamma 分布


它用于统计检验。这通常在实际分布中不会出现。


# x轴范围0-10,步长0.25

X = np.arange(0, 10, 0.25)

plt.subplots(figsize=(8, 5))

plt.plot(X, stats.chi2.pdf(X, df=1), label="1 dof")

plt.plot(X, stats.chi2.pdf(X, df=2), label="2 dof")

plt.plot(X, stats.chi2.pdf(X, df=3), label="3 dof")

plt.title("Chi-squared Distribution")

plt.legend()

plt.show()


中心极限定理


当我们从人群中收集足够大的样本时,样本的平均值将具有正态分布,即使人群不是正态分布。


我们可以从任何分布(离散或连续)开始,从人群中收集样本并记录这些样本的平均值。随着我们继续采样,我们会注意到平均值的分布正在慢慢形成正态分布。


相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码