index ๋ฐ˜ํ™˜ ํ•จ์ˆ˜

argmin : ์ถ• ๋ณ„ ์ตœ์†Œ ๊ฐ’์˜ index ๋ฐ˜ํ™˜

argmax : ์ถ• ๋ณ„ ์ตœ๋Œ€ ๊ฐ’์˜ index ๋ฐ˜ํ™˜

unique : ์ค‘๋ณต ์ œ๊ฑฐ ๊ฒฐ๊ณผ index ๋ฐ˜ํ™˜

 

 

kNN classifier

kNN ๋ถ„๋ฅ˜๊ธฐ ํŠน์ง•

- ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋ฒ”์ฃผ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ๋ฒ”์ฃผ๋กœ ๋ถ„๋ฅ˜

- ๊ธฐ์กด ๋ฒ”์ฃผ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•จ

- ์‹๋ฃŒํ’ˆ(๊ณผ์ผ, ์ฑ„์†Œ, ๋‹จ๋ฐฑ์งˆ ๋“ฑ)

- ํ•™์Šตํ•˜์ง€ ์•Š์Œ : ๊ฒŒ์œผ๋ฅธ ํ•™์Šต

 

kNN classifier ์•Œ๊ณ ๋ฆฌ์ฆ˜

* X : ๊ธฐ์กด ๋ถ„๋ฅ˜์ง‘๋‹จ Y : ์ƒˆ๋กœ์šด ๋ถ„๋ฅ˜๋Œ€์ƒ

1. tensorflow Euclidean ๊ฑฐ๋ž˜ ๊ณ„์‚ฐ์‹

distance = tf.sqrt( tf.reduce_sum( tf.square(X-Y) ), axis=1))

 

2.์˜ค์ฐจ๊ฐ€ ์ตœ์†Œ์ธ index ๋ฐ˜ํ™˜ (Euclidean ๊ฑฐ๋ฆฌ๊ณ„์‚ฐ์‹)

pred = tf.arg_min(distance, 0)

 

 

Model & Activation function

ํšŒ๊ท€๋ถ„์„(๋น„์œจ์ฒ™๋„) : Identity function

๋ถ„๋ฅ˜๋ถ„์„(์ดํ•ญ๋ถ„๋ฅ˜) : Sigmoid function

๋ถ„๋ฅ˜๋ถ„์„(๋‹คํ•ญ๋ถ„๋ฅ˜) : Softmax function

 

Identity function : ํ•ญ๋“ฑํ•จ์ˆ˜[์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ์œผ๋กœ ํ™œ์„ฑํ™”]

Sigmoid function : 0~1 ์‚ฌ์ด ํ™•๋ฅ ๊ฐ’(Sigmoid ๊ณ„์—ด : tanh, ReLU ๋“ฑ)

Softmax function : 0~1 ์‚ฌ์ด ํ™•๋ฅ ๊ฐ’, ์ „์ฒดํ•ฉ=1

 

 

 

Tensorflow ์ฃผ์š” Model

*w → weight / b → bias

 

1. linear regression ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์ˆ˜์น˜ ์˜ˆ์ธก

model = tf.matmul(X, w) + b #y ์˜ˆ์ธก์น˜

 

2. sigmoid classification ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์ดํ•ญ ๋ถ„๋ฅ˜

model = tf.sigmoid(tf.matmul(X, w) + b) #y ์˜ˆ์ธก์น˜

 

3. softmax classification ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋‹คํ•ญ๋ถ„๋ฅ˜

model = tf.nn.softmax(tf.matmul(X, w) + b) #y ์˜ˆ์ธก์น˜

 

 

Linear Regression ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์ˆ˜์น˜ ์˜ˆ์ธก

Y = tf.placeholder(tf.float32) #y ์‹ค์ œ๊ฐ’

 

1. ํšŒ๊ท€๋ฐฉ์ •์‹ : ๊ธฐ๊ณ„ํ•™์Šต model y_pred = (X * w) + b #y ์˜ˆ์ธก์น˜

2. ์†์‹ค(๋น„์šฉ)ํ•จ์ˆ˜ : MSE Loss = tf.reduce_mean(tf.square(Y – y_pred)) #์†์‹ค๊ฐ’ ๋ฐ˜ํ™˜

3. ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• : ๋น„์šฉํ•จ์ˆ˜ ์ตœ์†Œํ™” -> w(๊ฐ€์ค‘์น˜), b(ํŽธํ–ฅ) ์ˆ˜์ • optimizer = tf.optimizers.Adam(lr=0.01)

 

 

Sigmoid classification ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์ดํ•ญ ๋ถ„๋ฅ˜

Y = tf.placeholder(tf.float32) #y ์‹ค์ œ๊ฐ’

 

1. ํšŒ๊ท€๋ฐฉ์ •์‹+ sigmoid ํ•จ์ˆ˜

y_pred = tf.matmul(X, w) + b #ํšŒ๊ท€๋ฐฉ์ •์‹

sig = tf.nn.sigmoid(y_pred) #y ์˜ˆ์ธก์น˜

 

2. ์†์‹ค(๋น„์šฉ)ํ•จ์ˆ˜ : Cross Entropy

loss = -tf.reduce_mean(Y*tf.math.log(sig)+(1-Y)*tf.math.log(1-sig))

 

3. ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋น„์šฉํ•จ์ˆ˜ ์ตœ์†Œํ™”

optimizer = tf.optimizers.Adam(lr=0.01)

 

 

Softmax classification ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋‹คํ•ญ๋ถ„๋ฅ˜

