1. 代碼設(shè)計上遇到的問題及解決方案
1.1 遇到的問題
在代碼測試的過程中,發(fā)現(xiàn)代碼報錯,報錯信息如下:
IndexError Traceback (most recent call last)
<ipython-input-11-505b0d16f11e> in <module>
3 MF_SGD = ExplicitMF_Pearsion(train, 40, learning='sgd', verbose=True)
4 iter_array = [1, 2, 5, 10, 25, 50, 100, 200]
----> 5 MF_SGD.calculate_learning_curve(iter_array, test, learning_rate=0.001)
I:\Pywork\協(xié)同過濾\對接28-推導(dǎo)ALS公式結(jié)果\algorithm\ExplicitMF_pearsion.py in calculate_learning_curve(self, iter_array, test, learning_rate)
270 print('Iteration: {}'.format(n_iter))
271 if i == 0:
--> 272 self.train(n_iter - iter_diff, learning_rate)
273 else:
274 self.partial_train(n_iter - iter_diff)
I:\Pywork\協(xié)同過濾\對接28-推導(dǎo)ALS公式結(jié)果\algorithm\ExplicitMF_pearsion.py in train(self, n_iter, learning_rate)
138 # self.global_bias = np.mean(self.ratings[np.where(self.ratings != 0)])
139 self.persion_score = self.load_pearsion()
--> 140 self.partial_train(n_iter)
141
142 def partial_train(self, n_iter):
I:\Pywork\協(xié)同過濾\對接28-推導(dǎo)ALS公式結(jié)果\algorithm\ExplicitMF_pearsion.py in partial_train(self, n_iter)
163 self.training_indices = np.arange(self.n_samples)
164 np.random.shuffle(self.training_indices)
--> 165 self.sgd()
166 ctr += 1
167
I:\Pywork\協(xié)同過濾\對接28-推導(dǎo)ALS公式結(jié)果\algorithm\ExplicitMF_pearsion.py in sgd(self)
201 for f in range(self.persion_score.shape[0]):
202 if f == 0:
--> 203 sum_pearsion = self.persion_score[u, f] * (self.user_vecs[u, :] - self.user_vecs[f, :])
204 sum_pearsion += self.persion_score[u, f] * (self.user_vecs[u, :] - self.user_vecs[f, :])
205 self.pearsion_arr = self.persion_reg * sum_pearsion
IndexError: index 679 is out of bounds for axis 0 with size 610
- 總結(jié)一下
- 相似度矩陣的長度為 610
- 當(dāng)索引到 679 時,自然會報錯
1.2 解決思路
- 首先是查明 679 的來源
- 經(jīng)過各種測試,已經(jīng)弄懂 679 是變量 u 給出了,而變量 u 是隨機(jī)選擇的結(jié)果,范圍是 1 - 943。
- 再次查明后,發(fā)現(xiàn) 943 是數(shù)據(jù)集的總用戶數(shù)。
- 那么為什么相似度矩陣只有 610 個用戶呢
- 查明后,發(fā)現(xiàn)是計算相似度時導(dǎo)入數(shù)據(jù)的錯誤,沒有導(dǎo)入與算法相同的數(shù)據(jù)集(movielens - 100k)。
- 錯誤代碼如下所示:
data = pd.read_csv('dataset/movie_ratings.csv')
Ps:
- dataset 是存放數(shù)據(jù)集的文件夾,其中 movie_ratings.csv 是計算相似度時測試所用。
- dataset 目錄下的 ml-100k/u.data 才是算法使用到的數(shù)據(jù)集,因此需要修改路徑
1.3 解決方案
修改路徑,導(dǎo)入與算法相同的數(shù)據(jù),再次計算相似度矩陣,代碼如下:
data = pd.read_csv('dataset/ml-100k/u.data', sep='\t', names=names)