我想使用python将高斯混合模型拟合到一组加权数据点。
我尝试了sklearn.micross.GMM(),它工作得很好,只是它对所有数据点的权重相等。有人知道在这种方法中为数据点分配权重的方法吗?我多次尝试使用数据点来";增加它们的重量";,但对于大型数据集来说,这似乎是无效的。
我也想过自己实现EM算法,但这似乎比上面的GMM方法慢得多,并且会极大地增加大型数据集的计算时间。
我刚刚发现了EM算法cv2.EM()的opencv方法。这同样有效,但与sklearn.mixture.GMM有相同的问题,此外,似乎没有办法改变协方差允许值的最小值。或者有没有办法将协方差最小值更改为例如0.001?我希望可以使用probe参数来为数据分配权重,但这似乎只是一个输出参数,对拟合过程没有影响,不是吗?使用probs0并通过使用trainM以M步开始算法也没有帮助。对于问题0,我使用了一个(数据点的数量)x(GMM组件的数量)矩阵,其列是相同的,同时数据点的加权参数被写入对应于数据点的行。这也没有解决问题。它只是产生了一个混合模型,其中all表示0。
有人知道如何操作上述方法吗?或者有人知道另一种方法,以便GMM可以与加权数据拟合吗?
根据Jacobs的建议,我编写了一个石榴实现示例:
import pomegranate
import numpy
import sklearn
import sklearn.datasets
#-------------------------------------------------------------------------------
#Get data from somewhere (moons data is nice for examples)
Xmoon, ymoon = sklearn.datasets.make_moons(200, shuffle = False, noise=.05, random_state=0)
Moon1 = Xmoon[:100]
Moon2 = Xmoon[100:]
MoonsDataSet = Xmoon
#Weight the data from moon2 much higher than moon1:
MoonWeights = numpy.array([numpy.ones(100), numpy.ones(100)*10]).flatten()
#Make the GMM model using pomegranate
model = pomegranate.gmm.GeneralMixtureModel.from_samples(
pomegranate.MultivariateGaussianDistribution, #Either single function, or list of functions
n_components=6, #Required if single function passed as first arg
X=MoonsDataSet, #data format: each row is a point-coordinate, each column is a dimension
)
#Force the model to train again, using additional fitting parameters
model.fit(
X=MoonsDataSet, #data format: each row is a coordinate, each column is a dimension
weights = MoonWeights, #List of weights. One for each point-coordinate
stop_threshold = .001, #Lower this value to get better fit but take longer.
# (sklearn likes better/slower fits than pomegrante by default)
)
#Wrap the model object into a probability density python function
# f(x_vector)
def GaussianMixtureModelFunction(Point):
return model.probability(numpy.atleast_2d( numpy.array(Point) ))
#Plug in a single point to the mixture model and get back a value:
ExampleProbability = GaussianMixtureModelFunction( numpy.array([ 0,0 ]) )
print ('ExampleProbability', ExampleProbability)
如果您仍在寻找解决方案,石榴现在支持在加权数据上训练GMM。你所需要做的就是在训练时传递一个权重向量,它会为你处理它。这里有一个关于石榴中GMM的简短教程!
父github在这里:
https://github.com/jmschrei/pomegranate
具体教程在这里:
https://github.com/jmschrei/pomegranate/blob/master/tutorials/B_Model_Tutorial_2_General_Mixture_Models.ipynb