참고 : https://ko.wikipedia.org/wiki/서포트_벡터_머신
1. 2차원의 purple/green으로 분류된 학습 데이터를 SVM 비선형 분류 기법을 통해 학습 모델을 만든다.
* 커널(Kernel)은 RBF 방사형 함수를 사용하고, 새로운 차원으로 사상될 값의 크기를 시각적으로 표현하기 위해 확률값을 출력하도록 옵션을 주었다.
2. 커널함수의 실체를 시각화 하기 위해 그리드(Grid)한 테스트 데이터를 만들어, 실제 사상되는 값을 통해 3D 화면을 그린다.
* 커널(Kernel)은 새로운 차원 공간으로의 매핑 방법을 뜻한다. OS가 커널을 통해서 S/W가 H/W라는 다른 차원을 조절하는 것도 같은 의미로 보인다.
참조 라이브러리 로딩
In [2]:
import pandas as pd
from sklearn import svm
from mpl_toolkits.mplot3d import Axes3D
학습(트레이닝) 데이터 생성
In [3]:
X1 = pd.DataFrame([(1,1),(1,-1),(-1,1),(-1,-1)],columns=['x','y'])
X1['c'] = 'purple'
X2 = pd.DataFrame([(2,2),(2,-2),(-2,2),(-2,-2)],columns=['x','y'])
X2['c'] = 'green'
df1 = pd.concat([X1,X2])
2D 플롯을 통해서 시각화
In [4]:
scatter(x=df1['x'],y=df1['y'],color=df1['c'],s=100)
axhline(y=0,xmin=-3,xmax=3,color='black')
axvline(x=0,ymin=-3,ymax=3,color='black')
text(x=3,y=0,s=' X Axis ')
text(x=0,y=3,s=' Y Axis ')
axis('off')
Out[4]:
학습 데이터를 서포트 벡터 머신(SVM)을 통해서 분류(Classification) 모델 생성
In [5]:
# 커널 함수로는 방사형을 사용
clf = svm.SVC(probability=True,kernel='rbf')
clf.fit(df1[['x','y']], df1['c'])
Out[5]:
분류 모델을 통한 데이터 분류 및 시각화를 위한 확률값 추출
In [6]:
# 시각화를 위해 학습 데이터에 대한 확률값(z축) 반영하기
df1['z'] = df1.apply(lambda r: clf.predict_proba((r[0],r[1]))[0][1],axis=1)
# 커널 함수에 대한 시각적인 이해를 위해 그리드(Grid)한 테스트 데이터 분류
net = []
for i in arange(-3,3,.1):
for j in arange(-3,3,.1):
net.append((i,j,clf.predict((i,j))[0],clf.predict_proba((i,j))[0][1]))
df2 = pd.DataFrame(net,columns=['x','y','c','z'])
In [7]:
fig = plt.figure(figsize=(8,6))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xs=df1['x'],ys=df1['y'],zs=df1['z'],color=df1['c'],s=100)
ax.scatter(xs=df2['x'],ys=df2['y'],zs=df2['z'],color=df2['c'],alpha=.1,marker='.')
ax.set_zlabel('Z Axis')
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')
Out[7]:
차원(dimension)의 계념은 우리의 일상을 정량화 할 수 있고, 다양한 기법들을 활용해 문제 해결에도 영향을 주며, 학문의 벽을 허무는 연결고리에 대한 아이디어를 준다. 일상과 IT의 경계의 연결고리를 발견하게 해준 Jerry 선배님께 이 글을 바친다.
0 개의 댓글:
댓글 쓰기