Y = tf.placeholder('float', [None, 10]) # y ์‹ค์ œ๊ฐ’

 

1. model = ํšŒ๊ท€๋ฐฉ์ •์‹+ softmax ํ•จ์ˆ˜

model = tf.matmul(X, w) + b #ํšŒ๊ท€๋ฐฉ์ •์‹

soft = tf.nn.softmax(model) #y ์˜ˆ์ธก์น˜

 

2. ์†์‹ค(๋น„์šฉ)ํ•จ์ˆ˜ : Cross Entropy

loss = -tf.reduce_mean(Y*tf.math.log(soft)+(1-Y)*tf.math.log(1- soft))

 

3. ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋น„์šฉํ•จ์ˆ˜ ์ตœ์†Œํ™”

optimizer = tf.optimizers.Adam(lr=0.01)

 

 

Cross Entropy

 Entropy Cross Entropy
๋ฌผ๋ฆฌํ•™ ์šฉ์–ด ํ†ต๊ณ„ํ•™ ์šฉ์–ด
ํ™•๋ฅ  ๋ณ€์ˆ˜ ๊ฐ„์˜ ๋ถˆํ™•์‹ค์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜์น˜ ๋‘ ํ™•๋ฅ ๋ณ€์ˆ˜ x, y์—์„œ
x๋ฅผ ๊ด€์ฐฐํ•œ ํ›„ y์— ๋Œ€ํ•œ ๋ถˆํ™•์‹ค์„ฑ์„ ์ค„์ธ๋‹ค.
์ด ๊ฐ’์ด ํด ์ˆ˜๋ก ์ผ์ •ํ•œ ๋ฐฉํ–ฅ์„ฑ๊ณผ ๊ทœ์น™์„ฑ์ด ์—†๋Š” ๋ฌด์งˆ์„œ (chaos) ๋”ฅ๋Ÿฌ๋‹ ๋ถ„๋ฅ˜๊ธฐ์—์„œ loss ๊ณ„์‚ฐ์‹ ์ด์šฉ
(์ •๋‹ต๊ณผ ์˜ˆ์ธก์น˜ ์˜ค์ฐจ ๊ณ„์‚ฐ)
์‹ = -sum(p * log(p)) ์‹ = -tf.reduce_mean(Y * log(y_pred) + (1-Y) * log(1-y_pred))

 

 

Sigmoid classification

์ดํ•ญ๋ถ„๋ฅ˜

logistic ํšŒ๊ท€๋ถ„์„์˜ ํŠน์ง•

๋ชฉ์  : ๋…๋ฆฝ ๋ณ€์ˆ˜๊ฐ€ [-∞,∞]์˜ ์–ด๋А ์ˆซ์ž์ด๋“  ์ƒ๊ด€ ์—†์ด ์ข…์† ๋ณ€์ˆ˜ ๊ฐ’์ด ํ•ญ์ƒ ๋ฒ”์œ„ [0,1] ์‚ฌ์ด์— ์žˆ๋„๋ก ํ•œ๋‹ค.

์„ ํ˜• ํšŒ๊ท€๋ถ„์„๊ณผ ์ฐจ์ด์  : ์ข…์†๋ณ€์ˆ˜ ๋ฒ”์ฃผํ˜•(binary) -> [0, 1] encoding

ANN, ๋”ฅ ๋Ÿฌ๋‹์˜ ์ค‘์š” ์ปดํฌ๋„ŒํŠธ

 

ํ™œ์šฉ๋ถ„์•ผ

1. ๋ฉ”์‹œ์ง€ ๋ถ„๋ฅ˜ → Spam(1)/ham(0)

2. ์ด๋ฏธ์ง€๋ฅผ ๋ณด๊ณ  ์ข…์–‘(tumor) ์ง„๋‹จ → ์•…์„ฑ(1)/์–‘์„ฑ(0)

3. ์ด์ „์˜ ์‹œ์žฅ ๋™ํ–ฅ์œผ๋กœ ํ•™์Šต → ์ฃผ์‹ ๋งค๋งค(1)/๋น„๋งค๋งค(0)

 

Sigmoid(Logistic) ํ™œ์„ฑํ•จ์ˆ˜ ์˜ˆ

 

Sigmoid classification ์•Œ๊ณ ๋ฆฌ์ฆ˜

Y = tf.placeholder(tf.float32) #y ์‹ค์ œ๊ฐ’

 

(1) model : ํšŒ๊ท€๋ฐฉ์ •์‹

model = tf.matmul(X, w) + b #-inf ~ + inf # sigmoid(model)

sig = tf.nn.sigmoid(model) # 0~1 ํ™•๋ฅ ๊ฐ’

 

(2) loss function : Entropy ์ด์šฉ = -sum(Y * log(model))

loss = -tf.reduce_mean(Y * tf.log(sig) + (1 - Y) * tf.log(1 - sig))

 

(3) ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋น„์šฉํ•จ์ˆ˜ ์ตœ์†Œํ™”

optimizer = tf.optimizers.Adam (0.1)

 

 

Softmax Classification

๋‹คํ•ญ ๋ถ„๋ฅ˜(multi-classification)

์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ์ด๋ฏธ ์ •์˜๋œ ๋ช‡ ๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฌธ์ œ

์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ๊ฐ ๋ฐ์ดํ„ฐ์˜ ํด๋ž˜์Šค ๋ผ๋ฒจ์ด ํ•จ๊ป˜ ์ œ๊ณต -> {xi, y(xi)}

