msaf/algorithms/fmc2d/xmeans.py
def estimate_K_knee(self, th=.015, maxK=12):
        """Estimates the K using K-means and BIC, by sweeping various K and
            choosing the optimal BIC."""
        # Sweep K-means
        if self.X.shape[0] < maxK:
            maxK = self.X.shape[0]
        if maxK < 2:
            maxK = 2
        K = np.arange(1, maxK)
        bics = []
        for k in K:
            means, labels = self.run_kmeans(self.X, k)
            bic = self.compute_bic(self.X, means, labels, K=k,
                                   R=self.X.shape[0])
            bics.append(bic)
        diff_bics = np.diff(bics)
        finalK = K[-1]

        if len(bics) == 1:
            finalK = 2
        else:
            # Normalize
            bics = np.asarray(bics)
            bics -= bics.min()
            #bics /= bics.max()
            diff_bics -= diff_bics.min()
            #diff_bics /= diff_bics.max()

            #print bics, diff_bics

            # Find optimum K
            for i in range(len(K[:-1])):
                #if bics[i] > diff_bics[i]:
                if diff_bics[i] < th and K[i] != 1:
                    finalK = K[i]
                    break

        #print "Estimated K: ", finalK
        if self.plot:
            plt.subplot(2, 1, 1)
            plt.plot(K, bics, label="BIC")
            plt.plot(K[:-1], diff_bics, label="BIC diff")
            plt.legend(loc=2)
            plt.subplot(2, 1, 2)
            plt.scatter(self.X[:, 0], self.X[:, 1])
            plt.show()

        return finalK
def estimate_K_knee(self, th=.015, maxK=12):
        # Sweep K-means
        if self.X.shape[0] < maxK:
            maxK = self.X.shape[0]
        if maxK < 2:
            maxK = 2
        K = np.arange(1, maxK)
        bics = []
        for k in K:
            means, labels = self.run_kmeans(self.X, k)
            bic = self.compute_bic(self.X, means, labels, K=k,
                                   R=self.X.shape[0])
            bics.append(bic)
        diff_bics = np.diff(bics)
        finalK = K[-1]

        if len(bics) == 1:
            finalK = 2
        else:
            # Normalize
            bics = np.asarray(bics)
            bics -= bics.min()
            #bics /= bics.max()
            diff_bics -= diff_bics.min()
            #diff_bics /= diff_bics.max()

            #print bics, diff_bics

            # Find optimum K
            for i in range(len(K[:-1])):
                #if bics[i] > diff_bics[i]:
                if diff_bics[i] < th and K[i] != 1:
                    finalK = K[i]
                    break

        #print "Estimated K: ", finalK
        if self.plot:
            plt.subplot(2, 1, 1)
            plt.plot(K, bics, label="BIC")
            plt.plot(K[:-1], diff_bics, label="BIC diff")
            plt.legend(loc=2)
            plt.subplot(2, 1, 2)
            plt.scatter(self.X[:, 0], self.X[:, 1])
            plt.show()

        return finalK
def estimate_K_knee ( self , th = .015 , maxK = 12 ) : # Sweep K-means if self . X . shape [ 0 ] < maxK : maxK = self . X . shape [ 0 ] if maxK < 2 : maxK = 2 K = np . arange ( 1 , maxK ) bics = [ ] for k in K : means , labels = self . run_kmeans ( self . X , k ) bic = self . compute_bic ( self . X , means , labels , K = k , R = self . X . shape [ 0 ] ) bics . append ( bic ) diff_bics = np . diff ( bics ) finalK = K [ - 1 ] if len ( bics ) == 1 : finalK = 2 else : # Normalize bics = np . asarray ( bics ) bics -= bics . min ( ) #bics /= bics.max() diff_bics -= diff_bics . min ( ) #diff_bics /= diff_bics.max() #print bics, diff_bics # Find optimum K for i in range ( len ( K [ : - 1 ] ) ) : #if bics[i] > diff_bics[i]: if diff_bics [ i ] < th and K [ i ] != 1 : finalK = K [ i ] break #print "Estimated K: ", finalK if self . plot : plt . subplot ( 2 , 1 , 1 ) plt . plot ( K , bics , label = "BIC" ) plt . plot ( K [ : - 1 ] , diff_bics , label = "BIC diff" ) plt . legend ( loc = 2 ) plt . subplot ( 2 , 1 , 2 ) plt . scatter ( self . X [ : , 0 ] , self . X [ : , 1 ] ) plt . show ( ) return finalK
Estimates the K using K-means and BIC, by sweeping various K and
            choosing the optimal BIC.
Estimates the K using K - means and BIC by sweeping various K and choosing the optimal BIC .