Exemplo n.º 1
0
    def nmf(self):
        """
        Performs NMF dimensionality reduction
        :return:
        """
        constants = self.constants.Nmf()
        if self.binary_image_metadata:
            data = self.get_binary_image_metadata_matrix()
        elif self.subject_subject:
            data = self.matrix
        else:
            if not self.matrix:
                data = self.get_object_feature_matrix()
            else:
                data = self.matrix

        if not data.size == 0:
            obj_feature = np.array(data['featureVector'].tolist())
            if (obj_feature < 0).any():
                print("NMF does not accept negative values")
                return

            model = NMF(n_components=self.k_value,
                        beta_loss=constants.BETA_LOSS_KL,
                        init=constants.INIT_MATRIX,
                        random_state=0,
                        solver='mu',
                        max_iter=1000)
            w = model.fit_transform(obj_feature)
            h = model.components_
            if self.save_model:
                model = Model()
                model.save_model(
                    w,
                    "{}_{}_w".format(self.extractor_model.lower(),
                                     self.dimension_reduction_model.lower()))
                model.save_model(
                    h,
                    "{}_{}_h".format(self.extractor_model.lower(),
                                     self.dimension_reduction_model.lower()))
                return self

            if not self.conversion:
                return w, h
            tt1 = time.time()
            data_lat = pd.DataFrame({
                "imageId": data['imageId'],
                "reducedDimensions": w.tolist()
            })
            # for i in range(h.shape[0]):
            #     print("Latent Feature: {}\n{}".format(i + 1, sorted(((i, v) for i, v in enumerate(h[i])),
            #                                                         key=lambda x: x[1], reverse=True)))

            # print("\n\nTime Taken for NMF {}\n".format(time.time() - tt1))
            return data_lat, h, model
        raise \
            Exception("Data in database is empty, Run Task 2 of Phase 1 (Insert feature extracted records in db )\n\n")