y๋ณ€์ˆ˜์˜ label์— ๋”ฐ๋ผ์„œ ํ™œ์„ฑํ•จ์ˆ˜ ์ ์šฉ(์ดํ•ญ๋ถ„๋ฅ˜, ๋‹คํ•ญ๋ถ„๋ฅ˜)

 

Softmax ํ™œ์„ฑํ•จ์ˆ˜ ์˜ˆ

Y1 : 0.09003057  (9%)

Y2 : 0.24472847 (24%)

Y3: 0.66524096 (67% -> ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’๋‹ค)

 

๋‹คํ•ญ๋ถ„๋ฅ˜ ์˜ˆ

ํ„ธ๊ณผ ๋‚ ๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€์— ๋”ฐ๋ผ, ํฌ์œ ๋ฅ˜, ์กฐ๋ฅ˜, ๊ธฐํƒ€๋กœ ๋ถ„๋ฅ˜ํ•˜๋Š” ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ

import tensorflow as tf
import numpy as np

#[ํ„ธ, ๋‚ ๊ฐœ]
x_data = np.array(
[[0, 0], [1, 0], [1, 1], [0, 0], [0, 1], [1, 1]])

#[๊ธฐํƒ€, ํฌ์œ ๋ฅ˜, ์กฐ๋ฅ˜]
y_data = np.array([
[1, 0, 0], # ๊ธฐํƒ€
[0, 1, 0], # ํฌ์œ ๋ฅ˜
[0, 0, 1], # ์กฐ๋ฅ˜
[1, 0, 0],
[1, 0, 0],
[0, 0, 1] ])

* one hot encoding : ์ „์ฒด ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ ์ค‘ ํ•˜๋‚˜๋งŒ 1์ด๊ณ , ๋‚˜๋จธ์ง€๋Š” 0์ธ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹ โ‰’ dummy๋Š” n-1๊ฐœ๋กœ ๋ณ€์ˆ˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์„ค์ •

 

softmax classification ์•Œ๊ณ ๋ฆฌ์ฆ˜

Y = tf.placeholder('float', [None, 10]) # y ์‹ค์ œ๊ฐ’

(1) ํšŒ๊ท€๋ฐฉ์ •์‹ : ์˜ˆ์ธก์น˜
model = tf.matmul(X, w) + b # ํšŒ๊ท€๋ชจ๋ธ

softmax(์˜ˆ์ธก์น˜)
soft = tf.nn.softmax(model) # 0~1 ํ™•๋ฅ ๊ฐ’(์ „์ฒด ํ•ฉ=1)

(2) loss function : Entropy ์ด์šฉ : -sum(Y * log(model)) 
loss = -tf.reduce_mean(Y * tf.log(soft) + (1 - Y) * tf.log(1 - soft))

(3) ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋น„์šฉํ•จ์ˆ˜ ์ตœ์†Œํ™”
optimizer = tf.optimizers.Adam (0.1)

 

 

Tensorflow ๋‹คํ•ญ๋ถ„๋ฅ˜ model

x_data = np.array( [[0, 0], [1, 0], [1, 1], [0, 0], [0, 1], [1, 1]])
y_data = np.array([ [1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 0], [1, 0, 0], [0, 0, 1]])

X = tf.placeholder(tf.float32, [None, 2])
Y = tf.placeholder(tf.float32, [None, 3])

w = tf.Variable(tf.random_normal([2, 3])) # (2, 3)
b = tf.Variable(tf.zeros([3])) # (3)


