2017-12-23 6 views
1
내가 책 '파이썬 기계 학습 소개'에서 나이브 베이 즈 분류 예제를 통해하고 있어요

을 클래스 당 비 제로 항목을 계산하고, 다음 코드 예제의 메커니즘을 이해하기 위해 고군분투 :는 NumPy와

import numpy as np 

X = np.array([[0,1,0,1],[1,0,1,1],[0,0,0,1],[1,0,1,0]]) 

y = np.array([0,1,0,1]) 

print(X) 
print('\n') 
print(y) 
print('\n') 

counts = {} 

for label in np.unique(y): 
    print(label,'\n') 
    counts[label] = X[y == label].sum(axis=0) 
    print(counts[label],'\n') 

print('Feature counts:\n{}'.format(counts)) 

을 코드의 출력 :

[[0 1 0 1] 
[1 0 1 1] 
[0 0 0 1] 
[1 0 1 0]] 


[0 1 0 1] 


0 

[0 1 0 2] 

1 

[2 0 2 1] 

Feature counts: 
{0: array([0, 1, 0, 2]), 1: array([2, 0, 2, 1])} 

나는 각 클래스에 대한 배열 (0과 1) 채워지는 방법을 이해하지 않습니다.

제 생각에 sum (축 = 0)은 행렬의 열을 요약하는 것을 의미합니다. 따라서 "0"레이블 (일명 클래스)의 경우 'X'행렬에서 다음을 계산합니다.

두 번째 열에 0이 2 개, 두 번째 열에 3 개의 제로, 세 번째 열에 2 개의 0, 네 번째 열

코드 출력을 감안할 때 분명히 내 이해가 정확하지 않습니다.

답변

0

를 생성합니다 실행 당신은 부울 마스크 y == label를 잊어 버린 것 같다.

문서에 대한 Boolean or “mask” index arrays 상태 : 정수 인덱스 어레이의 경우와 달리

은 부울 경우, 결과에 대응하는 인덱스 된 어레이의 모든 요소를 ​​포함하는 1-D 배열이다 모든 부울 배열의 참 요소

따라서에서 label = 0 결과 X[y == label] 다음 문서에 따르면,

X[np.array(true, false, true, false)] 

어느 : 수직

[[0 1 0 1] 
[0 0 0 1]] 

합계와 당신이 얻을 :

count[0] = np.array([0, 1, 0, 2]) 

동일한에게 프로세스는을 얻습니다.. 이번에는 label = 1, y == labelnp.array(false, true, false, true)이됩니다. 이 배열로 X 마스킹 제공 : 수직

[[1 0 1 1] 
[1 0 1 0]] 

합 얻을 :

count[1] = np.array([2, 0, 2, 1]) 
+0

호기심 downvote의 이유를 듣고? –

2

당신은 코드 라인의 내부에서

X[y == label].sum(axis=0) 

이의 사건 label==0 살펴 보자 시작할 수 있습니다. 따라서, X의 첫 번째 및 세 번째 행을 선택한다 인덱스 X-4 항목이 부울 목록을 사용하여이어서

y == label 
# results in 
[ True False True False] 

,

[[0 1 0 1] # True 

             
 
  
              [1 0 1 1]
             
  # False 
[0 0 0 1] # True 

             
 
  
              [1 0 1 0]
             
 ] # False
X[y == label] 
#results in 
[[0 1 0 1] 
[0 0 0 1]] 

지금이 2 × 4 어레이의 열 방향을 따라 합산

X[y == label].sum(axis=0) 
# results in 
[0 1 0 2] 

여기서 추측하고 있지만 아마도 무엇을하고 싶은지 올레인 배열 X 자체와 그 열에 대한 합계.

counts[label] = (X == label).sum(axis=0) 

이 라인의 코드가

# for label == 0 
[2 3 2 1] 
# for label == 1 
[2 1 2 3]