程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了绘制由多峰分布确定的单峰分布大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决绘制由多峰分布确定的单峰分布?

开发过程中遇到绘制由多峰分布确定的单峰分布的问题如何解决?下面主要结合日常开发的经验,给出你关于绘制由多峰分布确定的单峰分布的解决方法建议,希望对你解决绘制由多峰分布确定的单峰分布有所启发或帮助;

我使用 GaussianMixture 来分析多峰分布。从 GaussianMixture 类中,我可以使用属性 @H_672_3@means_ 和 covariances_ 访问均值和协方差。我现在如何使用它们来绘制两个潜在的单峰分布?

我想过使用 scipy.stats.norm,但我不知道选择什么作为 locscale 的参数。所需的输出类似于附图所示。

绘制由多峰分布确定的单峰分布

此问题的示例代码是根据答案 here 修改的。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import mixture
from scipy.stats import norm

ls = np.linspace(0,60,1000)
multimodal_norm = norm.pdf(ls,5) + norm.pdf(ls,20,10)
plt.plot(ls,multimodal_norm)

# concatenate ls and multimodal to form an array of samples
# the shape is [n_samples,n_features]
# we reshape them to create an additional axis and concatenate along it
samples = np.concatenate([ls.reshape((-1,1)),multimodal_norm.reshape((-1,1))],axis=-1)
print(samples.shapE)

gmix = mixture.GaussianMixture(n_components = 2,covariance_type = "full")
fitted = gmix.fit(samples)

print(fitted.means_)
print(fitted.covariances_)

# The IDea is something like the following (not working):
new_norm1 = norm.pdf(ls,fitted.means_,fitted.covariances_)
new_norm2 = norm.pdf(ls,fitted.covariances_)
plt.plot(ls,new_norm1,label='norm 1')
plt.plot(ls,new_norm2,label='norm 2')

解决方法

您要实现的目标尚不完全清楚。您正在将 GaussianMixture 模型拟合到在统一网格上采样的两个高斯的 pdf 值之和与 unifrom 网格本身的串联。这不是高斯混合模型的拟合方式。通常,人们会将模型与从某种分布(通常未知但可以是模拟分布)中抽取的随机观察值拟合。

假设您想将 GaussianMixture 模型拟合到从高斯混合分布中抽取的样本。假设您知道预期结果是什么,大概是为了测试拟合效果如何。这是执行此操作的代码,既可以模拟正确的分布,又可以拟合模型。它打印拟合从样本中恢复的参数——我们观察到它们确实接近我们用来模拟样本的参数。最后生成拟合数据的 GaussianMixture 分布的密度图

import numpy as np
import matplotlib.pyplot as plt
from sklearn import mixture
from scipy.stats import norm

# set simulation parameters
mean1,std1,w1 = 0,5,0.5
mean2,std2,w2 = 20,10,1-w1

# simulate constituents
n_samples = 100000
np.random.seed(2021)
gauss_sample_1 = np.random.normal(loc = mean1,scale = std1,size = n_samples)
gauss_sample_2 = np.random.normal(loc = mean2,scale = std2,size = n_samples)
binomial = np.random.binomial(n=1,p=w1,size = n_samples)

# simulate gaussian mixture
mutlimodal_samples = (gauss_sample_1 * binomial + gauss_sample_2 * (1-binomial)).reshape(-1,1)

# define and fit the mixture model
gmix = mixture.GaussianMixture(n_components = 2,covariance_type = "full")
fitted = gmix.fit(mutlimodal_samples)

print('fitted means:',fitted.means_[0][0],fitted.means_[1][0])
print('fitted stdevs:',np.sqrt(fitted.covariances_[0][0][0]),np.sqrt(fitted.covariances_[1][0][0]))
print('fitted weights:',fitted.weights_)

# Plot component pdfs and a joint pdf
ls = np.linspace(-50,50,1000)
new_norm1 = norm.pdf(ls,np.sqrt(fitted.covariances_[0][0][0]))
new_norm2 = norm.pdf(ls,fitted.means_[1][0],np.sqrt(fitted.covariances_[1][0][0]))
multi_pdf = w1*new_norm1 + (1-w1)*new_norm2
plt.plot(ls,new_norm1,label='Norm pdf 1')
plt.plot(ls,new_norm2,label='Norm pdf 2')
plt.plot(ls,multi_pdf,label='multi-norm pdf')
plt.legend(loc = 'best')
plt.show()

结果是

fitted means: 22.358448018824642 0.8607494960575028
fitted stdevs: 8.770962351118127 5.58538485134623
fitted weights: [0.42517515 0.57482485]

正如我们所看到的,它们与模拟中的内容很接近(取决于它们的顺序,模型当然无法恢复,但无论如何都无关紧要):

@H_672_3@mean1,1-w1

以及密度及其部分的图。回想一下 GaussianMixture 的 pdf 不是 pdf 的总和,而是具有权重 w1,1-w1 的加权平均值:

绘制由多峰分布确定的单峰分布

大佬总结

以上是大佬教程为你收集整理的绘制由多峰分布确定的单峰分布全部内容,希望文章能够帮你解决绘制由多峰分布确定的单峰分布所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: