【问题标题】:initialize GMM using sklearn python使用 sklearn python 初始化 GMM
【发布时间】:2017-12-08 08:12:34
【问题描述】:

我希望使用一组预定义的均值、权重和协方差(在网格上)创建一个 sklearn GMM 对象。

我成功了:

from sklearn.mixture import GaussianMixture
import numpy as np


def get_grid_gmm(subdivisions=[10,10,10], variance=0.05 ):
    n_gaussians = reduce(lambda x, y: x*y,subdivisions)
    step = [ 1.0/(2*subdivisions[0]),  1.0/(2*subdivisions[1]),  1.0/(2*subdivisions[2])]

    means = np.mgrid[ step[0] : 1.0-step[0]: complex(0,subdivisions[0]),
                      step[1] : 1.0-step[1]: complex(0,subdivisions[1]),
                      step[2] : 1.0-step[2]: complex(0,subdivisions[2])]
    means = np.reshape(means,[-1,3])
    covariances = variance*np.ones_like(means)
    weights = (1.0/n_gaussians)*np.ones(n_gaussians)
    gmm = GaussianMixture(n_components=n_gaussians, covariance_type='spherical' )
    gmm.weights_ = weights
    gmm.covariances_ = covariances
    gmm.means_ = means
    return gmm

def main():
    xx = np.random.rand(100,3)
    gmm = get_grid_gmm()
    y= gmm.predict_proba(xx)

if __name__ == "__main__":
    main()

问题在于它缺少我以后需要使用的gmm.predict_proba() 方法。 我该如何克服这个问题?

更新:我将代码更新为显示错误的完整示例

更新2

我根据cmets和答案更新了代码

from sklearn.mixture import GaussianMixture
import numpy as np


def get_grid_gmm(subdivisions=[10,10,10], variance=0.05 ):
    n_gaussians = reduce(lambda x, y: x*y,subdivisions)
    step = [ 1.0/(2*subdivisions[0]),  1.0/(2*subdivisions[1]),  1.0/(2*subdivisions[2])]

    means = np.mgrid[ step[0] : 1.0-step[0]: complex(0,subdivisions[0]),
                      step[1] : 1.0-step[1]: complex(0,subdivisions[1]),
                      step[2] : 1.0-step[2]: complex(0,subdivisions[2])]
    means = np.reshape(means,[3,-1])
    covariances = variance*np.ones(n_gaussians)
    cov_type = 'spherical'
    weights = (1.0/n_gaussians)*np.ones(n_gaussians)
    gmm = GaussianMixture(n_components=n_gaussians, covariance_type=cov_type )
    gmm.weights_ = weights
    gmm.covariances_ = covariances
    gmm.means_ = means
    from sklearn.mixture.gaussian_mixture import _compute_precision_cholesky
    gmm.precisions_cholesky_ = _compute_precision_cholesky(covariances, cov_type)
    gmm.precisions_ = gmm.precisions_cholesky_ ** 2
    return gmm

def main():
    xx = np.random.rand(100,3)
    gmm = get_grid_gmm()
    _, y = gmm._estimate_log_prob(xx)
    y = np.exp(y)

if __name__ == "__main__":
    main()

没有更多错误,但 _estimate_log_prob 和 predict_proba 不会为拟合的 GMM 产生相同的结果。为什么会这样?

【问题讨论】:

  • 你永远不会返回 gmm 对象。
  • 哎呀!谢谢,在 ctrl+c ctrl+v 中迷路了。但这不是问题的原因
  • 您遇到的另一个问题是,您的方法应该有两个维度(nb 个组件,n_features)。这里有张量,sklearn 不允许这样做。
  • @Anis 谢谢。也修好了。但这仍然不是问题。问题是我没有运行gmm.fit()。所以 gmm 没有完全定义。我怎样才能定义它?
  • from sklearn.mixture.gaussian_mixture import _compute_precision_cholesky 然后gmm.precisions_cholesky_ = _compute_precision_cholesky(covariances, cov_type) 但是你会偶然发现我说的话。您的均值形状将导致“太多值无法解包”错误

标签: python scikit-learn


【解决方案1】:

由于您不训练模型而只是使用函数进行估计,因此您不需要使用对象,但您可以使用他们在后台使用的相同函数。你可以试试_estimate_log_gaussian_prob。我认为这就是他们在内部所做的。

看看源码:

特别是在基类 https://github.com/scikit-learn/scikit-learn/blob/ab93d657eb4268ac20c4db01c48065b5a1bfe80d/sklearn/mixture/base.py#L342

调用特定方法,调用函数 https://github.com/scikit-learn/scikit-learn/blob/ab93d657eb4268ac20c4db01c48065b5a1bfe80d/sklearn/mixture/gaussian_mixture.py#L671

【讨论】:

  • 感谢您的回答,我按照您说的做了,但我收到此错误sklearn/mixture/gaussian_mixture.py", line 430, in _estimate_log_gaussian_prob 2 * np.dot(X, means.T * precisions) + ValueError: operands could not be broadcast together with shapes (3,) (1000,) 知道有什么问题吗?我更新了上面的代码
  • 所以我发现了尺寸问题并修复,更新了代码)但现在_estimate_log_probpredict_proba 的结果不一样(对于拟合模型)....为什么可以那是? @Anis,@Gioelelm
  • 是的,您需要调整权重,这也在我链接的源代码中
  • 你能再具体一点吗?
  • 好的。我解决了。一旦我添加了` from sklearn.mixture.gaussian_mixture import compute_precision_cholesky gmm.precisions_cholesky = _compute_precision_cholesky(covariances, cov_type)`,我可以简单地使用predict_proba()directly,它很好。谢谢。
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 2017-03-22
  • 2017-07-12
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
相关资源
最近更新 更多