Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 绘制由多峰分布确定的单峰分布_Python_Distribution_Gaussian_Multimodal - Fatal编程技术网

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

Python 绘制由多峰分布确定的单峰分布,python,distribution,gaussian,multimodal,Python,Distribution,Gaussian,Multimodal,我曾经分析过多模式分布。从GaussianMixture类中,我可以使用属性means_u和协方差_u访问均值和协方差。现在如何使用它们来绘制两个基本的单峰分布 我想使用,但我不知道选择什么作为loc和scale的参数。所需输出类似于附图所示 此问题的示例代码根据答案进行了修改 现在还不完全清楚你想要完成什么。将高斯混合模型拟合为在统一网格上采样的两个高斯的PDF值之和与统一网格本身的连接。这不是高斯混合模型的拟合方式。通常情况下,一个模型适用于从某些分布中得出的随机观测值,这些分布通常未知,但

我曾经分析过多模式分布。从GaussianMixture类中,我可以使用属性means_u和协方差_u访问均值和协方差。现在如何使用它们来绘制两个基本的单峰分布

我想使用,但我不知道选择什么作为loc和scale的参数。所需输出类似于附图所示

此问题的示例代码根据答案进行了修改


现在还不完全清楚你想要完成什么。将高斯混合模型拟合为在统一网格上采样的两个高斯的PDF值之和与统一网格本身的连接。这不是高斯混合模型的拟合方式。通常情况下,一个模型适用于从某些分布中得出的随机观测值,这些分布通常未知,但可以是模拟分布

假设您想将高斯混合模型拟合到从高斯混合分布中提取的样本。假设你知道预期结果是什么,那么你就可以测试拟合效果如何。下面是执行此操作的代码,用于模拟正确的分布和拟合模型。它打印拟合从样本中恢复的参数-我们观察到它们确实与我们用来模拟样本的参数非常接近。最后生成适合数据的高斯混合分布密度图

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, fitted.means_[0][0], 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]
正如我们所看到的,它们接近于它们的排序,这当然是模型无法恢复的,但它与进入模拟的内容无关:

mean1, std1, w1 = 0,5,0.5
mean2, std2, w2 = 20,10,1-w1
以及密度图及其各部分。回想一下,高斯混合的pdf不是pdf的总和,而是权重为w1,1-w1的加权平均值:


我不明白,为什么你要在等距向量和多模范数上做高斯混合?我想我把提到y的地方搞砸了。我用以下内容替换了这条线:samples=multimodal_norm.reforme-1,1您一开始的假设是完全正确的。我对这段代码考虑得不够多,我的代码是基于这段代码编写的。此外,我对结果的期望是错误的,因为我不知道高斯混合是一个加权和。
mean1, std1, w1 = 0,5,0.5
mean2, std2, w2 = 20,10,1-w1