Saya ingin tahu apakah ada cara yang mungkin untuk menghitung koefisien Jaccard menggunakan perkalian matriks.
Saya menggunakan kode ini
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]
}
}
Ini cukup ok untuk diterapkan di R. Saya telah melakukan kemiripan dadu, tetapi terjebak dengan Tanimoto / Jaccard. Adakah yang bisa membantu?
r
matrix
binary-data
association-measure
similarities
pengguna4959
sumber
sumber
vegan
paket. Saya pikir mereka cenderung dioptimalkan dengan cukup baik untuk kecepatan juga.Jawaban:
Kita tahu bahwa Jaccard (dihitung antara dua kolom data biner mana pun ) adalah , sedangkan Rogers-Tanimoto adalah , di manaX aa+b+c a+da+d+2(b+c)
Maka kita memiliki:
Jadi, adalah matriks simetris persegi dari Jaccard antara semua kolom.An−D
Saya memeriksa secara numerik apakah formula ini memberikan hasil yang benar. Mereka melakukannya.
Pembaruan. Anda juga dapat memperoleh matriks dan :B C
Akibatnya, .C=B′
Matriks juga dapat dihitung dengan cara ini, tentu saja: .D n−A−B−C
Mengetahui matriks , Anda dapat menghitung matriks dari setiap koefisien kemiripan berpasangan (dis) yang ditemukan untuk data biner.A,B,C,D
sumber
not X
adalah X di mana 1-> 0, 0-> 1. Dan setiap divisi di sini adalah divisi elementwise. Harap perbaiki notasi saya jika Anda melihatnya tidak sesuai.Solusi di atas tidak terlalu baik jika X jarang. Karena mengambil! X akan membuat matriks padat, mengambil banyak memori dan komputasi.
Solusi yang lebih baik adalah dengan menggunakan rumus Jaccard [i, j] = #common / (#i + #j - #common) . Dengan matriks jarang Anda dapat melakukannya sebagai berikut (perhatikan kode juga berfungsi untuk matriks non-jarang):
sumber
Ini mungkin bermanfaat bagi Anda, tergantung pada apa kebutuhan Anda. Dengan asumsi bahwa Anda tertarik pada kesamaan antara tugas pengelompokan:
Koefisien Kemiripan Jaccard atau Indeks Jaccard dapat digunakan untuk menghitung kesamaan dari dua tugas pengelompokan.
Diberi label
L1
danL2
, Ben-Hur, Elisseeff, dan Guyon (2002) telah menunjukkan bahwa indeks Jaccard dapat dihitung dengan menggunakan produk-titik dari matriks perantara. Kode di bawah memanfaatkan ini untuk dengan cepat menghitung Indeks Jaccard tanpa harus menyimpan matriks perantara dalam memori.Kode ditulis dalam C ++, tetapi dapat dimuat ke R menggunakan
sourceCpp
perintah.sumber