평균 벡터를 사용하여 클래스 내 산포 행렬 SW를 계산할 수 있습니다.
이 행렬은 개별 클래스 i의 산포 행렬 Si를 더해 구합니다.
>>> d = 13 # 특성 개수
>>> S_W = np.zeros((d, d))
>>> for label, mv in zip(range(1, 4), mean_vecs):
... class_scatter = np.zeros((d, d))
>>> for row in X_train_std[y_train == label]:
... row, mv = row.reshape(d, 1), mv.reshape(d, 1)
... class_scatter += (row - mv).dot((row - mv).T)
... S_W += class_scatter
>>> print('클래스 내의 산포 행렬: %sx%s' % (
... S_W.shape[0], S_W.shape[1]))
클래스 내의 산포 행렬: 13x13
산포 행렬을 계산할 때 훈련 데이터셋의 클래스 레이블이 균등하게 분포되어 있다고 가정합니다. 클래스 레이블의 개수를 출력해 보면 이 가정이 틀렸다는 것을 알 수 있습니다.
>>> print('클래스 레이블 분포: %s'
... % np.bincount(y_train)[1:])
클래스 레이블 분포: [41 50 33]