DATA PROGRAMMING/PYTHON

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

허니리즘 2023. 11. 20. 13:08

이번 글에서는 머신 러닝 방법중 하나인 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()

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