如何获得贝叶斯高斯混合模型的平滑连续 pdf?
Posted
技术标签:
【中文标题】如何获得贝叶斯高斯混合模型的平滑连续 pdf?【英文标题】:How to get a smooth continuous pdf of a Bayesian Gaussian mixture model? 【发布时间】:2021-12-28 23:05:58 【问题描述】:给定下面的代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import BayesianGaussianMixture
df = pd.read_csv("dataset", delimiter=" ")
data = df.to_numpy()
X_train = np.reshape(data, (10*data.shape[0],2))
bgmm = BayesianGaussianMixture(n_components=15,
random_state=7,
max_iter=5000,
n_init=10,
weight_concentration_prior_type="dirichlet_distribution")
bgmm.fit(X_train)
logprob = bgmm.score_samples(X_train)
pdf = np.exp(logprob)
x = np.linspace(0, 1, num=20)
plt.plot(x, pdf, '-k', label='Mixture PDF')
plt.show()
我得到以下离散 pdf:
如何绘制此 pdf 的平滑连续版本?
编辑:
Here is the the dataset:
[[6.11507621 6.2285484 ]
[5.61154419 7.4166868 ]
[5.3638034 8.64581576]
[8.58030274 6.01384676]
[2.06883754 8.5662325 ]
[7.772149 2.29177372]
[0.66223423 0.01642353]
[7.42461573 5.46288677]
[0.82355307 3.60322705]
[1.12966405 9.54888118]
[4.34716189 3.63203485]
[7.95368286 5.74659859]
[3.21564946 3.67576324]
[6.48021187 7.35190659]
[3.02668358 4.41981514]
[0.01745485 7.49153586]
[1.08490595 0.91004064]
[1.89995405 0.38728879]
[4.40549506 2.48715052]
[4.52857064 1.24935027]]
【问题讨论】:
不确定发生了什么,但在linspace
的参数中尝试num=200
或类似的东西。
@RobertDodier:pdf
变量仅包含 20 个条目。因此,在绘图时选择除 num=20
之外的任何内容都会导致不匹配。
好吧,高斯混合是一个连续函数,因此即使这些部分不在数据集中,您也可以通过在许多点上评估它来增加绘图的平滑度。无论如何,如果您发布您正在使用的数据集,这不会有什么坏处。
@RobertDodier:如果您检查编辑,我刚刚添加了数据集。
我认为绘制的不是 GM 的 pdf;要么你想绘制其他东西(不是 pdf),要么你想绘制 pdf,你需要改变绘图的东西。我假设您确实需要 pdf,在这种情况下,您需要构建一个与数据样本范围大致相同的二维网格,并在该网格上评估 GM pdf。如果您只有 20 个数据点,您可能只想使用几个凹凸(比如说 2 或 3 个)。
【参考方案1】:
如果数据是 2D 中的 x 和 y 值,您可以尝试以下代码开始实验:
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.mixture import BayesianGaussianMixture
data = np.array([[6.11507621, 6.2285484], [5.61154419, 7.4166868], [5.3638034, 8.64581576], [8.58030274, 6.01384676],
[2.06883754, 8.5662325], [7.772149, 2.29177372], [0.66223423, 0.01642353], [7.42461573, 5.46288677],
[0.82355307, 3.60322705], [1.12966405, 9.54888118], [4.34716189, 3.63203485], [7.95368286, 5.74659859],
[3.21564946, 3.67576324], [6.48021187, 7.35190659], [3.02668358, 4.41981514], [0.01745485, 7.49153586],
[1.08490595, 0.91004064], [1.89995405, 0.38728879], [4.40549506, 2.48715052], [4.52857064, 1.24935027]])
X_train = data
bgmm = BayesianGaussianMixture(n_components=15,
random_state=7,
max_iter=5000,
n_init=10,
weight_concentration_prior_type="dirichlet_distribution")
bgmm.fit(X_train)
# create a mesh of points with x and y values going from -1 to 11
x, y = np.meshgrid(np.linspace(-1, 11, 30), np.linspace(-1, 11, 30))
# recombine x and y to tuples
xy = np.array([x.ravel(), y.ravel()]).T
logprob = bgmm.score_samples(xy)
pdf = np.exp(logprob).reshape(x.shape)
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 6))
# show the result of bgmm.score_samples on a mesh
ax1.imshow(pdf, extent=[-1, 11, -1, 11], cmap='Blues', interpolation='bilinear', origin='lower')
# show original data in red
ax1.scatter(data[:, 0], data[:, 1], color='red')
ax1.set_title('BayesianGaussianMixture')
# create a seaborn kdeplot from the same data
sns.kdeplot(x=data[:, 0], y=data[:, 1], fill=True, ax=ax2)
ax2.scatter(data[:, 0], data[:, 1], color='red')
ax2.set_aspect('equal', 'box')
ax2.set_xlim(-1, 11)
ax2.set_ylim(-1, 11)
ax2.set_title('Seaborn kdeplot')
plt.tight_layout()
plt.show()
【讨论】:
谢谢,但是当我运行代码时,它会抛出:sns.kdeplot(x=data[:, 0], y=data[:, 1], fill=True, ax=ax2) TypeError: kdeplot() missing 1 required positional argument: 'data'
我用最新的 seaborn 版本 0.11.2 试过这个以上是关于如何获得贝叶斯高斯混合模型的平滑连续 pdf?的主要内容,如果未能解决你的问题,请参考以下文章