实现 8 个概率分布公式及可视化
这篇文章讲介绍几个常见的概率分布公式,以及将他们使用 G2 5.0 可视化出来。
概率和统计知识是数据科学和机器学习的核心,通过数据的分布,从而获取一些有用的信息,获得洞察和结论。
概率分布是一个数学函数,它给出了实验中不同可能结果的发生概率。
了解数据的分布有助于更好地模拟我们周围的世界。它可以帮助我们确定各种结果的可能性,或估计事件的可变性。所有这些都使得了解不同的概率分布在数据科学和机器学习中非常有价值。
均匀分布
最直接的分布是均匀分布。均匀分布是一种概率分布,其中所有结果的可能性均等。例如,如果我们掷一个公平的骰子,落在任何数字上的概率是 1/6。这是一个离散的均匀分布。
但是并不是所有的均匀分布都是离散的——它们也可以是连续的。它们可以在指定范围内取任何实际值。a 和 b 之间连续均匀分布的概率密度函数 (PDF) 如下:
让我们看看如何在可视化一个骰子的概率分布。
import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
autoFit: true,
});
const sapme = 10000;
const category = 6;
const data = new Array(sapme).fill(0).map(() => Math.floor(Math.random() * category));
chart
.interval()
.data(data)
.encode('x', d => d)
.transform({ type: 'groupX', y: 'count' })
.axis('y', { labelFormatter: '~s' });
chart.render();
高斯分布
高斯分布可能是最常听到也熟悉的分布。它有几个名字:有人称它为钟形曲线,因为它的概率图看起来像一个钟形,有人称它为高斯分布,因为首先描述它的德国数学家卡尔·高斯命名,还有一些人称它为正态分布,因为早期的统计学家 注意到它一遍又一遍地再次发生。
正态分布的概率密度函数如下:
σ 是标准偏差,μ 是分布的平均值。要注意的是,在正态分布中,均值、众数和中位数都是相等的。
当我们绘制正态分布的随机变量时,曲线围绕均值对称——一半的值在中心的左侧,一半在中心的右侧。并且,曲线下的总面积为 1。
import { Chart } from '@antv/g2';
const chart = new Chart({
container: 'container',
autoFit: true,
});
const u = 0;
const sigma = Math.sqrt(1);
const r = [u - 3 * sigma, u + 3 * sigma];
const sample = 100;
const x = new Array(sample + 1).fill(0).map((_, idx) => r[0] + (r[1] - r[0]) / sample * idx)
// 正态分布公式
const y = (x) => 1 / (sigma * Math.sqrt(2 * Math.PI)) * Math.exp(-0.5 * Math.pow((x - u) / sigma, 2))
chart
.area()
.data(x)
.encode('x', d => d)
.encode('y', y)
.encode('shape', 'smooth')
.style('fillOpacity', 0.4)
chart
.line()
.data(x)
.encode('x', d => d)
.encode('y', y)
.encode('shape', 'smooth')
.style('lineWidth', 2)
chart.render();
对于正态分布来说。经验规则告诉我们数据的百分比落在平均值的一定数量的标准偏差内。这些百分比是:
- 68% 的数据落在平均值的一个标准差内。
- 95% 的数据落在平均值的两个标准差内。
- 99.7% 的数据落在平均值的三个标准差范围内。
对数正态分布
对数正态分布是对数呈正态分布的随机变量的连续概率分布。因此,如果随机变量 X 是对数正态分布的,则 Y = ln(X) 具有正态分布。
这是对数正态分布的 PDF:
对数正态分布的随机变量只取正实数值。因此,对数正态分布会创建右偏曲线。
让我们在 G2 中绘制它。
import { Chart } from '@antv/g2';
function linspace(start, end, sample) {
return new Array(sample + 1).fill(0).map((_, idx) => start + (end - start) / sample * idx)
}
const x = linspace(0, 5, 500);
const y = (mu, sigma) => (x) => 1 / (x * sigma * Math.sqrt(2 * Math.PI)) * Math.exp(-Math.pow(Math.log(x) - mu, 2) / (2 * Math.pow(sigma, 2)))
const chart = new Chart({
container: 'container',
autoFit: true,
});
chart
.call(line, { mu: 0, sigma: 1, color: 'steelblue' })
.call(line, { mu: 0, sigma: 0.5, color: '#E3D78A' })
.call(line, { mu: 1, sigma: 1.5, color: 'green' })
chart.render();
function line(node, { mu, sigma, color }) {
node
.line()
.data(x)
.encode('x', (d) => d)
.encode('y', y(mu, sigma))
.encode('shape', 'smooth')
.scale('x', { domain: [0, 5] })
.style('lineWidth', 2)
.style('stroke', color);
}
泊松分布
泊松分布以法国数学家西蒙·丹尼斯·泊松的名字命名。这是一个离散的概率分布,这意味着它计算具有有限结果的事件——换句话说,它是一个计数分布。因此,泊松分布用于显示事件在指定时期内可能发生的次数。
如果一个事件在时间上以固定的速率发生,那么及时观察到事件的数量(n)的概率可以用泊松分布来描述。例如,顾客可能以每分钟 3 次的平均速度到达咖啡馆。我们可以使用泊松分布来计算 9 个客户在 2 分钟内到达的概率。
下面是概率质量函数公式:
λ 是一个时间单位的事件率——在我们的例子中,它是 3。k 是出现的次数——在我们的例子中,它是 9。
import { Chart } from '@antv/g2';
import { randomPoisson } from 'd3-random';
const random = randomPoisson(Math.pow(10, 2.6));
const chart = new Chart({
container: 'container',
autoFit: true,
});
chart
.rect()
.data(new Array(5000).fill(0).map(random))
.encode('x', (d) => d)
.transform({ type: 'binX', y: 'count' })
.style('stroke', 'white')
.style('fill', 'steelblue');
chart.render();
指数分布
指数分布是泊松点过程中事件之间时间的概率分布。指数分布的概率密度函数如下:
λ 是速率参数,x 是随机变量。
import { Chart } from '@antv/g2';
function linspace(start, end, sample) {
return new Array(sample + 1).fill(0).map((_, idx) => start + (end - start) / sample * idx)
}
const x = linspace(0, 5, 1000);
// 指数分布公式
const y = (lamda = 1) => (x) => lamda * Math.exp(-lamda * x);
const chart = new Chart({
container: 'container',
autoFit: true,
});
chart
.line()
.data(x)
.encode('x', d => d)
.encode('y', y())
.encode('shape', 'smooth')
.style('lineWidth', 2)
.style('stroke', 'steelblue')
chart.render();
二项分布
可以将二项分布视为实验中成功或失败的概率。有些人也可能将其描述为抛硬币概率。
参数为 n 和 p 的二项式分布是在 n 个独立实验序列中成功次数的离散概率分布,每个实验都问一个是 - 否问题,每个实验都有自己的布尔值结果:成功或失败。
本质上,二项分布测量两个事件的概率。一个事件发生的概率为 p,另一事件发生的概率为 1-p。
这是二项分布的公式:
- P = 二项分布概率
- = 组合数
- x = n次试验中特定结果的次数
- p = 单次实验中,成功的概率
- q = 单次实验中,失败的概率
- n = 实验的次数
可视化代码如下:
import { Chart } from '@antv/g2';
import { randomBinomial } from 'd3-random';
const random = randomBinomial(1, 0.5); // n = 1; p = 0.5
const chart = new Chart({
container: 'container',
autoFit: true,
});
chart
.rect()
.data(new Array(5000).fill(0).map(random))
.encode('x', (d) => d)
.transform({ type: 'binX', y: 'count' })
.style('stroke', 'white')
.style('fill', 'steelblue');
chart.render();
伽马分布
import { Chart } from '@antv/g2';
import { randomGamma } from 'd3-random';
import { sort } from 'd3-array';
const random = (k, theta = 1) => randomGamma(k, theta);
const chart = new Chart({
container: 'container',
autoFit: true,
});
chart
.call(gammaLine, { n: 1, color: 'steelblue' })
.call(gammaLine, { n: 2, color: '#E3D78A' })
.call(gammaLine, { n: 3, color: 'green' });
chart.render();
function gammaLine(node, { n, color }) {
node
.line()
.data(new Array(1000).fill(0).map(random(n)))
.encode('x', (d) => d)
.encode('shape', 'smooth')
.transform({ type: 'binX', y: 'count' })
.transform({ type: 'sortX', ordinal: false })
.style('lineWidth', 2)
.style('stroke', color);
}
总结
本文结合一系列的概率公式,然后基于 G2 可视化出来,可以直观的看到不同概率的分布,一方面让大家了解不同的概率分布公式,也让大家认识数据可视化带来的作用。
以上案例代码,都可以直接复制在G2 官网案例预览中运行和查看。
另外,本文内容参考:《Python 实现 8 个概率分布公式及可视化》,感谢提供的知识。
转载自:https://juejin.cn/post/7178670363994226744