超全面讲透一个分布模型,正态分布!!

文摘   2024-11-11 14:27   北京  

大家好,我们来聊聊正态分布

一篇文章,带你读懂~

想象一下,你们班考完数学,老师把所有同学的成绩统计出来,发现绝大多数同学的分数集中在70到80分之间,有几个学霸考了90多分,也有一些同学可能刚刚及格,甚至不及格。这种情况是不是挺常见的?高分和低分的人少,大部分同学成绩集中在某个范围里。

这就是正态分布的典型特征!它其实就是一种「大部分集中,中间多,两头少」的分布形状。在数学里,这种形状很经典,是个对称的“钟形”曲线,又叫“钟形曲线”。

正态分布的特点

  1. 平均值在中间:大多数人的成绩集中在一个「平均值」附近(比如70分左右)。
  2. 对称性:成绩的分布在平均值左右是对称的。比方说,考70分左右的最多,向左右两边走,分数越来越高或越来越低的人数就越来越少。
  3. 极端少见:特别高或特别低的成绩很少见,少数人会考到90分以上或低于50分。

举几个例子

这几个例子结束后,你会立刻明白一些东西~

  1. 身高:一般来说,大多数人的身高是集中在一个范围里的,比如成年男性大多数身高在170-180厘米之间,特别高的(比如190以上)和特别矮的(比如160以下)就会比较少,正好符合正态分布的钟形曲线。
  2. 体重:同样,大部分人的体重会在一个平均值附近,比如男性平均在70公斤左右,那么特别胖或者特别瘦的人就相对少,体重分布也是正态的。
  3. 考试成绩:刚才提到的考试成绩也是正态分布的一个好例子。大部分人考中等分数,极高分和极低分的同学比较少。

正态分布为什么重要?

正态分布之所以重要,是因为很多实际现象都符合这种规律,比如人的身高、考试成绩,甚至是股票市场中每天的波动幅度。所以研究正态分布,能帮助我们理解和预测这些「大部分集中,中间多,两头少」的现象。

总的来说,正态分布就是一种「中间多、两头少」的对称分布,生活中很多现象都会符合这个规律。当你看到很多数据大多数集中在某个值附近、两边逐渐减少的时候,就可以猜测这可能是个正态分布。

完整案例

我们使用Python模拟生成一个正态分布的虚拟数据集,计算其统计特征,并基于公式绘制正态分布曲线和一些数据分析图表。我们逐步推导正态分布的公式并使用它来生成分布曲线,大家对于原理理解起来会更加的通透。

核心公式

正态分布的概率密度函数(PDF)公式如下:

  • : 均值(数据的集中位置)
  • : 标准差(数据的离散程度)

在代码中,我们会:

  1. 生成一个符合正态分布的虚拟数据集。
  2. 计算其均值和标准差,并基于公式绘制正态分布的曲线。
  3. 展示一些数据分析的图形。

完整代码

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm

# 生成符合正态分布的虚拟数据集
np.random.seed(42)   # 设置随机种子,保证可重复性
mu, sigma = 7010   # 均值为70,标准差为10
data = np.random.normal(mu, sigma, 1000)  # 生成1000个符合正态分布的数据

# 计算均值和标准差
mean = np.mean(data)
std_dev = np.std(data)

# 定义正态分布函数
def normal_dist(x, mean, std_dev):
    return (1 / (np.sqrt(2 * np.pi * std_dev ** 2))) * np.exp(-((x - mean) ** 2) / (2 * std_dev ** 2))

# 设置x轴的范围用于绘制曲线
x_values = np.linspace(mean - 4*std_dev, mean + 4*std_dev, 1000)
y_values = normal_dist(x_values, mean, std_dev)

# 假设已有的数据和参数
data = np.random.normal(loc=0, scale=1, size=1000)  # 示例正态分布数据
x_values = np.linspace(-551000)  # x 轴的取值范围
y_values = norm.pdf(x_values, loc=0, scale=1)  # 正态分布的概率密度函数
mean = np.mean(data)  # 计算数据的均值
std_dev = np.std(data)  # 计算数据的标准差

# 创建图表
fig, axes = plt.subplots(22, figsize=(1410))
fig.suptitle('Normal Distribution Dataset Analysis', fontsize=16, color='navy')

# 1. 正态分布的概率密度函数曲线
axes[00].plot(x_values, y_values, color='magenta', lw=2, label='Normal Distribution Curve')
axes[00].hist(data, bins=30, density=True, color='skyblue', alpha=0.6, label='Data Histogram')
axes[00].set_title('Normal Distribution Curve and Histogram')
axes[00].set_xlabel('Value')
axes[00].set_ylabel('Probability Density')
axes[00].legend()

# 2. 数据的盒须图(展示分布的偏态和离群点)
sns.boxplot(data=data, ax=axes[01], color='orange')
axes[01].set_title('Boxplot of Data')
axes[01].set_ylabel('Value')

# 3. 数据的累积分布函数(CDF)
sorted_data = np.sort(data)
cdf = np.arange(len(sorted_data)) / float(len(sorted_data))
axes[10].plot(sorted_data, cdf, color='green', lw=2)
axes[10].set_title('Cumulative Distribution Function (CDF)')
axes[10].set_xlabel('Value')
axes[10].set_ylabel('Cumulative Probability')

# 4. Q-Q 图(检验数据是否符合正态分布)
theoretical_quantiles = norm.ppf((np.arange(len(data)) + 1) / (len(data) + 1), mean, std_dev)
axes[11].scatter(theoretical_quantiles, sorted_data, color='purple')
axes[11].plot(theoretical_quantiles, theoretical_quantiles, color='red', lw=2, linestyle='--', label='Theoretical Line')
axes[11].set_title('Q-Q Plot')
axes[11].set_xlabel('Theoretical Quantiles')
axes[11].set_ylabel('Actual Quantiles')
axes[11].legend()

plt.tight_layout(rect=[0010.96])
plt.show()

咱们详细的解释一下代码中的核心内容:

  1. 正态分布曲线及直方图:第一个图展示了生成的数据的直方图,显示了数据的大致分布。粉色曲线是我们根据正态分布公式绘制的理论概率密度函数,用于比较数据与理论正态分布的吻合程度。

  2. 盒须图(Box Plot):盒须图帮助我们观察数据的离群点和整体分布范围。可以快速看到数据的偏态和离群值的位置。

  3. 累积分布函数(CDF):累积分布函数展示了数值在不同位置上的累计概率。例如,可以从中看到有约50%的数据小于均值位置,CDF曲线也可以帮助判断数据的集中度。

  4. Q-Q 图(Quantile-Quantile Plot):Q-Q 图用于判断数据是否符合正态分布。若数据是正态分布,实际分位数和理论分位数应大致落在红色的对角线上。这是验证正态性的一种方法。

最后

通过这个案例,给大家展现了这种从零实现 GBDT 的过程能帮助你更好地理解梯度提升决策树的核心原理。
最近准备了16大块的内容,124个算法问题的总结,完整的机器学习小册,免费领取~
另外,今天给大家准备了关于「深度学习」的论文合集,往期核心论文汇总,分享给大家。
点击名片,回复「深度学习论文」即可~
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~

机器学习和人工智能AI
让我们一起期待 AI 带给我们的每一场变革!推送最新行业内最新最前沿人工智能技术!
 最新文章