[PYTHON] SVM을 활용해 분류하고 시각화 하기

2023. 11. 20. 13:08DATA PROGRAMMING/PYTHON

이번 글에서는 머신 러닝 방법중 하나인 svm을 활용하여 군집 모델을 만들고 이를 시각화 해보려고 한다.

 

 

선형 SVM

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets._samples_generator import make_classification, make_moons

 

우선 필요한 라이브러리들과 데이터 셋을 받아온다.

 

X1, y1 = make_classification(n_samples = 100, n_features=2, n_informative=1, n_redundant=0,
                            n_clusters_per_class=1, random_state=4
                            )

 

군집 모형을 만들기 위해 각 파라미터 값을 입력해 가상 데이터를 생성한다.

여기서 n_samples는 생성할 데이터 수, n_features는 독립 변수의 수, n_informative는 독립 변수 중 종속 변수와 상관관계가 있는 성분의 수, n_redundant는 독립 변수 중 다른 독립 변수의 선형 조합으로 나타나는 성분의 수, n_clusters_per_class는 클래스 당 클러스터의 수이다.

 

clf1 = svm.SVC(kernel='linear', random_state=44)
clf1.fit(X1,y1)

 

만들어진 데이터를 svm알고리즘에 fit한다. 여기서 kernel을 linear로 설정해 선형 군집을 한다.

 

plt.scatter(X1[:,0], X1[:,1], c=y1, s=30)

# 초평면 표현
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)

YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf1.decision_function(xy).reshape(XX.shape) # 데이터 포인트~결정경계 사이의 거리를 구해 각 포인트가 어느 클래스에 속하는지 결정

ax.contour(XX, YY, Z, colors='k', levels=[-1,0,1], alpha=0.5, linestyles=['--','-','--'])

#Support Vector 표현
ax.scatter(clf1.support_vectors_[:,0], clf1.support_vectors_[:,1], s=50, facecolors='r')
plt.show()

 

 

https://honeylive.tistory.com/44

 

[PYTHON] matplotlib을 활용하여 3차원 그래프 그리기

matplotlib 2차원 그래프 그리기 t1 = np.linspace(-2, 2, 10) # x와 y 배열 생성 x = 2 * t1 y = t1**2 + 2 * t1 # 그래프 그리기 plt.figure(figsize=(8, 6)) # 그래프 크기 설정 plt.plot(x, y, marker='o', linestyle='-') # 선 그래프 그

dd.honeyreviewer.com

 

초평면 그리는 자세한 방법

 

 

비선형 SVM

 

 

X2, y2 = make_moons(n_samples = 400, noise = 0.1, random_state = 0)

clf_rbf = svm.SVC(kernel='rbf', random_state=44)
clf_rbf.fit(X2, y2)

 

초승달 모양의 클러스터 두 개 형상의 데이터를 생성한다.

 

plt.scatter(X2[:,0], X2[:,1], c=y2, s=30)

# 초평면 표현
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)

YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf2_rbf.decision_function(xy).reshape(XX.shape) # 데이터 포인트~결정경계 사이의 거리를 구해 각 포인트가 어느 클래스에 속하는지 결정

ax.contour(XX, YY, Z, colors='k', levels=[-1,0,1], alpha=0.5, linestyles=['--','-','--'])

#Support Vector 표현
ax.scatter(clf2_rbf.support_vectors_[:,0], clf2_rbf.support_vectors_[:,1], s=50, facecolors='r')
plt.show()

위와 마찬가지로 시각화 한다.