msaf/algorithms/fmc2d/xmeans.py
def estimate_K_xmeans(self, th=0.2, maxK = 10):
        """Estimates K running X-means algorithm (Pelleg & Moore, 2000)."""

        # Run initial K-means
        means, labels = self.run_kmeans(self.X, self.init_K)

        # Run X-means algorithm
        stop = False
        curr_K = self.init_K
        while not stop:
            stop = True
            final_means = []
            for k in range(curr_K):
                # Find the data that corresponds to the k-th cluster
                D = self.get_clustered_data(self.X, labels, k)
                if len(D) == 0 or D.shape[0] == 1:
                    continue

                # Whiten and find whitened mean
                stdD = np.std(D, axis=0)
                #D = vq.whiten(D)
                D /= float(stdD)  # Same as line above
                mean = D.mean(axis=0)

                # Cluster this subspace by half (K=2)
                half_means, half_labels = self.run_kmeans(D, K=2)

                # Compute BICs
                bic1 = self.compute_bic(D, [mean], K=1,
                                        labels=np.zeros(D.shape[0]),
                                        R=D.shape[0])
                bic2 = self.compute_bic(D, half_means, K=2,
                                        labels=half_labels, R=D.shape[0])

                # Split or not
                max_bic = np.max([np.abs(bic1), np.abs(bic2)])
                norm_bic1 = bic1 / float(max_bic)
                norm_bic2 = bic2 / float(max_bic)
                diff_bic = np.abs(norm_bic1 - norm_bic2)

                # Split!
                #print "diff_bic", diff_bic
                if diff_bic > th:
                    final_means.append(half_means[0] * stdD)
                    final_means.append(half_means[1] * stdD)
                    curr_K += 1
                    stop = False
                # Don't split
                else:
                    final_means.append(mean * stdD)

            final_means = np.asarray(final_means)

            #print "Estimated K: ", curr_K
            if self.plot:
                plt.scatter(self.X[:, 0], self.X[:, 1])
                plt.scatter(final_means[:, 0], final_means[:, 1], color="y")
                plt.show()

            if curr_K >= maxK or self.X.shape[-1] != final_means.shape[-1]:
                stop = True
            else:
                labels, dist = vq.vq(self.X, final_means)

        return curr_K
def estimate_K_xmeans(self, th=0.2, maxK = 10):
        """Estimates K running X-means algorithm (Pelleg & Moore, 2000)."""

        # Run initial K-means
        means, labels = self.run_kmeans(self.X, self.init_K)

        # Run X-means algorithm
        stop = False
        curr_K = self.init_K
        while not stop:
            stop = True
            final_means = []
            for k in range(curr_K):
                # Find the data that corresponds to the k-th cluster
                D = self.get_clustered_data(self.X, labels, k)
                if len(D) == 0 or D.shape[0] == 1:
                    continue

                # Whiten and find whitened mean
                stdD = np.std(D, axis=0)
                #D = vq.whiten(D)
                D /= float(stdD)  # Same as line above
                mean = D.mean(axis=0)

                # Cluster this subspace by half (K=2)
                half_means, half_labels = self.run_kmeans(D, K=2)

                # Compute BICs
                bic1 = self.compute_bic(D, [mean], K=1,
                                        labels=np.zeros(D.shape[0]),
                                        R=D.shape[0])
                bic2 = self.compute_bic(D, half_means, K=2,
                                        labels=half_labels, R=D.shape[0])

                # Split or not
                max_bic = np.max([np.abs(bic1), np.abs(bic2)])
                norm_bic1 = bic1 / float(max_bic)
                norm_bic2 = bic2 / float(max_bic)
                diff_bic = np.abs(norm_bic1 - norm_bic2)

                # Split!
                #print "diff_bic", diff_bic
                if diff_bic > th:
                    final_means.append(half_means[0] * stdD)
                    final_means.append(half_means[1] * stdD)
                    curr_K += 1
                    stop = False
                # Don't split
                else:
                    final_means.append(mean * stdD)

            final_means = np.asarray(final_means)

            #print "Estimated K: ", curr_K
            if self.plot:
                plt.scatter(self.X[:, 0], self.X[:, 1])
                plt.scatter(final_means[:, 0], final_means[:, 1], color="y")
                plt.show()

            if curr_K >= maxK or self.X.shape[-1] != final_means.shape[-1]:
                stop = True
            else:
                labels, dist = vq.vq(self.X, final_means)

        return curr_K
def estimate_K_xmeans ( self , th = 0.2 , maxK = 10 ) : # Run initial K-means means , labels = self . run_kmeans ( self . X , self . init_K ) # Run X-means algorithm stop = False curr_K = self . init_K while not stop : stop = True final_means = [ ] for k in range ( curr_K ) : # Find the data that corresponds to the k-th cluster D = self . get_clustered_data ( self . X , labels , k ) if len ( D ) == 0 or D . shape [ 0 ] == 1 : continue # Whiten and find whitened mean stdD = np . std ( D , axis = 0 ) #D = vq.whiten(D) D /= float ( stdD ) # Same as line above mean = D . mean ( axis = 0 ) # Cluster this subspace by half (K=2) half_means , half_labels = self . run_kmeans ( D , K = 2 ) # Compute BICs bic1 = self . compute_bic ( D , [ mean ] , K = 1 , labels = np . zeros ( D . shape [ 0 ] ) , R = D . shape [ 0 ] ) bic2 = self . compute_bic ( D , half_means , K = 2 , labels = half_labels , R = D . shape [ 0 ] ) # Split or not max_bic = np . max ( [ np . abs ( bic1 ) , np . abs ( bic2 ) ] ) norm_bic1 = bic1 / float ( max_bic ) norm_bic2 = bic2 / float ( max_bic ) diff_bic = np . abs ( norm_bic1 - norm_bic2 ) # Split! #print "diff_bic", diff_bic if diff_bic > th : final_means . append ( half_means [ 0 ] * stdD ) final_means . append ( half_means [ 1 ] * stdD ) curr_K += 1 stop = False # Don't split else : final_means . append ( mean * stdD ) final_means = np . asarray ( final_means ) #print "Estimated K: ", curr_K if self . plot : plt . scatter ( self . X [ : , 0 ] , self . X [ : , 1 ] ) plt . scatter ( final_means [ : , 0 ] , final_means [ : , 1 ] , color = "y" ) plt . show ( ) if curr_K >= maxK or self . X . shape [ - 1 ] != final_means . shape [ - 1 ] : stop = True else : labels , dist = vq . vq ( self . X , final_means ) return curr_K
Estimates K running X-means algorithm (Pelleg & Moore, 2000).
Estimates K running X - means algorithm ( Pelleg & Moore 2000 ) .