本文简要介绍 python 语言中 scipy.stats.vonmises_fisher
的用法。
用法:
scipy.stats.vonmises_fisher = <scipy.stats._multivariate.vonmises_fisher_gen object>#
冯 Mises-Fisher 变量。
mu 关键字指定平均方向向量。 kappa 关键字指定浓度参数。
- mu: array_like
分布的平均方向。必须是范数为 1 的一维单位向量。
- kappa: 浮点数
浓度参数。必须是正的。
- seed: {无,int,np.random.RandomState,np.random.Generator},可选
用于绘制随机变量。如果种子是None, 这RandomState使用单例。如果种子是一个 int,一个新的
RandomState
使用实例,用种子播种。如果种子已经是一个RandomState
或者Generator
实例,然后使用该对象。默认为None.
参数 ::
注意:
von Mises-Fisher 分布是单位超球面表面上的方向分布。单位向量 的概率密度函数为
其中 是平均方向, 是浓度参数, 是尺寸, 是第一类修正贝塞尔函数。由于 表示方向,因此它必须是单位向量,或者换句话说,超球面上的点: 。 是一个浓度参数,这意味着它必须为正值 ( ),并且随着 的增加,分布变得更窄。从这个意义上说,倒数 类似于正态分布的方差参数。
von Mises-Fisher 分布通常用作球体上正态分布的模拟。直观上,对于单位向量,有用的距离度量由它们之间的角度 给出。这正是 von Mises-Fisher 概率密度函数中的标量积 所说明的:平均方向 和向量 之间的角度。它们之间的角度越大,观察到该特定平均方向 的 的概率就越小。
在 2 维和 3 维中,使用专门的算法进行快速采样 [2]、[3]。对于 4 或更高的维度,使用[4]中说明的拒绝采样算法。该实现部分基于 geomstats 包 [5]、[6]。
参考:
[1]Von Mises-Fisher 分布,维基百科,https://en.wikipedia.org/wiki/Von_Mises%E2%80%93Fisher_distribution
[2]Mardia, K. 和 Jupp, P. 方向统计。威利,2000。
[3]J.文泽尔. S2 上 von Mises Fisher 分布的数值稳定采样。https://www.mitsuba-renderer.org/~wenzel/files/vmf.pdf
[4]Wood, A. von Mises Fisher 分布的模拟。 statistics-simulation 中的通信和计算 23, 1 (1994), 157-164。 https://doi.org/10.1080/03610919408813161
[5]地理统计器,Github。麻省理工学院许可证。访问时间:2023 年 1 月 6 日。 https://github.com/geomstats/geomstats
[6]米奥兰,N.等人。 Geomstats:机器学习中黎曼几何的 Python 包。机器学习研究杂志 21 (2020)。 http://jmlr.org/papers/v21/19-027.html
例子:
概率密度的可视化
绘制三个维度的概率密度以增加浓度参数。密度通过
pdf
方法计算。>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy.stats import vonmises_fisher >>> from matplotlib.colors import Normalize >>> n_grid = 100 >>> u = np.linspace(0, np.pi, n_grid) >>> v = np.linspace(0, 2 * np.pi, n_grid) >>> u_grid, v_grid = np.meshgrid(u, v) >>> vertices = np.stack([np.cos(v_grid) * np.sin(u_grid), ... np.sin(v_grid) * np.sin(u_grid), ... np.cos(u_grid)], ... axis=2) >>> x = np.outer(np.cos(v), np.sin(u)) >>> y = np.outer(np.sin(v), np.sin(u)) >>> z = np.outer(np.ones_like(u), np.cos(u)) >>> def plot_vmf_density(ax, x, y, z, vertices, mu, kappa): ... vmf = vonmises_fisher(mu, kappa) ... pdf_values = vmf.pdf(vertices) ... pdfnorm = Normalize(vmin=pdf_values.min(), vmax=pdf_values.max()) ... ax.plot_surface(x, y, z, rstride=1, cstride=1, ... facecolors=plt.cm.viridis(pdfnorm(pdf_values)), ... linewidth=0) ... ax.set_aspect('equal') ... ax.view_init(azim=-130, elev=0) ... ax.axis('off') ... ax.set_title(rf"$\kappa={kappa}$") >>> fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(9, 4), ... subplot_kw={"projection": "3d"}) >>> left, middle, right = axes >>> mu = np.array([-np.sqrt(0.5), -np.sqrt(0.5), 0]) >>> plot_vmf_density(left, x, y, z, vertices, mu, 5) >>> plot_vmf_density(middle, x, y, z, vertices, mu, 20) >>> plot_vmf_density(right, x, y, z, vertices, mu, 100) >>> plt.subplots_adjust(top=1, bottom=0.0, left=0.0, right=1.0, wspace=0.) >>> plt.show()
当我们增加集中参数时,点在平均方向周围变得更加聚集。
采样
使用
rvs
方法从分布中抽取 5 个样本,生成 5x3 数组。>>> rng = np.random.default_rng() >>> mu = np.array([0, 0, 1]) >>> samples = vonmises_fisher(mu, 20).rvs(5, random_state=rng) >>> samples array([[ 0.3884594 , -0.32482588, 0.86231516], [ 0.00611366, -0.09878289, 0.99509023], [-0.04154772, -0.01637135, 0.99900239], [-0.14613735, 0.12553507, 0.98126695], [-0.04429884, -0.23474054, 0.97104814]])
这些样本是球体 上的单位向量。为了验证,让我们计算它们的欧几里得范数:
>>> np.linalg.norm(samples, axis=1) array([1., 1., 1., 1., 1.])
绘制从 von Mises-Fisher 分布中绘制的 20 个观测值,以增加浓度参数 。红点突出显示平均方向 。
>>> def plot_vmf_samples(ax, x, y, z, mu, kappa): ... vmf = vonmises_fisher(mu, kappa) ... samples = vmf.rvs(20) ... ax.plot_surface(x, y, z, rstride=1, cstride=1, linewidth=0, ... alpha=0.2) ... ax.scatter(samples[:, 0], samples[:, 1], samples[:, 2], c='k', s=5) ... ax.scatter(mu[0], mu[1], mu[2], c='r', s=30) ... ax.set_aspect('equal') ... ax.view_init(azim=-130, elev=0) ... ax.axis('off') ... ax.set_title(rf"$\kappa={kappa}$") >>> mu = np.array([-np.sqrt(0.5), -np.sqrt(0.5), 0]) >>> fig, axes = plt.subplots(nrows=1, ncols=3, ... subplot_kw={"projection": "3d"}, ... figsize=(9, 4)) >>> left, middle, right = axes >>> plot_vmf_samples(left, x, y, z, mu, 5) >>> plot_vmf_samples(middle, x, y, z, mu, 20) >>> plot_vmf_samples(right, x, y, z, mu, 100) >>> plt.subplots_adjust(top=1, bottom=0.0, left=0.0, ... right=1.0, wspace=0.) >>> plt.show()
该图显示,随着浓度 的增加,所得样本更加集中在平均方向周围。
拟合分布参数
可以使用返回估计参数的
fit
方法将分布拟合到数据。作为一个玩具示例,让我们将分布拟合到从已知 von Mises-Fisher 分布中抽取的样本。>>> mu, kappa = np.array([0, 0, 1]), 20 >>> samples = vonmises_fisher(mu, kappa).rvs(1000, random_state=rng) >>> mu_fit, kappa_fit = vonmises_fisher.fit(samples) >>> mu_fit, kappa_fit (array([0.01126519, 0.01044501, 0.99988199]), 19.306398751730995)
我们看到估计的参数mu_fit和kappa_fit非常接近地面实况参数。
相关用法
- Python SciPy stats.vonmises_line用法及代码示例
- Python SciPy stats.vonmises用法及代码示例
- Python SciPy stats.variation用法及代码示例
- Python SciPy stats.anderson用法及代码示例
- Python SciPy stats.iqr用法及代码示例
- Python SciPy stats.genpareto用法及代码示例
- Python SciPy stats.skewnorm用法及代码示例
- Python SciPy stats.cosine用法及代码示例
- Python SciPy stats.norminvgauss用法及代码示例
- Python SciPy stats.directional_stats用法及代码示例
- Python SciPy stats.invwishart用法及代码示例
- Python SciPy stats.bartlett用法及代码示例
- Python SciPy stats.levy_stable用法及代码示例
- Python SciPy stats.page_trend_test用法及代码示例
- Python SciPy stats.itemfreq用法及代码示例
- Python SciPy stats.exponpow用法及代码示例
- Python SciPy stats.gumbel_l用法及代码示例
- Python SciPy stats.chisquare用法及代码示例
- Python SciPy stats.semicircular用法及代码示例
- Python SciPy stats.gzscore用法及代码示例
- Python SciPy stats.gompertz用法及代码示例
- Python SciPy stats.normaltest用法及代码示例
- Python SciPy stats.dirichlet_multinomial用法及代码示例
- Python SciPy stats.genlogistic用法及代码示例
- Python SciPy stats.skellam用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.vonmises_fisher。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。