<jupyter_start><jupyter_text>Trabajo de Inteligencia Colectiva Con el fin de darle una orientación al trabajo seguiremos los siguientes pasos:  **Introducción**   **Descripción del Método utilizado**    **Descripción del conjunto de datos**    **Análisis del conjunto de datos**    **Conclusión de las recomendaciones**     **Introducción**  ==**¿Que son los Sistemas de Recomendación?** **Def:** Un sistema de recomendación es un **sistema inteligente ** que proporciona a los **usuarios** un serie de **sugerencias personalizadas** (recomendaciones) **sobre un determinado tipo de elementos** (items). Los sistemas de recomendación estudian las características de cada usuario y mediante un procesamiento de los datos, encuentra un subconjunto de items que pueden resultar de interés para el usuario. Los Sistemas de Recomendación, se clasifican en 4 tipos:**Filtrado Basado en contenido:** (ejm: Youtube) Las recomendaciones se basan en el conocimiento que se tiene sobre los items qe el usuario ha valorado (ya sea de forma implícita o explícita), y se le recomendarán items similares que le puedan gustar o interesar.**Filtrado Demográfico**: Estas recomendaciones se realizan en función de las características de los usuarios (edad, sexo, situación geográfica, profesión, etc).**Filtrado Colaborativo:** (ejem: Filmaffinity) El filtrado colaborativo consiste en ver que usuarios son similares al usuario activo (o usuario al que hay que realizarle las recomendaciones) y a continuación,recomendar aquellos items que no han sido votados por el usuario activo y que han resultado bien valorados por los usuarios similares.**Filtrado Híbrido:** (ejm: Amazon) Mezclan alguno de los tres filtrados mencionados anteriormente para realizar recomendaciones e incluso lo combinan con alguna otra técnica de inteligencia artificial como pueda ser la lógica borrosa o la computación evolutiva. 2. Descripción del Método utilizado==**Sistemas de Recomendación basado en Filtrado Colaborativo [K-Vecinos (knn)]** **Def:** Dentro de los sistemas de recomendación basados en filtrado colaborativo, existen dos clasificaciones que son los basados en memoria y los basados en modelos. **Métodos basado en memoria:** Emplean métrias de similaridad para determinar el parecido entre una pareja de usuarios. Para ello calculan los items que han sido votados por ambos usuarios y comparan dichos votos para calcular la similaridad.**Métodos basados en modelos:** utilizan la matriz de votaciones para crear un modelo a través del cual establecer el conjunto de usuarios similares al usuario activo. Algunos ejemplos de estos modelos son los clasiﬁcadores bayesianos, las redes neuronales, algoritmos genéticos, sistemas borrosos y la técnica de descomposición matricial basada en la técnica matemática del SVD.**Nota:** de entrada nos centraremos en el método basado en memoria. A continuación vamos a motrar las tres métricas de similaridad propuestas que básicamente lo que hacen es calcular "**las distancias**" que hay entre cada par de usuarios:* **MSD (Minimum Square Difference)**$$sim(x,y)  = 1-\frac{1}{\B_{x,y}} \sum_{i\in I_u}{\left(\frac{r_{x,i}-r_{y,i}}{max-min}\right)^{2}}$$Siendo $\B_{x,y}$ el número de productos que ambos usuarios han calificado (y que tiene que ser necesariamente mayor que 0); siendo $r_{x,i}$ y $r_{y,i}$ las calificaciones emitidas por los usuarios $x$ e $y$ respectivamente, y sinedo $max$ y $min$ las calificaciones máximas y mínimas que los usuarios han emitido.* **Correlación de Pearson**$$sim(x,y)  = \frac{\sum_{i\in I_u}{\left(r_{x,i}-\overline{r}_x \right)*\left(r_{y,i}-\overline{r}_y \right)} }{\sqrt{ \sum_{i\in B_{x,y}}{\left(r_{x,i}-\overline{r}_x \right)^2 * \sum_{i\in B_{x,y}}}{\left(r_{y,i}-\overline{r}_y \right)^2 } }}$$Siendo $\overline{r}_x$ la media de calificación del usuario $x$.* **Coseno:** Mide la distancia que hay entre dos usuarios en función del ángulo que forman entre ellos.$$sim(x,y)  = \frac{\sum_{i\in I_u}{r_{x,i}*r_{y,i}} }{\sqrt{ \sum_{i\in B_{x,y}}{r_{x,i}^2}}*\sqrt{ \sum_{i\in B_{x,y}}{r_{y,i}^2}} }$$ 3. Descripción del conjunto de datos==El conjunto de datos pertenece a la tienda de bebé de Amazon que ofrece desde alimento, hasta mobiliario y juguetes para todo tipo de ocasión, los datos fueron extraidos de la página de **Stanford University**. Este conjunto de datos incluye revisiones (calificaciones, texto, votos de ayuda), metadatos del producto (descripciones, información de categoría, precio, marca e imágenes) y enlaces (también vistos / también compró gráficos). Link:(**Página de datos [Amazon][1]**)[1]: http://jmcauley.ucsd.edu/data/amazon/ "Página de Amazon" 4. Análisis del conjunto de datos==**Objetivo:** Recomendar calificaciones de los productos que un usuarios no ha calificado, por medio del método del **Vecino más cercano [K-Vecino (knn)]**.**Desarrollo:** Este sistema de recomendación se hará en el lenguaje de programación **R** ya que nos brinda herramientas que permiten un gran análisis, en miras a dar una buena recomendación al usuario.<jupyter_code># Cargamos los paquetes necesarios para el análisis
options(warn=-1)
library(recommenderlab)
library(Matrix)
library(lsa)
library(class)
library(ggplot2)
# lectura de datos 
datos <- read.table(file.choose(),header = TRUE, sep = ",")
head(datos)
str(datos)
# Convertimos los datos al formato adecuado para hacer el análisis
# sr: Sistema de Recomendación
sr <- as(datos, "realRatingMatrix")
sr
# Matriz de similaridad del usuario usando el método de coseno
similarity_users <- similarity(sr[1:6, ], method = "cosine", which = "users")
similarity_users

