【发布时间】: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