svm 모듈의 SVC에 대해 (수학은 제외)

여러분 안녕하세요.
12/19의 문장을 써 갑니다.
오늘은 일이 있어서 늦어졌어요. . .

오늘은 어제 공부한 직선 SVC 모델의 분류를 정리해 가겠습니다.

분류 목적





위 사진을 보세요.
분류는 이 파란색 점과 오렌지 버트를 분리하는 선을 자동으로 찾는 것입니다.
2차원이라면 인간에게 매우 간단하죠?
SVC 모델은 고차원의 경우라도 나누기 위한 식을 요구할 수 있기 때문에 굉장하네요.
자, 이것이 무엇에 도움이됩니까? 라고 생각하는 분도 많을 것입니다.
아래 이미지는 어떻습니까?



차이를 알았습니까?
그래, G 메일에서는 당연한 것처럼 스팸 메일을 연주해 줍니다만, 이것은 AI의 힘입니다. (알고리즘은 더 복잡합니다.)
하지만 하고 있는 일은 같고, 어느 직선(면)을 당겨 스팸인지 유효한 메일인지를 분석하고 있습니다.
아름답고 굉장합니다.

글쎄, 오늘의 최종 목적 이미지를 보여줍니다.
다음이됩니다.



⚠︎주의하고 싶을 수 있습니다.
이 예제의 경우라면 무한한 선을 그릴 수 있다고 말하는 것입니다.
따라서, 이 점선의 폭(병합)이 제일 넓어진 다음, 그 중간에 실선(결정 경계)을 그립니다.

이제 이 결정 경계를 구하기 위한 코드를 살펴보겠습니다.

샘플 코드


import numpy as np
from sklearn.svm import SVC
import matplotlib.pyplot as plt
xmin = 0
xmax = 2
ymin = 0
ymax = 2

# 0 ~ 1 までの正規分布に従った値が入った(100行2列(X&Y))の行列を作成
X0 = np.random.uniform(size=(100, 2))
y0 = np.repeat(0, 100)

X1 = np.random.uniform(low=1.0, high=2.0, size=(100, 2))
y1 = np.repeat(1, 100)

svc = SVC(kernel='linear', C=1e8)

# 学習
# svc.fit(train_features, train_labels)
svc.fit(np.vstack((X0, X1)), np.hstack((y0, y1)))

fig, ax = plt.subplots()

# ax.scatter(x, y) 散布図
ax.scatter(X0[:, 0], X0[:, 1], marker='o', label='class 0')
ax.scatter(X1[:, 0], X1[:, 1], marker='x', label='class 1')

# 格子点を準備
xx, yy = np.meshgrid(np.linspace(xmin, xmax, 100), np.linspace(ymin, ymax, 100))
# decision_functionの為に一つの行列に。
xy = np.vstack([xx.ravel(), yy.ravel()]).T

# 100 * 100 の行列。
# z = x*2 + y*2 とする部分のzの高さの部分。
# svcの決定関数を使ってxyという格子点からzを求めている。
z = svc.decision_function(xy).reshape((100, 100))
# 決定境界とマージンをプロット
ax.contour(xx, yy, z, colors='k', levels=[-1, 0, 1], alpha=0.3, linestyles=['--', '-', '--'])
plt.show()

흐름으로서는
1. 데이터 준비
2. SVC의 인스턴스 생성
3. 입력 데이터를 그것을 부착시킨 라벨을 fit 함수에 넣는 것으로 학습시킨다.
4. 격자점 생성( 참고 기사 )
5. Z를 fit으로 배운 decision_function을 사용하여 작성
6. contour를 사용하여 등고선을 그리면 결정 경계를 쓸 수 있습니다.

중요한 함수는 fit과 decition_funkction이다.
fit의 사용법은 이해했지만, decision_function 쪽은 분류기를 이용해 Z를 요구하는 정도밖에 이해할 수 없다.
그것은 좀 더 공부가 진행되어 기사로 하려고 한다.

오늘은 밤이 늦기 때문에 이 정도로.
잘자.

좋은 웹페이지 즐겨찾기