示例#1
0
 def fit(self, trainset):
     AlgoBase.fit(self, trainset)
     numUsers = trainset.n_users
     numItems = trainset.n_items
     trainingMatrix = np.zeros([numUsers, numItems, 10], dtype = np.float32)
     for (uid, iid, rating) in trainset.all_ratings():
         adjustedRating = int(float(rating)*2.0) - 1
         trainingMatrix[int(uid), int(iid), adjustedRating] = 1
         
     trainingMatrix = np.reshape(trainingMatrix,[trainingMatrix.shape[0], - 1])
     
     rbm = RBM(trainingMatrix.shape[1], hiddenDimensions = self.hiddenDim, learningRate = self.learningRate, batchSize = self.batchSize)
     rbm.Train(trainingMatrix)
     self.predictedRatings = np.zeros([numUsers, numItems], dtype = np.float32)
     for uiid in range(trainset.n_users):
         if(uiid % 50 == 0):
             print("Procissing user ", uiid)
         recs = rbm.GetRecommendations([trainingMatrix[uiid]])
         recs = np.reshape(recs, [numItems, 10])
         
         for itemID, rec in enumerate(recs):
             normalized = self.softmax(rec)
             rating = np.average(np.arange(10), weights = normalized)
             self.predictedRatings[uiid,itemID] = (rating + 1)* 0.5
     
     return self
    def fit(self, trainset):
        AlgoBase.fit(self, trainset)

        numUsers = trainset.n_users
        numItems = trainset.n_items
        
        trainingMatrix = np.zeros([numUsers, numItems, 10], dtype=np.float32)
        
        for (uid, iid, rating) in trainset.all_ratings():
            adjustedRating = int(float(rating)*2.0) - 1
            trainingMatrix[int(uid), int(iid), adjustedRating] = 1        
        # Flatten to a 2D array, with nodes for each possible rating type on each possible item, for every user.
        trainingMatrix = np.reshape(trainingMatrix, [trainingMatrix.shape[0], -1])        
        # Create an RBM with (num items * rating values) visible nodes
        rbm = RBM(trainingMatrix.shape[1], hiddenDimensions=self.hiddenDim, learningRate=self.learningRate, batchSize=self.batchSize, epochs=self.epochs)
        rbm.Train(trainingMatrix)
        self.predictedRatings = np.zeros([numUsers, numItems], dtype=np.float32)
        for uiid in range(trainset.n_users):
            if (uiid % 50 == 0):
                print("Processing user ", uiid)
            recs = rbm.GetRecommendations([trainingMatrix[uiid]])
            recs = np.reshape(recs, [numItems, 10])            
            for itemID, rec in enumerate(recs):
                # The obvious thing would be to just take the rating with the highest score:                
                #rating = rec.argmax()
                # ... but this just leads to a huge multi-way tie for 5-star predictions.
                # The paper suggests performing normalization over K values to get probabilities
                # and take the expectation as your prediction, so we'll do that instead:
                normalized = self.softmax(rec)
                rating = np.average(np.arange(10), weights=normalized)
                self.predictedRatings[uiid, itemID] = (rating + 1) * 0.5        
        return self
示例#3
0
    def fit(self, trainset):
        AlgoBase.fit(self, trainset)

        numUsers = trainset.n_users
        numItems = trainset.n_items

        trainingMatrix = np.zeros([numUsers, numItems, 10], dtype=np.float32)

        for (uid, iid, rating) in trainset.all_ratings():
            adjustedRating = int(float(rating) * 2.0) - 1
            trainingMatrix[int(uid), int(iid), adjustedRating] = 1

        #ユーザーごとにアイテムの可能な評価スコアに対して、ノードに2次元配列で平坦化する
        trainingMatrix = np.reshape(trainingMatrix,
                                    [trainingMatrix.shape[0], -1])

        #可視化できるノードにアイテムの整数値と評価値を掛け算して、RBMを新たに構築する
        rbm = RBM(trainingMatrix.shape[1],
                  hiddenDimensions=self.hiddenDim,
                  learningRate=self.learningRate,
                  batchSize=self.batchSize,
                  epochs=self.epochs)
        rbm.Train(trainingMatrix)

        self.predictedRatings = np.zeros([numUsers, numItems],
                                         dtype=np.float32)
        for uiid in range(trainset.n_users):
            if (uiid % 50 == 0):
                print("Processing user ", uiid)
            recs = rbm.GetRecommendations([trainingMatrix[uiid]])
            recs = np.reshape(recs, [numItems, 10])

            for itemID, rec in enumerate(recs):
                #評価値に最も高いスコアを付与して明示する
                #rating = rec.argmax()
                #5つ星に複数の評価値を導入する
                #考えうるk値の正規化を行う
                #予測する際に、期待値を取る
                normalized = self.softmax(rec)
                rating = np.average(np.arange(10), weights=normalized)
                self.predictedRatings[uiid, itemID] = (rating + 1) * 0.5

        return self