【问题标题】:R error: "Error in check.data : Argument Should be Numeric"R 错误:“check.data 中的错误:参数应该是数字”
【发布时间】:2021-01-17 05:14:58
【问题描述】:

我正在学习 R 编程语言的“kohonen”库。我创建了一些人工数据来尝试一些功能。我尝试仅对连续(即 type = as.numeric)数据使用“supersom()”函数,并且一切正常。但是,当我尝试在连续和分类(type = as.factor)上运行“supersom()”函数时,我开始遇到一些错误(“Argument data should be numeric”)。

“supersom()”函数有一个名为“dist.fct”(距离函数)的参数,它允许用户指定哪种类型的“距离”(例如“欧几里得”表示连续,“tanimoto”表示分类)用于不同的列。我创建了一个包含 4 个连续变量和 3 个分类变量的数据集。使用以下链接:https://www.rdocumentation.org/packages/kohonen/versions/2.0.5/topics/supersom,我尝试运行示例:

  #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])
data = as.matrix(data)

#som function
som <- supersom(data= data, grid =somgird(10,10, "hexagonal"), 
dist.fct = c("euclidean","euclidean","euclidean","euclidean","tanimoto", "tanimoto", "tanimoto", "tanimoto), keep.data = TRUE)


#sources:
https://cran.r-project.org/web/packages/kohonen/kohonen.pdf
https://www.rdocumentation.org/packages/kohonen/versions/2.0.5/topics/supersom

但是,这会产生错误"Error in check.data(data): Argument data should be numeric"。根据文档(请参阅我附加的来源),“dist.fct”参数有默认值 - 因此,我也尝试将其留空,希望自动选择默认值:

som <- supersom(data= data, grid =somgird(10,10, "hexagonal"), keep.data = TRUE)

但这也产生了类似的错误。

有谁知道我做错了什么?

谢谢

【问题讨论】:

    标签: r machine-learning distance data-manipulation


    【解决方案1】:

    如果您将因子或字符数据保存在矩阵中,它会将矩阵的所有其他值转换为字符,因为矩阵只能包含一种类型的数据。在矩阵中只保留数字数据或将每一列转换为列表。

    library(kohonen)
    
    cols <- 1:4
    data[cols] <- scale(data[cols])
    som <- supersom(data= as.list(data), grid = somgrid(10,10, "hexagonal"), 
                    dist.fct = "euclidean", keep.data = TRUE)
    

    【讨论】:

    • 感谢您的回复!我想在“数据”对象的所有 7 列上运行 supersom() 函数。我尝试删除“data = as.matrix(data)”行,但它仍然不起作用。有没有办法在“数据”对象的所有列上运行“supersom”?谢谢
    • 谢谢!你能解释一下 - 使用“as.list”背后的逻辑是什么?
    • ?supersom 建议data 可以是list of data matrices (numerical) of factors,因为我们不能拥有包含数字和因子的矩阵。我将它们更改为列出哪些有效。
    • 混合数据类型是否可能导致 supersom() 函数的复杂化? stackoverflow.com/questions/65763760/…
    猜你喜欢
    • 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
    相关资源
    最近更新 更多