我想模拟混合数据,比如三维数据.我想在每两个变量之间有两个不同的组件.
也就是说,模拟混合数据(V1和V2),其中它们之间的依赖关系是两个不同的正常分量.然后,在V2和V3之间另外两个正常组件.所以,我将得到3d数据,第一个和第二个变量之间的依赖关系是两个法线的混合.并且第二和第三变量之间的依赖性是另外两个不同组分的混合.
另一种解释我问题的方法:
假设我想生成如下混合数据:
1- 0.3正常(0.5,1)+ 0.7正常(2,4)#因此在这里我将获得由两个不同法线(混合模型的两个分量)生成的双变量混合数据,混合器重量的总和为1.
然后,我想得到另一个变量如下:
2- 0.5 normal(2,4)#这是第一个模拟的第二个变量+ 0.5法线(2,6)
所以在这里,我得到了3d模拟混合数据,其中V1和V2由两个不同的混合成分生成,V2和V3由另一个不同的混合成分生成.
这是如何在r中生成数据:(我相信它不会生成双变量数据)
N <- 100000
#Sample N random uniforms U
U <- runif(N)
#Variable to store the samples from the mixture distribution
rand.samples <- rep(NA,N)
#Sampling from the mixture
for(i in 1:N) {
if(U[i]<.3) {
rand.samples[i] <- rnorm(1,1,3)
} else {
rand.samples[i] <- rnorm(1,2,5)
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我们生成混合双变量数据(两个变量),那么如何将其扩展为具有4个或5个变量,其中V1和V2由两个不同的法线生成(它们之间的依赖关系结构是两个法线的混合)然后V3将从另一个不同的法线生成,然后用V2进行复习.也就是说,当我们绘制V2~V3时,我们会发现它们之间的依赖关系结构是两个法线的混合,依此类推.
我想使用高斯混合模型来返回如下图所示的内容,除了正确的高斯分布。
我正在尝试使用 pythonsklearn.mixture.GaussianMixture但我失败了。我可以将每个峰值视为任何给定 x 值的直方图的高度。我的问题是:我是否必须找到一种方法将这个图转换为直方图并删除负值,或者有没有办法将 GMM 直接应用于这个数组以产生红色和绿色高斯?
我想使用sklearn.mixture.GaussianMixture来存储高斯混合模型,以便我以后可以使用它来使用score_samples方法在样本点生成样本或值。这是一个示例,其中组件具有以下权重、均值和协方差
import numpy as np
weights = np.array([0.6322941277066596, 0.3677058722933399])
mu = np.array([[0.9148052872961359, 1.9792961751316835],
[-1.0917396392992502, -0.9304220945910037]])
sigma = np.array([[[2.267889129267119, 0.6553245618368836],
[0.6553245618368835, 0.6571014653342457]],
[[0.9516607767206848, -0.7445831474157608],
[-0.7445831474157608, 1.006599716443763]]])
Run Code Online (Sandbox Code Playgroud)
然后我初始化混合物如下
from sklearn import mixture
gmix = mixture.GaussianMixture(n_components=2, covariance_type='full')
gmix.weights_ = weights # mixture weights (n_components,)
gmix.means_ = mu # mixture means (n_components, 2)
gmix.covariances_ = sigma # mixture cov (n_components, 2, 2)
Run Code Online (Sandbox Code Playgroud)
最后,我尝试根据导致错误的参数生成示例:
x = gmix.sample(1000)
NotFittedError: This GaussianMixture instance is not fitted yet. Call 'fit' with appropriate arguments before …Run Code Online (Sandbox Code Playgroud) 我有兴趣将 2 分量高斯混合模型拟合到下面所示的数据。
然而,由于我在这里绘制的是标准化为 0-1 之间的对数转换计数,因此我的数据将采用的最大值为 0。当我尝试使用 sklearn.mixture.GaussianMixture (下面的代码)进行简单拟合时,我得到最终的拟合结果,这显然不是我想要的。
from sklearn.mixture import GaussianMixture
import numpy as np
# start with some count data in (0,1]
logged_counts = np.log(counts)
model = GaussianMixture(2).fit(logged_counts.reshape(-1,1))
# plot resulting fit
x_range = np.linspace(np.min(logged_counts), 0, 1000)
pdf = np.exp(model.score_samples(x_range.reshape(-1, 1)))
responsibilities = model.predict_proba(x_range.reshape(-1, 1))
pdf_individual = responsibilities * pdf[:, np.newaxis]
plt.hist(logged_counts, bins='auto', density=True, histtype='stepfilled', alpha=0.5)
plt.plot(x_range, pdf, '-k', label='Mixture')
plt.plot(x_range, pdf_individual, '--k', label='Components')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果我能将顶部分量的均值固定为 0 并且只优化其他均值、两个方差和混合分数,我会很高兴。(此外,我希望能够对右侧的组件使用半法线。)是否有一种简单的方法可以使用 python/sklearn 中的内置函数来执行此操作,或者我必须使用自己构建该模型某种概率编程语言?
我需要在下面重现归一化密度 p(x),但给出的代码不会生成归一化 PDF。
clc, clear
% Create three distribution objects with different parameters
pd1 = makedist('Uniform','lower',2,'upper',6);
pd2 = makedist('Uniform','lower',2,'upper',4);
pd3 = makedist('Uniform','lower',5,'upper',6);
% Compute the pdfs
x = -1:.01:9;
pdf1 = pdf(pd1,x);
pdf2 = pdf(pd2,x);
pdf3 = pdf(pd3,x);
% Sum of uniforms
pdf = (pdf1 + pdf2 + pdf3);
% Plot the pdfs
figure;
stairs(x,pdf,'r','LineWidth',2);
Run Code Online (Sandbox Code Playgroud)
如果我通过简单地按它们的总和缩放它们来计算归一化混合 PDF,与上面的原始图相比,我有不同的归一化概率。
pdf = pdf/sum(pdf);
Run Code Online (Sandbox Code Playgroud) matlab distribution probability-density uniform-distribution mixture
mixture ×5
python ×3
scikit-learn ×3
gaussian ×2
distribution ×1
gmm ×1
matlab ×1
numpy ×1
r ×1
simulation ×1