Volver a predecir las preferencias del usuario recomendación

1. Descripción general

  Tradicional usuario colaboración, encontrar primero TopK similar al usuario , y luego utilizando la fórmula de puntuación para predecir el comportamiento del usuario de destino no excesiva elemento marcador, se recomienda esta puntuación basada en la producción de grande a pequeño. El método de regresión con la cantidad recomendada de usuario colaboración es mucho lo mismo, la diferencia principal es el retorno de la recomendación es aprender las características de las preferencias del usuario, por lo que este método utiliza clasificaciones de datos y de elementos características de la distribución. Este elemento de distribución de fondo debe ser conocido, tal como una mercancía que puede ser productos electrónicos, productos de entretenimiento, productos de aprendizaje, tales como diferentes tipos; una película puede ser un terror, entretenimiento, comedia y otras categorías, puede simplemente usar 0 , 1 indica que el artículo sea o categorías que tiene ciertas características, o alguna probabilidad de pasajeros.

  En resumen, el presente método es el uso de usuario características y elemento de distribución característica para adaptarse a la matriz de puntuación. Utilizando el modelo de regresión lineal, la optimización de descenso de gradiente, el objetivo es evaluado por el usuario desde el punto de aprender las características del perfil del usuario (o características puede hacer referencia a una imagen de usuario como).

2. La matriz de puntuación , M un usuario , N número de artículo . En el que hay un elemento de matriz de características.

  , Donde X 0 = 1. , X dimensión: m * (n- + 1.) , Utilizando regresión lineal a la puntuación de ajuste.

3. pérdida de pérdida cuadrado + L2 término de regularización

  

   En el que, el usuario tiene que aprender una distribución característica, X es una distribución característica de proyecto, R ^ ij de usuario i con el punto j puntuación real, K es el número de características.

4. Uso SGD entrenamiento (número de iteraciones se alcanza o pérdida es menor que el valor umbral)

  , En donde una fórmula para K = 0 ; 2 donde K> 0 .

5. Si el estudio sobre la distribución de las preferencias del usuario, se puede se puede utilizar calificaciones o preferencias de un usuario para encontrar la más parecida a la del usuario, y luego usando la distribución estimada de las características del proyecto de los usuarios objetivo y sus preferencias no anotó; o un usuario no dispone de preferencias, se puede utilizar el usuario de score calculan su más similar al usuario, que es la más parecida a la distribución de las preferencias del usuario como un aprendizaje a sus propias preferencias, tomar ventaja de esta característica preferencias y no anotó distribución de pre-proyecto estimaciones.

  A raíz de lo anterior segundo código es completa (Datos de MovieLens-100K), https://github.com/jiangnanboy/recommendation_methods/blob/master/com/sy/reco/recommendation/content/contentregression.py

Importación numpy AS NP
 importación Math
 de com.sy.reco.similarity.cosine importación Coseno 

