Я хочу знать, есть ли какой-нибудь возможный способ для вычисления коэффициента Жакара с использованием умножения матриц.
Я использовал этот код
jaccard_sim <- function(x) {
# initialize similarity matrix
m <- matrix(NA, nrow=ncol(x),ncol=ncol(x),dimnames=list(colnames(x),colnames(x)))
jaccard <- as.data.frame(m)
for(i in 1:ncol(x)) {
for(j in i:ncol(x)) {
jaccard[i,j]= length(which(x[,i] & x[,j])) / length(which(x[,i] | x[,j]))
jaccard[j,i]=jaccard[i,j]
}
}
Это вполне нормально для реализации в R. Я сделал сходство с кубиками, но застрял с Tanimoto / Jaccard. Кто-нибудь может помочь?
vegan
пакете уже реализован ряд индексов подобия (включая Jaccard) . Я думаю, что они также довольно хорошо оптимизированы для скорости.Ответы:
Мы знаем , что Jaccard (вычисленный между любыми двумя столбцами бинарных данных ) являетсяИкс ,то время как Роджерс-Танимото является+дaа + б + с , гдеа + да + д+ 2 ( б + с )
, количество строк в Xа + б + с + д= п Икс
Тогда мы имеем:
Я проверил численно, если эти формулы дают правильный результат. Они делают.
источник
not X
X, где 1-> 0, 0-> 1. И любое деление здесь является поэлементным делением. Пожалуйста, исправьте мою запись, если вы видите, что она не подходит.Приведенное выше решение не очень хорошо, если X разреженный. Потому что, взяв! X, получим плотную матрицу, занимающую огромное количество памяти и вычислений.
Лучшее решение - использовать формулу Jaccard [i, j] = #common / (#i + #j - #common) . С разреженными матрицами вы можете сделать это следующим образом (обратите внимание, что код также работает для не разреженных матриц):
источник
Это может или не может быть полезно для вас, в зависимости от ваших потребностей. Предполагая, что вы заинтересованы в сходстве между кластеризационными заданиями:
Коэффициент подобия Жакара или индекс Жакара могут быть использованы для расчета сходства двух кластерных назначений.
Учитывая маркировки
L1
иL2
, Бен-Гур, Elisseeff и Гийон (2002) показали , что индекс Jaccard можно рассчитать с помощью дот-продукты промежуточной матрицы. Приведенный ниже код использует это для быстрого вычисления индекса Жакара без необходимости хранить промежуточные матрицы в памяти.Код написан на C ++, но может быть загружен в R с помощью
sourceCpp
команды.источник