首页 > 解决方案 > R 错误:“check.data 中的错误:参数应该是数字”

问题描述

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

“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)

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

有谁知道我做错了什么?

谢谢

标签: rmachine-learningdistancedata-manipulation

解决方案


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

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)

推荐阅读