'' ' 
como se usa aquí, la regularización de regresión lineal basado en matriz de características del artículo y la matriz de puntuación, entrenar a las preferencias del usuario. 
'' ' 
Clase UserFeatureRegression ():
     ' '' 
    inicialización ratingMatrix, itemsFeatures, Alpha, [lambda] 
    ratingMatrix: matriz de puntuación 
    en el que los elementos de la matriz: itemsFeatures 
    Alfa: aprendizaje tasa 
    lambda: el parámetro de regularización, para evitar un exceso de ajuste 
    '' ' 
    DEF  la __init__ ( Ser, ratingMatrix, itemsFeatures, Alpha, [lambda]): 
        self.ratingMatrix = ratingMatrix 
        self.itemsFeaturesMatrix = itemsFeatures 
        self.alpha =Alfa 
        self.λ = [lambda] 

    # pronóstico 
    DEF Predict (Ser, vec1, vec2): 
        Producto = 0. El
         de A, B en la postal (vec1, vec2): 
            Producto + = A * B
         retorno Producto 

    # iterativo descomposición formación, max_iter: La iteración frecuencia característica de aprendizaje a todos los usuarios (retrato) 
    DEF iteration_train (Self, max_iter): 
        n_features = len (self.itemsFeaturesMatrix [0]) + 1   # 0 de la línea, un total de características, además de 1 aquí es una regresión lineal = intercepción. 1 B 
        n_users = len (self.ratingMatrix) # número de usuarios 
        n_items = len (self.ratingMatrix [0]) # artículos 

        #La matriz característica elemento en items_features, la intersección de 0 como 1 
        # aumentado realmente a un proyecto matriz característica itemsFeaturesMatrix intercepción son los 1 
        items_features = np.ones ((n_items, n_features)) 
        items_features [:, 1 :] = self.itemsFeaturesMatrix 
        items_features = items_features.astype (float) 
        self.ratingMatrix = self.ratingMatrix.astype (float) 

        # initialize la matriz característica del usuario, aquí es la necesidad de resolver el peso correcto (regresión lineal) 
        users_featuers = np.random. RAND (n_users, n_features) 
        users_featuers [:, 0] . = 1 # de 0 es el término de intersección, un conjunto completo aquí 
        # solver iterativo, caracterizado por todos los usuarios 
        para la iteración en Rango (max_iter):
            para el usuario en el rango (n_users):
                 para funciones de rango (n_features):
                     SI Función == 0: # Este es el término de intersección, no necesitan regularización 
                        de artículo en el rango (n_items):
                             SI self.ratingMatrix [usuario, Artículo] > 0: # datos de entrenamiento valorados por 
                                # diferencia entre el valor predicho y el valor verdadero de 
                                -Diferencia = self.predict (users_featuers [usuario], items_features [artículos]) - self.ratingMatrix [usuario, elemento] 
                                users_featuers [usuario, Función] - = * * items_features self.alpha -Diferencia [artículo, la característica] #items_features [artículo, la característica] un representante de si el proyecto tiene esta característica, hay un 1, si existe, es 0 
                    el otro :
                         por artículo en el rango (n_items):
                             SI self.ratingMatrix [el usuario, Artículo]> 0: # Formación revisión datos excesivas 
                                -Diferencia = self.predict (users_featuers [usuario], items_features [Elemento]) - self.ratingMatrix [usuario, Elemento] 
                                users_featuers [usuario, Feature] - = self.alpha * (* items_features -Diferencia [artículo, Feature] + * self.λ users_featuers [usuario, Función]) 
        self.users_features = users_featuers 
        self.items_features = items_features 

    #La formación del error de predicción, la convergencia: el error de convergencia, el error es menos de la parada de 
    DEF convergence_train (Self, Convergencia): 
        n_features = len (self.itemsFeaturesMatrix [0]) + 1   # 0 línea, en el que un número total, donde 1 se añade a lineal el intercepto de la regresión. 1 = B 
        n_users = len (self.ratingMatrix)   # número de usuarios 
        n_items = len (self.ratingMatrix [0])   # número de artículo 

        # proyecto en items_features matriz característica, la intersección primero listada 0 artículo 1 
        # de hecho, es un proyecto matriz característica itemsFeaturesMatrix aumentar una intersección son los 1 
        items_features = np.ones ((n_items, n_features)) 
        items_features [:, 1:] = self.itemsFeaturesMatrix 
        items_features = = items_features.astype (float)
        self.ratingMatrixself.ratingMatrix.astype (un flotador) 

        # initialize la matriz característica del usuario, hay una necesidad de resolver el peso correcto (regresión lineal) 
        users_featuers = np.random.rand (n_users, n_features) 
        users_featuers [:, 0] = 1.   # 0 . término de intersección columna, un conjunto completo aquí 1 
        en Flag = Verdadero
         # iterativo resolvió para dar a todos los usuarios, en el que 
        el tiempo en Bandera:
             para usuario en Rango (n_users):
                 para característica en Rango (n_features):
                     IF característica == 0:   # aquí es el término de intersección, sin regularización 
                        de elemento en el rango (n_items):
                             SI self.ratingMatrix [usuario, Artículo]> 0:   # datos de entrenamiento valorados por 
                                # diferencia entre el valor predicho y el valor verdadero de 
                                -Diferencia = self.predict (users_featuers [usuario], items_features [Artículo]) - \ 
                                             Ser. ratingMatrix [el usuario, artículo] 
                                users_featuers [el usuario, la característica] - = self.alpha -Diferencia * * items_features [ 
                                    artículo, la característica]   # items_features [artículo, la función] un representante de este proyecto es tener esta característica, hay un 1, entonces hay es 0 
                    el otro :
                         por artículo en el rango (n_items):
                            Siself.ratingMatrix [usuario, artículo]> 0:   # 训练评过分的数据 
                                diferencia = self.predict (users_featuers [usuario], items_features [punto]) - \ 
                                             self.ratingMatrix [usuario, artículos] 
                                users_featuers [usuario], característica - = self.alpha * ( 
                                diferencia * items_features [artículo, la característica] + self.λ * users_featuers [usuario, la característica]) 

            coste = 0
             para el usuario en gama (n_users):
                 para artículo en rango (n_items):
                     si self.ratingMatrix [usuario, artículo]> 0: 
                        costo + = (1/2) * Math.pow (self.ratingMatrix [usuario, elemento] -self.predict (users_featuers [usuario], [items_features elemento]), 2 )
                 para característica en rango (1 , n_features): 
                    costo + = (1/2) * Math.pow (users_featuers [usuario, la característica], 2 )
             si coste < convergencia:
                 rotura 

        self.users_features = users_featuers 
        auto .items_features = items_features

 

Supongo que te gusta

Origin www.cnblogs.com/little-horse/p/12507975.html
Recomendado
Clasificación