使用 sklearn python 初始化 GMM

itz*_*bat 5 python scikit-learn

我希望创建一个 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()
Run Code Online (Sandbox Code Playgroud)

问题是它缺少gmm.predict_proba()我稍后需要使用的方法。我怎样才能克服这个问题?

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

更新2

我根据评论和答案更新了代码

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()
Run Code Online (Sandbox Code Playgroud)

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

Gio*_*elm 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

  • 好的。我解决了。一旦我添加了“ from sklearn.mixture.gaussian_mixture import _compute_ precision_cholesky gmm. precisions_cholesky_ = _compute_ precision_cholesky(covariances, cov_type)”,我就可以直接使用“predict_proba()”,效果很好。谢谢。 (2认同)