scikit-learn高斯混合模型集基于高斯平均值的预测输出

时间:2017-07-24 22:59:14

标签: python scipy scikit-learn

我正在使用GMM来分离2个重叠的高斯。一个是信号,另一个是背景。背景总是具有比信号更低的值和平均值。大多数情况下,gmm.means_的顺序是[lower_mean,higher_mean],这使得它将0预测为背景,将1预测为信号。有时,均值的顺序是[higher_mean,lower_mean],这使得GMM将其预测为0表示信号,1表示噪声(与我想要的相反)。我希望具有较低均值的高斯是背景(0),而具有较高均值的高斯是信号(1)。如何将GMM结果设置为正确的顺序或如何设置预测输出?

img = cv2.imread(path, -1)
img_flatten = img.flatten().reshape(img.flatten().shape[0],1)

gmm = GaussianMixture(n_components=2, covariance_type='full')
gmm.fit(img_flatten)
pred = gmm.predict(img_flatten) # how can I set the prediction value I want for each Gaussian?

print(np.round(g.means_, 2))
# gives [[  66.31] [ 203.64]] on some images and [[  67.32] [ 306.13]] on other

1 个答案:

答案 0 :(得分:1)

Stauffer和Grimson的文章“用于实时跟踪的自适应背景混合模型”讨论了一种启发式算法,用于识别GMM的哪些组成部分与背景相对应。他们建议用w / sigma的值来对高斯人进行排序(w是混合权重,西格玛是他们的标准)。前k个应该是背景的。如何选择k取决于每个问题,并在论文中讨论。

但是你的情况只有两个高斯,也许你可以检查具有最高w / sigma的高斯分量是否总是对应​​于同一个类。

还有一个细节:在那篇论文中,sigma是1-d Gaussian的std。在你的情况下,你似乎有N维高斯。在这种情况下,您可以将协方差的决定因素取代1/2的幂,而不是西格玛。