model = tf.matmul(X, w) + b
# (None, 3)
[[ 0.74250543 -1.18412077 -0.74753278]
[ 0.10888183 -0.62678969 -0.88903713]
[ 0.486274 -1.19238925 -1.20663118]
...

softmax = tf.nn.softmax(model)
# (None, 3)
[[ 0.72939312 0.10622789 0.164379 ]
[ 0.54117554 0.25932243 0.19950208]
[ 0.72960341 0.13616098 0.13423553]
...

* ํ–‰์˜ ํ•ฉ = 1

 

 

 

 

 

index ๋ฆฌํ„ด 

1. argmin/argmax
- ์ตœ์†Œ/์ตœ๋Œ€ ๊ฐ’์˜ index ๋ฐ˜ํ™˜ 
tf.arg_min -> tf.arg_min


2. unique
- ์ค‘๋ณต์ œ๊ฑฐ 

import tensorflow as tf #ver2.3



1. argmin/argmax

a = tf.constant([5,2,1,4,3], dtype=tf.int32)
b = tf.constant([4,5,1,3,2])
c = tf.constant([[5,4,2], [3,2,4]]) #2์ฐจ์› 
print(c)
'''
[[5 4 2]
 [3 2 4]]
'''


dimension : reduce ์ฐจ์›(vector = 0) 

min_index = tf.argmin(a, 0) #1์ฐจ์› ๋Œ€์ƒ 
max_index = tf.argmax(b, 0) #1์ฐจ์› ๋Œ€์ƒ 
print(tf.argsort(a, 0)) #[2 1 4 3 0]

max_index2 = tf.argmax(c, 1) #2์ฐจ์› ๋Œ€์ƒ
min_index2 = tf.argmin(c, 1) #2์ฐจ์› ๋Œ€์ƒ

print(min_index.numpy()) #2
print(max_index.numpy()) #1
print(max_index2.numpy()) #[0 2] - [1ํ–‰, 2ํ–‰]
print(min_index2.numpy()) #[2 1] - [1ํ–‰, 2ํ–‰]

 



2. unique

c = tf.constant(['a','b','a','c','b', 'c'])

cstr, cidx = tf.unique(c)
print(cstr.numpy()) #['a' 'b' 'c']
print(cidx.numpy()) #[0 1 0 2 1 2]

 

 

 

 

 

KNN(K-Nearest Neighbor) ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ํ•™์Šต๊ณผ์ • ์—†์Œ 
- Euclidean ๊ฑฐ๋ฆฌ๊ณ„์‚ฐ์‹

import numpy as np
import tensorflow as tf


x : ๋ถ„๋ฅ˜์ง‘๋‹จ 

p1 = [1.2, 1.1] 
p2 = [1.0, 1.0]
p3 = [1.8, 0.8]
p4 = [2, 0.9]

x_data = np.array([p1, p2, p3, p4]) #์•Œ๋ ค์ง„ ๋ฒ”์ฃผ 
label = ['A','A','B','B'] #๋ถ„๋ฅ˜๋ฒ”์ฃผ(Y๋ณ€์ˆ˜)
y_data = [1.6, 0.85] #y : ๋ถ„๋ฅ˜๋Œ€์ƒ


x,y ๋ณ€์ˆ˜ ์„ ์–ธ : tensor ์ƒ์„ฑ 

X = tf.constant(x_data, tf.float32) #์•Œ๋ ค์ง„ ์ง‘๋‹จ 
Y = tf.constant(y_data, tf.float32) #์•Œ๋ ค์ง€์ง€ ์•Š์€ ์ง‘๋‹จ(๋ถ„๋ฅ˜๋Œ€์ƒ)


Euclidean ๊ฑฐ๋ฆฌ๊ณ„์‚ฐ์‹ 

distance = tf.math.sqrt(tf.math.reduce_sum(tf.math.square(X-Y),axis=1))
'''
๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ์—ฐ์‚ฐ : sqrt( sum( (x-y)^2 ) )
distance : ๊ฑฐ๋ฆฌ๊ณ„์‚ฐ ๊ฒฐ๊ณผ 4๊ฐœ ์›์†Œ๋ฅผ ๊ฐ–๋Š” vector 
'''
print(distance) #[0.47169903 0.61846584 0.20615523 0.40311286]


๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ index ๋ฐ˜ํ™˜ 

idx = tf.argmin(distance, 0) #input, dimension

print('๋ถ„๋ฅ˜ index :', idx.numpy())   
print('๋ถ„๋ฅ˜๊ฒฐ๊ณผ  : ', label[idx]) #๋ถ„๋ฅ˜๊ฒฐ๊ณผ  :  B

 

 

 

 

 

CrossEntropy

- ๋‘ ํ™•๋ฅ ๋ณ€์ˆ˜ x, y์—์„œ x๋ฅผ ๊ด€์ฐฐํ•œ ํ›„ y์— ๋Œ€ํ•œ ๋ถˆํ™•์‹ค์„ฑ ์ธก์ •
- ๋”ฅ๋Ÿฌ๋‹ ๋ถ„๋ฅ˜๊ธฐ : ์ •๋‹ต(Y) VS ์˜ˆ์ธก์น˜(y_pred)
-> ์ •๋‹ต(Y)๋ฅผ ๊ด€์ฐฐํ•œ ํ›„ ์˜ˆ์ธก์น˜์˜ ์†์‹ค(loss) ๊ณ„์‚ฐ
* Cross์˜๋ฏธ : Y = 1, Y = 0์ผ ๋•Œ ์„œ๋กœ ๊ต์ฐจํ•˜์—ฌ ์†์‹ค(loss) ๊ณ„์‚ฐ 
- loss : -(Y * log*(y_pred) + (1-Y) * log(1-y_pred))

์™ผ์ชฝ ์‹ : Y * log*(y_pred) -> Y = 1์ผ ๋•Œ ์†์‹ค๊ฐ’
์˜ค๋ฅธ์ชฝ ์‹ : (1-Y) * log(1-y_pred)) -> Y = 0์ผ ๋•Œ ์†์‹ค๊ฐ’

import tensorflow as tf



model_pred = [0.02, 0.98] #model ์˜ˆ์ธก์น˜

Y = 1 #์ •๋‹ต
for y_pred in model_pred :
    loss_val = -(Y * tf.math.log(y_pred)) #-๋„ฃ์Œ์œผ๋กœ์จ +๋กœ ์ถœ๋ ฅ๋˜๊ฒŒ๋” (logํ•จ์ˆ˜ ํŠธ์„ฑ)
    print(loss_val.numpy())
'''
3.912023    -> 1 vs 0.02 : ์†์‹ค๊ฐ’ ์ปค์ง
0.020202687 -> 1 vs 0.98 : ์†์‹ค๊ฐ’ ์ž‘์Œ
'''

Y = 0 #์ •๋‹ต
for y_pred in model_pred :
    loss_val = -((1-Y) * tf.math.log(1-y_pred)) #-๋„ฃ์Œ์œผ๋กœ์จ +๋กœ ์ถœ๋ ฅ๋˜๊ฒŒ๋” (logํ•จ์ˆ˜ ํŠธ์„ฑ)
    print(loss_val.numpy())
'''
0.020202687 -> 0 vs 0.02  : ์†์‹ค๊ฐ’ ์ž‘์Œ
3.912023    -> 0 vs 0.98 : ์†์‹ค๊ฐ’ ์ปค์ง
'''

 

Cross Entropy(Y=1 and Y=0)์— ์˜ํ•œ ์†์‹ค ๊ณ„์‚ฐ ์ˆ˜

Y = 1 #์ •๋‹ต (Y=1 and Y=0)
for y_pred in model_pred :
    loss_val = -tf.reduce_mean(Y * tf.math.log(y_pred) +(1-Y) * tf.math.log(1-y_pred))
    print(loss_val.numpy())
'''
Y = 0์ผ ๋•Œ
0.020202687
3.912023

Y = 1์ผ ๋•Œ
3.912023
0.020202687
'''

 

 

 

 

 

 

sigmoid classifier

- ์ดํ•ญ๋ถ„๋ฅ˜๊ธฐ

ํ™œ์„ฑํ•จ์ˆ˜ : Sigmoidํ•จ์ˆ˜ - ์ดํ•ญ๋ถ„๋ฅ˜
์†์‹คํ•จ์ˆ˜ : Cross Entropy ํ•จ์ˆ˜ - ์†์‹ค๊ฐ’ ๋ฐ˜ํ™˜

import tensorflow as tf
from sklearn.metrics import accuracy_score #ํ‰๊ฐ€๋„๊ตฌ



1. x, y ๊ณต๊ธ‰ data 

#x๋ณ€์ˆ˜ : [hours, video]
x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]] #[6,2]

