Esto puede o no ser útil para usted, dependiendo de cuáles sean sus necesidades. Suponiendo que esté interesado en la similitud entre las tareas de agrupación:
El coeficiente de similitud de Jaccard o índice de Jaccard se pueden usar para calcular la similitud de dos asignaciones de agrupamiento.
Dados los etiquetados L1
y L2
, Ben-Hur, Elisseeff y Guyon (2002) han demostrado que el índice Jaccard se puede calcular utilizando productos de punto de una matriz intermedia. El siguiente código aprovecha esto para rápidamente calcular el índice Jaccard sin tener que almacenar las matrices intermedias en la memoria.
El código está escrito en C ++, pero se puede cargar en R usando el sourceCpp
comando.
/**
* The Jaccard Similarity Coefficient or Jaccard Index is used to compare the
* similarity/diversity of sample sets. It is defined as the size of the
* intersection of the sets divided by the size of the union of the sets. Here,
* it is used to determine how similar to clustering assignments are.
*
* INPUTS:
* L1: A list. Each element of the list is a number indicating the cluster
* assignment of that number.
* L2: The same as L1. Must be the same length as L1.
*
* RETURNS:
* The Jaccard Similarity Index
*
* SIDE-EFFECTS:
* None
*
* COMPLEXITY:
* Time: O(K^2+n), where K = number of clusters
* Space: O(K^2)
*
* SOURCES:
* Asa Ben-Hur, Andre Elisseeff, and Isabelle Guyon (2001) A stability based
* method for discovering structure in clustered data. Biocomputing 2002: pp.
* 6-17.
*/
// [[Rcpp::export]]
NumericVector JaccardIndex(const NumericVector L1, const NumericVector L2){
int n = L1.size();
int K = max(L1);
int overlaps[K][K];
int cluster_sizes1[K], cluster_sizes2[K];
for(int i = 0; i < K; i++){ // We can use NumericMatrix (default 0)
cluster_sizes1[i] = 0;
cluster_sizes2[i] = 0;
for(int j = 0; j < K; j++)
overlaps[i][j] = 0;
}
//O(n) time. O(K^2) space. Determine the size of each cluster as well as the
//size of the overlaps between the clusters.
for(int i = 0; i < n; i++){
cluster_sizes1[(int)L1[i] - 1]++; // -1's account for zero-based indexing
cluster_sizes2[(int)L2[i] - 1]++;
overlaps[(int)L1[i] - 1][(int)L2[i] - 1]++;
}
// O(K^2) time. O(1) space. Square the overlap values.
int C1dotC2 = 0;
for(int j = 0; j < K; j++){
for(int k = 0; k < K; k++){
C1dotC2 += pow(overlaps[j][k], 2);
}
}
// O(K) time. O(1) space. Square the cluster sizes
int C1dotC1 = 0, C2dotC2 = 0;
for(int i = 0; i < K; i++){
C1dotC1 += pow(cluster_sizes1[i], 2);
C2dotC2 += pow(cluster_sizes2[i], 2);
}
return NumericVector::create((double)C1dotC2/(double)(C1dotC1+C2dotC2-C1dotC2));
}
vegan
paquete. Creo que también tienden a estar bastante bien optimizados para la velocidad.