2-18 Rosenblatt 퍼셉트론 데모용 Iris flower data set 파이선 데이타 입력 코드

in #kr5 years ago (edited)

뉴론에서 웨이팅은 상당히 복잡한 생명과학적 현상이다. 하지만 컴퓨터 상에서 구현하는 머신 러닝에서는 적절한 숫자 값을 찾아내는 과정으로서 이를 학습(trainning) 이라고도 한다.

Rosenblatt 의 학습 알고리듬

Rosenblatt 이 만들었던 퍼셉트론은 20X20 즉 400개에 달하는 포토센서가 사용되어 형상을 가지는 이미지를 충분히 읽어 들일 수 있다. 이 정도로 많은 포토셀 이나 픽셀을 쓰는 예 아니지만 훈민정음의 자음과 모음을 구분하는 3X3 이진분류(Binary Classification) 문제를 생각해 보자.

noname01.png

⓵ 자음이면 “+1”로 라벨을 부여하고 모음이면 “-1”로 라벨 값을 부여하자.
⓶ “ㄱ’ 자인 경우 3X3 픽셀을 3개씩 찢어서 한 줄로 이어 붙이면 하나의 랜덤한 입력 데이터 벡터가 생성이 된다. 이 기법은 MNIST 수기 숫자 인식 TensorFlow 코딩에서 흔하게 사용하는 기법임에 유의하자.
⓷ 바이아스 b를 하나 추가하고 입력 벡터의 각각 요소에 각각 랜덤 웨이트를 하나씩 곱하여 합(∑,시그마)을 구하도록 하자.

noname02.png

함수위에 씌운 ∧ 기호는 머신 러닝에서 학습과정에서의 산출 값으로 이미 알고 있는 라벨 값과 비교가 이루어져야 한다.

0이 아닌 랜덤 수를 사용하는 이유는 시냅스에서 웨이트 값이 모조리 0이라면 뉴론에 바이아스 값 b만 입력된다. 즉 무의미해지므로 TensorFlow든 Numpy든 random_normal() default를 사용하여 평균 값은 0 이겠지만 표준편차가 0.01로 아주 작으므로 생각보다 작은 랜덤 수가 설정이 된다. 반면에 random_uniform() 사용이 안되는 것은 아니지만 생각 보다 큰 랜덤 수가 설정되어 초기에 학습에 실패하는 경우가 왕왕 있을 수 있다.

⓸ 합산 결과가 양이면 +1 값을 부여한다. 이때에 라벨 값과 비교해 보면 “+1” 이므로 이 두 값이 같다는 것을 알 수 있다. 즉 에러가 0이 되었다는 것은 더 이상 랜덤 웨이트 값들을 업데이트 할 필요가 없으며 “ㄱ”자 학습이 되었다는 것을 뜻한다.
⓹학습의 범위는 주어진 데이터 세트 전체를 대상으로 해야 한다. 이 예제에서는 +1 이 되는 두 경우와 –1이 되는 두 경우를 만족 시킬 수 있도록 9개의 웨이트 값들이 결정되어야 한다.
Rosenblatt 의 퍼셉트론을 이용한 이진분류문제에서는 위와 같이 아주 간단하게 시그마 ∑를 계산하여 양인지 부인지만 판단하면 된다.
⓺ 타겟 라벨 값과 일치하지 않을 경우 즉 error 가 발생하는 경우인데 이때는 각각의 랜덤 웨이트 값들을 업데이트해야 한다. 다음과 같이 4가지 경우가 있다. 표에서 guess(predict) 값은 계산된 시그마 값을 대상으로 부호를 판정 후 +1 또는 –1 값을 부여한 결과를 의미한다.

noname03.png

⓻ error가 0이 아닌 경우에는 정확한 라벨 값에 도달할 수 있도록 웨이트 업데이트와 더불어 학습이 계속 이루어져야 한다. 다음과 같이 기존의 웨이트 값에 업데이트 되도록 learning rate를 곱해 코딩하도록 하자.

Rosenblatt 의 알고리듬에서는 learning rate 개념이 정확히 명시되어 있지 않지만 경험적으로 알고 있었다고 봐야 하며 대체로 0.0∼1.0 사이의 작은 값을 사용하도록 한다.

Rosenblatt 퍼셉트론의 대단한 점은 1950년대 당시 생체 뉴론에 대해서 퍼악했던 내용을 아주 간단하게 웨이팅하여 합(∑,시그마)을 계산 후 그 부호에 따라서 주어진 두 개의 라벨 값에 따른 이진 분류가 가능하도록 웨이트 업데이트 알고리듬을 짰다는 점으로서 생체 뉴론과 거의 비슷한 결과를 출력할 수 있었다는 점이다.

파이선 코드 셸 사전 실행 체크

지금까지 설명한 내용이 Rosenblatt 의 알고리듬이며 이를 바탕으로 파이선 코드화 해보기로 하지. 이미 N = 2 인 경우에 Binary Classification 문제 C/C++ 코드는 작성을 해보았으나 파이선 코딩을 미루었던 이유 중의 하나는 파이선 Class 코딩에서 자주 나타나는 다른 컴퓨터 언어에서는 볼 수 없었던 self 사용법에 익숙치 못했기 때문이었다. 파이선 클라스 선언 내의 파라메타들과 속성들은 클라스 내부에서 다시 설정하는 함수에서 self.∙∙∙ 형태로 불러 사용할 수 있으며 함수 자체도 self.∙∙∙형태로 불러 사용할 수 있다.

