- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我从 DPGMM 得到的结果不是我所期望的。例如:
>>> import sklearn.mixture
>>> sklearn.__version__
'0.12-git'
>>> data = [[1.1],[0.9],[1.0],[1.2],[1.0], [6.0],[6.1],[6.1]]
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1)
>>> m.fit(data)
DPGMM(alpha=1, covariance_type='diag', init_params='wmc', min_covar=None,
n_components=5, n_iter=1000, params='wmc',
random_state=<mtrand.RandomState object at 0x108a3f168>, thresh=0.01,
verbose=False)
>>> m.converged_
True
>>> m.weights_
array([ 0.2, 0.2, 0.2, 0.2, 0.2])
>>> m.means_
array([[ 0.62019109],
[ 1.16867356],
[ 0.55713292],
[ 0.36860511],
[ 0.17886128]])
我预计结果会更类似于 Vanilla GMM;也就是说,两个高斯分布(大约值 1 和 6)具有不均匀的权重(如 [0.625, 0.375])。我希望“未使用”的高斯函数的权重接近于零。
我是否错误地使用了模型?
我也尝试过更改 alpha,但没有任何运气。
最佳答案
与sklearn 0.14.1版本差别不大。我将使用以下代码打印 DPGMM 模型:
def pprint(model, data):
idx = np.unique(model.predict(data))
m_w_cov = [model.means_, model.weights_, model._get_covars()]
flattened = map(lambda x: np.array(x).flatten(), m_w_cov)
filtered = map(lambda x: x[idx], flattened)
print np.array(filtered)
此函数过滤掉冗余(空)分量,即那些未用于预测和打印均值、权重和协方差的分量。
如果对 OP 问题的数据进行多次尝试,会发现两种不同的结果:
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1).fit(data)
>>> m.predict(data)
array([0, 0, 0, 0, 0, 1, 1, 1])
>>> pprint(m, data)
[[ 0.62019109 1.16867356]
[ 0.10658447 0.19810279]
[ 1.08287064 12.43049771]]
和
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1).fit(data)
>>> m.predict(data)
array([1, 1, 1, 0, 1, 0, 0, 0])
>>> pprint(m, data)
[[ 1.24122696 0.64252404]
[ 0.17157736 0.17416976]
[ 11.51813929 1.07829109]]
然后可以猜测,意外结果的原因在于一些中间结果(在我们的例子中是 1.2)在类之间迁移,并且方法无法推断出正确的模型参数。一个原因是聚类参数 alpha 对于我们的集群来说太大了,每个只包含 3 个元素,我们可以通过减少这个参数来尝试更好,0.1
将给出更稳定的结果:
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=.1).fit(data)
>>> m.predict(data)
array([1, 1, 1, 1, 1, 0, 0, 0])
但根本原因在于 DPGMM 方法的随机性,该方法无法在小簇的情况下推断模型结构。如果我们将观察扩展 4 次,情况会变得更好,方法的行为也会更符合预期:
>>> m = sklearn.mixture.DPGMM(n_components=5, n_iter=1000, alpha=1).fit(data*4)
>>> pprint(m, data)
[[ 0.90400296 5.46990901]
[ 0.11166431 0.24956023]
[ 1.02250372 1.31278926]]
总而言之,要小心方法拟合参数,并意识到某些 ML 方法在小数据集或倾斜数据集的情况下效果不佳。
关于python - sklearn.mixture.DPGMM : Unexpected results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12960516/
所以我已经将我的语料库转换成一个漂亮的 word2vec 矩阵。该矩阵是一个负数和正数的浮点矩阵。 我似乎无法得到无限狄利克雷过程来给我任何有凝聚力的答案。 示例输出 [for 2 steps] 如下
我从 DPGMM 得到的结果不是我所期望的。例如: >>> import sklearn.mixture >>> sklearn.__version__ '0.12-git' >>> data = [
我正在使用 scikit-learn 来实现狄利克雷过程高斯混合模型: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn
我是一名优秀的程序员,十分优秀!