scipy.cluster.vq.kmeans2 中的“矩阵不是正定的”错误

Posted

技术标签:

【中文标题】scipy.cluster.vq.kmeans2 中的“矩阵不是正定的”错误【英文标题】:"Matrix is not positive definite" error in scipy.cluster.vq.kmeans2 【发布时间】:2016-06-17 17:54:14 【问题描述】:

我正在尝试对 128 维点(图像中兴趣点的描述符)执行 kmeans 聚类。 当我使用scipy.cluster.vq.kmeans2 函数时,有时会出现以下错误:

  File "main.py", line 21, in level_routine
current.centroids, current.labels = cluster.vq.kmeans2( current.descriptors, k)
  File "/usr/lib/python2.7/dist-packages/scipy/cluster/vq.py", line 706, in kmeans2
    clusters = init(data, k)
  File "/usr/lib/python2.7/dist-packages/scipy/cluster/vq.py", line 593, in _krandinit
    return init_rankn(data)
  File "/usr/lib/python2.7/dist-packages/scipy/cluster/vq.py", line 586, in init_rankn
    x = np.dot(x, np.linalg.cholesky(cov).T) + mu
  File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 603, in cholesky
    return wrap(gufunc(a, signature=signature, extobj=extobj).astype(result_t))
  File "/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py", line 93, in _raise_linalgerror_nonposdef
    raise LinAlgError("Matrix is not positive definite")
numpy.linalg.linalg.LinAlgError: Matrix is not positive definite

我知道这与随机初始化有关,因为在同一 data 和同一 k 上,有时我不会收到此错误。

我的data 是一个具有 128 列和可变行数的 numpy 矩阵。我没有构建协方差矩阵,因此无法控制它。有没有办法摆脱这个错误。

【问题讨论】:

由于您收到错误Matrix is not positive definite,类似问题的答案可能会有所帮助,请查看:***.com/questions/21604498/… 【参考方案1】:

尝试将 minit 参数更改为 'points':

kmeans2(obs,k,minit='points')

【讨论】:

你知道为什么这样可以解决吗?即为什么minit="random" 的默认值(如在 scipy v1.5.3 中)会引发此问题? @bricoletc 问题源于初始点。默认的“随机”参数使用质心的标量值。如果数据点是 n 维向量,则会引发错误。通过将初始质心选择设置为“点”,算法将部分数据点作为质心,问题将得到解决。

以上是关于scipy.cluster.vq.kmeans2 中的“矩阵不是正定的”错误的主要内容,如果未能解决你的问题,请参考以下文章