나이브 베이지안 분류기 (MNIST 데이터 집합) 파이썬 데이터 세트 순진 베이 즈 분류기 MNIST

P (Y | X) = P (Y) * P (X | Y) / P (X)

샘플 속성은 독립적이다;

 

문제는 원래의 문제에 해당합니다 :

 

데이터 처리
P (Y) * P 방지하기 위하여 | 언더 값 (x 및 y), 즉 원래의 질문의 대수 :

 

 

 

주 : 속성 값은 트레이닝 세트에서와 같은 시간에 볼 수없는 경우, 클래스, 직접 P (Y) 또는 P (X | y)는 0이 될 수 있도록 계산 된 P (Y) * P (X | Y)의 0 인 것은 확률 값의 개수는 일반적으로 "평활화"프로세스 라플라스 보정 필요 찾을 비교할 불편하지 않다.

고정 선험적 확률 : D 클래스의 Dy (Y)의 샘플 세트들의 조합 세트를 나타내는 훈련하자, N은 D 가능한 카테고리의 트레이닝 세트의 개수를 나타내며

 

즉, 각 종류의 샘플들의 수는 1을 첨가 하였다.

클래스 조건부 확률 : 또 하나의 Dy가 XI 직류 샘플 XI는 i 번째 속성에 형성 될 때 설정 한 값이고, NI는 가능한 수의 속성 값 i 번째를 나타낸다

 

즉, i 번째 속성 카테고리 샘플을 증가한다.

-------------------------------------------------- ------------

데이터 전처리

 

훈련자

시험 시료

함수 호출

 

 

 

 

참고

파이썬 순진 베이 즈 분류 MNIST 데이터 세트

구조체 가져 오기 
NumPy와 가져 오기 *의에서 
NP AS 가져 오기 NumPy와 
가져 오기 시간 
DEF의 read_image (FILE_NAME) : 
    # 첫번째 바이너리 모드는 모든 문서에 와서 읽는 
    file_handle = 개방 (FILE_NAME, "RB ") #의 바이너리 문서 열 
    file_content = file_handle.read을 () # 버퍼에 판독 
    오프셋 = 0 
    , 반환 헤드 struct.unpack_from = ( '> IIII'FILE_CONTENT 오프셋) # 4의 정수 전에 수행하는 튜플 
    오프셋 + = struct.calcsize ( '> IIII') 
    imgNum = 헤드 [1] # 화상 번호 
    = 헤드 [2] # 폭 행 
    = 헤드 [3] # 높이 COLS 

    사진 = np.empty ((imgNum, 784 )) 빈 #은, 그것이 상기 어레이 내의 모든 요소에 공통된은 빈 실질적인 의미가없는, 그 배열 생성하는 빠른 방법이다 
    = 행 * COLS 번호를 크기의 단일 사진 image_size를 
    FMT = '>'+ STR ( image_size) 'B'# + 단일 이미지 포맷을 

    난에 (imgNum)의 범위는 :
        이미지 [I] = np.array (struct.unpack_from (FMT, FILE_CONTENT) 오프셋) 
        () (행 COLS) 이미지 # [I] = np.array (struct.unpack_from (FMT, FILE_CONTENT 오프셋)). 모양 변경을 
        + = struct.calcsize 오프셋 (FMT) 
    반환 이미지 

#가 태그 판독 
DEF의 read_label (FILE_NAME) 
    file_handle = 개방 (FILE_NAME을 "RB") # 이진의 문서 열기 
    file_content = file_handle.read ()를 # 1 버퍼로 읽어 

    헤드 = struct.unpack_from ( '> II'는 , file_content, 0) #은 처음 두 정수를 취 튜플 리턴 
    오프셋 = struct.calcsize를 ( '> II') 

    labelNum 헤드 =. 1] 라벨 번호 # 1 
    # 전단 (labelNum ) 
    bitsString = '>'+ STR (labelNum) 'B'포맷 FMT 번호 + '> 47040000B'어레이 (라벨) 
