【问题标题】:How to overcome indefinite matrix error (NbClust)?如何克服不定矩阵误差(NbClust)?
【发布时间】:2019-08-11 04:39:03
【问题描述】:

我在调用NbClust() 时遇到以下错误:

Error in NbClust(data = ds[, sapply(ds, is.numeric)], diss = NULL, distance = "euclidean", : TSS 矩阵是不定的。一定是缺失值太多。索引不能进行计算。

我在运行 NbClust 之前调用了 ds <- ds[complete.cases(ds),],因此没有缺失值。

知道这个错误背后的原因吗?

谢谢

【问题讨论】:

  • 我已经大幅减少了变量的数量,现在面临以下错误:NbClust 中的错误(data = ds[, sapply(ds, is.numeric)], diss = NULL, distance = "euclidean", : 无效的聚类方法

标签: cluster-analysis


【解决方案1】:

我在研究中遇到了同样的问题。 所以,我给包维护者 Nadia Ghazzali 发了邮件,得到了答复。 我会附上我的邮件和她的回复。

我的电子邮件:

亲爱的 Nadia Ghazzali。你好纳迪亚。我有一些关于 R 库中的 NbClust 函数。我试过谷歌搜索但不能 找到满意的答案。首先,我非常感谢你制作 这个很棒的 R 库。这对我的研究很有帮助。我测试过 NbClust 库中的 NbClust 函数以及我自己的数据,如下所示。

> clust <- NbClust(data, distance = “euclidean”, 
                   min.nc = 2, max.nc = 10, method = ‘kmeans’, index =”all”)

但很快,发生了错误。错误:除以零!错误 指数.WBT(x = jeu, cl = cl1, P = TT, s = ss, vv = vv) : 对象 'scott' not found 所以,我逐行尝试了 NbClust 函数 发现一些索引,如 CCC、Scott、marriot、tracecovw、 tracew、friedman、rubin,因对象原因未计算 vv = 0。我对代数不是很熟悉,所以我不知道什么意思 的特征值。但在我看来,对象 ss(它是 eigenValues) 在 prodected 后不应为 0。 所以,这是我的问题。 我假设我的数据非常稀疏(很多零值),以至于 sqrt(eigenValues) 变得太小了,对吗?对不起,我 无法附加我的数据,但我可以附加特征值的某些部分和 平方特征值。

> head(eigenValues)
[1] 0.039769880 0.017179826 0.007011972 0.005698736 0.005164871 0.004567238

> head(sqrt(eigenValues))
[1] 0.19942387 0.13107184 0.08373752 0.07548997 0.07186704 0.06758134

如果我的假设是正确的,我可以为这些问题做些什么?只有一个 退出7个指数的方法? 感谢您的阅读,我将等待您的回复。最好的问候!

她的回复:

亲爱的韩松,

感谢您的关注。是的,你的理解很好。 遗憾的是,这七个指标无法应用。

最好的问候,

纳迪亚·加扎利

【讨论】:

    【解决方案2】:

    @seni 这个错误的原因是数据相关。如果你看一下这个函数的源代码,

    NbClust <- function(data, diss="NULL", distance = "euclidean", min.nc=2, max.nc=15, method = "ward", index = "all", alphaBeale = 0.1)
    {
    x<-0
    min_nc <- min.nc
    max_nc <- max.nc
    jeu1 <- as.matrix(data)
    numberObsBefore <- dim(jeu1)[1]
    jeu <- na.omit(jeu1) # returns the object with incomplete cases removed 
    nn <- numberObsAfter <- dim(jeu)[1]
    pp <- dim(jeu)[2]
    TT <- t(jeu)%*%jeu   
    sizeEigenTT <- length(eigen(TT)$value)
    eigenValues <- eigen(TT/(nn-1))$value
    for (i in 1:sizeEigenTT) 
    {
            if (eigenValues[i] < 0) {
        print(paste("There are only", numberObsAfter,"nonmissing observations out of a possible", numberObsBefore ,"observations."))
        stop("The TSS matrix is indefinite. There must be too many missing values. The index cannot be calculated.")
            } 
    }
    

    我认为这个错误的根本原因是当集群数量非常多时渗入的负特征值,即max.nc 很高。因此,要解决问题,您必须查看您的数据。看看它是否有更多的列然后是行。删除缺失值,检查共线性和多重共线性、方差、协方差等问题。

    对于另一个错误invalid clustering method,请查看方法here的源代码。查看给定链接中的行号168, 169。您收到此错误消息是因为聚类方法为空。 if (is.na(method)) stop("invalid clustering method")

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 2017-10-30
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 2018-08-10
      • 1970-01-01
      相关资源
      最近更新 更多