哈喽,我是小白~
今儿整理了概率分布的一些内容,再来详细的和大家聊聊~
概率分布非常非常重要,提供了非常底层的原理支持。概率分布在机器学习中用于建模数据的生成过程,帮助算法理解数据的内在结构和模式。它能够支持模型的预测和不确定性估计,从而提高决策的可靠性。
在模型评估和优化中,概率分布帮助评估损失、调整参数,进而提升模型的泛化能力。
今儿涉及到的概率分布有:
正态分布 伯努利分布 二项分布 多项分布 泊松分布 指数分布 卡方分布 t分布 Gamma分布 Beta分布
如果需要本文PDF版本的同学,文末获取~
另外,文末有总结性的干货~
一起来看下具体细化内容~
1. 正态分布(Normal Distribution)
正态分布,又称为高斯分布,是最常用的连续概率分布,具有对称的钟形曲线。正态分布的均值决定其中心位置,方差决定曲线的宽窄。许多自然现象都符合正态分布,如人的身高、体重、考试成绩等。
原理
正态分布的核心原理是中心极限定理(Central Limit Theorem),该定理说明,在某些条件下,多个独立同分布的随机变量之和的分布会趋向于正态分布。因此,无论原始数据的分布形状如何,只要样本量足够大,平均值的分布会接近正态分布。
核心公式
正态分布的概率密度函数(PDF)为:
其中, 为均值, 为方差。
公式推导
正态分布的推导基于标准正态分布的定义。对于一个随机变量 来说,如果 ,则其密度函数为:
对于任意正态分布 ,可以通过变换 得到。
Python实现
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
# 设置随机种子以确保结果可重复
np.random.seed(42)
# 生成虚拟数据集
mu, sigma = 0, 1 # 平均值和标准差
data = np.random.normal(mu, sigma, 1000)
# 创建子图
fig, axs = plt.subplots(2, 3, figsize=(18, 10))
fig.suptitle('Multidimensional Analysis of Normal Distribution Data', fontsize=16)
# 概率密度函数
x = np.linspace(-4, 4, 1000)
pdf = stats.norm.pdf(x, mu, sigma)
axs[0, 0].plot(x, pdf, color='blue', linewidth=2, label='PDF')
axs[0, 0].fill_between(x, pdf, color='cyan', alpha=0.3)
axs[0, 0].set_title('Probability Density Function (PDF)', fontsize=12)
axs[0, 0].legend()
# 直方图
sns.histplot(data, bins=30, kde=True, color='purple', ax=axs[0, 1])
axs[0, 1].set_title('Histogram with KDE', fontsize=12)
axs[0, 1].set_xlabel('Value')
axs[0, 1].set_ylabel('Frequency')
# 累积分布函数 (CDF)
axs[0, 2].plot(x, stats.norm.cdf(x, mu, sigma), color='green', label='CDF', linewidth=2)
axs[0, 2].fill_between(x, stats.norm.cdf(x, mu, sigma), color='lime', alpha=0.3)
axs[0, 2].set_title('Cumulative Distribution Function (CDF)', fontsize=12)
axs[0, 2].legend()
# 箱线图 (Box plot)
sns.boxplot(data, color='orange', ax=axs[1, 0])
axs[1, 0].set_title('Box Plot', fontsize=12)
axs[1, 0].set_xlabel('Value')
# Q-Q图 (Quantile-Quantile plot)
stats.probplot(data, dist="norm", plot=axs[1, 1])
axs[1, 1].get_lines()[1].set_color('red')
axs[1, 1].get_lines()[1].set_linestyle('--')
axs[1, 1].set_title('Q-Q Plot', fontsize=12)
# 数据描述信息
axs[1, 2].axis('off') # 关闭坐标轴
stats_text = f'''
Mean = {np.mean(data):.2f}
Standard Deviation = {np.std(data):.2f}
Min = {np.min(data):.2f}
Max = {np.max(data):.2f}
Median = {np.median(data):.2f}
'''
axs[1, 2].text(0.1, 0.5, stats_text, fontsize=12, verticalalignment='center')
# 调整子图布局
plt.tight_layout(rect=[0, 0, 1, 0.96])
plt.show()
数据生成:使用 np.random.normal
生成一个均值为0,标准差为1的正态分布数据。概率密度函数:使用 scipy.stats.norm.pdf
计算给定均值和标准差的PDF。
直方图和KDE:使用Seaborn的 histplot
展示频率直方图及核密度估计。
累积分布函数(CDF):用 scipy.stats.norm.cdf
绘制数据的CDF。
箱线图:通过 sns.boxplot
展示数据的分布范围、异常值等。
Q-Q图:通过 stats.probplot
验证数据的正态性。
数据描述信息:在最后一个子图位置展示数据的统计描述信息。
2. 伯努利分布(Bernoulli Distribution)
伯努利分布描述了一个只有两种结果(成功和失败)的实验,每种结果的概率分别为 和 。它是最简单的离散分布之一。
原理
伯努利分布是二项分布的特例,二项分布的实验次数为 1 时即为伯努利分布。它通常用来描述单个二分类变量的分布。
核心公式
若随机变量 服从伯努利分布,则概率质量函数(PMF)为:
其中, 为事件成功的概率。
公式推导
伯努利分布的概率质量函数(PMF)可表示为:
可以将这个表达式统一写成 ,其中 为 0 或 1。
Python实现
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置种子和样本数
np.random.seed(42)
sample_size = 1000
# 生成伯努利分布数据(假设成功的概率为0.4)
p = 0.4
data = np.random.binomial(1, p, sample_size)
# 创建图形和子图
plt.figure(figsize=(12, 8))
plt.suptitle("Bernoulli Distribution and Data Analysis", fontsize=18)
# 1. 概率分布条形图
plt.subplot(2, 2, 1)
sns.countplot(data, palette="bright")
plt.title("Probability Distribution (Bar Chart)", fontsize=14)
plt.xlabel("Outcome (0 = Failure, 1 = Success)")
plt.ylabel("Frequency")
# 2. 累计分布函数(CDF)图
plt.subplot(2, 2, 2)
sorted_data = np.sort(data)
cdf = np.arange(1, len(sorted_data) + 1) / len(sorted_data)
plt.plot(sorted_data, cdf, color='darkorange', marker='o', linestyle='-', linewidth=2)
plt.title("Cumulative Distribution Function (CDF)", fontsize=14)
plt.xlabel("Outcome")
plt.ylabel("Cumulative Probability")
# 3. 箱线图
plt.subplot(2, 2, 3)
sns.boxplot(data, color="skyblue")
plt.title("Box Plot", fontsize=14)
plt.xlabel("Outcome")
# 4. 直方图
plt.subplot(2, 2, 4)
plt.hist(data, bins=2, color="limegreen", edgecolor="black")
plt.title("Histogram", fontsize=14)
plt.xlabel("Outcome")
plt.ylabel("Frequency")
# 调整布局和显示
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()
概率分布条形图:用于展示事件的频率分布,帮助我们直观地观察成功(1)与失败(0)出现的频次。 累计分布函数图:提供事件在不同概率下的累计频率,显示事件在给定概率水平的累积趋势。 箱线图:展示数据的分布范围、四分位数和离群值,能观察数据是否偏向某一事件。 直方图:直方图进一步展示数据的频率分布,补充了条形图信息。
这几种图形结合有助于全面分析伯努利分布的事件概率及分布趋势。
3. 二项分布(Binomial Distribution)
二项分布描述了在 次独立的伯努利实验中成功的次数,参数包括实验次数 和成功概率 。
原理
假设每次实验结果相互独立,二项分布描述了 次实验中成功的次数。成功的可能性服从伯努利分布,因此二项分布可以看作多个伯努利分布的和。
核心公式
若随机变量 服从二项分布,则其概率质量函数(PMF)为:
其中, 表示组合数,即 。
公式推导
次实验中成功 次的概率为 。 次成功在 次实验中可能出现的位置数为 。 因此,成功 次的概率为 。
Python实现
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import binom
# 设置二项分布参数
n = 20 # 试验次数
p = 0.5 # 每次试验成功概率
size = 1000 # 模拟样本数
# 生成二项分布数据
data = binom.rvs(n=n, p=p, size=size)
# 创建画布
plt.figure(figsize=(16, 12))
# 1. 概率质量函数(PMF)图
plt.subplot(2, 2, 1)
x = np.arange(0, n + 1)
pmf_values = binom.pmf(x, n, p)
plt.stem(x, pmf_values, basefmt=" ", linefmt='C1-', markerfmt='C1o', label="PMF") # Removed use_line_collection
plt.xlabel("Number of Successes")
plt.ylabel("Probability")
plt.title("Probability Mass Function (PMF) of Binomial Distribution")
plt.legend()
# 2. 累积分布函数(CDF)图
plt.subplot(2, 2, 2)
cdf_values = binom.cdf(x, n, p)
plt.plot(x, cdf_values, 'C2-', marker='o', label="CDF")
plt.xlabel("Number of Successes")
plt.ylabel("Cumulative Probability")
plt.title("Cumulative Distribution Function (CDF) of Binomial Distribution")
plt.legend()
# 3. 数据直方图
plt.subplot(2, 2, 3)
sns.histplot(data, bins=n + 1, kde=False, color="C0", edgecolor="black", stat="probability")
plt.xlabel("Number of Successes")
plt.ylabel("Frequency")
plt.title("Frequency Distribution of Simulated Data (Histogram)")
# 4. 箱线图
plt.subplot(2, 2, 4)
sns.boxplot(data=data, color="C3")
plt.xlabel("Sample Data")
plt.title("Box Plot of Simulated Data")
# 调整布局
plt.tight_layout()
plt.show()
概率质量函数(PMF)图:展示成功次数的概率分布,帮助理解每个成功次数出现的概率。 累积分布函数(CDF)图:帮助理解从最小到某个值之间的成功次数的累计概率。 数据直方图:模拟的实际数据的频数分布,可以更直观的观察到实际模拟数据的分布情况。 箱线图:显示模拟数据的分布情况,包括四分位数和离散程度,帮助我们理解数据的集中趋势和离群点。
4. 多项分布(Multinomial Distribution)
多项分布是二项分布的推广,适用于 类事件的实验次数分布。它适合用于描述词频分布、分类任务等场景。
原理
假设每次试验有 个可能的结果,且每个结果发生的概率分别为 。多项分布描述了在 次试验中每个类别的出现次数。
核心公式
若随机向量 服从多项分布,则概率质量函数(PMF)为:
其中, 且 。
公式推导
每个类别 出现 次的概率为 。 组合数 表示在 次实验中按特定次数组合的总数。 因此,联合概率为 。
Python实现
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置随机种子,确保可重复性
np.random.seed(42)
# 定义商品类别数量
categories = ['A', 'B', 'C']
# 定义多项分布的参数(每种商品的平均销售概率)
probs = [0.5, 0.3, 0.2] # 各个类别的销售概率
# 模拟销售数据 - 假设每天观察100次销售
n_trials = 100
sales_data = np.random.multinomial(n_trials, probs, size=1000)
# 计算每类商品的平均销售数量
mean_sales = sales_data.mean(axis=0)
# 图形设置
fig, axes = plt.subplots(1, 3, figsize=(18, 6), dpi=100)
fig.suptitle('Product Sales Probability Distribution and Data Analysis', fontsize=16)
# 1. Bar Chart
axes[0].bar(categories, mean_sales, color=['red', 'green', 'blue'], alpha=0.7)
axes[0].set_title('Average Sales Quantity Bar Chart')
axes[0].set_xlabel('Product Category')
axes[0].set_ylabel('Average Sales Quantity')
for i, val in enumerate(mean_sales):
axes[0].text(i, val + 2, f'{val:.1f}', ha='center', color='black')
# 2. CDF
cumulative_sales = np.cumsum(mean_sales / np.sum(mean_sales))
axes[1].plot(categories, cumulative_sales, marker='o', linestyle='-', color='purple')
axes[1].fill_between(categories, cumulative_sales, color='purple', alpha=0.2)
axes[1].set_title('Cumulative Distribution Function (CDF)')
axes[1].set_xlabel('Product Category')
axes[1].set_ylabel('Cumulative Probability')
# 3. PDF
for idx, cat in enumerate(categories):
sns.kdeplot(sales_data[:, idx], label=cat, ax=axes[2], linewidth=2)
axes[2].set_title('Probability Density Function (PDF) of Sales Data')
axes[2].set_xlabel('Sales Quantity')
axes[2].set_ylabel('Density')
axes[2].legend(title="Product Category")
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()
概率分布柱状图 - 清晰展示不同类别商品的平均销售数量及其分布情况,帮助直观理解哪种商品销量最大。
累积分布函数(CDF) - 累积概率曲线可以用来直观表示随着类别的增加,商品的总销量如何累积,可以看出每增加一个类别对累积销量的贡献。
概率密度函数(PDF) - 显示每种商品销售数量的密度分布情况,通过核密度估计了解销售数量的分布形态,比如是否集中在某个区间。
5. 泊松分布(Poisson Distribution)
泊松分布用于描述单位时间内稀有事件发生的次数,是二项分布在 、 且 时的极限分布。
原理
泊松分布假设事件独立且发生速率恒定,因此在单位时间或空间内发生次数满足泊松分布。
核心公式
泊松分布的概率质量函数(PMF)为:
其中, 为单位时间内的事件平均发生次数。
公式推导
泊松分布是二项分布的极限形式。当 次实验中,每次实验的成功概率为 ,且当 时 ,使得 为常数。则可以推导出泊松分布的公式。
Python实现
假设一个小型零售店观察顾客进入的情况,测量的是每小时内顾客进店的次数。我们使用泊松分布模拟顾客进店的次数,并通过多种图表来分析分布特征。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import poisson
# 设置随机种子,确保结果可重复
np.random.seed(42)
# 生成虚拟数据:泊松分布的随机数据,假设平均进店次数为4
lambda_val = 4
data = poisson.rvs(mu=lambda_val, size=1000)
# 设置图形风格和颜色
sns.set(style="whitegrid")
plt.figure(figsize=(14, 10))
# 绘制直方图
plt.subplot(2, 2, 1)
sns.histplot(data, bins=15, kde=False, color="skyblue", edgecolor="black")
plt.title("Histogram of Poisson Distribution (λ=4)", fontsize=14)
plt.xlabel("Number of Customers per Hour")
plt.ylabel("Frequency")
# 绘制核密度估计图 (KDE)
plt.subplot(2, 2, 2)
sns.kdeplot(data, color="red", fill=True, alpha=0.6, linewidth=2)
plt.title("KDE of Poisson Distribution", fontsize=14)
plt.xlabel("Number of Customers per Hour")
plt.ylabel("Density")
# 绘制累计分布函数 (CDF)
plt.subplot(2, 2, 3)
x = np.sort(data)
y = np.arange(1, len(x) + 1) / len(x)
plt.step(x, y, color="purple", where="post", linewidth=2)
plt.title("CDF of Poisson Distribution", fontsize=14)
plt.xlabel("Number of Customers per Hour")
plt.ylabel("Cumulative Probability")
# 绘制箱线图 (Box Plot)
plt.subplot(2, 2, 4)
sns.boxplot(data=data, color="lime")
plt.title("Box Plot of Poisson Data", fontsize=14)
plt.xlabel("Distribution")
# 显示所有图
plt.tight_layout()
plt.show()
频率直方图:展示了不同区间顾客进店次数的频率。我们能观察到大多数顾客次数集中在平均值附近。 核密度估计图(KDE图):通过平滑曲线来显示数据的分布趋势,帮助识别数据密度的分布结构。 累计分布函数(CDF):清晰地展现了数据的累积概率,便于观察数据在不同区间内累积的分布情况。 箱线图:通过箱线图查看数据的四分位数、极端值及离群点。
6. 指数分布(Exponential Distribution)
指数分布是一种连续概率分布,通常用于描述独立事件发生的时间间隔。它是泊松过程(即单位时间内事件发生次数符合泊松分布)中的间隔时间分布。
原理
指数分布的核心思想是事件独立发生,间隔时间不随时间变化,即发生速率恒定。泊松过程描述单位时间内事件的数量,而指数分布则描述这些事件的发生间隔。
核心公式
指数分布的概率密度函数(PDF)为:
其中, 表示事件发生的平均速率。
公式推导
设 为事件发生的时间间隔,其累计分布函数(CDF)为 。 求导得到概率密度函数:。 指数分布是泊松过程间隔时间分布的特例,满足无记忆性,即 。
Python实现
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
# 设置随机种子,确保结果可重复
np.random.seed(42)
# 生成虚拟数据集:指数分布数据
lambda_param = 1.5 # 指数分布的参数
data = np.random.exponential(1 / lambda_param, 1000) # 生成1000个样本数据
# 创建子图画布
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('Exponential Distribution Data Analysis', fontsize=16, fontweight='bold')
# 绘制概率密度函数 (PDF)
sns.histplot(data, bins=30, kde=True, color="dodgerblue", ax=axes[0, 0])
axes[0, 0].set_title('Probability Density Function (PDF)', fontsize=14)
axes[0, 0].set_xlabel('Data Value')
axes[0, 0].set_ylabel('Probability Density')
# 绘制累积分布函数 (CDF)
sorted_data = np.sort(data)
cdf = np.arange(1, len(data) + 1) / len(data)
axes[0, 1].plot(sorted_data, cdf, color="darkorange", lw=2)
axes[0, 1].set_title('Cumulative Distribution Function (CDF)', fontsize=14)
axes[0, 1].set_xlabel('Data Value')
axes[0, 1].set_ylabel('Cumulative Probability')
# 绘制箱线图 (Boxplot)
sns.boxplot(data=data, color="lightcoral", ax=axes[1, 0])
axes[1, 0].set_title('Boxplot', fontsize=14)
axes[1, 0].set_xlabel('Exponential Distribution Data')
# 绘制QQ图 (QQ plot)
stats.probplot(data, dist="expon", plot=axes[1, 1])
axes[1, 1].get_lines()[1].set_color("green") # 参考线颜色
axes[1, 1].set_title('QQ Plot', fontsize=14)
# 调整布局
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()
概率密度函数 (PDF):该图帮助我们查看数据值的密度分布是否与指数分布的预期形状一致。指数分布的特征是密度在靠近零值时高,并逐渐递减,因此PDF可有效验证数据的分布特性。
累积分布函数 (CDF):CDF能帮助我们观察数据的累积情况。对于指数分布,CDF会呈现一种指数增长的趋势,通过CDF可以直观理解数据的累积概率特性。
箱线图 (Boxplot):此图用来检测数据的离散性、极值等特性。箱线图可以有效地展示出数据的中位数、四分位间距以及潜在的极端值,在数据分布分析中非常有用。
QQ图 (QQ plot):QQ图用于检查数据是否符合期望的分布(在这里是指数分布)。若数据点接近参考线,则说明数据符合指数分布;否则,偏差会更明显。
7. 卡方分布(Chi-Square Distribution)
卡方分布描述了多个独立标准正态分布平方和的分布,是检验分布之一,广泛用于假设检验和方差分析。
原理
卡方分布主要用于评估观察值和期望值之间的偏差大小。当我们对方差或频率进行统计检验时,卡方分布用于检验假设。
核心公式
若 且 ,则 服从自由度为 的卡方分布。其概率密度函数为:
其中, 表示伽马函数。
公式推导
若 独立且 ,则 。 使用拉普拉斯变换或伽马分布推导得出, 的分布为卡方分布。
Python实现
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
# 设置随机数种子以保证结果可重复
np.random.seed(42)
# 定义卡方分布的自由度
df = 5
# 生成卡方分布的虚拟数据
chi_data = np.random.chisquare(df, 1000)
# 创建一个多图表画布
fig, axs = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle("Chi-Square Distribution Analysis", fontsize=16)
# 图1:概率密度函数曲线图(PDF)曲线
x = np.linspace(0, 20, 1000)
pdf_y = stats.chi2.pdf(x, df)
axs[0, 0].plot(x, pdf_y, color='magenta', lw=2, label=f'Chi-Square PDF (df={df})')
axs[0, 0].fill_between(x, pdf_y, color='magenta', alpha=0.3)
axs[0, 0].set_title("Probability Density Function (PDF)")
axs[0, 0].set_xlabel("x")
axs[0, 0].set_ylabel("Density")
axs[0, 0].legend()
# 图2:直方图(Histogram)
sns.histplot(chi_data, bins=30, color='orange', kde=True, ax=axs[0, 1])
axs[0, 1].set_title("Histogram with KDE")
axs[0, 1].set_xlabel("Chi-Square Values")
axs[0, 1].set_ylabel("Frequency")
# 图3:箱线图(Box Plot)
sns.boxplot(chi_data, color='cyan', ax=axs[1, 0], orient='h')
axs[1, 0].set_title("Box Plot of Chi-Square Distribution")
axs[1, 0].set_xlabel("Chi-Square Values")
# 图4:QQ图(Q-Q Plot)
stats.probplot(chi_data, dist="chi2", sparams=(df,), plot=axs[1, 1])
axs[1, 1].get_lines()[1].set_color('blue') # 设置QQ图的趋势线颜色
axs[1, 1].set_title("Q-Q Plot for Chi-Square Distribution")
# 调整布局
plt.tight_layout(rect=[0, 0, 1, 0.96])
plt.show()
PDF曲线:显示卡方分布的理论概率密度函数,帮助观察数据的密度分布情况。 直方图:展示了样本数据的分布和频率,同时叠加了核密度估计(KDE)曲线,用于更加细致地观察数据的集中区域。 箱线图:突出数据的分布形状、范围和离群值,是识别数据偏态和集中趋势的有效方式。 QQ图:直观展示样本分布与理论卡方分布的拟合程度,观察数据与卡方分布的匹配情况。
8. t 分布(t-Distribution)
t 分布类似于正态分布,但在样本量较小或方差未知时具有更厚的尾部,因此更适用于小样本的假设检验和区间估计。
原理
当总体方差未知、样本量较小时,使用正态分布会导致误差偏差。t 分布通过引入自由度参数来校正误差,使得更适用于样本较小的情形。
核心公式
t 分布的概率密度函数为:
其中, 表示自由度。
公式推导
假设随机变量 和 相互独立,且 、,则 服从自由度为 的 t 分布。 利用积分技巧可以推导出其 PDF 形式。
Python实现
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
# 设置虚拟数据集和 t 分布参数
np.random.seed(42)
df = 5 # 自由度
sample_size = 1000
data = np.random.standard_t(df, sample_size)
# 创建图形
fig, axs = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle("T-Distribution Analysis with Degree of Freedom (df) = 5", fontsize=16)
# 1. 概率密度函数 (PDF)
x = np.linspace(-5, 5, 100)
pdf = stats.t.pdf(x, df)
axs[0, 0].plot(x, pdf, color="blue", lw=2, label="t-PDF (df=5)")
axs[0, 0].fill_between(x, pdf, color="skyblue", alpha=0.5)
axs[0, 0].set_title("Probability Density Function (PDF)", fontsize=12)
axs[0, 0].set_xlabel("x")
axs[0, 0].set_ylabel("Density")
axs[0, 0].legend()
# 2. 累积分布函数 (CDF)
cdf = stats.t.cdf(x, df)
axs[0, 1].plot(x, cdf, color="green", lw=2, label="t-CDF (df=5)")
axs[0, 1].fill_between(x, cdf, color="lightgreen", alpha=0.5)
axs[0, 1].set_title("Cumulative Distribution Function (CDF)", fontsize=12)
axs[0, 1].set_xlabel("x")
axs[0, 1].set_ylabel("Cumulative Probability")
axs[0, 1].legend()
# 3. 直方图和 PDF 曲线
axs[1, 0].hist(data, bins=30, density=True, color="orange", alpha=0.6, label="Sample Data Histogram")
axs[1, 0].plot(x, pdf, color="blue", lw=2, linestyle="--", label="t-PDF (df=5)")
axs[1, 0].set_title("Histogram of Sample Data with t-PDF", fontsize=12)
axs[1, 0].set_xlabel("x")
axs[1, 0].set_ylabel("Density")
axs[1, 0].legend()
# 4. QQ图
stats.probplot(data, dist="t", sparams=(df,), plot=axs[1, 1])
axs[1, 1].get_lines()[1].set_color("purple")
axs[1, 1].set_title("Q-Q Plot for t-Distribution", fontsize=12)
# 调整布局
plt.tight_layout(rect=[0, 0, 1, 0.96])
plt.show()
PDF:用于观察 t
分布的形状和特性,在自由度较小(如5)的情况下,分布有较厚的尾部。CDF:帮助理解特定值以下的累积概率,特别是在确定置信区间或特定分位数时很有用。 直方图:通过数据的频率分布与理论 PDF 曲线的比较,可以验证数据是否符合期望的分布特性。 QQ图:用于检验数据的分布是否符合 t
分布,通过观察数据与理论分布的分位数之间的对比来判断分布一致性。
9. Gamma 分布(Gamma Distribution)
Gamma 分布是定义在非负实数上的连续分布,常用于描述等待时间和贝叶斯统计中的先验分布。
原理
Gamma 分布可以看作是指数分布的推广,当 时即为指数分布。它通常用来描述多个独立事件发生所需的总时间。
核心公式
Gamma 分布的概率密度函数为:
其中, 为形状参数, 为尺度参数, 为伽马函数。
公式推导
若 ,则 。 通过对密度函数的卷积求解,可以推导出上式。
Python实现
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats
# 设置随机种子
np.random.seed(42)
# 定义Gamma分布的参数
shape = 2.0 # 形状参数
scale = 2.0 # 尺度参数
# 生成随机数据
data = np.random.gamma(shape, scale, 1000)
# 创建一个图形和多个子图
fig, axs = plt.subplots(2, 2, figsize=(12, 10))
fig.suptitle('Gamma Distribution Analysis', fontsize=16)
# 1. Gamma分布的概率密度函数 (PDF)
x = np.linspace(0, 20, 1000)
pdf = stats.gamma.pdf(x, a=shape, scale=scale)
axs[0, 0].plot(x, pdf, 'r-', lw=2, label='Gamma PDF')
axs[0, 0].set_title('Gamma Distribution PDF')
axs[0, 0].set_xlabel('x')
axs[0, 0].set_ylabel('Probability Density')
axs[0, 0].legend()
# 2. 直方图
sns.histplot(data, bins=30, kde=True, color='blue', ax=axs[0, 1])
axs[0, 1].set_title('Histogram of Random Samples')
axs[0, 1].set_xlabel('Value')
axs[0, 1].set_ylabel('Frequency')
# 3. 箱形图
sns.boxplot(x=data, ax=axs[1, 0], color='green')
axs[1, 0].set_title('Box Plot of Random Samples')
axs[1, 0].set_xlabel('Value')
# 4. Q-Q图
stats.probplot(data, dist="gamma", sparams=(shape, 0, scale), plot=axs[1, 1])
axs[1, 1].set_title('Q-Q Plot against Gamma Distribution')
# 调整子图布局
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
Gamma分布的概率密度函数(PDF):这张图展示了Gamma分布在不同参数下的概率密度。这有助于理解参数(形状和尺度)如何影响分布的形状和峰值。
直方图:这张图展示了从Gamma分布生成的随机样本的频率分布。通过直方图,我们可以直观地观察样本数据的分布情况,是否与理论分布相符。
箱形图:这张图展示了数据的分位数、异常值和整体分布特征。箱形图可以有效地识别出数据中的异常值,并给出数据的中位数和四分位数范围。
Q-Q图:这张图用于检验数据的分布是否符合Gamma分布。若点大致沿着45度线分布,说明数据分布与理论分布相近。
10. Beta 分布(Beta Distribution)
Beta 分布是定义在 区间上的连续分布,常用于描述概率的分布,广泛用于贝叶斯分析中的先验分布。
原理
Beta 分布的灵活性非常高,可以通过调整参数生成不同形状的分布,用于建模分布在 0 和 1 之间的变量。
核心公式
Beta 分布的概率密度函数为:
其中, 和 为形状参数。
公式推导
通过定义 ,其中 和 ,可导出 Beta 分布。 使用贝塔函数定义以及伽马函数性质推导其 PDF。
Python实现
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta
# 设置Beta分布的参数
alpha, beta_params = 2, 5 # 通过调整alpha和beta参数可以控制分布的形状
# 生成Beta分布的数据
x = np.linspace(0, 1, 1000)
y = beta.pdf(x, alpha, beta_params)
# 样本数据
np.random.seed(42)
sample_data = np.random.beta(alpha, beta_params, 1000)
# 创建画布
fig, axs = plt.subplots(2, 2, figsize=(14, 10), constrained_layout=True)
# 子图1:Beta分布的PDF曲线
axs[0, 0].plot(x, y, color='orange', lw=2, label=f'Beta PDF (α={alpha}, β={beta_params})')
axs[0, 0].fill_between(x, y, color='orange', alpha=0.2)
axs[0, 0].set_title("Beta Distribution PDF", fontsize=14)
axs[0, 0].set_xlabel("x", fontsize=12)
axs[0, 0].set_ylabel("Density", fontsize=12)
axs[0, 0].legend()
# 子图2:直方图和核密度估计 (KDE) 图
axs[0, 1].hist(sample_data, bins=30, density=True, alpha=0.6, color='dodgerblue', edgecolor='black', label="Sample Histogram")
axs[0, 1].plot(x, y, color='red', lw=2, label="Beta PDF")
axs[0, 1].set_title("Histogram and KDE", fontsize=14)
axs[0, 1].set_xlabel("x", fontsize=12)
axs[0, 1].set_ylabel("Density", fontsize=12)
axs[0, 1].legend()
# 子图3:累积分布函数 (CDF)
y_cdf = beta.cdf(x, alpha, beta_params)
axs[1, 0].plot(x, y_cdf, color='purple', lw=2, label=f'Beta CDF (α={alpha}, β={beta_params})')
axs[1, 0].fill_between(x, y_cdf, color='purple', alpha=0.2)
axs[1, 0].set_title("Cumulative Distribution Function (CDF)", fontsize=14)
axs[1, 0].set_xlabel("x", fontsize=12)
axs[1, 0].set_ylabel("Cumulative Probability", fontsize=12)
axs[1, 0].legend()
# 子图4:箱线图和小提琴图
axs[1, 1].boxplot(sample_data, vert=False, patch_artist=True, boxprops=dict(facecolor='lightgreen', color='green'),
medianprops=dict(color='green'), whiskerprops=dict(color='green'))
axs[1, 1].violinplot(sample_data, vert=False, showmedians=True, showmeans=True)
axs[1, 1].set_title("Box Plot and Violin Plot", fontsize=14)
axs[1, 1].set_xlabel("Sample Data", fontsize=12)
# 显示图形
plt.suptitle("Complex Analysis of Beta Distribution", fontsize=16, fontweight='bold')
plt.show()
Beta分布的PDF图:这是Beta分布的核心,可视化其概率密度函数 (PDF) 有助于理解其概率密度随位置变化的规律。 直方图和核密度估计 (KDE):显示样本数据的实际分布情况,并与Beta PDF曲线对比,帮助分析实际数据与理论分布的吻合度。 累积分布函数 (CDF):CDF展示累积概率,便于查看特定值的累积概率分布,是概率和分布特性分析中的重要工具。 箱线图和小提琴图:展示数据的离散程度和分布形态。箱线图提供五数概括,而小提琴图显示数据密度分布,更为详细。
最后