计算类内类间散度矩阵(附代码)

class compute_scatter_matrix(object):
    def __init__(self,X,labels):
        self.X = X
        self.labels = labels

    def compute_scatter(self):
        meanAll = np.mean(self.X,axis=0)
        St = np.dot((self.X-meanAll).T,(self.X-meanAll))


        xclasses = {}
        meanclasses = {}
        Sw = np.zeros((self.X.shape[1],self.X.shape[1]))
        for label in np.unique(self.labels):
            xclasses[label] = [self.X[i] for i in range(len(self.labels)) if self.labels[i]==label]
            meanclasses[label] = np.mean(xclasses[label],axis=0)
            Sw += np.dot((xclasses[label]-meanclasses[label]).T,(xclasses[label]-meanclasses[label]))
        SB = np.zeros((self.X.shape[1],self.X.shape[1]))
        #第二种SB的计算方法
        for label in np.unique(self.labels):
            n = np.array(xclasses[label]).shape[0]
            mean_vec = np.array(meanclasses[label]).reshape(self.X.shape[1],1)
            overall_mean = np.array(meanAll).reshape(self.X.shape[1],1)
            SB += n*(mean_vec-overall_mean).dot((mean_vec-overall_mean).T)

        Sb = St-Sw
        return St,Sw,Sb,SB



散度矩阵有叫做散布矩阵。代码中,St是总体散度矩阵,Sw是类内散度矩阵,SB和Sb相同都是类间散度矩阵。类内类间散度表征样本的可分性,类间散度越大,类内散度越小,则可分性越好。

计算类内类间散度矩阵(附代码)

m(i)是类别i的样本均值,m是整体样本均值,P(Oi)=Ni代表第n类样本的个数

评论

Live Sex Cams Free