import numpy as np
import matplotlib.pyplot as plt
"""
x, y를 각각의 평균과 분산에 따라서 생성해주는 함수를 만들었습니다.
np.vstack은 세로로 쌓아줍니다.
(1, nrow)
(1, nrow)
"""
def normal_sampling(mu1, v1, mu2, v2, nrow):
x = np.random.normal(mu1, v1, nrow)
y = np.random.normal(mu2, v2, nrow)
return np.vstack([x,y])
"""
다양한 평균과 분산에 대해서 샘플링하여 쌓아줍니다.
np.hstack은 가로로 붙여줍니다.
그래서 마지막에 Transpose 했습니다.
"""
sample_size = 500
cluster_num = 3
X = np.hstack([
normal_sampling(0, 1, 0, 1, sample_size),
normal_sampling(2, 1, 2, 1, sample_size),
normal_sampling(3, 1, 7, 1, sample_size),
normal_sampling(8, 1, 4, 1, sample_size),
normal_sampling(6, 1, 5, 1, sample_size),
normal_sampling(6, 3, 0, 1, sample_size),
normal_sampling(0, 3, 6, 2, sample_size)
]).T
Y = []
for i in range(0, X.shape[0]//sample_size):
Y+=[i for j in range(0, sample_size)]
Y = np.array(Y)
plt.figure(figsize=(15, 6))
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.rainbow, alpha=0.2)
"""
대충 학습을 시키고요...
"""
from sklearn.neural_network import MLPClassifier
clf = MLPClassifier(hidden_layer_sizes=[50, 50, 10], activation='relu')
clf.fit(X, Y)
#print(clf.score(X, Y))
"""
grid_size를 대충 잡고, 인공적으로 값들을 만들어줍니다.
이를 활용해서 np.meshgrid를 만들고, 이 값들별로 class를 에측하고, 컨투어를 그려줍니다.
"""
grid_size = 500
A, B = np.meshgrid(np.linspace(X[:, 0].min(), X[:, 0].max(), grid_size),
np.linspace(X[:, 1].min(), X[:, 1].max(), grid_size))
C = clf.predict( np.hstack([A.reshape(-1, 1), B.reshape(-1, 1)]) ).reshape(grid_size, grid_size)
plt.contourf(A, B, C, alpha=0.3, cmap=plt.cm.rainbow)
plt.axis('off')
plt.savefig("../../assets/images/markdown_img/decision_boundary_180529_1807.svg")
plt.show()
댓글남기기