#y๋ณ€์ˆ˜ : binary data (fail or pass)
y_data = [[0], [0], [0], [1], [1], [1]] #์ดํ•ญ๋ถ„๋ฅ˜



2. X, y๋ณ€์ˆ˜ ์ •์˜ : type์ผ์น˜ - float32

X = tf.constant(value=x_data, dtype=tf.float32) #[๊ด€์ธก์น˜, ์ž…๋ ฅ์ˆ˜]
y = tf.constant(value=y_data, dtype=tf.float32) #[๊ด€์ธก์น˜, ์ถœ๋ ฅ์ˆ˜]



3. w, b๋ณ€์ˆ˜ ์ •์˜ : ์ดˆ๊ธฐ๊ฐ’(๋‚œ์ˆ˜) -> update๋Œ€์ƒ

w = tf.Variable(tf.random.normal(shape=[2, 1])) #[์ž…๋ ฅ์ˆ˜, ์ถœ๋ ฅ์ˆ˜]
b = tf.Variable(tf.random.normal(shape=[1])) #[์ถœ๋ ฅ์ˆ˜]



4. sigmoid(ํšŒ๊ท€๋ชจ๋ธ) ํ•จ์ˆ˜ : y ์˜ˆ์ธก์น˜ ๋ฐ˜ํ™˜ 

def sig_fun(X) : 
    model = tf.linalg.matmul(X, w) + b  #ํšŒ๊ท€๋ฐฉ์ •์‹
    y_pred = tf.nn.sigmoid(model)  #sigmoid(model)
    return y_pred #0~1 ํ™•๋ฅ ๊ฐ’



5. ์†์‹ค/๋น„์šฉ ํ•จ์ˆ˜(loss/cost function) : ์†์‹ค๊ฐ’(Cross Entropy) ๋ฐ˜ํ™˜ 

def loss_fn() : # ์ธ์ˆ˜ ์—†์Œ 
    y_pred = sig_fun(X) # y ์˜ˆ์ธก์น˜    
    #Cross Entropy 
    loss = -tf.reduce_mean(y*tf.math.log(y_pred) + (1-y)*tf.math.log(1-y_pred))    
    return loss



6. ์ตœ์ ํ™” ๊ฐ์ฒด ์ƒ์„ฑ 

opt = tf.optimizers.Adam(learning_rate=0.5) #ํ•™์Šต๋ฅ 



7. ๋ฐ˜๋ณตํ•™์Šต   

for step in range(100) : 
    opt.minimize(loss=loss_fn, var_list=[w, b])
    
    #10๋ฐฐ์ˆ˜ ๋‹จ์œ„ ์ถœ๋ ฅ 
    if (step+1) % 10 == 0 :
        print('step =', (step+1), ', loss value=',loss_fn().numpy())


        
8. ์ตœ์ ํ™”๋œ model ๊ฒ€์ฆ 

y_pred = sig_fun(X) 
print(y_pred.numpy()) #ํ™•๋ฅ ๊ฐ’ ์˜ˆ์ธก์น˜


cut-off=0.5 : T/F -> 1.0/0.0

y_pred = tf.cast(sig_fun(X).numpy() > 0.5, dtype=tf.float32)
y_pred #class ์˜ˆ์ธก์น˜

  
model ํ‰๊ฐ€ 

acc = accuracy_score(y, y_pred)
print('accuracy =',acc) #accuracy = 1.0

 

 

 

 

 

sigmoid classifier iris

dataset : iris 
ํ™œ์„ฑํ•จ์ˆ˜ : Sigmoidํ•จ์ˆ˜ - ์ดํ•ญ๋ถ„๋ฅ˜ 
์†์‹คํ•จ์ˆ˜ : Cross Entropyํ•จ์ˆ˜ -> ์†์‹ค๊ฐ’ 

import tensorflow as tf 
from sklearn.metrics import accuracy_score, confusion_matrix #model ํ‰๊ฐ€ 
from sklearn.datasets import load_iris #datase 
from sklearn.preprocessing import minmax_scale #X๋ณ€์ˆ˜ ์ •๊ทœํ™”



1. [์ˆ˜์ •] x, y ๊ณต๊ธ‰ data 

X, y = load_iris(return_X_y=True)


x๋ณ€์ˆ˜ : 100๊ฐœ ๊ด€์ธก์น˜ 

