【问题标题】:Expand grid in R with unlist and apply使用 unlist 扩展 R 中的网格并应用
【发布时间】:2020-05-08 20:12:04
【问题描述】:

我希望使用 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)

目标是在我的dists 中列出的distmethod 参数和hclustmethod 参数在我的meths 中列出的参数之间变化。 在最后一行,回想一下我写过acc,它将采用一个矩阵并输出一个命名列表,其中包含准确度、精度、F1、... rows 是hyperparams 中的超参数组合。

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

正如建议的那样,最终所需的输出实际上是hyperparams,但作为带有附加列的数据框,第三列包含准确性,第四列包含精度等(我的函数acc中列出的度量)。谁能告诉我怎么去那里?

如果你想为acc 做点什么,我们可以使用

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

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

我真的更喜欢 base 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 中的两个绩效指标各一个。

【问题讨论】:

  • 您能否提供dfacc 函数的示例?
  • 如果分配给每个集群的任意整数可能在迭代之间发生变化,您打算如何量化与已知标签的相似性?
  • @Dij 别担心,我已经通过对角线最大化考虑了这一点。 @Ian Campbell,提供了acc 的虚拟示例;对于df,您实际上可以使用任何数据框,只要它有一个因执行hclust 而被删除但用于比较的因子变量(这里称为Group)。
  • 我为df添加了一个示例

标签: r datagrid combinations permutation


【解决方案1】:

我们可以在base R中使用Map

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

【讨论】:

  • 谢谢,这对解决问题大有帮助。但它似乎失去了标题,这对我来说有点重要......(也就是说,最终输出是一个列表,可以强制转换为包含我想要的所有数字信息的表格:但行没有标记就像我上面的acc 函数中只有第一列和第二列,不再是超参数标签。)
  • @MobeusZoom 你介意提供一个例子'df'
  • 我已经编辑了我的帖子。看看,希望够了吗?
  • @MobeusZoom 所以你的'df'是iris?
  • @MobeusZoom 无法复制
【解决方案2】:

一种方法可能是map2 来自purrr

library(purrr)
map2(hyperparams$meths, hyperparams$dists,
     ~ acc(hclust(dist(df[-1],method = .x), method = .y)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多