Esta es una visión alternativa a la respuesta aquí .
Usuario $u_i$ no ha visto la película $m_j$ todavía, pero ¿cuál es la probabilidad de que el usuario $u_i$ dará la película $m_j$ una puntuación que es $\ge t$ ¿si lo ve?
Digamos que el conjunto de puntuaciones de películas es discreto y es $\mathcal{S}$ . Lo cual es habitual. Por ejemplo, en un sistema de clasificación de 5 estrellas $\mathcal{S} = \{\frac{1}{5}, \frac{2}{5}, \frac{3}{5}, \frac{4}{5}, \frac{5}{5}\}$ . También digamos que $\mathcal{U}$ es el conjunto de usuarios, y $\mathcal{M}$ es el conjunto de películas.
$t$ es algún umbral que definimos y que creemos que es un buen punto de corte que nos dice cuándo es digno de recomendar una película a alguien. Quizás $t = \frac{4}{5}$ es una buena idea.
Digamos que $S$ es una puntuación r.v. que toma valores en $\mathcal{S}$ , $U$ son usuarios r.v. que toman valores en $\mathcal{U}$ et $M$ es películas r.v. que toman valores en $\mathcal{M}$ .
Entonces queremos encontrar esta probabilidad:
$$ P = \sum_{s \in \mathcal{S}:s \ge t}\Pr(S=s|U=u_i, M=m_j) $$
Sólo si $P > 0.5$ recomendamos la película $m_j$ al usuario $u_i$ .
Digamos que tenemos $n$ número de calificaciones de películas que su puntuación es $\ge t$ . Algunas de las valoraciones son por parte del usuario objetivo $u_i$ en diferentes películas, algunos más de ellos están en la película de destino $m_j$ pero por usuarios diferentes $u_k$ donde $k \ne i$ y, por lo general, la gran mayoría de ellos son de diferentes usuarios en diferentes películas.
$$ \widehat{\Pr}(S=s|U=u_i, M=m_j) = \frac{1}{n}\sum_{k\in\mathcal{U}}\sum_{l\in\mathcal{M}}\begin{cases} \texttt{sim}^*(u_i,u_k,m_j,m_l) & \text{ if } \texttt{score}(u_k,m_l) \ge s\\ 0 & \text{ if } \texttt{score}(u_k,m_l) < s\\ \end{cases} $$
Donde $\texttt{sim}^*(u_i,u_k,m_j,m_l)$ es una puntuación de similitud en $[0,1]$ es decir $1$ cuando $u_i$ es perfectamente similar a $u_k$ y $m_j$ es perfectamente similar a $m_l$ (es decir $u_i=u_k, m_j=m_l$ que nunca sucede), y es $0$ cuando $u_i$ es perfectamente dis similar a $u_k$ y $m_j$ es perfectamente dis similar a $m_l$ . Así que normalmente esta puntuación de similitud está entre $0$ y $1$ .
Así que lo que te sugiero es que renuncies a sólo buscando similitudes entre usuarios, y -en su lugar- ampliarlo a las similitudes entre usuarios y películas.
Hay que encontrar un equilibrio entre la importancia del usuario y las similitudes de las películas. Por ejemplo, si un usuario es extremadamente dis similar a $u_i$ pero ve una película que es extremadamente similar a la película $m_j$ Pero, sin embargo, le dice algo que es más que nada, y es mejor que considere ese algo. Pero si tanto el usuario como la película son dis similar a $u_i$ y $m_j$ entonces probablemente puedas ignorarlo.
Es necesario encontrar el $\texttt{sim}^*$ función. Esto se puede hacer buscando todas esas funciones de similitud y sólo elegir la que minimice algún error. El error que sugiero minimizar es este: $$ \texttt{sim}^* = \underset{\texttt{sim} \in \mathcal{H}}{\text{arg min }}\sum_{i \in \mathcal{U}}\sum_{j \in \mathcal{M}} \sum_{k \in \mathcal{U}}\sum_{l \in \mathcal{M}}|\texttt{sim}(u_i,u_k,m_j,m_l) \times \texttt{score}(u_i, m_j) - \texttt{score}(u_k, m_l)| $$ donde $\mathcal{H}$ es el espacio de las funciones.
Simplemente, se puede asumir que $\texttt{sim}^*$ es un polinomio, y luego utilizar cosas como el descenso de gradiente o la búsqueda en cuadrícula, o cualquier búsqueda adecuada para $\texttt{sim}^*$ y terminar encontrando su estimación $\widehat{\texttt{sim}}^*$ (debido a las limitaciones en la suposición de que $\texttt{sim}^*$ es un polinomio y limitaciones en el algoritmo de búsqueda). En cuanto a los usuarios y las películas, puedes representarlos como vectores, tal y como se describe aquí .
Nota: No estoy seguro del objetivo de minimización anterior. Creo que se puede simplificar al menos.