1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# -*- coding: utf-8 -*-
"""Day 13_Perceptron.ipynb
Automatically generated by Colaboratory.
Original file is located at
"""
 
from google.colab import drive
drive.mount('/gdrive')
 
PATH = "/gdrive/My Drive/Colab Notebooks/resources/"
 
# %matplotlib inline
 
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
import seaborn as sns
import time
 
 
from scipy.stats import norm, multivariate_normal
 
# installing packages for interactive graphs
import ipywidgets as widgets
from IPython.display import display
from ipywidgets import interact, interactive, fixed, interact_manual, IntSlider
 
@interact_manual( x =IntSlider(0,0,12) )
def test_model( x ):
    print(x)
 
## 데이터 로드
data = np.loadtxt(PATH + "perceptron_at_work/data_1.txt")
data.shape # 85, 3 => x좌표, y좌표, target
 
np.unique(data[:,-1:], return_counts = True)  #array([-1.,  1.]), array([60, 25])
 
target = data[:,-1:]
points = data[:,:-1]
 
n, d = points.shape
 
sns.scatterplot(x = points[:,0], y = points[:,1], hue = target[:,0],legend = None )
 
def my_perceptronModel(X, y):
    n, d = X.shape
    
    w = np.zeros((d,))
    b = 0
    
    MAX_STEP = 100
    count = 0
    done = False
    
    while not(done):
        done = True
        for i in range(n):
            if ( w.dot(X[i,:]) + b ) * y[i] <= 0:
                w = w + y[i] * X[i,:]
                b = b + y[i]
                done = False
 
        count += 1
        if count == MAX_STEP:
            print("count == MAX_STEP")
            done = True
 
    
    return w, b
 
w, b = my_perceptronModel(points, target)
 
= lambda x : w.dot(x) + b
 
line_y = np.array([f(points[i]) for i in range(len(points))])
line_x = points.copy()
 
plt.xlim(0,10)
plt.ylim(0,10)
 
 
grid_spacing = 0.05
 
## 가로 0~10 세로 0~10까지 0.05를 기준으로 모든 x 좌표값 , y 좌표값 생성
## xx1 은 200 x 200 매트릭스에서 x1 변수의 자리수. 즉 x좌표, 
## xx2 는 200 x 200 매트릭스에서 x2 변수의 자리수, 즉 y좌표 만을 가지고 있다.
 
xx1, xx2 = np.meshgrid(np.arange(010, grid_spacing), np.arange(010, grid_spacing))
 
## 그리드 내의 0.05 간격 모든 좌표값 200 x 200 요소를 가진 매트릭스의 각 좌표값을 가지고 있는 리스트가 된다.
grid = np.c_[ xx1.ravel(), xx2.ravel() ]
 
## 각 좌표에서 내가 구분한 값이 -1 인지 1인지를 담는 변수 Z
= np.array([ (( w.dot(pt) + b ) <= 0* 2 - 1 for pt in grid ])
 
## 40000개의 각 좌표값을 다시 200 x 200 행렬로 만들어 준다.
= Z.reshape(xx1.shape)
 
## x좌표를 담고있는 xx1과 y 좌표를 담고 있는 xx2, 각 좌표에 들어갈 값 Z 
plt.pcolormesh(xx1, xx2, Z, cmap=plt.cm.PRGn, vmin=-1, vmax=1)
sns.scatterplot(x = points[:,0], y = points[:,1], hue = target[:,0],legend = None )
 
## 매트릭스 각 요소의 0 좌표만을 가지고 있다.
xx1[:10,:10]
 
## 매트릭스 각 요소의 y 좌표만을 가지고 있다 
xx2[:10,:10]
 
 
 
cs


+ Recent posts