예제 #1
0
    def recommendAtk(U, V, k, blockSize=1000, omegaList=None, verbose=False): 
        """
        Compute the matrix Z = U V^T and then find the k largest indices for each row. 
        """
        blocksize = 1000
        numBlocks = int(ceil(U.shape[0]/float(blocksize)))
        orderedItems = numpy.zeros((U.shape[0], k), numpy.int32)
        scores = numpy.zeros((U.shape[0], k), numpy.float) 

        for j in range(numBlocks):
            logging.debug("Block " + str(j) + " of " + str(numBlocks))
            endInd = min(U.shape[0], (j+1)*blocksize)
            UV = U[j*blocksize:endInd, :].dot(V.T)
            orderedItems[j*blocksize:endInd, :] = Util.argmaxN(UV, k)
            
            rowInds = numpy.repeat(numpy.arange(endInd-j*blocksize), k)
            colInds = orderedItems[j*blocksize:endInd, :].flatten()           
            
            scores[j*blocksize:endInd, :] = numpy.reshape(UV[rowInds, colInds], (endInd-j*blocksize,k))
            #orderedItems[j*blocksize:endInd, :] = Util.argmaxN2d(scores, k)
            
            #Now delete items in omegaList if given 
            if omegaList != None: 
                for i in range(j*blocksize, endInd):
                    
                    nonTrainItems = orderedItems[i, :][numpy.logical_not(numpy.in1d(orderedItems[i, :], omegaList[i]))]
                    orderedItems[i, 0:nonTrainItems.shape[0]] = nonTrainItems
                    orderedItems[i, nonTrainItems.shape[0]:] = -1
        
        if verbose: 
            return orderedItems, scores 
        else: 
            return orderedItems
예제 #2
0
    def recommendAtk(U, V, k, blockSize=1000, omegaList=None, verbose=False):
        """
        Compute the matrix Z = U V^T and then find the k largest indices for each row. 
        """
        blocksize = 1000
        numBlocks = int(ceil(U.shape[0] / float(blocksize)))
        orderedItems = numpy.zeros((U.shape[0], k), numpy.int32)
        scores = numpy.zeros((U.shape[0], k), numpy.float)

        for j in range(numBlocks):
            logging.debug("Block " + str(j) + " of " + str(numBlocks))
            endInd = min(U.shape[0], (j + 1) * blocksize)
            UV = U[j * blocksize:endInd, :].dot(V.T)
            orderedItems[j * blocksize:endInd, :] = Util.argmaxN(UV, k)

            rowInds = numpy.repeat(numpy.arange(endInd - j * blocksize), k)
            colInds = orderedItems[j * blocksize:endInd, :].flatten()

            scores[j * blocksize:endInd, :] = numpy.reshape(
                UV[rowInds, colInds], (endInd - j * blocksize, k))
            #orderedItems[j*blocksize:endInd, :] = Util.argmaxN2d(scores, k)

            #Now delete items in omegaList if given
            if omegaList != None:
                for i in range(j * blocksize, endInd):

                    nonTrainItems = orderedItems[i, :][numpy.logical_not(
                        numpy.in1d(orderedItems[i, :], omegaList[i]))]
                    orderedItems[i, 0:nonTrainItems.shape[0]] = nonTrainItems
                    orderedItems[i, nonTrainItems.shape[0]:] = -1

        if verbose:
            return orderedItems, scores
        else:
            return orderedItems
예제 #3
0
    def testArgMaxN(self):
        numRuns = 10

        for j in range(numRuns):
            m = numpy.random.randint(5, 50)
            a = numpy.random.rand(m)

            inds = numpy.flipud(numpy.argsort(a))

            for i in range(m):
                nptst.assert_array_equal(Util.argmaxN(a, i), inds[0:i])

        #Now test a 2D array
        for j in range(numRuns):
            m = numpy.random.randint(5, 50)
            n = numpy.random.randint(5, 50)
            A = numpy.random.rand(m, n)

            inds = numpy.argsort(-A, axis=1)

            for i in range(n):
                nptst.assert_array_equal(Util.argmaxN(A, i), inds[:, 0:i])
