Numpy Python & Scipy:如何拟合von Mises分布

Numpy Python & Scipy:如何拟合von Mises分布

在本文中,我们将介绍如何使用Numpy、Python和Scipy对数据拟合一个von Mises分布。von Mises分布是一个圆上连续概率分布,它通常用于描述循环变量,例如方向。它的概率密度函数(PDF)可表示为:

f(xμ,κ)=eκcos(xμ)2πI0(κ)f(x | \mu, \kappa) = \frac{e^{\kappa \cos(x – \mu)}}{2 \pi I_0(\kappa)}

其中,μ\mu是分布的平均方向,κ\kappa是分布的聚集度,I0I_0是第一类修正贝塞尔函数。我们的目标是拟合一个von Mises分布到我们的数据上,以获得分布的μ\muκ\kappa参数。

阅读更多:Numpy 教程

生成模拟数据

首先,我们将创建一些模拟数据,使用Numpy的vonmises函数。我们设置μ=0\mu=0κ=4\kappa=4,生成1000个样本。

import numpy as np

np.random.seed(42)

mu = 0
kappa = 4

data = np.random.vonmises(mu, kappa, size=1000)
Python

现在我们有了一个数据集,它的值是从von Mises分布中随机抽取的。

绘制直方图

接下来,我们可以绘制数据的直方图,以查看它的形状。我们使用Matplotlib绘图工具包:

import matplotlib.pyplot as plt

n_bins = 50
plt.hist(data, bins=n_bins)
plt.show()
Python

我们可以看到,数据呈现出一个钟形曲线,类似于正态分布,但是在圆上。这是一个典型的von Mises分布的形状。

定义拟合函数

接下来,我们定义一个函数,该函数将拟合von Mises分布到我们的数据上,并返回拟合分布的μ\muκ\kappa参数。我们使用Scipy的最小二乘拟合函数,在拟合函数中定义von Mises分布的PDF。

from scipy.optimize import curve_fit
from scipy.special import i0

def von_mises_fit(data):
    def von_mises_pdf(x, mu, kappa):
        return np.exp(kappa * np.cos(x - mu)) / (2 * np.pi * i0(kappa))

    hist, bin_edges = np.histogram(data, 50, density=True)
    bin_centers = (bin_edges[:-1] + bin_edges[1:]) / 2

    popt, _ = curve_fit(von_mises_pdf, bin_centers, hist, p0=[0, 1])

    return popt[0], popt[1]
Python

在拟合函数von_mises_fit中,我们首先使用Numpy计算数据的直方图和直方图bins。然后,我们定义von Mises分布的PDF函数von_mises_pdf。最后,我们使用Scipy的曲线拟合函数curve_fit,在拟合函数中使用数据的直方图和PDF函数来拟合参数μ\muκ\kappa

对数据进行拟合

现在我们已经定义了我们的拟合函数,我们可以将它应用到我们的模拟数据上:

mu_fit, kappa_fit = von_mises_fit(data)

print("mu_fit =", mu_fit)
print("kappa_fit =", kappa_fit)
Python

在这里,我们将拟合的μ\muκ\kappa参数打印出来。我们可以看到,拟合的参数与生成数据时的参数μ=0\mu=0κ=4\kappa=4相当接近。

绘制拟合曲线

我们可以将拟合分布绘制到原始数据的直方图上,以便查看其拟合质量。

plt.hist(data, bins=n_bins, density=True)

x = np.linspace(-np.pi, np.pi, 1000)
pdf = np.exp(kappa_fit * np.cos(x - mu_fit)) / (2 * np.pi * i0(kappa_fit))
plt.plot(x, pdf, 'r')
plt.show()
Python

在这里,我们使用拟合的μ\muκ\kappa参数计算von Mises分布的PDF,并将PDF绘制为红色曲线。我们可以看到,红色曲线几乎完全覆盖了原始数据的直方图,这表明我们的拟合曲线与数据非常吻合。

总结

在本文中,我们介绍了如何使用Numpy、Python和Scipy拟合一个von Mises分布到数据上。我们首先生成了一个von Mises分布的模拟数据集,然后定义了一个拟合函数,并使用Scipy的最小二乘拟合函数拟合函数来拟合数据拟合分布的μ\muκ\kappa参数。最后,我们使用Matplotlib工具包将拟合分布绘制到原始数据的直方图上,以便查看其拟合质量。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册