Cómo escribir código similar a un sitio web de citas

Realmente depende de los datos de entrada. Una entrada de valor único puede usar una estructura de datos ordenada y compararla con los vecinos más cercanos. Eso, por supuesto, no es lo que estás pidiendo. La analogía del sitio de citas me dice que espera que cada entrada tenga un rango de dimensiones. Esas dimensiones son probablemente valores booleanos o enumerados según los detalles, pero no tenemos que limitarnos a dar una respuesta genérica aquí.

En estos casos utilizo los términos dimensión muy intencionalmente. Cada entrada se puede utilizar como un vector desde el origen. Eso lo convierte en un punto en un espacio dimensional superior. Luego puede calcular la distancia entre ese punto y todos los demás puntos y almacenar el valor en una matriz. Por supuesto, se pueden aplicar ponderaciones para enfatizar o resaltar una contribución de dimensiones particulares como las compensaciones.

Utilizando esta configuración, hay una serie de operaciones que están disponibles. Los vecinos más cercanos, los SVM son útiles para agrupar y clasificar. PCA puede decirle la importancia de cada dimensión. Esta lista sigue y sigue. Que te diviertas.

Dependiendo de cuán grande sea su conjunto de datos, es posible que desee probar varios enfoques.

El método ingenuo usualmente involucra el uso de la distancia de coseno o alguna variante para calcular la diferencia de “porcentaje” entre 2 vectores.

https://en.m.wikipedia.org/wiki/

Esencialmente, cada perfil se puede representar mediante un vector de valores: cada valor representa la puntuación de un atributo.

Por ejemplo, [attr1, attr2, attr3]

Sin embargo, si el atributo es categórico en lugar de numérico, es posible que desee realizar algún tipo de codificación en caliente.

https://en.m.wikipedia.org/wiki/

Y probablemente deberías usar la distancia Hamming en su lugar. Como la distancia del coseno no es significativa, especialmente si la dimensión es alta (todo se vuelve similar a todo, maldición de alta dimensionalidad)

https://en.m.wikipedia.org/wiki/

https://en.m.wikipedia.org/wiki/

Eso es para el enfoque ingenuo. Sin embargo, si su conjunto de datos es grande, tendrá algún problema con el rendimiento. La comparación por pares es o (n ^ 2). Ej. Comparando 100k perfiles = 10,000M comparaciones.

Por lo tanto, la estrategia como el hash sensible a la localidad se suele emplear para reducir la comparación por pares.

https://en.m.wikipedia.org/wiki/

Esto puede variar enormemente, pero a un nivel simple, esto es lo que se conoce como un simple problema MapReduce :

Dada una entrada x de tipo HashMap [String, Bool] y un conjunto Y coincidente de varias instancias de este HashMap, realizamos la siguiente operación:

coincidencias val = Y.map (y => {
y.keys.map (clave => {
y (clave) .equals (x (clave)
}
}
val matchPercents = matches.map (matchOrNot => {
(matchOrNot.count (match => match == true) / matchOrNot.size) * 100
})

Entonces, este es un enfoque muy simple: asignamos desde los atributos de dos personas a una secuencia de verdadero | falso para cada atributo que coincida o no. Luego simplemente reducimos para calcular el porcentaje de atributos que coinciden. En este caso no estoy usando reducir explícitamente pero el efecto es el mismo.

Obviamente, lo anterior no es necesario, pero ese es probablemente el enfoque más básico, y cualquier otro requerirá conocer los tipos de datos y la política de coincidencia precisa.