x_data = X[:100]
x_data.shape #(100, 4)


x๋ณ€์ˆ˜ ์ •๊ทœํ™”(0~1)

x_data = minmax_scale(x_data)


y๋ณ€์ˆ˜ : 100๊ฐœ ๊ด€์ธก์น˜ 

y_data = y[:100]


y๋ณ€์ˆ˜ : 1d -> 2d

y_data = y_data.reshape(100, 1) 
y_data.shape #(100, 1)




2.  X, y๋ณ€์ˆ˜ ์ •์˜ : type ์ผ์น˜ - float32

X = tf.constant(value=x_data, dtype=tf.float32) #[๊ด€์ธก์น˜,์ž…๋ ฅ์ˆ˜]
y = tf.constant(value=y_data, dtype=tf.float32) #[๊ด€์ธก์น˜,์ถœ๋ ฅ์ˆ˜]




3. w, b๋ณ€์ˆ˜ ์ •์˜ : ์ดˆ๊ธฐ๊ฐ’(๋‚œ์ˆ˜) -> update

w = tf.Variable(tf.random.normal(shape=[4, 1])) #[์ˆ˜์ •] : [์ž…๋ ฅ์ˆ˜,์ถœ๋ ฅ์ˆ˜]
b = tf.Variable(tf.random.normal(shape=[1])) #[์ถœ๋ ฅ์ˆ˜]




4. sigmoid(ํšŒ๊ท€๋ชจ๋ธ) ํ•จ์ˆ˜ : y ์˜ˆ์ธก์น˜ ๋ฐ˜ํ™˜ 

def sig_fun(X) : 
    model = tf.linalg.matmul(X, w) + b  #ํšŒ๊ท€๋ฐฉ์ •์‹
    y_pred = tf.nn.sigmoid(model)  #sigmoid(model)
    return y_pred #0~1 ํ™•๋ฅ ๊ฐ’



5. ์†์‹ค/๋น„์šฉ ํ•จ์ˆ˜(loss/cost function) : ์†์‹ค๊ฐ’(Cross Entropy) ๋ฐ˜ํ™˜ 

def loss_fn() : # ์ธ์ˆ˜ ์—†์Œ 
    y_pred = sig_fun(X) #y ์˜ˆ์ธก์น˜    
    # Cross Entropy 
    loss = -tf.reduce_mean(y*tf.math.log(y_pred) + (1-y)*tf.math.log(1-y_pred))    
    return loss

 



6. ์ตœ์ ํ™” ๊ฐ์ฒด ์ƒ์„ฑ 

opt = tf.optimizers.Adam(learning_rate=0.1) #ํ•™์Šต๋ฅ 

 



7. ๋ฐ˜๋ณตํ•™์Šต   

for step in range(500) : 
    opt.minimize(loss=loss_fn, var_list=[w, b])
    
    #10๋ฐฐ์ˆ˜ ๋‹จ์œ„ ์ถœ๋ ฅ 
    if (step+1) % 10 == 0 :
        print('step =', (step+1), ', loss value=',loss_fn().numpy())


        

8. ์ตœ์ ํ™”๋œ model ๊ฒ€์ฆ 

y_pred = sig_fun(X) 
print(y_pred.numpy()) #ํ™•๋ฅ ๊ฐ’ ์˜ˆ์ธก์น˜


cut-off=0.5 : T/F -> 1.0/0.0

y_pred = tf.cast(sig_fun(X).numpy() > 0.5, dtype=tf.float32)
y_pred #class ์˜ˆ์ธก์น˜


model ํ‰๊ฐ€ 

acc = accuracy_score(y, y_pred)
print('accuracy =',acc) #accuracy = 1.0


ํ˜ผ๋™ํ–‰๋ ฌ

con = confusion_matrix(y, y_pred)
print(con)

 

 

 

 

 

softmax classifier

- ๋‹คํ•ญ๋ถ„๋ฅ˜๊ธฐ
ํ™œ์„ฑํ•จ์ˆ˜ : softmaxํ•จ์ˆ˜
์†์‹คํ•จ์ˆ˜ : cross entropyํ•จ์ˆ˜
y_data : one hot encodig


import tensorflow as tf
from sklearn.metrics import accuracy_score #modelํ‰๊ฐ€
import numpy as np



1. x, y ๊ณต๊ธ‰ data 
[ํ„ธ, ๋‚ ๊ฐœ]

x_data = np.array(
    [[0, 0], [1, 0], [1, 1], [0, 0], [0, 1], [1, 1]]) #[6, 2] -> ๊ด€์ธก์น˜ 6๊ฐœ, ์ž…๋ ฅ๋ณ€์ˆ˜ 2๊ฐœ

 

[๊ธฐํƒ€, ํฌ์œ ๋ฅ˜, ์กฐ๋ฅ˜] : [6, 3] 

y_data = np.array([ #one hot encoding
    [1, 0, 0],  #๊ธฐํƒ€[0] -> ํ„ธ๊ณผ ๋‚ ๊ฐœ๊ฐ€ ๋ชจ๋‘ ์—†์Œ
    [0, 1, 0],  #ํฌ์œ ๋ฅ˜[1] -> ํ„ธ์€ ์žˆ๋Š”๋ฐ ๋‚ ๊ฐœ๊ฐ€ ์—†์Œ
    [0, 0, 1],  #์กฐ๋ฅ˜[2] -> ํ„ธ๊ณผ ๋‚ ๊ฐœ๊ฐ€ ๋ชจ๋‘ ์กด์žฌ
    [1, 0, 0],
    [1, 0, 0],
    [0, 0, 1]
]) #y๊ฐœ์ˆ˜๊ฐ€ 3๊ฐœ


