示例#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
示例#4
0
def main(args):
    train, test = read_data(args.in_dir)
    train, val = split_data(train)

    print('\n\nTrain: ', train.shape)
    print('Val: ', val.shape)
    print('Test:  ', test.shape)

    # RBM object
    rbm = RBM(args.num_hidden, val.shape[1], args.lr, args.n, args.batch_size,
              args.epochs)

    # Train RBM
    train_loss, val_loss = rbm.Train(train, val)

    # Create output dir if it doesn't exist
    if not os.path.exists(args.out_dir):
        os.makedirs(args.out_dir)

    # Plot error
    plot_error(train_loss, val_loss, args.out_dir)

    # Performance on Test set
    error_test = rbm.reconstruction_error(test.T)

    print("\n\n\nReconstruction error...\n")
    print("Train : ", train_loss[-1])
    print("Val : ", val_loss[-1])
    print("Test : ", error_test)

    # For viewing reconstruction
    reconstruct_images(rbm, test, (args.image_height, args.image_width),
                       args.out_dir)

    # Saving the model learned weights
    pickle.dump([rbm.W, rbm.b_h, rbm.b_v],
                open(args.out_dir + '\\weights.pkl', 'wb'))
    print(f"\n\nRBM weights saved in {args.out_dir}\\weights.pkl")
示例#5
0
# Load up common data set for the recommender algorithms
ml = LoadData()
#to train the model
#trainset= evaluationData.build_full_trainset()
numUsers = ml.getNumberUsers()
numItems = ml.getNumberItems()
trainingMatrix = np.zeros([numUsers + 1, numItems + 1, 10], dtype=np.float32)
ratings = ml.all_ratings()

for i in ratings:
    uid = i[0]
    iid = i[1]
    rate = i[2]
    adjustedRating = int(float(rate) * 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])
epochs = 22
hiddenDim = 100
learningRate = 0.001
batchSize = 100
# Create an RBM with (num items * rating values) visible nodes
rbm_recommend = RBM(trainingMatrix.shape[1],
                    hiddenDimensions=hiddenDim,
                    learningRate=learningRate,
                    batchSize=batchSize,
                    epochs=epochs)
rbm_recommend.Train(trainingMatrix)