使用sklearn在Python中初始化高斯混合参数

4

我正在尝试使用sklearn进行高斯混合,但我认为我错过了什么,因为它明显不起作用。

我的原始数据看起来像这样:

Genotype LogRatio  Strength
AB       0.392805  10.625016
AA       1.922468  10.765716
AB       0.22074   10.405445
BB       -0.059783 10.625016

我想做一个高斯混合模型,其中有3个成分= 3个基因型(AA | AB | BB)。 我知道每个基因型的权重,对数比率的平均值和强度的平均值。
wgts = [0.8,0.19,0.01]  # weight of AA,AB,BB
means = [[-0.5,9],[0.5,9],[1.5,9]] # mean(LogRatio), mean(Strenght) for AA,AB,BB 

我将保留HTML标签并翻译如下:

我保留列LogRatio和Strength并创建一个NumPy数组。

datas = [[  0.392805  10.625016]
         [  1.922468  10.765716]
         [  0.22074   10.405445]
         [ -0.059783   9.798655]]

然后我测试了来自sklearn v0.18的混合模型中的高斯混合函数GaussianMixture,并尝试了来自sklearn v0.17的GaussianMixtureModel函数(我仍然看不到区别,不知道该使用哪个)。

gmm = mixture.GMM(n_components=3) 
OR
gmm = mixture.GaussianMixture(n_components=3)

gmm.fit(datas)

colors = ['r' if i==0 else 'b' if i==1 else 'g' for i in gmm.predict(datas)]
ax = plt.gca()
ax.scatter(datas[:,0], datas[:,1], c=colors, alpha=0.8)
plt.show()

这是我得到的结果,虽然很好,但由于每次运行时初始参数的计算方式不同,因此结果会发生变化。

enter image description here

我想在高斯混合或GMM函数中初始化我的参数,但我不知道如何格式化我的数据:


你希望每次都获得相同的结果吗?这是你的问题吗? - MMF
是的,我希望每次都能得到相同的结果,并且我相信如果我可以修复初始参数,那么这将成为可能。 - Elysire
好的,请看我的回答吧 ;) - MMF
1个回答

2

可以通过显式地设置随机数种子random_state来控制随机性,以便使结果可重现。

而不是:

gmm = mixture.GaussianMixture(n_components=3)

做:

gmm = mixture.GaussianMixture(n_components=3, random_state=3)

random_state必须是一个整数:我已经随机设置为3,但你可以选择任何其他整数。

当使用相同的random_state多次运行时,将得到相同的结果。


1
是的,你说得对。我使用random_state也得到了相同的结果,但我仍然想要通过“weights_init”和“means_init”来固定我的初始参数,并且我不能直接使用我的权重列表[0.8,0.19,0.01],即使是在数组形式下。我不知道如何格式化我的权重和均值。 - Elysire
1
我不明白为什么你不能把你的 weightsmeans 列表放进去。根据文档,如果这样传递应该可以工作。出现了什么错误? - MMF
错误信息为:“ValueError: 参数 'weights' 应该被归一化,但是得到的 sum(weights) = 0.98377”。 - Elysire
对不起,我帖子中使用的不是真实的权重。 我使用的是:[0.5194072 0.38038109 0.08398024] 我检查了GaussianMixture函数自动计算的权重,与我的权重相差不多但并不完全相同。 - Elysire
np.sum([ 0.5194072, 0.38038109, 0.08398024]) = 0.98376852999999997 :总和应为 1.0 - MMF
没错!这是我的数据中的一个错误,当和为1的数组可用时,它可以在我的函数中使用!谢谢! - Elysire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接