* one hot encoding VS dummy
๊ณตํ†ต์  : encoding(2์ง„์ˆ˜๋กœ ๋ณ€ํ™˜)
์ฐจ์ด์  : one-hot์€ ๋ณ€์ˆ˜size = class์ˆ˜, dummy๋Š” ๋ณ€์ˆ˜size = class-1

x_data.shape #(6, 2) - (๊ด€์ธก์น˜, ์ž…๋ ฅ์ˆ˜)
y_data.shape #(6, 3) - (๊ด€์ธก์น˜, ์ถœ๋ ฅ์ˆ˜)




2. X, y๋ณ€์ˆ˜ ์ •์˜ : type float32๋กœ ์ผ์น˜์‹œํ‚ค๊ธฐ

X = tf.constant(x_data, dtype=tf.float32)
y = tf.constant(y_data, dtype=tf.float32)




3. w, b๋ณ€์ˆ˜ ์ •์˜ : ์ดˆ๊ธฐ๊ฐ’(๋‚œ์ˆ˜) -> update

w = tf.Variable(tf.random.normal([2, 3])) #[์ž…๋ ฅ์ˆ˜, ์ถœ๋ ฅ์ˆ˜] -> ์ด 6๊ฐœ์˜ w๊ฐ€ ์ƒ์„ฑ๋จ
b = tf.Variable(tf.random.normal([3])) #[์ถœ๋ ฅ์ˆ˜]




4. softmax(ํšŒ๊ท€๋ชจ๋ธ) ํ•จ์ˆ˜ : y ์˜ˆ์ธก์น˜ ๋ฐ˜ํ™˜ 

def soft_fn(X) : 
    model = tf.linalg.matmul(X, w) + b  #ํšŒ๊ท€๋ฐฉ์ •์‹
    y_pred = tf.nn.softmax(model)  #softmax(model)
    return y_pred #0~1 ํ™•๋ฅ ๊ฐ’




5. ์†์‹ค/๋น„์šฉ ํ•จ์ˆ˜(loss/cost function) : ์†์‹ค๊ฐ’(Cross Entropy) ๋ฐ˜ํ™˜ 

def loss_fn() : # ์ธ์ˆ˜ ์—†์Œ 
    y_pred = soft_fn(X) #y ์˜ˆ์ธก์น˜    
    # Cross Entropy 
    loss = -tf.reduce_mean(y*tf.math.log(y_pred) + (1-y)*tf.math.log(1-y_pred))    
    return loss

 



6. ์ตœ์ ํ™” ๊ฐ์ฒด ์ƒ์„ฑ 

opt = tf.optimizers.Adam(learning_rate=0.1) #ํ•™์Šต๋ฅ 




7. ๋ฐ˜๋ณตํ•™์Šต   

for step in range(100) : 
    opt.minimize(loss=loss_fn, var_list=[w, b])
    
    #10๋ฐฐ์ˆ˜ ๋‹จ์œ„ ์ถœ๋ ฅ 
    if (step+1) % 10 == 0 :
        print('step =', (step+1), ', loss value=',loss_fn().numpy())

step = 10 , loss value= 0.2945415
step = 100 , loss value= 0.014622948   
      

        
8. ์ตœ์ ํ™”๋œ model ๊ฒ€์ฆ

y_pred = soft_fn(X).numpy()
print(y_pred)

[[9.88110900e-01 9.25376546e-03 2.63541052e-03] -> 1๋ฒˆ ๊ด€์ธก์น˜ ์˜ˆ์ธก์น˜ (97%, 0.15%, 0.4%)
 [3.77652748e-03 9.63190913e-01 3.30325998e-02]
 [1.07707642e-02 1.05104195e-02 9.78718817e-01]
 [9.88110900e-01 9.25376546e-03 2.63541052e-03]
 [9.73005116e-01 3.48643771e-05 2.69599613e-02]
 [1.07707642e-02 1.05104195e-02 9.78718817e-01]] -> 6๋ฒˆ ๊ด€์ธก์น˜ ์˜ˆ์ธก์น˜

print(y_pred.shape) #(6, 3)
y_pred.sum(axis=1) #ํ–‰ ๋‹จ์œ„ ํ•ฉ๊ณ„. 'axis=0' : ์—ด ๋‹จ์œ„
#[1., 1., 1., 1., 1., 1.]


y : one-hot-encoding(2์ง„์ˆ˜) vs y_pred : prob
* y, y_pred -> 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ (=class ๋ณ€ํ™˜)

y_pred = tf.argmax(y_pred, axis=1) #๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ์„ ์ƒ‰์ธ์œผ๋กœ ๋ฐ˜ํ™˜
y_true = tf.argmax(y, axis=1)

acc = accuracy_score(y_true, y_pred)
print('accuracy = ', acc) #accuracy =  1.0 -> 100% ์ผ์น˜

print(y_pred) #[0 1 2 0 0 2]
print(y_true) #[0 1 2 0 0 2]

 

 

 

 

 

softmax classifier iris

- ๋‹คํ•ญ๋ถ„๋ฅ˜๊ธฐ
dataset : iris
ํ™œ์„ฑํ•จ์ˆ˜ : softmaxํ•จ์ˆ˜
์†์‹คํ•จ์ˆ˜ : cross entropyํ•จ์ˆ˜
y_data : one hot encodig

