如何检测使kmeans余弦崩溃Matlab的零向量?

2024-06-12 05:56:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个大型数据集上运行kmeans,但总是得到以下错误:

Error using kmeans (line 145)
Some points have small relative magnitudes, making them effectively zero.
Either remove those points, or choose a distance other than 'cosine'.

Error in runkmeans (line 7)
[L, C]=kmeans(data, 10, 'Distance', 'cosine', 'EmptyAction', 'drop')

我的问题是,即使我给所有的向量加1,我仍然会得到这个错误。我本以为它会过去,但很明显,还有太多的零(这就是导致它的原因,对吧?)。在

我的问题是:什么条件使得Matlab判定一个点具有“小的相对大小”和“实际上是零”?在

在把数据交给Matlab之前,我想用python从数据集中删除所有这些点,因为我需要将我的结果与python中处理的黄金标准进行比较。在

提前谢谢!在

编辑答案

下面给出了正确的答案,但是如果有人通过Google找到这个问题,下面是如何在python中从矩阵中删除“有效的零向量”。每行(!)是一个数据点,因此如果运行kmeans,则需要在python或Matlab中进行转置:

^{pr2}$

我相信有一种更科学的方法来做这件事,但它会做的:-)


Tags: 数据答案have错误lineerrorsome向量
2条回答

如果使用的是this kmeans,则引发错误的相关代码是:

case 'cosine'
    Xnorm = sqrt(sum(X.^2, 2));
    if any(min(Xnorm) <= eps * max(Xnorm))
        error(['Some points have small relative magnitudes, making them ', ...
               'effectively zero.\nEither remove those points, or choose a ', ...
               'distance other than ''cosine''.'], []);
    end

所以这是你的测试。 正如你所看到的,重要的是相对大小,所以给所有东西加一个只会让事情变得更糟(max(Xnorm)也越来越大)。一个好的解决方法可能是按常量缩放所有数据。在

在你的other question中,你的数据看起来是标量的。如果输入向量只有一个特征/维度,则它们之间的余弦距离将始终未定义(或为零),因为根据定义,它们指向同一方向(沿单个轴)。余弦度量给出两个向量之间的角度,只有当两个向量可以指向不同的方向时,这个角度才可以是非零的(即尺寸>1)。在

相关问题 更多 >