别再只会调包了,试着用 Numpy 手写一遍概率分布才算真正懂机器学习

大Jerry 高级 2026/7/25 440 浏览 11 点赞 约 2 分钟

很多开发者在接触机器学习时,习惯于直接调用 scikit-learnPyTorch 的内置函数,把概率分布当成一个“黑盒”参数。这种习惯在跑通 Demo 时没有问题,但当你真正面对长尾分布的数据集,或者在调优大模型采样参数时,如果缺乏对底层分布逻辑的直观感知,很容易在处理异常值或优化随机性时陷入盲目试错的困境。

别再只会调包了,试着用 Numpy 手写一遍概率分布才算真正懂机器学习

其实,理解概率分布最快的方式不是死磕数学定义,而是尝试将概率密度函数(PDF)直接翻译成可运行的代码。

以最基础的正态分布(Normal Distribution)为例。在 Python 环境中,我们通常使用 numpy.random.normal 来生成样本。这里有三个关键参数:loc(均值)、scale(标准差)和 size(样本量)。很多初学者会对 scale 的影响感到模糊,但当你实际运行 data = np.random.normal(loc=0, scale=1, size=1000) 并通过 np.std(data) 验证时,你会发现标准差实际上是控制分布“胖瘦”的刻度尺。如果将 scale 从 1 改为 5,数据点会迅速向两端扩散,这意味着在实际业务场景中,标准差越大,模型面对的噪声波动就越剧烈。

这种从代码到数学的映射能力,在理解 LLM(大语言模型)的采样机制时至关重要。现在大家经常讨论的“温度(Temperature)”参数,本质上就是在操作 Softmax 层的概率分布形状。

在模型预测下一个 Token 时,输出层会产生一组 logits。如果温度 $T=1$,分布保持原样;当 $T$ 趋向于 0 时,分布会变得极其“尖锐”,概率最高的词会被无限放大,其他词几乎被抹除,导致模型输出极其稳定但缺乏创造力;而当 $T$ 增加(例如 $T=1.5$)时,分布会被“压平”,原本概率较低的词获得了被选中的机会,这就是为什么高温度会让模型显得更随机、更有灵气,但也更容易产生幻觉。

如果你在构建 AI Agent 或进行数据增强,除了正态分布,还有三个分布值得在代码层面深挖:

首先是伯努利分布(Bernoulli Distribution)。它是所有二元分类任务的基石。在代码中模拟一个 $p=0.3$ 的伯努利分布,本质上就是生成一组 0 和 1,且 1 出现的频率为 30%。当你处理 Dropout 层时,其实就是在执行一个大规模的伯努利采样,随机丢弃神经元。

其次是泊松分布(Poisson Distribution)。它在模拟“单位时间内随机事件发生次数”时非常强大。比如在模拟用户请求的并发压力时,如果设定 $\lambda=5$(单位时间平均发生 5 次),通过 np.random.poisson(5, 1000) 产生的序列会告诉你,虽然平均值是 5,但实际出现 2 次或 8 次的情况依然频繁。

最后是 Beta 分布。这是贝叶斯优化中的核心,它被定义为“概率的概率”。在 A/B 测试或 Thompson Sampling 算法中,Beta 分布通过更新 $\alpha$ 和 $\beta$ 参数来动态调整对某个选项转化率的认知。

建议大家不要只盯着教科书,尝试用 matplotlib 把这几种分布的 PDF 曲线画出来,并对比不同参数下的形态变化。当你能通过代码直观感受到 locscale 改变时,数据分布在你眼中就不再是枯燥的公式,而是一组可控的动态形状。

求助
更多可复用的提示词工作流收录在ChatGPT提示词优化指南,有不少直接可参考的案例。

全部回复 (4)

程序员老陈 初级 2026/7/25
建议试试用numpy的random,比手写公式快多了,也稳。
0 回复
数据分析师大山 中级 2026/7/25
确实,之前调包调傻了,结果被异常值坑得差点加班到天亮。
0 回复
产品经理阿强 中级 2026/7/25
其实可以结合可视化看看,画个直方图对比一下分布才直观。
0 回复
大Max爱学习 初级 2026/7/25
@产品经理阿强 画图有用吗?很多时候分布稍微偏一点,可视化根本看不出来吧
0 回复

发表回复

支持 Markdown 格式