Menu
CoddyTech

密度直方图

本课属于 Coddy Machine Learning 学习旅程的“机器学习统计学”单元。第 7 课,共 64 课。

本章将介绍数据的形状。学完本章后,你将能为直方图拟合钟形曲线,并找出异常值:

一张包含 300 个甜瓜重量的直方图,图上叠加了一条平滑的橙色钟形曲线,最轻的甜瓜下方有一个红点

首先,先修正一个问题。计数会让人数多的群体压过人数少的群体,例如 500 名成年人的反应时间对比 50 名游戏玩家的反应时间:

两张图展示了相同的反应时间。左图为计数:500 名成年人远远超过 50 名游戏玩家,游戏玩家的柱子几乎看不见。右图为 density=True:两个群体都完整显示,游戏玩家反应更快,数据也更集中

density=True 会对每组进行缩放,使其柱形面积之和为 1:

ax.hist(adults, bins=16, density=True, alpha=0.5, label="adults")
ax.hist(gamers, bins=16, density=True, alpha=0.5, label="gamers")

每个柱子的高度为 count / (n * bin width),因此柱子的面积表示它在组中的占比。现在,无论组的大小如何,都可以公平地进行比较。

challenge icon

挑战

简单

一家城市医院称量了 400 名新生儿,另一家乡村医院称量了 60 名。初始代码将体重保存在 city 和 rural 中,并设置好了标题和标签。

  1. 为每组绘制密度直方图,使用 bins=10、alpha=0.5,并将标签设为 city 或 rural。
  2. 添加图例并显示图表。

Coddy 会描述你的图表。它应该像下面这张来自两位番茄种植者的图表:

标题为番茄重量的两组半透明密度直方图:农场番茄约为 90 到 200 克,花园番茄较轻,大多为 95 到 145 克,并带有图例

亲手试试

import numpy as np
import matplotlib.pyplot as plt

# 不要修改下面的代码
rng = np.random.default_rng(23)
city = np.round(rng.normal(3.4, 0.5, size=400), 2)
rural = np.round(rng.normal(3.2, 0.45, size=60), 2)

fig, ax = plt.subplots()
ax.set_title("Birth Weights")
ax.set_xlabel("Weight (kg)")
ax.set_ylabel("Density")

# 在下面编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

机器学习统计学中的所有课

自己练习: Python 在线编译器