python-3.x - 期望最大化算法(高斯混合模型): ValueError: the input matrix must be positive semidefinite

标签 python-3.x machine-learning covariance gaussian expectation-maximization

我正在尝试在数据集 data=[[x,y],...] 上实现期望最大化算法(高斯混合模型)。我正在使用 mv_norm.pdf(data,mean,cov) 函数来计算集群职责。但在 6-7 次迭代后计算出新的协方差值(cov 矩阵)后,cov 矩阵变得奇异,即 cov 的行列式为 0(非常小的值),因此会产生错误

ValueError: the input matrix must be positive semidefinite

raise np.linalg.LinAlgError('singular matrix')

有人可以为此提出任何解决方案吗?

#E-step: Compute cluster responsibilities, given cluster parameters
def calculate_cluster_responsibility(data,centroids,cov_m):
    pdfmain=[[] for i in range(0,len(data))]
    for i in range(0,len(data)):
        sum1=0
        pdfeach=[[] for m in range(0,len(centroids))]
        pdfeach[0]=1/3.*mv_norm.pdf(data[i], mean=centroids[0],cov=[[cov_m[0][0][0],cov_m[0][0][1]],[cov_m[0][1][0],cov_m[0][1][1]]])
        pdfeach[1]=1/3.*mv_norm.pdf(data[i], mean=centroids[1],cov=[[cov_m[1][0][0],cov_m[1][0][1]],[cov_m[1][1][0],cov_m[0][1][1]]])
        pdfeach[2]=1/3.*mv_norm.pdf(data[i], mean=centroids[2],cov=[[cov_m[2][0][0],cov_m[2][0][1]],[cov_m[2][1][0],cov_m[2][1][1]]])
        sum1+=pdfeach[0]+pdfeach[1]+pdfeach[2]
        pdfeach[:] = [x / sum1 for x in pdfeach]
        pdfmain[i]=pdfeach

    global old_pdfmain
    if old_pdfmain==pdfmain:
        return
    old_pdfmain=copy.deepcopy(pdfmain)
    softcounts=[sum(i) for i in zip(*pdfmain)]
    calculate_cluster_weights(data,centroids,pdfmain,soft counts)

最初,我为每个簇协方差传递了 [[3,0],[0,3]],因为预期的簇数为 3。

最佳答案

Can someone suggest any solution for this?

问题是您的数据位于严格小于输入数据的某个维度中。换句话说,例如您的数据位于一个圆上,而您拥有 3 维数据。因此,当您的方法尝试估计适合您的数据的 3 维椭圆体(协方差矩阵)时,它会失败,因为最佳椭圆体是 2 维椭圆体(第三维为 0)。

如何解决?您需要对协方差估计器进行一些正则化。有很多可能的解决方案,全部在 M 步骤中,而不是 E 步骤中,问题在于计算协方差:

  • 简单的解决方案,而不是执行诸如 cov = np.cov(X) 之类的操作,而是添加一些正则化项,例如 cov = np.cov(X) + eps * np.identity( X.shape[1]) 带有小 eps
  • 使用更好的估计器,例如 LedoitWolf estimator from scikit-learn

Initially, I've passed [[3,0],[0,3]] for each cluster covariance since expected number of clusters is 3.

这没有意义,协方差矩阵值与簇的数量无关。您可以用任何或多或少合理的东西来初始化它。

关于python-3.x - 期望最大化算法(高斯混合模型): ValueError: the input matrix must be positive semidefinite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39784721/

相关文章:

java - 在继承层次结构中声明具有两个类型参数的方法的正确方法

python - 不使用堆栈的反向队列

python - 在完成机器学习项目后,如何保存它以供其他人查看

machine-learning - 理解 scikit learn 中的岭线性回归

c# - 需要一些帮助在两个 .NET 实例之间进行转换

c++ - `shared_ptr` 是如何实现协变的?

image - 如何在python flask服务器中保存base64图像

python - 使用 xlrd 在 Python 3 中将 xls 转换为 csv

python - Tkinter:标签和按钮框架之间的空间太大

python - opencv如何在屏幕录像机上使用级联