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

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类样本的个数


版权声明:本文为weixin_39709674原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。