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
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
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")
# 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)