Разверните сетку в R с помощью unlist и примените - PullRequest
0 голосов
/ 08 мая 2020

Я хочу использовать expand.grid R для всестороннего перечисления и исследования вариантов иерархического кластерного анализа. У меня есть последняя функция acc, которая возьмет матрицу и проанализирует ее на предмет показателей производительности, таких как точность, точность, F1 и т. Д. c., Возвращая именованный список (с точностью, F1, и т. Д. c.): Окончательный результат, который я ищу, представляет собой таблицу, в которой перечислены все комбинации гиперпараметров, а в столбцах рядом с ними указаны различные показатели производительности (точность, 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 для dist среди тех, что перечислены в моем dists, и аргумент method для hclust среди тех, которые перечислены в моем meths. Напомним, что в последней строке я написал acc, который будет принимать матрицу и выводить именованный список точности, точности, F1, ... каждый из которых я бы хотел в столбце итоговой таблицы, чьи Строки - это комбинации гиперпараметров в hyperparams.

Итак, моя первая проблема заключается в том, что я не уверен, как использовать unlist таким образом, чтобы охватить все параметры, указанные выше. Я почти уверен, что это правильная функция, но просто не знаю, как это сделать. И я также хочу создать таблицу без a for-l oop, то есть с помощью apply или чего-то в этом роде (я думаю, применяя по строкам hyperparams? ...), так как я знаю такие решения обычно лучше в R.

Как было предложено, окончательный желаемый результат будет, по сути, hyperparams, но в виде кадра данных с дополнительными столбцами, третий столбец содержит точность, четвертый - точность и т. д. c (меры, перечисленные в моей функции 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 даст одну строку желаемого вывода (строка, соответствующая euclidean и complete. Тогда желаемый результат будет выглядеть как hyperparams с каждым из двух текущих столбцов, за которым следуют (скажем) два больше столбцов, по одному для каждого из двух моих показателей производительности в acc.

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Мы можем использовать Map в base R

Map(function(x, y) acc(hclust(dist(df[-1],method = x), method = y),
           hyperparams[[1]], hyperparams[[2]])
2 голосов
/ 08 мая 2020

Один подход может быть map2 из purrr

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