import tensorflow as tf
from sklearn.datasets import load_iris #datset load
from sklearn.preprocessing import minmax_scale #x๋ณ€์ˆ˜ ์ •๊ทœํ™”
from sklearn.preprocessing import OneHotEncoder #y๋ณ€์ˆ˜ 2์ง„์ˆ˜ ์ธ์ฝ”๋”ฉ
from sklearn.metrics import accuracy_score #modelํ‰๊ฐ€



1. x, y ๊ณต๊ธ‰ data

X, y = load_iris(return_X_y=True)
y #0~2์˜ 3๊ฐ€์ง€ ํด๋ž˜์Šค(๊ฝƒ์˜ ์ข…)๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ

x_data = X
y_data = y

x_data.shape #(150, 4) - (๊ด€์ธก์น˜, ์ž…๋ ฅ์ˆ˜)
y_data.shape #(150,) - (๊ด€์ธก์น˜, ์ถœ๋ ฅ์ˆ˜)


๋ณ€์ˆ˜ ์ „์ฒ˜๋ฆฌ

x_data = minmax_scale(x_data) #x๋ณ€์ˆ˜ ์ •๊ทœํ™”


1d, 10์ง„์ˆ˜ -> 2d, 2์ง„์ˆ˜

obj = OneHotEncoder()
y_data = obj.fit_transform(y_data.reshape(150, 1)).toarray() #์ธ์ฝ”๋”ฉ, 2์ฐจ์›์œผ๋กœ ๋ณ€๊ฒฝ, array๋กœ ๋ณ€๊ฒฝ
print(y_data)

[[1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]...
-> class๋ณ„๋กœ 1(=๊ฝƒ์˜ ์ข…)์˜ ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

 


2. X, y๋ณ€์ˆ˜ ์ •์˜ : type float32๋กœ ์ผ์น˜์‹œํ‚ค๊ธฐ

X = tf.constant(x_data, dtype=tf.float32)
y = tf.constant(y_data, dtype=tf.float32)




3. w, b๋ณ€์ˆ˜ ์ •์˜ : ์ดˆ๊ธฐ๊ฐ’(๋‚œ์ˆ˜) -> update

x_data.shape #(150, 4) : ์ž…๋ ฅ์ˆ˜ 4๊ฐœ
y_data.shape #(150, 3) : ์ถœ๋ ฅ์ˆ˜ 3๊ฐœ

w = tf.Variable(tf.random.normal([4, 3])) #[์ž…๋ ฅ์ˆ˜, ์ถœ๋ ฅ์ˆ˜]
b = tf.Variable(tf.random.normal([3])) #[์ถœ๋ ฅ์ˆ˜]




4. softmax(ํšŒ๊ท€๋ชจ๋ธ) ํ•จ์ˆ˜ : y ์˜ˆ์ธก์น˜ ๋ฐ˜ํ™˜ 

def soft_fn(X) : 
    model = tf.linalg.matmul(X, w) + b  #ํšŒ๊ท€๋ฐฉ์ •์‹
    y_pred = tf.nn.softmax(model)  #softmax(model)
    return y_pred #0~1 ํ™•๋ฅ ๊ฐ’




5. ์†์‹ค/๋น„์šฉ ํ•จ์ˆ˜(loss/cost function) : ์†์‹ค๊ฐ’(Cross Entropy) ๋ฐ˜ํ™˜ 

def loss_fn() : # ์ธ์ˆ˜ ์—†์Œ 
    y_pred = soft_fn(X) #y ์˜ˆ์ธก์น˜    
    # Cross Entropy 
    loss = -tf.reduce_mean(y*tf.math.log(y_pred) + (1-y)*tf.math.log(1-y_pred))    
    return loss




6. ์ตœ์ ํ™” ๊ฐ์ฒด ์ƒ์„ฑ 

opt = tf.optimizers.Adam(learning_rate=0.1) #learning_rate : ํ•™์Šต๋ฅ 

 



7. ๋ฐ˜๋ณตํ•™์Šต   

for step in range(100) : 
    opt.minimize(loss=loss_fn, var_list=[w, b])
    
    #10๋ฐฐ์ˆ˜ ๋‹จ์œ„ ์ถœ๋ ฅ 
    if (step+1) % 10 == 0 :
        print('step =', (step+1), ', loss value=',loss_fn().numpy())

step = 10 , loss value= 0.2945415
step = 100 , loss value= 0.014622948   
          
         

8. ์ตœ์ ํ™”๋œ model ๊ฒ€์ฆ

y_pred = soft_fn(X).numpy()

print(y_pred) : ์˜ˆ์ธกํ•œ ํ™•๋ฅ ๊ฐ’

y : one-hot-encoding(2์ง„์ˆ˜) vs y_pred : prob
* y, y_pred -> 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ (=class ๋ณ€ํ™˜)

y_pred = tf.argmax(y_pred, axis=1) #๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ์„ ์ƒ‰์ธ์œผ๋กœ ๋ฐ˜ํ™˜
y_true = tf.argmax(y, axis=1)

acc = accuracy_score(y_true, y_pred)
print('accuracy = ', acc) #accuracy =  0.96 -> data์˜ ๋ณต์žก๋„๊ฐ€ ๋†’์•„์ง€๋ฉด์„œ ์˜ˆ์ธก๋„๊ฐ€ ๋–จ์–ด์กŒ์ง€๋งŒ, ์ƒ๋‹นํžˆ ๋†’์€ ์ˆ˜์ค€์˜ ์˜ˆ์ธก๋ฅ 

print(y_pred) 
print(y_true)

 

+ Recent posts