【发布时间】: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 中列出的dist 的method 参数和hclust 的method 参数在我的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 将给出所需输出的一行(对应于euclidean 和complete 的行。所需的输出将看起来像hyperparams,两个当前列中的每一列后跟(比如说)两个更多列,我在acc 中的两个绩效指标各一个。
【问题讨论】:
-
您能否提供
df和acc函数的示例? -
如果分配给每个集群的任意整数可能在迭代之间发生变化,您打算如何量化与已知标签的相似性?
-
@Dij 别担心,我已经通过对角线最大化考虑了这一点。 @Ian Campbell,提供了
acc的虚拟示例;对于df,您实际上可以使用任何数据框,只要它有一个因执行hclust而被删除但用于比较的因子变量(这里称为Group)。 -
我为
df添加了一个示例
标签: r datagrid combinations permutation