# Viene del libro:
#similarity_users <- similarity(MovieLense[1:4, ], method = "cosine", which = "users")
# Sirve para visualizar la matriz de similaridad de los usuarios completa 
 as.matrix(similarity_users)

# Viene del libro
# as.matrix(similarity_users)
# Sirve par sacar un mapa de calor de la matriz de similaridad de los usuarios
image(as.matrix(similarity_users), main = "Similaridad de los Usuarios", xlab= "Usuario", ylab="Usuario")

# Conclusión: Este gráfico se analiza de la siguiente forma: 
# Entre más rojo este un cuadro significa que hay más similaridad entre los usuarios

# Viene del libro
# image(as.matrix(similarity_users), main = "User similarity")
# Sirve para sacar la matriz de similaridad de los productos
similarity_items <- similarity(sr[, 1:6], method = "cosine", which = "items")
similarity_items

# Viene del libro:
# similarity_items <- similarity(MovieLense[, 1:4], method = "cosine", which = "items")
# Sirve para visualizar la matriz de similaridad de los productos completa 
as.matrix(similarity_items)

# Viene del libro
# as.matrix(similarity_items)
# Sirve par sacar un mapa de calor de la matriz de similaridad de los productos
image(as.matrix(similarity_items), main = "Similaridad de los Productos", xlab="Productos", ylab="Productos")

# Conclusión: Este gráfico se analiza de la siguiente forma: 
# Entre más rojo este un cuadro significa que hay más similaridad entre los productos

# Viene del libro
# image(as.matrix(similarity_items), main = "Item similarity")
# El paquete tiene varios algoritmos de recomendación que son los siguientes:
modelos_recomendacion <- recommenderRegistry$get_entries(dataType ="realRatingMatrix")
names(modelos_recomendacion)
# Sirve para ver la descripción de cada algoritmo de recomendación
lapply(modelos_recomendacion, "[[", "description")
# Sirve para ver los parámetros de cada algoritmo de recomendación
modelos_recomendacion$IBCF_realRatingMatrix$parameters
# Sirve para ver las dimensiones de los datos esto quiere decir cantidad de Usiarios, cantidad de productos
dim(sr)
# Sirve para crear un vector de calificaciones
 vector_ratings <- as.vector(sr@data)
 unique(vector_ratings)