아울러 퍼셉트론의 머신 러닝 데모과정에서 가장 어려운 점이 알기쉬운(illustrative) 예제가 전혀 없다는 점일 것이다. 오로지 MNIST 와 Iris-flower 두 종류를 대상으로 한 예제만 있는데 여기 파이선 코딩에서는 150개로 구성되는 Iris-flower 데이터 세트를 활용하기로 한다.
Iris flower 는 setosa, versicolor, versinica 3종류로 각각 50개의 데이터 묶음으로 .csv 데이터로 구성되어 있으며 pandas 라이브러리 모듈에 의해 지원된다.
이 데이터를 아나콘더 스파이더 편집기 셸에서 조각 조각 실행할 수 있도록 데모를 진행해 보고 나중에는 파이선 코드화하여 한번에 실행하도록 코드를 작성하기로 한다.

아래에 기술되는 내용의 출처는 “Python Machine Learning”이며 저자는 Sebastian Raschka & Vahid Mirjalili 이다. 이 책은 주로 통계학 쪽으로 접근하는 머신 러닝 내용을 주로 담고 있으며 파이선 코드는 오픈 소스로 제공이 된다. 하지만 그 내용은 무신 소린지 알 수 없는 내용으로 점철되어 있어 절대 추천하기 어려운 원서이나 함께 제공되는 오픈 소스 코드는 꽤 쓸만해 보인다. 아마도 두 저자들이 오픈소스 수집(Collection)에 중독된 대가가 아닐까 상상해 보기도 한다.

아나콘다 스파이더 셸에서 numpy, pandas, matplotlib, ListColorMap을 import 하자. 이 라이브러리들은 윈도우즈10에서 아나콘다 설치 시에 default 로 설치된 라이브러리들이다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

다음의 pandas 명령을 셀에서 실행 시켜 책의 저자들이 어딘가 대학 서버에 저장해둔 데이터를 가져오면서 df.tail() 명령에 의해서 마지막 5줄의 데이터를 출력해 보자

df = pd.read_csv('https://archive.ics.uci.edu/ml/'
'machine-learning-databases/iris/iris.data', header=None)
df.tail()

가져온 데이터를 지금 현재 spyder 편집기에서 실행 중인 파일이 저장되어 있는 곳에 데이타를 저장 시켜 놓은 상태에서 다시 df.tail() 명령에 의해 마지막 5줄의 데이터를 출력해 보자.

df = pd.read_csv('iris.data', header=None)
df.tail()

#Plotting the Iris data: select setosa and versicolor
0에서 99번 row까지의 데이터 값을 출력해 보자. 셀에서 데이터 출력을 보려면 y = 부분이 없sms 상태에서 명령을 실행해야 한다. y = 부분이 있으면 셸 화면에 출력되는 내용이 없음에 유의하자.
y = df.iloc[0:100, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)

noname04.png

아울러 np.where() 명령은 y가 “Iris-setos’ 이면 –1 라벨 값을 부여하고 그렇치 않으면 +1 값을 부여한다.

noname05.png

0번에서 100개까지의 데이터 중에서 0번과 2번 컬럼 데이터를 출력해 보자.

extract sepal length and petal length

X = df.iloc[0:100, [0, 2]].values

noname06.png

불러들인 두 종류의 데이터들을 다음과 같이 plot 해 보자. 이 두 데이터는 나중에 파이선 코드에서 하나의 그래프로 처리하기로 한다.

noname07.png

다음에 퍼셉트론 클라스 코드를 연재할 계획이다.
#data_read_plot
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

## Training a perceptron model on the Iris dataset

### Reading-in the Iris data

df = pd.read_csv('https://archive.ics.uci.edu/ml/'
'machine-learning-databases/iris/iris.data', header=None)
df.tail()

df = pd.read_csv('iris.data', header=None)
df.tail()

### Plotting the Iris data

select setosa and versicolor

y = df.iloc[0:100, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)

extract sepal length and petal length

X = df.iloc[0:100, [0, 2]].values

plot data

plt.scatter(X[:50, 0], X[:50, 1],
color='red', marker='o', label='setosa')
plt.scatter(X[50:100, 0], X[50:100, 1],
color='blue', marker='x', label='versicolor')

plt.xlabel('sepal length [cm]')
plt.ylabel('petal length [cm]')
plt.legend(loc='upper left')

plt.savefig('images/02_06.png', dpi=300)

plt.show()

Sort:  

짱짱맨 호출에 응답하여 보팅하였습니다. 짱짱맨의 보팅현황은 보팅 자동화 서비스 스티머를 통해서 투명하게 공개됩니다.

https://steemer.app/jjm

편안한밤되세요~

감사합니다

Coin Marketplace

STEEM 0.35
TRX 0.12
JST 0.039
BTC 70310.43
ETH 3568.34
USDT 1.00
SBD 4.73