def getWeightPrimeMatrix(self): # compute D_x^(-1/2) D_x = getDiagonalMatrix(self.weightMatrix) D_x_powered = powDiagonalMatrix(D_x, -0.5) # compute D_y^(-1/2) D_y = getDiagonalMatrix(np.transpose(self.weightMatrix)) D_y_powered = powDiagonalMatrix(D_y, -0.5) # multiply matrices w_prime = np.dot(np.dot(D_x_powered, self.weightMatrix), D_y_powered) return w_prime
def partition(self): print len(self.matrix.keys()) print self.weightMatrix # get singular vectors x,y = self.getLeftRightSingularVectors() # compute D_x^(-1/2) D_x = getDiagonalMatrix(self.weightMatrix) D_x_powered = powDiagonalMatrix(D_x, -0.5) # compute D_y^(-1/2) D_y = getDiagonalMatrix(np.transpose(self.weightMatrix)) D_y_powered = powDiagonalMatrix(D_y, -0.5) #print "weight_matrix", self.weightMatrix #print "D_x", D_x x_new = np.dot(D_x_powered, x) y_new = np.dot(D_y_powered, y) print "x'", x_new print "y'", y_new A = [] A_c = [] B = [] B_c = [] c_x = 0.0 # Partition advertisements index = 0 print "c_x", c_x for adv in sorted(self.matrix.keys(), key = lambda adv : adv.advertiser_id): if x_new.item(index) >= c_x: A.append(adv) else: A_c.append(adv) if adv.advertiser_id == '27961': print "c_x specific", x_new.item(index) index += 1 c_y = 0.0 # Partition ads index = 0 print "c_y", c_y for ad in sorted(self.dict_of_keywords.keys(), key = lambda ad : ad.keyword_id): if y_new.item(index) >= c_y: B.append(ad) else: B_c.append(ad) if ad.keyword_id == '394': print "c_y_specific", y_new.item(index) index += 1 # Build new partitioned bipartite graphs # where G = (A,B) and G_c = (A_c,B_c) partition = SpectralBipartiteGraph() partition_c = SpectralBipartiteGraph() for adv in sorted(A, key = lambda adv : adv.advertiser_id): for ad in sorted(B, key = lambda ad : ad.keyword_id): if self.matrix[adv][ad] >= 1: partition.add(adv,ad, self.matrix[adv][ad]) for adv in sorted(A_c, key = lambda adv : adv.advertiser_id): for ad in sorted(B_c, key = lambda ad : ad.keyword_id): if self.matrix[adv][ad] >= 1: partition_c.add(adv, ad, self.matrix[adv][ad]) # Do check for partitions to ensure no keyword is left out for kw in sorted(self.dict_of_keywords.keys(), key = lambda ad : ad.keyword_id): if partition.getKeyword(kw) == None and partition_c.getKeyword(kw) == None: for ad in self.dict_of_keywords[kw]: if partition.getAdv(ad) != None: partition.add(ad, kw, self.matrix[ad][kw]) else: partition_c.add(ad, kw, self.matrix[ad][kw]) partition.setWeightMatrix() partition_c.setWeightMatrix() return (partition, partition_c)