# Viene del libro
# vector_ratings <- as.vector(MovieLense@data)
# unique(vector_ratings)
# Sirve para crear una tabla de frecuencias con las calificaciones de los productos
 table_ratings <- table(vector_ratings)
 table_ratings

# Viene del libro
# table_ratings <- table(vector_ratings)
# table_ratings
# Sirve para sacar las frecuencias de las calificaciones de los productos
vector_ratings <- vector_ratings[vector_ratings != 0]
vector_ratings <- factor(vector_ratings)


# Viene del libro
# vector_ratings <- vector_ratings[vector_ratings != 0]
# vector_ratings <- factor(vector_ratings)
# Sirve para hallar la distribución de frecuencias de las calificaciones de los productos
 qplot(vector_ratings) + ggtitle("Distribución de Calificaciones") 

# Viene del libro
# qplot(vector_ratings) + ggtitle("Distribution of the ratings")
# Sirve para saber que prodcutos han sido más calificados
 views_per_prod <- colCounts(sr)
 table_views <- data.frame(producto = names(views_per_prod), vistas = views_per_prod)
 table_views <- table_views[order(table_views$vistas, decreasing = TRUE), ]
 table_views

# Viene del libro
# views_per_movie <- colCounts(MovieLense)
# table_views <- data.frame(movie = names(views_per_movie),views = views_per_movie)
# table_views <- table_views[order(table_views$views, decreasing = TRUE), ]
# Sirve para generar el gráfico de los productos más calificados
ggplot(table_views[1:5, ], aes(x = producto, y = vistas)) + geom_bar(stat="identity") + theme(axis.text.x =
 element_text(angle = 45, hjust = 1)) + ggtitle("Número de vistas del top de Productos")

# Viene del libro
# ggplot(table_views[1:6, ], aes(x = movie, y = views)) + geom_bar(stat="identity") + theme(axis.text.x =
# element_text(angle = 45, hjust = 1)) + ggtitle("Number of views of the top movies")
# Sirve para sacar el promedio de calificaciones de los productos
average_ratings <- colMeans(sr)
average_ratings


# Viene del libro
# average_ratings <- colMeans(MovieLense)
# Sirve para sacar el gráfico de distribución del promedio de calificaciones de los productos
qplot(average_ratings) + stat_bin(binwidth = 0.05) + 
ggtitle("Distribución del promedio de calificaciones de los productos")
options(warn=-1)

# Viene del libro
# qplot(average_ratings) + stat_bin(binwidth = 0.1) + ggtitle("Distribution of the average movie rating")
# Promedio de la calificación de los productos más calificados 
average_ratings_relevant <- average_ratings[views_per_prod > 8]
average_ratings_relevant

# Viene del libro
# average_ratings_relevant <- average_ratings[views_per_movie > 100]
# Sirve para sacar el gráfico de distribución del promedio de las calificaciones de los productos más calificados
qplot(average_ratings_relevant) + stat_bin(binwidth = 0.1) +
ggtitle(paste("Distribución de promedio de calificaciones más relevantes"))

# Viene del libro
# qplot(average_ratings_relevant) + stat_bin(binwidth = 0.1) + ggtitle(paste("Distribution of the relevant average ratings"))
# Sirve para sacar la siguiente información:
# Número mínimo de productos por usuario
# Número mínimo de usuarios por productos
min_n_product <- quantile(rowCounts(sr), 0.80)
min_n_product
min_n_users <- quantile(colCounts(sr), 0.80)
min_n_users

# Viene del libro
# min_n_movies <- quantile(rowCounts(MovieLense), 0.99)
# min_n_users <- quantile(colCounts(MovieLense), 0.99)
# min_n_movies
# min_n_users
# Sirve para sacar un gráfico de calor con el top de usuarios y productos
image(sr[rowCounts(sr) > min_n_product, colCounts(sr) > min_n_users], main = "Mapa de calor del top de usuarios y productos")

# Viene del libro
# image(MovieLense[rowCounts(MovieLense) > min_n_movies,colCounts(MovieLense) > min_n_users], main = "Heatmap of the top users
# and movies")
# Sirve para sacar el conjunto de datos más calificado
ratings_product <- sr[rowCounts(sr) > 3, colCounts(sr) > 3] 
ratings_product

