Python 의 지원 벡터 기 SVM 사용(인 스 턴 스 코드 첨부)

Matlab 에서 PRTools 도구 상자 의 svm 알고리즘 을 사용 하 는 것 을 제외 하고 Python 에서 도 지원 벡터 기 를 사용 하여 분류 할 수 있 습 니 다.Python 의 sklearn 라 이브 러 리 에 도 SVM 알고리즘 이 통합 되 어 있 기 때문에 본 고의 운영 환경 은 Pycharm 입 니 다.
1.sklearn 알고리즘 패키지 가 져 오기
Scikit-learn 라 이브 러 리 는 모든 기본 기계 학습 알고리즘 을 실 현 했 습 니 다.구체 적 인 사용 은 공식 문서 설명 을 참조 하 십시오http://scikit-learn.org/stable/auto_examples/index.html
skleran 에 많은 알고리즘 이 통합 되 어 있 습 니 다.가방 을 가 져 오 는 방식 은 다음 과 같 습 니 다.
논리 회귀:from sklearn.linearmodel import LogisticRegression
소박 한 베 이 루스:from sklearn.naivebayes import GaussianNB
K-근린:from sklearn.neighbors import KNeighbors Classifier
의사 결정 트 리:from sklearn.tree import 의사 결정 트 리 분류 기
벡터 지원:from sklearn import svm
2.sklearn 에서 svc 의 사용
(1)numpy 의 loadtxt 를 사용 하여 데이터 파일 을 읽 습 니 다.
loadtxt()의 사용 방법:

fname:파일 경로.eg:C:/Dataset/iris.txt。
dtype:데이터 형식.eg:float,str 등.
delimiter:구분자.eg:‘,'。
converters:데이터 열 과 변환 함 수 를 매 핑 하 는 사전 입 니 다.eg:{1:fun}은 두 번 째 열 에 대응 하 는 변환 함 수 를 변환 하 는 것 을 의미 합 니 다.
usecols:데이터 의 열 을 선택 하 십시오.
Iris 난초 데이터 세트 를 예 로 들 면:
UCI 데이터베이스 에서 다운로드 한 Iris 원본 데이터 세트 의 모양 이 이 렇 기 때문에 앞의 4 열 은 특징 열 이 고 다섯 번 째 열 은 유형 열 이 며 각각 세 가지 유형 인 Iris-setosa,Iris-versicolor,Iris-virginica 가 있다.   

numpy 의 loadtxt 함 수 를 사용 하여 이 데이터 세트 를 가 져 올 때 데이터 형식 dtype 을 부동 소수점 형 으로 가정 하지만 다섯 번 째 열의 데이터 형식 은 부동 소수점 형 이 아 닌 것 이 분명 합 니 다.
따라서 우 리 는 loadtxt()함수 중의 converters 인 자 를 통 해 다섯 번 째 열 을 변환 함 수 를 통 해 부동 소수점 형식의 데이터 로 표시 하 는 작업 을 추가 해 야 합 니 다.
우선,우 리 는 변환 함 수 를 써 야 한다.

def iris_type(s):
  it = {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}
  return it[s]
다음 데 이 터 를 읽 습 니 다.converters={4:iristype:}에서"4"는 5 열 을 말 합 니 다.

path = u'D:/f /python/  /iris.data' #       
data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})
읽 기 결과:

(2)아이 리 스 를 훈련 집 과 테스트 집 으로 나눈다.

