ver por los contador como statistics social-networking data-mining pattern-recognition similarity

statistics - por - Maneras de calcular la similitud



como ver los tweets de un hashtag (6)

Asigne a cada atributo un peso apropiado y agregue las diferencias entre los valores.

enum SkinType Dry, Medium, Oily enum HairLength Bald, Short, Medium, Long UserDifference(user1, user2) total := 0 total += abs(user1.Age - user2.Age) * 0.1 total += abs((int)user1.Skin - (int)user2.Skin) * 0.5 total += abs((int)user1.Hair - (int)user2.Hair) * 0.8 # etc... return total

Si realmente necesita similitud en lugar de diferencia, use 1 / UserDifference(a, b)

Estoy haciendo un sitio web comunitario que me obliga a calcular la similitud entre dos usuarios. Cada usuario se describe con los siguientes atributos:

edad, tipo de piel (grasa, seca), tipo de cabello (largo, corto, medio), estilo de vida (amante activo al aire libre, TV junky) y otros.

¿Alguien puede decirme cómo abordar este problema o indicarme algunos recursos?



Mira los algoritmos para calcular la diferencia. Es muy similar a lo que necesitas. Almacena tus atributos como una cadena de bits y calcula la distancia entre las cadenas


Otra forma de calcular (en R ) todas las diferencias entre pares (distancias) entre las observaciones en el conjunto de datos. Las variables originales pueden ser de tipos mixtos. El manejo de los datos binarios simétricos, ordinales y (a) simétricos se logra utilizando el coeficiente de disimilitud general de Gower (Gower, JC (1971) Un coeficiente general de similitud y algunas de sus propiedades, Biometrics 27, 857–874). Para más información, consulte esto en la página 47 . Si x contiene alguna columna de estos tipos de datos, el coeficiente de Gower se usará como la métrica.

Por ejemplo

x1 <- factor(c(10, 12, 25, 14, 29)) x2 <- factor(c("oily", "dry", "dry", "dry", "oily")) x3 <- factor(c("medium", "short", "medium", "medium", "long")) x4 <- factor(c("active outdoor lover", "TV junky", "TV junky", "active outdoor lover", "TV junky")) x <- cbind(x1,x2,x3,x4) library(cluster) daisy(x, metric = "euclidean")

obtendrás :

Dissimilarities : 1 2 3 4 2 2.000000 3 3.316625 2.236068 4 2.236068 1.732051 1.414214 5 4.242641 3.741657 1.732051 2.645751

Si está interesado en un método para reducir la dimensionalidad de los datos categóricos (también es una forma de organizar las variables en grupos homogéneos), verifique this


Probablemente deberías echar un vistazo por

Estos temas le permitirán a su programa reconocer similitudes y grupos en su colección de usuarios y tratar de adaptarse a ellos ...

Luego puede conocer diferentes grupos ocultos de usuarios relacionados ... (es decir, a los usuarios con cabello verde generalmente no les gusta ver la televisión).

Como consejo, intente utilizar herramientas ya implementadas para esta función en lugar de implementarla usted mismo ...
Echa un vistazo a Open Directory Data Mining Projects.


Tres pasos para lograr una métrica subjetiva simple para la diferencia entre dos puntos de datos que podrían funcionar bien en su caso:

  1. Capture todas sus variables en una variable numérica representativa, por ejemplo: tipo de piel (grasa = -1, seco = 1), tipo de cabello (largo = 2, corto = 0, medio = 1), estilo de vida (amante activo al aire libre = 1, TV junky = -1), la edad es un número.
  2. Escale todos los rangos numéricos para que se ajusten a la importancia relativa que les da para indicar la diferencia. Por ejemplo: una diferencia de edad de 10 años es tan diferente como la diferencia entre el cabello largo y mediano, y la diferencia entre la piel grasa y seca. Por lo tanto, 10 en la escala de edad es tan diferente como 1 en la escala de cabello es tan diferente como 2 en la escala de piel, por lo tanto, la diferencia en la edad en 0.1, que en el pelo en 1 y que en la piel en 0.5
  3. Use una métrica de distancia apropiada para combinar las diferencias entre dos personas en las diferentes escalas en una diferencia general. Cuanto menor es este número, más similares son. Yo sugeriría una diferencia cuadrática simple como un primer intento en su función de distancia.

Entonces, la diferencia entre dos personas podría calcularse con (supongo que Person.age, .skin, .hair, etc. ya han pasado por el paso 1 y son numéricos):

double Difference(Person p1, Person p2) { double agescale=0.1; double skinscale=0.5; double hairscale=1; double lifestylescale=1; double agediff = (p1.age-p2.age)*agescale; double skindiff = (p1.skin-p2.skin)*skinscale; double hairdiff = (p1.hair-p2.hair)*hairscale; double lifestylediff = (p1.lifestyle-p2.lifestyle)*lifestylescale; double diff = sqrt(agediff^2 + skindiff^2 + hairdiff^2 + lifestylediff^2); return diff; }

Tenga en cuenta que la diferencia en este ejemplo no está en una escala agradable como (0..1). Su valor puede variar de 0 (sin diferencia) a algo grande (alta diferencia). Además, este método es casi completamente no científico, solo está diseñado para darle rápidamente una métrica de diferencia de trabajo.