# Viene del libro
# ratings_movies <- MovieLense[rowCounts(MovieLense) > 50,colCounts(MovieLense) > 100] ratings_movies
# Sirve para crear una muestra alatoria para generar el conjunto de entrenamiento y de prueba del modelo
which_train <- sample(x = c(TRUE, FALSE), size = nrow(ratings_product),replace = TRUE, prob = c(0.6, 0.4))
head(which_train)


# Viene del libro 
# which_train <- sample(x = c(TRUE, FALSE), size = nrow(ratings_movies),replace = TRUE, prob = c(0.8, 0.2))
# head(which_train)
# Sirve para crear el conjunto de entrenamiento y de prueba con la muestra aleatoria antes creada
recc_data_train <- ratings_product[which_train, ]
recc_data_test <- ratings_product[!which_train, ]

# Viene del libro
# recc_data_train <- ratings_movies[which_train, ]
# recc_data_test <- ratings_movies[!which_train, ]
# Sirve para construir la recomendación generando muestras aleatorias de los conjuntos de entrenamiento y prubea.
which_set <- sample(x = 1:5, size = nrow(ratings_product), replace = TRUE)
for(i_model in 1:5) {
    which_train <- which_set == i_model
    recc_data_train <- ratings_product[which_train, ]
    recc_data_test <- ratings_product[!which_train, ]
# build the recommender
}

# Viene del libro
#which_set <- sample(x = 1:5, size = nrow(ratings_movies), replace = TRUE)
#for(i_model in 1:5) {
#which_train <- which_set == i_model
#recc_data_train <- ratings_movies[which_train, ]
#recc_data_test <- ratings_movies[!which_train, ]
# build the recommender
#}
# Sirve para entrenar el modelo de recomendación usando el algoritmo IBCF que es del K-Vecino más cercano
recc_model <- Recommender(data = recc_data_train, method = "IBCF", parameter = list(k = 4))
recc_model

# Viene del libro
# recc_model <- Recommender(data = recc_data_train, method = "IBCF", parameter = list(k = 30))
# recc_model
# Sirve para aplicar la recomendación a los clientes del conjunto de prueba
n_recommended <- 6
recc_predicted <- predict(object = recc_model, newdata = recc_data_test, n = n_recommended)
recc_predicted

# Viene del libro
# n_recommended <- 6
# recc_predicted <- predict(object = recc_model, newdata = recc_data_test, n = n_recommended)
# recc_predicted
# Sirve para ver los indices de los productos recomendados al primer usuario
recc_predicted@items[[1]]

# Viene del libro
# recc_predicted@items[[1]]
# Sirve para extraer los productos recomendados al primer usuario
recc_user_1 <- recc_predicted@items[[1]]
product_user_1 <- recc_predicted@itemLabels[recc_user_1]
product_user_1

# Viene del libro
# recc_user_1 <- recc_predicted@items[[1]]
# movies_user_1 <- recc_predicted@itemLabels[recc_user_1]
# movies_user_1
# Sirve para definir la matriz de recomendación para cada usuario
recc_matrix <- sapply(recc_predicted@items, function(x){
    colnames(ratings_product)[x]
})
as.matrix(recc_matrix)

# Viene del libro
#recc_matrix <- sapply(recc_predicted@items, function(x){
#    colnames(ratings_movies)[x]
#})
# dim(recc_matrix)
# Siver para ver la recomendación de los primeros 4 usuarios
as.matrix(recc_matrix)[1:4,]

# Viene del libro
# recc_matrix[, 1:4]<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09571873729846904, 'fraction_numerical': 0.007248340333288172, 'mean_word_length': 5.806362378976487, 'pattern_counts': {'":': 0, '<': 62, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '655685', 'license': 'MIT', 'n_tokens_mistral': 5193, 'n_tokens_neox': 5047, 'n_words': 1610, 'path': 'InteligenciaColectiva/InteligenciaColectiva.ipynb', 'repo_name': 'petusan36/Anal-tica-de-Redes', 'size': '14762'}