展开R中的网格,并取消列出并应用

问题描述 投票:0回答:2

我希望使用R的expand.grid来全面枚举和研究用于层次聚类分析的选项。我有一个最终函数acc,它将获取一个矩阵并对其进行分析,以进行性能测量(如准确性,精度,F1等),返回一个命名列表(具有准确性,F1等):我正在寻找的最终输出是一个表,其中列出了所有超参数组合,并在其旁边的列中列出了不同的性能指标(准确性,F1等)。

组合表可以用例如来设置

hyperparams =  expand.grid(meths=c("ward.D","ward.D2","single","complete","average","mcquitty","median","centroid"), dists=c("euclidean", "maximum", "manhattan", "canberra", "binary","minkowski"))

接下来,我们将与已知标签进行比较,并获得准确度,并包装了许多功能,为简洁起见,我尝试将其省略(例如cutree):

t1 = table(df$Group, hclust(dist(df[-1],method="euclidean"), method="complete"))
Res1 = acc(t1)

目标是在我的method中列出的变量之间更改distdists参数,并在我的method中列出的变量之间更改hclustmeths参数。在最后一行,回想一下,我写了acc,它将使用一个矩阵并输出一个精度,精度,F1的命名列表,我希望每个列表都在最终表的列上,其行是hyperparams中的超参数组合。

现在,我的第一个问题是,我不确定如何以覆盖上述所有选项的方式使用unlist。我很确定这是正确的功能,但不确定如何做到这一点。而且我还想为for循环创建表without,即使用apply之类的东西(我猜是沿着hyperparams的行吗?...),因为我知道这样的解决方案通常更好在R中。

按照建议,最终的期望输出将有效地为hyperparams,但作为带有附加列的数据帧,第三列包含精度,第四列包含精度,等等(在我的函数acc中列出的度量) 。谁能告诉我如何到达那里吗?

如果您想为acc玩一些游戏,我们可以使用

first = sum(x)
second = sum(x^2)
return(list(First=first,Second=second))

并且最终输出表将是两个超参数列,然后是First(最终混淆矩阵中元素的总和,对应于该行的超参数组合)的一列和Second(元素^ 2的总和)在最终的混淆矩阵中)。如果您想使用给定的功能,这只是一个假设的示例。

我真的更喜欢在R底下的解决方案! (如果绝对必要,也可以使用dplyr)

编辑:好,很多人都要求输入df。让我们使用iris,但是当然,如​​果我们要输出,就无法避免某些中间函数,例如cutree

现在有了iris,您可以运行

contingtab1 = table(iris$Species, cutree(hclust(dist(iris[,1:4],method="euclidean"),method="complete"),3))

这给出了列联表。将其传递到acc会得到一行期望的输出(与euclideancomplete对应的行。然后,期望的输出看起来像hyperparams,其中两个当前列中的每一列都跟着(例如)两个更多列,acc中我的两个性能指标之一。

r datagrid combinations permutation
2个回答
0
投票

我们可以在Map中使用base R

Map(function(x, y) acc(hclust(dist(df[-1],method = x), method = y),
           hyperparams[[1]], hyperparams[[2]])

0
投票

一种方法可能是map2中的purrr

library(purrr)
map2(hyperparams$meths, hyperparams$dists,
     ~ acc(hclust(dist(df[-1],method = .x), method = .y)))
© www.soinside.com 2019 - 2024. All rights reserved.