文章目录
一、说明
高斯分布是典型的连续函数的概率分布。然而,现实中我们只能用离散形式去表述,而使用连续分布在计算机上,就是需要技巧的。
二、关于高斯分布
高斯分布, 的,又称 正态分布, 的,是统计学和机器学习中最重要的概率分布之一。它的特点是钟形曲线,由两个参数定义:平均 (μ) 和标准差 (σ)。
概率密度函数 (PDF) 的高斯分布由下式给出:
此处:
平均(μ) 是分布的平均值,
方差 (σ²) 是分布的方差,
标准差 (σ) 是方差的平方根。
e (exp) 表示指数函数。
pi (Π) 是表示圆的周长与其直径之比的数学常数。它大约等于3.14159
可视化平均值和标准的高斯分布:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# Parameters for different Gaussian distributions
params = [
{'mean': 0, 'std_dev': 1, 'color': 'blue'},
{'mean': 2, 'std_dev': 0.5, 'color': 'green'},
{'mean': -3, 'std_dev': 2, 'color': 'red'}
]
# Generate the x-axis values
x = np.linspace(-10, 10, 1000)
# Plot each Gaussian distribution
plt.figure(figsize=(10, 6))
for param in params:
mean = param['mean']
std_dev = param['std_dev']
color = param['color']
# Calculate the Gaussian distribution
y = norm.pdf(x, mean, std_dev)
# Plot the distribution
plt.plot(x, y, color=color, label=f'Mean: {mean}, Std Dev: {std_dev}')
# Add titles and labels
plt.title('Gaussian Distributions with Different Means and Standard Deviations')
plt.xlabel('x')
plt.ylabel('Probability Density')
plt.legend()
# Show the plot
plt.grid(True)
plt.show()
这是上述代码的输出:
注: 高斯分布围绕均值对称。
68–95–99.7 规则
68–95–99.7法则,也称为经验法则, 是一个简写,用于记住正态分布中与平均值存在一定数量标准差范围内的值的百分比。在数学表示法中,这些事实可以表达如下,其中 Pr() 是概率函数, Χ 是来自正态分布随机变量的观察, μ (mu) 是分布的平均值,并且 σ (sigma) 是其标准差:
68%锛屽悓姣斿% 的数据属于其中 一个标准差 的平均值。
95% 的数据属于其中 两个标准差 的平均值。
99.7% 的数据属于其中 三个标准差 的平均值。
Python 代码可视化 68–95–99.7 规则
### Python Code to Visualize the 68-95-99.7 Rule
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# Mean and standard deviation
mean = 0
std_dev = 1
# Generate x values
x = np.linspace(-4, 4, 1000)
# Calculate the y values for the Gaussian distribution
y = norm.pdf(x, mean, std_dev)
# Create the plot
plt.figure(figsize=(12, 6))
plt.plot(x, y, label='Normal Distribution', color='blue')
# Fill areas under the curve
plt.fill_between(x, y, where=(x >= mean - std_dev) & (x <= mean + std_dev), color='green', alpha=0.5, label='68% (1 std dev)')
plt.fill_between(x, y, where=(x >= mean - 2 * std_dev) & (x <= mean + 2 * std_dev), color='yellow', alpha=0.3, label='95% (2 std dev)')
plt.fill_between(x, y, where=(x >= mean - 3 * std_dev) & (x <= mean + 3 * std_dev), color='red', alpha=0.2, label='99.7% (3 std dev)')
# Add titles and labels
plt.title('Visualization of the 68-95-99.7 Rule in a Normal Distribution')
plt.xlabel('x')
plt.ylabel('Probability Density')
plt.legend()
# Show the plot
plt.grid(True)
plt.show()
这是上述代码的输出:
在实证科学中,所谓的 三西格玛经验法则 (or 3σ 规则)表达了一种传统的启发式方法,即几乎所有值都被视为位于平均值的三个标准差范围内,因此将 99.7% 的概率视为接近确定性在经验上是有用的。
三、高斯分布的重要类型
在机器学习中,高斯分布的一些重要类型包括:
标准正态分布: 这是一条钟形曲线,带有 平均值为 0,标准差为 1。它常用于许多机器学习模型和算法,例如线性回归和逻辑回归。
多变量正态分布: 该分布用于对多个随机变量的联合分布进行建模。它在高斯混合物模型 (GMM)、主成分分析 (PCA) 和线性判别分析 (LDA) 等技术中至关重要。
Python代码来说明它们两者:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm, multivariate_normal
# Generate data for Standard Normal Distribution
data_standard = np.random.randn(1000)
# Generate data for Multivariate Normal Distribution
mean = [0, 0]
covariance_matrix = [[1, 0.5], [0.5, 1]]
data_multivariate = np.random.multivariate_normal(mean, covariance_matrix, 1000)
# Plot Standard Normal Distribution (Histogram and PDF)
plt.figure(figsize=(10, 8))
plt.subplot(2, 1, 1)
plt.hist(data_standard, bins=30, density=True, color='skyblue', edgecolor='black', alpha=0.7, label='Standard Normal Distribution')
x = np.linspace(-4, 4, 1000)
plt.plot(x, norm.pdf(x, 0, 1), 'r-', label='Standard Normal PDF')
plt.legend()
plt.title('Standard Normal Distribution')
plt.xlabel('Values')
plt.ylabel('Density')
# Plot Multivariate Normal Distribution (Scatter Plot)
plt.subplot(2, 1, 2)
plt.scatter(data_multivariate[:, 0], data_multivariate[:, 1], color='orange', alpha=0.5, label='Multivariate Normal Distribution')
plt.legend()
plt.title('Multivariate Normal Distribution')
plt.xlabel('X')
plt.ylabel('Y')
plt.tight_layout()
plt.show()
代码的输出:
四、了解 Python 中智商分数的 Z 核心和概率计算
问题。让我们考虑一个群体的智商分数,已知该分数遵循正态分布,其中 a 100的平均(μ) 和一个 15的标准差(σ)。我们想找到一个人拥有智商的概率 85到115之间。
回答
要找到一个人的智商在 85 到 115 之间的概率,我们需要遵循以下步骤:
第 1 步:计算 Z 分数
Z 分数是衡量数据点与平均值有多少标准差的指标。Yong公式计算得出:
其中 X 是值 (在这种情况下,IQ 分数),μ 是平均值 (100),σ 是标准差 (15)。
85的智商分数:
115的智商分数:
第 2 步:查找与 Z 分数相关的概率
我们使用标准正态分布的累积分布函数 (CDF) 来查找与 Z 分数相对应的概率。
对于与 85 IQ( 相关的 -1 ) 的 Z 分数:
对于 1 ( 的 Z 分数与 115 IQ) 相关:
3步:计算智商在85到115之间的概率
IQ介于85和115之间的概率, 我们从低于115的概率中减去低于85的概率:
P(85 < X < 115) = P(Z < 1) — P(Z < -1)
P(85 < X < 115) = 0.8413–0.1587
P(85 < X < 115) = 0.6826
因此,一个人的智商在 85 到 115 之间的概率是 0.6826。
python 代码来解决这个问题,这里有相应的代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
mu = 100
sigma = 15
z1 = (85 - mu) / sigma
z2 = (115 - mu) / sigma
prob_85 = norm.cdf(z1)
prob_115 = norm.cdf(z2)
prob_between = prob_115 - prob_85
# Plotting the standard normal distribution
x = np.linspace(-3, 3, 1000)
y = norm.pdf(x, 0, 1) # PDF of standard normal distribution
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='Standard Normal Distribution PDF')
plt.fill_between(x, 0, y, where=(x >= z1) & (x <= z2), color='skyblue', alpha=0.5, label='P(85 < X < 115)')
plt.title('Standard Normal Distribution with Probability Area for IQ Scores between 85 and 115')
plt.xlabel('Z-score')
plt.ylabel('Probability Density')
plt.legend()
plt.grid()
plt.show()
print(f"The probability that an individual has an IQ between 85 and 115 is: {prob_between:.4f}")
代码的输出图形:
注:请看这两种计算:
这些概率是从标准正态分布表或统计软件包(例如 Python 的 SciPy 库)获得的标准值。
您可以在互联网上找到具有不同 Z 分数累积概率的标准正态分布表,或者使用 Python 中的 SciPy 库计算这些概率。的规范.cdf()SciPy
中的功能统计数据
模块计算 累积分布函数 (CDF) 给定的标准正态分布 Z 分数。在下面的代码中,norm.cdf(z_scors)
计算提供的 Z 分数数组的累积概率。
这是 Python 中选定 Z 分数的标准正态分布表:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
z_scores = np.array([-3.0, -2.5, -2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0])
probabilities = norm.cdf(z_scores)
plt.figure(figsize=(16, 10))
plt.plot(z_scores, probabilities, marker='o', linestyle='-')
for i, prob in enumerate(probabilities):
plt.text(z_scores[i], prob, f'{prob:.4f}', ha='right' if i % 2 == 0 else 'left', va='bottom', bbox=dict(facecolor='green', alpha=0.5))
plt.title('Standard Normal Distribution Cumulative Probabilities for Specific Z-Scores')
plt.xlabel('Z-Score')
plt.ylabel('Cumulative Probability (P(Z < z))')
plt.grid()
plt.show()
这是上述代码的输出: