Python 은 KNN 알고리즘 을 기반 으로 한 필적 식별 기능 에 대한 상세 한 설명 을 실현 합 니 다.

본 고 는 Python 이 KNN 알고리즘 을 바탕 으로 하 는 필적 식별 기능 을 실현 하 는 것 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
필요:
  • Numpy 라 이브 러 리
  • Pandas 창고
  • 손 글씨 인식 데 이 터 를 클릭 하 십시오본 사이트 다운로드.
  • 데이터 설명:
    데 이 터 는 모두 785 열 로 첫 번 째 열 은 label 이 고 나머지 784 열 데 이 터 는 그 레이스 케 일 이미지(0~255)의 픽 셀 값 28*28=784 를 저장 합 니 다.
    KNN(K 근접 알고리즘):
    훈련 에서 새로운 데이터 와 가장 가 까 운 K 조 기록 을 집중 적 으로 찾 아 그들의 주요 분류 에 따라 새로운 데이터 의 유형 을 결정 한다.
    이곳 의 주요 분 류 는 서로 다른 판별 근거 가 있 을 수 있다.예 를 들 어'가장 많 음','최근 이웃',또는'거리 가중'등 이다.
    전체 프로그램의 몇 부분:
    1.데이터 의 정규 화 처리(normalization)
    2.(중요)test 데이터 와 가장 가 까 운 train 데이터 의 번 호 를 찾 아 번호 에 따라 해당 하 는 label 을 찾 아 label 을 test 데이터 에 대한 예측 치 를 부여 합 니 다.
    3.통계 적 으로 알 고 있 는 test 의 label 값 과 test 의 예측 label 가치 정확도
    Step 1
    Numpy 와 Pandas 라 이브 러 리 가 져 오기
    
    import numpy as np
    import pandas as pd
    
    Step 2
    데이터 를 귀 일화 하 다
    데 이 터 를 획일 화 하 는 방법 은 매우 많다.예 를 들 어:
    1.max-min 표준화
    max-Min 표준화 방법 은 원시 데 이 터 를 선형 으로 변환 하 는 것 이다.minA 와 maxa 를 각각 속성 A 의 최소 값 과 최대 값 으로 설정 하고 A 의 원시 값 x 를 max-min 표준 화 를 통 해 구간[0,1]에서 의 값 x 로 매 핑 합 니 다.그 공식 은:
    새 데이터=(원 데이터-극소 값)/(최대 값-극소 값)
    둘째,
    새 데이터=원 데이터/(원 데이터 의 제곱 과 루트 번호)
    셋째,
    y=(x-min)/(max-min)그 중에서 min 은 x 의 최소 값 이 고 max 는 x 의 최대 값 이 며 입력 벡터 는 x 이 며 귀 일 화 된 출력 벡터 는 y 이다.이 식 은 데 이 터 를[0,1]구간 으로 정규 화하 고 활성화 함수 가 S 형 함 수 를 사용 할 때(값 영역(0,1)이 식 이 적 용 됩 니 다.
    여기 서 방법 2.
    
    def normalize(x):
     norms = np.apply_along_axis(np.linalg.norm,1,x)
     return x / np.expand_dims(norms,-1)
    
    
    np 의linalg.norm(x)apply_along_axis(func, axis, x)함 수 를 호출 합 니 다.linalg.norm(x)함수 의 작용 은return sum(abs(xi)**2)**0.5,apply_along_axis(func, axis, x)함수 의 작용 은 x 를 axis 방향 으로 func 함 수 를 집행 하 는 것 이 고,axis=0 은 열 방향의 연산 을 하고,axis=1 은 행 방향의 연산 을 하 는 것 을 나타 낸다
    step 3
    test 데이터 와 가장 가 까 운 train 데 이 터 를 찾 는 것 이 가장 중요 하 다.
    여기 서 test 데이터 와 train 데 이 터 는 공간의 두 벡터 이 고 문 제 는 이 두 벡터 의 유사 도 를 어떻게 계산 하 느 냐 가 되 었 다.
    우 리 는 그것들 을 공간 속 의 두 선 으로 상상 할 수 있다.모두 원점([0,0,...]에서 출발 하여 서로 다른 방향 을 가리킨다.두 선분 사이 에 하나의 협각 이 형성 되 는데 협각 이 0 도이 면 방향 이 같 고 선분 이 겹 치 는 것 을 의미한다.협각 이 90 도 라면 직각 이 형성 되 고 방향 이 전혀 비슷 하지 않다 는 것 을 의미한다.협각 이 180 도 라면 방향 이 정반 대 라 는 뜻 이다.따라서 우 리 는 협각 의 크기 를 통 해 벡터 의 유사 도 를 판단 할 수 있다.협각 이 작 을 수록 비슷 하 다 는 뜻 이다.
    a 벡터 가[x1,y1]이 고 b 벡터 가[x2,y2]라 고 가정 하면 코사인 정 리 를 다음 과 같은 형식 으로 바 꿀 수 있다.

    여 현 정리
    
    def nearest_neighbor(norm_func,train_data,train_label,test_data):
     train_data = norm_func(train_data)
     test_data = norm_func(test_data)
     cos = np.dot(train_data,np.transpose(test_data))#np.transpose    ,dot      ,   cos     test train    
     max_cos = np.argmax(cos,axis=0)#np.argmax cos         
     test_pred = train_label[max_cos]#train_label   ,max_cos     ,train_label[max_cos]   train_label max_cos       
     return test_pred#  test    
    
    
    step 4
    통계 예측 치 의 정확도
    
    def validate(test_pred,test_label):
     c=len(test_pred)#           ,len             ,          ,            
     correct=(test_pred == test_label).sum()#               
     return float(correct)/c#            ,    correct/c  0
    
    
    테스트 코드:
    
    if __name__ == '__main__':
     train_num = 200
     test_num = 300#       test_num-train_num
     x = pd.read_csv('train.csv')
     x_train = x.values[0:train_num,1:]#  pandas        ,   data.values[]
     x_train_label = x.values[0:train_num,0]#    label,         
     x_test = x.values[train_num:test_num,1:]
     x_test_label = x.values[train_num:test_num,0]
     test_pred=nearest_neighbor(normalize,x_train,x_train_label,x_test)
     prec=validate(test_pred,x_test_label)
     print u"    %.2f"%(prec)#    %f
    
    
    전체 코드 는 여 기 를 클릭 하 십시오본 사이트 다운로드.
    주석:
    위 부분 은 주로 KNN 알고리즘 을 설명 하고 기 존의 28*28 의 데 이 터 를 활용 하 는데 실제 필적 분석 을 할 때 먼저 이미 지 를 행렬 데이터 로 전환 해 야 한다.
    이제 이미지 가 행렬 과 행렬 로 바 뀌 어 이미지 로 바 뀌 는 방법 을 소개 합 니 다.
    매트릭스 가 이미지 로 전환
    필요 한 라 이브 러 리 는 이미지 처리 라 이브 러 리 Python Imaging Library(PIL)입 니 다.
    Windows 에서 pip install PIL 설치 에 실 패 했 습 니 다.PIL.exe 를 다운로드 하여 더 블 클릭 으로 설치 하 는 방법 을 취 했 습 니 다.
    다운로드 주소:
    PIL 공식 다운로드 주소
    
    import pandas as pd
    import numpy as np
    from PIL import Image
    # load data
    train = pd.read_csv('train.csv')
    # now draw the numbers
    for ind, row in train.iloc[0:3].iterrows():#iloc  (    )    3   
     i = row[0]#[0]    
     arr = np.array(row[1:], dtype=np.uint8)#1-784      ,,uint8 8      
     #arr = np.array(255 - row[1:], dtype=np.uint8)#        , 255           
     arr.resize((28, 28))#    28*28   
     #save to file
     im = Image.fromarray(arr)
     im.save("./train_pics/%s-%s.png" % (ind, i))#   %s(ind)         ,   %s             ,            ,              
    
    
    .iloc()방법
    
    iloc[   ,   ]
    df.iloc[1,1]#     ,     ,       
    df.iloc[0,2],:]#            
    
    
    그림 이 행렬 로 바뀌다
    필요 한 라 이브 러 리 는opencv(open source computer vision)입 니 다.다운로드 설치 방식 은 부록 을 참조 하 십시오.python_OpenCV 설치
    여 기 는 주로 그것 의 몇 가지 간단 한 기능 을 말한다.
    1.정적 이미지 의 입력,출력
    
    cv2.imread('xxx.png')#  ,#    image   image.shape = (w,h,3),w*h      ,3 BGR      channel ,    0~255
    cv2.imwrite('xxx.jpg', image)#  
    
    
    2.그림 을 그 레이스 케 일 로 변환
    
    #       channel    ,0~255     
    grayImage = cv2.imread('xxx.png',cv2.CV_LOAD_IMAGE_GRAYSCALE)
    
    
    3.그림 의 크기 변경
    
    print grayImage.shape#     shape,shape (137,301),         size,  42137(41237=137*301)
    res=cv2.resize(grayImage,(28,28),interpolation=cv2.INTER_CUBIC)#   grayImage cv2.INTER_CUBIC     (28,28)     
    
    
    변환 방법:
  • CV_INTER_NN-최근 인접 플러그 인,
  • CV_INTER_LINEAR-이중 선형 플러그 인(사용 부족)
  • CV_INTER_AREA-픽 셀 관계 재 샘플링 사용.그림 이 축소 되 었 을 때,이 방법 은 파문 이 나타 나 는 것 을 피 할 수 있다.그림 을 확대 할 때 CV 와 유사 합 니 다.INTER_NN 방법..
  • CV_INTER_CUBIC-입방 플러그 인.
  • 다음은 입력,출력,그 레이스 케 일 로 변경,그림 크기 변경,표 시 된 전체 프로그램 입 니 다.창 에 표 시 된 그림 에 주의 하 십시오.
    
    import cv2
    image = cv2.imread('111.png')# 
    cv2.imwrite('111.jpg', image)# 
    grayImage = cv2.imread('111.png',cv2.CV_LOAD_IMAGE_GRAYSCALE)
    print grayImage.shape
    res=cv2.resize(grayImage,(28,28),interpolation=cv2.INTER_CUBIC)
    #    
    cv2.imshow('test',grayImage)#     
    cv2.imshow('change',res)#         
    #      
    k=cv2.waitKey(0)
    if k==27:#27  ESC 
     cv2.destroyWindow()
    
    
    cv2.imshow()그림 을 창 에 표시 하 는 데 사용 합 니 다.그 다음 에cv2.waitKey()함 수 를 따라 야 표시 가 지속 되 고 그렇지 않 으 면 표시 프로그램 이 중단 되 고 창 이 닫 힙 니 다.cv2.waitKey()함 수 는 키 보드 를 캡 처 하 는 입력 이 고cv2.destroyWindow()는 방출 창 입 니 다.
    그림 을 읽 고 출력 하 는 것 을 배 운 후에 우 리 는 쓴 KNN 알고리즘 으로 우리 의 필적 을 식별 할 수 있다.
    질문:
    나 는 손 으로 쓴 데 이 터 를 많이 사용 하여 식별 이 정확 한 지 검증 하 였 는데,정확도 가 아직 높 지 않다 는 것 을 발견 하 였 다.문제
    1.그림 의 크기 문제,크기 조절 은 전체 그림 을 28*28 의 그림 으로 바 꾸 는 것 이 아니 라 숫자 가 적 힌 중심 그림 을 식별 하여 옆 에 있 는 흰 쪽 을 없 애 야 한다.
    2.손 으로 쓴 숫자 사진 은 글 씨 를 쓰 는 곳 이 검은색 이 라 고 장담 할 수 없습니다(픽 셀 값 255)
    해결 방법:종이,촬영 문제 로 인 한 픽 셀 값 을 낮 추 는 필 터 를 사용 해 야 합 니 다.더 이상 필 터 를 사용 하지 않 은 조건 에서 나 는 사진 을 화판 에 쓴 숫자 로 바 꾸 었 다.
    3.글씨 의 굵기 는 판단 에 영향 을 미친다
    해결 방법:이것 은 훈련 견본 이 많 지 않 고 전체적인 훈련 견본 의 필적 이 굵 어서 가 는 필적 을 입력 할 때 식별 할 수 없 는 것 일 수 있 습 니 다.그리고 입력 글씨체 의 굵기 를 측정 하고 입력 한 가 는 필적 을 팽창 처리 하 며 굵 은 필적 을 부식 처리 해 야 한다.
    첨부:pythonOpenCV 설치
    인터넷 에서 많은 튜 토리 얼 을 본 것 은 VS 환경 에서 OpenCV 의 설치 이 고 저 는 windows 7,32 비트,sublime+cmd 환경 에서 python 의 프로 그래 밍 을 했 기 때문에 이런 조건 에서 OpenCV 의 설 치 를 생각 했 습 니 다.
    pip install numpy 문 구 를 사용 하여 numpy 를 설치 합 니 다.
    (오류 가 발생 하면:Microsoft Visual C++9.0 is required,관리자 신분 으로 Microsoft Visual C++9.0 을 설치 하고 컴퓨터 를 다시 시작 한 다음 pip install numpy 문 구 를 사용 하여 numpy 를 설치 합 니 다.
    opencv2.4.10 다운로드 하 다.
    다운로드 후 압축 풀기(어디 에 압축 풀기),압축 풀기 디 렉 터 리 opencv 폴 더 에서 build->python->2.7->x86 의 파일 cv2.pyd 를 python 2.7\Lib\site-packages 에 복사 합 니 다.
    설치 에 성 공 했 는 지 테스트 합 니 다.디 렉 터 리 에 있 는 sources\samples\python\\drawing.py 를 실행 하거나 python 환경 에 들 어가 서 사용 합 니 다import cv2더 많은 파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
    본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

    좋은 웹페이지 즐겨찾기