【问题标题】:Error: Mean Distance Between Objects Zero错误:物体之间的平均距离为零
【发布时间】:2021-04-22 02:46:24
【问题描述】:

我正在尝试学习 R 中的“kohonen”包。特别是,有一个名为“supersom()”的函数(https://www.rdocumentation.org/packages/kohonen/versions/3.0.10/topics/supersom,对应于无监督机器学习中使用的 SOM(自组织映射)算法) ) 我正在尝试应用于某些数据。

下面,(来自上一个问题:R error: "Error in check.data : Argument Should be Numeric")我学习了如何将“supersom()”函数应用于一些带有“因子”和“数值”变量的人工创建数据。

#the following code works

#load libraries 
    library(kohonen)
    library(dplyr)
    
#create and format data

a =rnorm(1000,10,10)
b = rnorm(1000,10,5)
c = rnorm(1000,5,5)
d = rnorm(1000,5,10)
e <- sample( LETTERS[1:4], 100 , replace=TRUE, prob=c(0.25, 0.25, 0.25, 0.25) )
f <- sample( LETTERS[1:5], 100 , replace=TRUE, prob=c(0.2, 0.2, 0.2, 0.2, 0.2) )
g <- sample( LETTERS[1:2], 100 , replace=TRUE, prob=c(0.5, 0.5) )

data = data.frame(a,b,c,d,e,f,g)
data$e = as.factor(data$e)
data$f = as.factor(data$f)
data$g = as.factor(data$g)

cols <- 1:4
data[cols] <- scale(data[cols])

#som model
som <- supersom(data= as.list(data), grid = somgrid(10,10, "hexagonal"), 
                dist.fct = "euclidean", keep.data = TRUE)

一切正常 - 问题是,当我尝试对“更真实和更大的数据”应用“supersom()”函数时,出现以下错误:

"Error: Non-informative layers present : mean distances between objects zero"

当我查看此函数 (https://rdrr.io/cran/kohonen/src/R/supersom.R) 的源代码时,我注意到相同错误的引用:

  if (any(sapply(meanDistances, mean) < .Machine$double.eps))
        stop("Non-informative layers present: mean distance between objects zero")
      

谁能告诉我如何解决这个错误,即让“supersom()”函数处理因子和数值数据?

我认为删除重复行和 NA 可能会解决此问题:

data <- na.omit(data)
data <- unique(data)

但是同样的错误(“存在非信息层:物体之间的平均距离为零”)仍然存在。

有人可以帮我找出可能导致此错误的原因吗?注意:当我删除“因子”变量时,一切正常。

来源:

https://cran.r-project.org/web/packages/kohonen/kohonen.pdf

https://www.rdocumentation.org/packages/kohonen/versions/2.0.5/topics/supersom

https://rdrr.io/cran/kohonen/src/R/supersom.R

【问题讨论】:

    标签: r machine-learning type-conversion distance


    【解决方案1】:

    如果您有某些数字列的平均值为 0,则会发生错误。您可以通过将任何 1 列变为 0 来重现该错误。

    data$a <- 0
    som <- supersom(data= as.list(data), grid = somgrid(10,10, "hexagonal"), 
                    dist.fct = "euclidean", keep.data = TRUE)
    

    supersom(data = as.list(data), grid = somgrid(10, 10, "hexagonal"), 中的错误: 存在非信息层:物体之间的平均距离为零

    也许您可以调查为什么这些列的平均值为 0,或者从数据中删除平均值为 0 的列。

    library(kohonen)
    library(dplyr)
    
    data <- data %>% select(where(~(is.numeric(.) && mean(.) > 0) | !is.numeric(.)))
    #som model
    som <- supersom(data= as.list(data), grid = somgrid(10,10, "hexagonal"), 
                    dist.fct = "euclidean", keep.data = TRUE)
    

    【讨论】:

    • 感谢您的回答@Ronak Shah。是的,你是对的 - 这个错误是由平均值为零的列引起的。我继续研究相关主题,例如这里:stackoverflow.com/questions/65781259/… ...我发布了一个更全面的问题,但建议我减小它的大小。也许你有时间可以看看它?感谢您的帮助
    • 有时间可以看看这个问题吗? stackoverflow.com/questions/65864333/… 谢谢(赏金)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多