데프 loadDataSet () 
    #mnist 
    라벨 = struct.unpack_from (bitsString,file_content, #은 데이터 데이터를 가져) 오프셋 튜플을 반환
    np.array 반환 (라벨) 

    train_x_filename = "기차 - 이미지 - IDX3-ubyte" 
    train_y_filename = "기차 라벨 - IDX1-ubyte" 
    test_x_filename = "t10k - 이미지 - IDX3-ubyte" 
    test_y_filename = "t10k - 라벨 - IDX1-ubyte " 

    # #fashion mnist 
    # train_x_filename ="패션 - 기차 - 이미지 - IDX3-ubyte " 
    #의 train_y_filename ="패션 기차 라벨 - IDX1-ubyte " 
    #의 test_x_filename ="패션 t10k - 이미지 - IDX3-ubyte " 
    # test_y_filename = "패션 t10k - 라벨 - IDX1-ubyte"

    train_x = read_image (train_x_filename) # 60000 * 784的矩阵
    train_y = read_label (train_y_filename) # 60000 * 1的矩阵
    test_x = read_image (test_x_filename) # 10000 * 784 
    test_y = read_label (test_y_filename) # 10000 * 1
 
    train_x = 정규화 (train_x)
    = 노멀 test_x (test_x) 
    # 번호 빠를 속도 디버그 시간, 데이터의 크기를 줄이는 설정 
    # train_x = train_x [0 : 1000 :] 
    # train_y = train_y [0 : 1000] 
    # test_x test_x = [0 : 500 :] 
    # test_y test_y = [0 : 500] 

    복귀 train_x, test_x, train_y, test_y 

DEF 평준화 (데이터) : # 치화 화상 픽셀 분포하게 0-1 
    m = data.shape [0] 
    , N-NP = .Array (데이터) .shape의 [1.] 
    I에 대한 거리 (m)에서 : 
        범위 J 대 (N-) 
            ! IF 데이터 [I, J = 0 
                . 데이터 [I, J] 1 = 
            다른 : 
                데이터 [I , J = 0 
    복귀 데이터 
 
. (1) # 조건부 확률 사전 확률을 계산
DEF의 train_model (train_x, train_y, classNum) # 10 개의 classNum 카테고리 수단 여기 train_x 이미 치화, 
    m = train_x.shape [0] 
    , N-train_x.shape = 1. ] 
    # = np.zeros prior_probability (N-) #의 선험적 확률 
    prior_probability = np.zeros (classNum) #의 선험적 확률 
    conditional_probability = np.zeros ((classNum, N , 2)) # 조건부 확률 
    #의 사전 계산 된 조건부 확률 
    범위 I에 대해 (m ) : #의 m은 화상의 수가 60,000 개의이다 
        IMG = train_x [I] #img 1 * N 개의 행 벡터의 i 번째의 화상이다 
        레이블 = train_y [I] #label 라벨에 대응하는 i 번째의 화상 
        prior_probability [ 라벨] + 라벨 번호 (p (Y = CK) = (1 #)의 통계 클래스 라벨, N으로 나눈 첨자 라벨 prior_probability [상표]을 저장하기위한 클래스 사전 확률이고 
        (N) 범위 J의 경우 : #N은 특성 번호 784의 합계이다 
            온도 = IMG [J] .astype ( INT) #img [J] 정수만 표시 첨자 오류 들어갈 0.0,

            . conditional_probability가 [라벨] [J]를 [TEMP는] + 1 = 
의 곱을 계산 # (2) 주어진 X, 조건부 확률 사전 확률
 
            # conditional_probability [상표] [J]를 [IMG은 [J]를] = 1 개 + # 통계 클래스 라벨은 각 열에서의 행의 수는 숫자 1 또는 0이다 , IMG는 [j]가 값 0 또는 1이고, 조건부 확률을 계산

    # 확률 [1.10001]로 정규화 
    범위 (classNum)에 대한 I : 
        J에 대한 범위 (N-) 
            # 치화 화상 만 두 값 0 
            pix_0 = conditional_probability을 [I] [J ] [0 ] 
            pix_1 conditional_probability = [I] [J]. 1] 

            # 0에 대응하는 픽셀 계산 된 조건부 확률 
            probability_0 = (플로트 (pix_0) / 플로트 (pix_0의 pix_1의 +)) * 10000 +. 1 
            probability_1 = (플로트 (pix_1) / 플로트 (pix_0 + pix_1)) * 10000 +. 1 

            conditional_probability [I] [J] [0] = probability_0 
            conditional_probability [I] [J]. 1] = probability_1의 
    복귀 prior_probability, conditional_probability의

cal_probability DEF (IMG, 레이블 prior_probability, conditional_probability) 
    확률 = INT (prior_probability [상표]) #의 선험적 확률 
    N-img.shape = [0] 
    # 전단 (N-) 
    범위 (N-)의 I위한 # 특성되어야 번호 
        확률 * = INT (conditional_probability [상표] [I] [IMG [I] .astype (INT)]) 

    회신 확률 

argmax에 대응하여 결정되는 클래스의 #의 X 인스턴스 
DEF (test_x, test_y, prior_probability, conditional_probability) 예측 # test_x 후에 전달 또는 train_x 치화 
    predict_y = [] 
    m = test_x.shape [0] 
    , N-test_x.shape = 1이다.] 
    거리 (m)에 대한 I : 
        IMG = np.array (test_x를 [ I]) # IMG에 이미 열 벡터 치화 후의 
        라벨 test_y = [I] 
        max_label = 0
        max_probability = cal_probability (IMG, 0, prior_probability, conditional_probability)  
        범위 J 대 (1,10)에 인덱스 # 1 시작이되기 때문에, 아래 첨자 0은 초기 값
            확률 = cal_probability (IMG, J, prior_probability, conditional_probability) 
            경우 max_probability <확률 : 
                max_probability = 확률 
                max_label = j 개의 
        predict_y.append (max_label) #用来记录每行最大概率的라벨 
    복귀 np.array (predict_y) 

데프 cal_accuracy (test_y, predict_y) : 
    m = test_y.shape [0] 
    ERRORCOUNT = 0.0 
    범위 (m)에서의 I : 
        만약 test_y [I] = predict_y [I]! 
            ERRORCOUNT + = 1 
    정확도 = 1.0 유동 (ERRORCOUNT) / m의 
    반송 정밀도 

경우 __name __ == '__ main__' 
    classNum = 10 
    인쇄 ( "데이터 ... 읽기 시작") 
    시간 1 =로 time.time을 ()
    train_x, test_x, train_y, test_y = loadDataSet () 
    train_x = (train_x) 정상화 
    test_x = 정규화 (test_x) 

    TIME2 =로 time.time () 
    인쇄 ( "두 번째", TIME2-TIME1 "데이터 코스트를 읽는") 

    인쇄 ( "시작 트레이닝 데이터 ... ") 
    prior_probability, conditional_probability = train_model (train_x, train_y, classNum) 
    나 대 범위 (classNum) 
        인쇄 (prior_probability [I]) #输出一下每个标签的总共数量
    TIME3로 time.time = () 
    인쇄 ( "기차 데이터 비용"시간 3-TIME2는 "두 번째") 

    인쇄 ( "데이터 ... 예측 시작") 
    predict_y = 예측을 (test_x, test_y, prior_probability, conditional_probability)  
    time4 = 시간.시각()
    인쇄 ( "데이터 비용을 예측", time4-시간 3 ,"둘째") 

    인쇄 ( "정확도를 계산 시작 ...")
    ACC = cal_accuracy (test_y, predict_y) 
    time5로 time.time = () 
    인쇄 ( "accuarcy"ACC) 
    인쇄 ( "두 번째", time5-time4 "accuarcy 비용을 계산하는")

 

추천

출처www.cnblogs.com/wanglinjie/p/11600994.html