예제 #4
0
    def testArgMaxN(self): 
        numRuns = 10 

        for j in range(numRuns): 
            m = numpy.random.randint(5, 50)
            a = numpy.random.rand(m)
            
            inds = numpy.flipud(numpy.argsort(a))
            
            for i in range(m): 
                nptst.assert_array_equal(Util.argmaxN(a, i), inds[0:i])
                
        #Now test a 2D array 
        for j in range(numRuns): 
            m = numpy.random.randint(5, 50)
            n = numpy.random.randint(5, 50)
            A = numpy.random.rand(m, n)
            
            inds = numpy.argsort(-A, axis=1)
            
            
            for i in range(n): 
                nptst.assert_array_equal(Util.argmaxN(A, i), inds[:, 0:i])
예제 #5
0
    def testRecommendAtk(self):
        m = 20
        n = 50
        r = 3

        X, U, s, V, wv = SparseUtils.generateSparseBinaryMatrix((m, n),
                                                                r,
                                                                0.5,
                                                                verbose=True)

        import sppy
        X = sppy.csarray(X)

        k = 10
        orderedItems, scores = MCEvaluator.recommendAtk(U, V, k, verbose=True)

        #Now do it manually
        Z = U.dot(V.T)

        orderedItems2 = Util.argmaxN(Z, k)
        scores2 = numpy.fliplr(numpy.sort(Z, 1))[:, 0:k]

        nptst.assert_array_equal(orderedItems, orderedItems2)
        nptst.assert_array_equal(scores, scores2)

        #Test case where we have a set of training indices to remove
        #Let's create a random omegaList
        omegaList = []
        for i in range(m):
            omegaList.append(numpy.random.permutation(n)[0:5])

        orderedItems = MCEvaluator.recommendAtk(U, V, k, omegaList=omegaList)
        orderedItems2 = MCEvaluator.recommendAtk(U, V, k)

        #print(omegaList)
        #print(orderedItems)
        #print(orderedItems2)

        for i in range(m):
            items = numpy.intersect1d(omegaList[i], orderedItems[i, :])
            self.assertEquals(items.shape[0], 0)

            items = numpy.union1d(omegaList[i], orderedItems[i, :])
            items = numpy.intersect1d(items, orderedItems2[i, :])
            nptst.assert_array_equal(items, numpy.sort(orderedItems2[i, :]))
예제 #6
0
    def testRecommendAtk(self):
        m = 20
        n = 50
        r = 3

        X, U, s, V, wv = SparseUtils.generateSparseBinaryMatrix((m, n), r, 0.5, verbose=True)

        import sppy

        X = sppy.csarray(X)

        k = 10
        orderedItems, scores = MCEvaluator.recommendAtk(U, V, k, verbose=True)

        # Now do it manually
        Z = U.dot(V.T)

        orderedItems2 = Util.argmaxN(Z, k)
        scores2 = numpy.fliplr(numpy.sort(Z, 1))[:, 0:k]

        nptst.assert_array_equal(orderedItems, orderedItems2)
        nptst.assert_array_equal(scores, scores2)

        # Test case where we have a set of training indices to remove
        # Let's create a random omegaList
        omegaList = []
        for i in range(m):
            omegaList.append(numpy.random.permutation(n)[0:5])

        orderedItems = MCEvaluator.recommendAtk(U, V, k, omegaList=omegaList)
        orderedItems2 = MCEvaluator.recommendAtk(U, V, k)

        # print(omegaList)
        # print(orderedItems)
        # print(orderedItems2)

        for i in range(m):
            items = numpy.intersect1d(omegaList[i], orderedItems[i, :])
            self.assertEquals(items.shape[0], 0)

            items = numpy.union1d(omegaList[i], orderedItems[i, :])
            items = numpy.intersect1d(items, orderedItems2[i, :])
            nptst.assert_array_equal(items, numpy.sort(orderedItems2[i, :]))