x, y = np.split(data, (4,), axis=1)
x = x[:, :2]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6)
1.split(데이터,분할 위치,축=1(수평 분할)or 0(수직 분할).
2.x=x[::2]는 후기 에 그림 을 그 리 는 것 을 편리 하 게 하기 위해 앞의 두 열 특징 치 벡터 훈련 만 취 했다.
3. sklearn.model_selection.train_test_split 는 무 작위 로 훈련 집 과 테스트 집 을 나눈다.train_test_split(train_data,train_target,test_size=숫자,randomstate=0)
매개 변수 설명:
  • train_data:구분 할 샘플 특징 집
  • train_target:구분 할 샘플 결과
  • test_size:견본 이 차지 하 는 비례,정수 라면 견본 의 수량
  • random_state:난수 의 씨앗 입 니 다
  • 랜 덤 피 드:사실은 이 그룹의 랜 덤 수의 번호 입 니 다.중복 시험 이 필요 할 때 같은 랜 덤 수 를 얻 을 수 있 습 니 다.예 를 들 어 당신 이 매번 1 을 채 우 고 다른 매개 변수 가 같은 상황 에서 얻 은 랜 덤 배열 은 같 습 니 다.그러나 0 을 쓰 든 지 말 든 지 매번 다르다.랜 덤 수의 생 성 은 씨앗 에 달 려 있 고 랜 덤 수 와 씨앗 간 의 관 계 는 다음 과 같은 두 가지 규칙 에 따른다.씨앗 이 다 르 면 서로 다른 랜 덤 수가 생 긴 다.피 드 는 같 습 니 다.인 스 턴 스 가 다 르 더 라 도 같은 랜 덤 수 를 만 듭 니 다.
    (3)svm 분류 기 훈련
    
    # clf = svm.SVC(C=0.1, kernel='linear', decision_function_shape='ovr')
      clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
      clf.fit(x_train, y_train.ravel())
    kernel='linear'일 때 선형 핵 이 고 C 가 클 수록 분류 효과 가 좋 지만 너무 적합 할 수 있 습 니 다(defaul C=1).
    kernel='rbf'시(default)는 고 스 핵 이 고 gamma 값 이 작 을 수록 분류 인터페이스 가 연속 적 입 니 다.gamma 수치 가 클 수록 분류 인터페이스 가'산'될 수록 분류 효과 가 좋 지만 너무 적합 할 수 있 습 니 다.
    decision_function_shape='ovr'일 때 원 v rest,즉 하나의 유형 과 다른 유형 으로 구분 합 니 다.
    decision_function_shape='ovo'시 one v one 으로 분류 두 사 이 를 구분 하고 두 가지 분류 방법 으로 다 중 분류 결 과 를 모 의 합 니 다.
    (4)svc 분류 기의 정확 도 를 계산한다.
    
    print clf.score(x_train, y_train) #   
    y_hat = clf.predict(x_train)
    show_accuracy(y_hat, y_train, '   ')
    print clf.score(x_test, y_test)
    y_hat = clf.predict(x_test)
    show_accuracy(y_hat, y_test, '   ')
    결 과 는:

    의사 결정 함 수 를 보 려 면 decision 을 통 해function()구현
    
    print 'decision_function:
    ', clf.decision_function(x_train) print '
    predict:
    ', clf.predict(x_train)
    결 과 는:

    decision_function 에서 각 열의 값 은 각종 다른 거 리 를 대표 합 니 다.
    (5)그림 그리 기
    1.좌표 축 범 위 를 확정 하고 x,y 축 은 각각 두 가지 특징 을 나타 낸다.
    
    x1_min, x1_max = x[:, 0].min(), x[:, 0].max() #  0    
    x2_min, x2_max = x[:, 1].min(), x[:, 1].max() #  1    
    x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j] #        
    grid_test = np.stack((x1.flat, x2.flat), axis=1) #    
    # print 'grid_test = 
    ', grid_testgrid_hat = clf.predict(grid_test) # grid_hat = grid_hat.reshape(x1.shape) #
    mgrid()함 수 를 사 용 했 습 니 다.이 함수 의 역할 은 여기 서 간단하게 소개 합 니 다.
     목표 함수 F(x,y)=x+y 를 가정 합 니 다.x 축 범위 1~3,y 축 범위 4~6,그림 을 그 릴 때 주로 4 단계 로 나 누 어 진행:
    [step 1:x 확장](오른쪽으로 확장):
            [1 1 1]
       [2 2 2]
       [3 3 3]
    [step 2:y 확장](아래로 확장):
       [4 5 6]
       [4 5 6]
       [4 5 6]
    [step 3:포 지 셔 닝(xi,yi)]:
       [(1,4) (1,5) (1,6)]
       [(2,4) (2,5) (2,6)]
       [(3,4) (3,5) (3,6)]
    [step 4:(xi,yi)를 F(x,y)=x+y 에 대 입하 기]
    그래서 여기 x1,x2=np.mgrid[x1min:x1_max:200j, x2_min:x2_max:200 j]후의 결 과 는:

    stack()함수,axis=1 을 통 해 테스트 점 을 생 성 합 니 다.

    2.기본 글꼴 지정
    
    mpl.rcParams['font.sans-serif'] = [u'SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    3.그리 기
    
    cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
    
    cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
    
    plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)
    
    plt.scatter(x[:, 0], x[:, 1], c=y, edgecolors='k', s=50, cmap=cm_dark) #   
    
    plt.scatter(x_test[:, 0], x_test[:, 1], s=120, facecolors='none', zorder=10) #        
    
    plt.xlabel(u'    ', fontsize=13)
    
    plt.ylabel(u'    ', fontsize=13)
    
    plt.xlim(x1_min, x1_max)
    
    plt.ylim(x2_min, x2_max)
    
    plt.title(u'   SVM     ', fontsize=15)
    
    # plt.grid()
    
    plt.show()
    pcolormesh(x,y,z,cmap)여기 매개 변 수 는 x1,x2,grid 를 대 입 합 니 다.hat,cmap=cm_light 는 배경 을 그립 니 다.
     scatter 에서 edgecolors 는 점 의 가장자리 색 채 를 묘사 하 는 것 을 말 합 니 다.s 는 점 의 크기,cmap 가 가리 키 는 색 을 말 합 니 다.
    xlim 그림 의 경계.
    최종 결 과 는:

    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기