if e < 0.001: break return numpy.dot(UK, KI) def mae(self, k): snmf = numpy.array(self.matrix_factorization(k)) self.test_matrix = numpy.zeros(shape=(943, 1682)) result = 0 count = 0 for i in xrange(len(self.testdata_matrix)): for j in xrange(len(self.testdata_matrix[i])): if self.testdata_matrix[i][j] == 0: continue else: self.test_matrix[i][j] = snmf[i][j] count += 1 result += abs(self.test_matrix[i][j] - self.testdata_matrix[i][j]) return (result / count) if __name__ == '__main__': nmf = NMF('/ml-100k/u.data') for k in [10, 20, 30, 40, 50, 60, 70, 80]: for m in [1, 2, 3, 4, 5, 6, 7, 8]: for seed in [40, 60, 80, 100]: nmf.shuffleData(m, seed) nmf.matrix_factorization(k) maerror += nmf.mae(k) print 'The mean absolute error is:', float(maerror / (32 * 8))