Quiet Time


■ 7장 신경망과 서포트 벡터 머신
  • 머신러닝의 3가지 종류
    • 1.지도학습 : 
          -분류: knn, 나이브 베이즈, 결정트리
          -회귀: 선형회귀, 신경망, 서포트 벡터 머신
          2.비지도학습: k-means
          3.강화학습: 핑퐁, 틱텍토

■ 7장 신경망 목차
     1.신경망에 대한 이해
     2.신경망 구조
     3.신경망 실습 
          - 콘크리트 data
          - 보스톤 하우징 data
          - 무성이 발표 data ( 화력발전 데이터, 페이스북 데이터 ) 
     4.서포트 벡터 머신의 이해 
     5.서포트 벡터 머신 실습 
          - 필기체를 컴퓨터가 인식할수 있게 학습 
          - ?
          
■ 1. 신경망에 대한 이해 
          학습 데이터 
               ↓
          학습 규칙 --> 학습 데이터에서 모델을 찾아내는 기법 (신경망) 
               ↓     
     입력 데이터 --->       신경망   --->     결과
 (시멘트,물,강화제, ...)                   콘크리트 강도 
  다음 거리뷰(사진)                        번호판, 사람얼굴

    


          컴퓨터            vs           뇌 
            ↓                           ↓
정보를 메모리의 특정위치 저장          정보를 저장하는 공간이 따로 없다.
                                        ↓
                                  신경세포(뉴런)의 연결관계를 변경하는
                                  방식으로 저장한다.
                                        ↓
                                  신경세포는 그저 다른 신경세포에서 
                                  오는 신호를 받아 자신의 신호를 내보내는
                                  역할만 한다. 


 사람 : 뉴런수 (850억개) 
고양이 : 뉴런수 (10억개)
 쥐   : 뉴런수 (7천5백만개)
바퀴벌레 : 뉴런수 몇백만개 
하루살이 : 최신 최첨단 ANN보다 많다. 




인공 신경망
신경세포(뉴런)
노드
신경세포의 연결
연결 가중치

바이어스: -> 가중치와 함께 신경망의 정보를 저장하는데 관여하는 변수 
v = w1 * x1 + w2 * x2 + w3 * x3 +b
v = wx + b
w = [w1 w2 w3]
x = [x1 x2 x3] ^T

y = f(v)
활성함수 
1. 입력신호의 가중의 합을 구한다
2. 활성함수에 가중합을 입력해 얻은 값을 외부로 출력한다. 






입력층 : 들어오는 신호를 다음 노드에 전달하는 창구역할 
은닉층 : 신경망 외부에서는 이 노드에 직접 접근 할 수 없다. 
출력층 : 노드들의 출력이 신경망의 최종값이 된다. 


단층 신경망 : 입력층 --> 출력층 바로감

다층 신경망 : 

     얕은 신경망 : 입력층 --> 은닉층 -> 출력층
      
     심층 신경망 : 입력층 --> 은닉층 -> 출력층






※ 정규화 
  1. 표준정규분포: scale()
  2. 최대최소변환: normalize() 함수를 만들었음 : ( 0 ~ 1 ) 사이의 값

입력값과 출력 값은 정해져있고

가중치와 바이어스를 역전파로 찾아내는게 신경망 학습의 원리 

실제값과 오차를 구하는 함수 : 비용함수 


■ 신경망의 지도학습
    학습의 종류         학습 데이터
1.지도학습            {입력값, 정답}

     -1. 연습문제 하나를 현재의 지식으로 문제의 답을 구한다.
     -2. 정답과 비교한다.
     -3. 틀렸으면 잘못된 지식(가중치, 바이어스)을 교정한다.
     -4. 모든 문제에 대해서 1 ~ 3번 단계를 반복한다. (역전파)
     
2.비지도 학습         {입력값}

     정답이 없으니 해법을 배우지 못하고 문제의 구문이나 형태를 가지고     
     유형을 나눠보는것 

3.강화학습            {입력값, 출력값, 출력에 대한 점수}

■ 2. 신경망 실습 1 (콘크리트 데이터) 

분석 목적 : 건물의 내구성을 결정하는 콘크리트의 내구려겡 믿을만한 예측 모델 만들기

     입력 재료의 구성 목록을 고려해서 어떻게 입력 재료를 조합했을때 콘크리트의 강도가 높은지를 알아내고 시팓.

     입력값                  출력값
       ↓                      ↓
     콘크리트 재료들         콘크리트 강도 

 UCI의 머신러닝 DATA
1.mount of cement : 콘크리트의 총량
2.slag  : 시멘트
3.ash   : 회분 (시멘트)
4.water :  물
5.superplasticizer : 고성능 감수재(콘크리트 강도를 높이는 첨가제)
6.coarse aggregate : 굵은 자갈
7.fine aggregate : 잔 자갈
8.aging time      : 숙성시간

위의 데이터를 8 : 2 로 나눠서 8을 가지고 훈련을 시키고 모델을 만든다.

2를 가지고 검증을 한다.





##### 7장 : 신경망(Neural Network)과 서포트 벡터 머신(Support Vector Machines) -------------------

##### Part 1: 신경망 -------------------
## 예제 : 콘크리트의 강도 모델링  ----

## 2단계 : 데이터 준비와 살펴보기 ----
# 데이터 읽기와 구조 확인

concrete <- read.csv("concrete.csv")
str(concrete)


# 정규화 함수
normalize <- function(x) { 
  return((x - min(x)) / (max(x) - min(x)))
}


# 전체 데이터 프레임에 정규화 적용
concrete_norm <- as.data.frame(lapply(concrete, normalize))


# 0과1 사이에 범위 확인
summary(concrete_norm$strength)


# 본래 데이터의 최소값, 최대값 비교
summary(concrete$strength)


# 훈련과 테스트 데이터 생성
concrete_train <- concrete_norm[1:773, ]
concrete_test <- concrete_norm[774:1030, ]


## 3단계 : 데이터로 모델 훈련 ----
# neuralnet 모델 훈련
install.packages("neuralnet")
library(neuralnet)


# 하나의 은닉 뉴런에 대한 단순한 ANN
concrete_model <- neuralnet(formula = strength ~ cement + slag +
                              ash + water + superplastic + 
                              coarseagg + fineagg + age,
                              data = concrete_train)


# 망(network) 시각화
plot(concrete_model)


## 4단계 : 모델 성능 평가 ----


# 모델 결과
model_results <- compute(concrete_model, concrete_test[1:8])


# 강도값 예측
predicted_strength <- model_results$net.result


# 예측값과 실제값간의 상관 관계 확인
cor(predicted_strength, concrete_test$strength)


## 5단계 : 모델 성능 향상 ----
# 5개 은닉 뉴런인 복잡한 뉴런망

concrete_model2 <- neuralnet(strength ~ cement + slag +
                               ash + water + superplastic + 
                               coarseagg + fineagg + age,
                               data = concrete_train, hidden = 5)


# 망(network) 시각화
plot(concrete_model2)


# 결과 평가
model_results2 <- compute(concrete_model2, concrete_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, concrete_test$strength)








보스톤 주택가격 데이터로 해보자 ! 




##### 7장 : 신경망(Neural Network)과 서포트 벡터 머신(Support Vector Machines) -------------------
##### Part 1: 신경망 -------------------
## 예제 : 콘크리트의 강도 모델링  ----
## 2단계 : 데이터 준비와 살펴보기 ----
# 데이터 읽기와 구조 확인
boston <- read.csv("boston.csv")
str(boston)


# 정규화 함수
normalize <- function(x) {
  return((x - min(x)) / (max(x) - min(x)))
}


# 전체 데이터 프레임에 정규화 적용
boston_norm <- as.data.frame(lapply(boston, normalize))


# 0과1 사이에 범위 확인
summary(boston_norm$MEDV)




# 훈련과 테스트 데이터 생성
boston_train <- boston_norm[1:773, ]
boston_test <- boston_norm[774:1030, ]


## 3단계 : 데이터로 모델 훈련 ----
# neuralnet 모델 훈련
install.packages("neuralnet")
library(neuralnet)

str(boston)
# 하나의 은닉 뉴런에 대한 단순한 ANN
boston_model <- neuralnet(formula = MEDV ~ 
                              data = boston_train)

# 망(network) 시각화
plot(boston_model)


## 4단계 : 모델 성능 평가 ----

# 모델 결과
model_results <- compute(boston_model, boston_test[1:8])

# 강도값 예측
predicted_strength <- model_results$net.result

# 예측값과 실제값간의 상관 관계 확인
cor(predicted_strength, boston_test$strength)


## 5단계 : 모델 성능 향상 ----
# 5개 은닉 뉴런인 복잡한 뉴런망
boston_model2 <- neuralnet(strength ~ cement + slag +
                               ash + water + superplastic +
                               coarseagg + fineagg + age,
                               data = boston_train, hidden = 5)


# 망(network) 시각화
plot(boston_model2)


# 결과 평가
model_results2 <- compute(boston_model2, boston_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, boston_test$strength)





  1. R 기본 수업 
  2. R 을 활용한 기계학습
     *머신러닝의 종류 3가지
          1.지도학습
               분류 : KNN, 나이브베이즈, 결정트리, SVM
               회귀 : 회귀분석, 신경망
          2.비지도학습 : K-means
          3.강화학습 : 틱텍토, 핑퐁


서울아산병원 영상분석팀에 취업한 친구가 ...
     포트폴리오 : 틱텍토,오라클 database 
                    
■ 7장 . 신경망과 서포트 벡터 머신 




■ 7장 신경망 목차
     1.신경망에 대한 이해
     2.신경망 구조
     3.신경망 실습 
          - 콘크리트 data
          - 보스톤 하우징 data
          - 무성이 발표 data ( 화력발전 데이터, 페이스북 데이터 ) 
     4.서포트 벡터 머신의 이해 
     5.서포트 벡터 머신 실습 
          - 필기체를 컴퓨터가 인식할수 있게 학습 

■ 7.4 서포트 벡터 머신 

빨간색공과 파란색 공이 모여잇는데 이것을 하나의 끊이지 않는 직선으로 구분하고 싶다면?

무수히 많은 직성을 그을 수 있다. 

y = 2x + 3

d = w^t*x + w0 > 0 : 빨간색
d = w^t*x + w0 < 0 : 파란색





좌표축이 2개면 ? 경계선은 직선의 방적식

좌표축이 3개면 ? 경계면 

d = w^t*x + w0 <- 절편
w0 : 절편
d = 경계면까지의 거리

t== 가중치 벡터 
x == 공의 위치 벡터

경계선(면) 까지의 거리인 d의 부호만으로도 빨간색인지 파란색인지를 알 수 있다.

"공의 위치를 알려주는 위치 벡터가 x라고 한다며 ㄴ
x 의 위치가 경계면 (또는 경계선) 의 위에 있느냐 아래에 있느냐에 따라 d의 
부호가 바뀐다. "

d = w^t + w0



"2차원 평면과 두개의 데이터의 집합이 있다.
그리고 둘 사이의 경계를 주기를 원한다
우리는 이 경계의 넓이를 조절 할 수 있고 
이 경계선의 방향을 조절 할 수 있다. "

우리의 목표는 가능한 적당한 넓이의 경계선을 찾는것이고
그리고 데이터간의 경계를 유지시키는 것이다.


이 구분의 경계선의 직선의 방정식은

w^t      *      x      +      b = 0
↓               ↓             ↓ 
normal vector 공의 위치벡터     scalar vector (바이어스)

바이어스는 원점으로 부터의 변위를 제어한다
두 분리선에는 어느정도 margin을 각각 갖게 한다
우리는 normal vector의 각도를 변경함으로써 여유를 회전시킨다.
그리고 바이어스를 조정함으로써 저 경계선을 이동시킨다. 



1.set1.csv를 로드하고 plot 를 그래프로 본다

set1 <- read.csv("set1.csv", header = T , stringsAsFactors = F)
set1

plot(set1)

install.packages("MASS")
library(MASS)
density <- kde2d(set1$food, set1$book, n=400)
image(density, xlab = "food", ylab="book")



설명 : 가운데 평균점 근처에 모여있는 데이터가 보통 사람들의데이터이다.
이들을 분류하기 위하여 어떠한 방법을 쓸수 있는가 .

svm을 이용해서 분류를 해보자


  1. svm 으로 보통사람들(중산층)을 분류
install.packages("e1071")
library(e1071)

m1 <- svm(status ~ food + book + cul + cloth + travel, 
     type ="C-classification", data= set1)

m1 
  1. 이모델이 얼마나 정확한지 기존 훈련 데이터로 평가를 해본다.

predict(m1, set1)

cbind(set1, predict(m1, set1))

  1. 예측한 결과와 실제와의 차이
sum(set1$status != predict(m1, set1)) 

12

88%의 정확도를 가지고 있네여 !

문제228. (점심시간문제) 보스톤 하우징 데이터를 이용해서 
     svm테스트를 하는데 CAT. MEDV가 0과1 로 구분 되는데 
     SVM으로 0과 1의 정확도가 어떻게 나오는지 테스트하시오  !
boston_norm <- as.data.frame(lapply(boston, normalize))

m1 <- svm(CAT..MEDV~ .,  type ="C-classification", data= boston_norm )


cbind(boston_norm$CAT..MEDV+1,predict(m1, boston_norm ))

sum(boston_norm $CAT..MEDV  != predict(m1, boston_norm )) 



m1 <- svm(CAT..MEDV~ .,  type ="C-classification", data= boston_norm )

library(caret)

confusionMatrix(table(boston_norm $CAT..MEDV  , predict(m1,boston_norm )))


 
■ 서포트 벡터 머신 실습
  1. 중산층 분류 실습
  2. 필기체 분류 숫자 
  3. 필기체 분류 영어





install.packages("caret")

install.packages("doParallel")

install.packages("kernlab")

install.packages("ggplot2")

install.packages("lattice")

library(ggplot2)

library(lattice)

library(kernlab)

library(caret)

library(doParallel)


# Enable parallel processing.


cl <- makeCluster(detectCores())

registerDoParallel(cl)


# Load the MNIST digit recognition dataset into R

# http://yann.lecun.com/exdb/mnist/

# assume you have all 4 files and gunzip'd them

# creates train$n, train$x, train$y  and test$n, test$x, test$y

# e.g. train$x is a 60000 x 784 matrix, each row is one digit (28x28)

# call:  show_digit(train$x[5,])   to see a digit.

# brendan o'connor - gist.github.com/39760 - anyall.org


load_mnist <- function() {

  load_image_file <- function(filename) {

    ret = list()

    f = file(filename,'rb')

    readBin(f,'integer',n=1,size=4,endian='big')

    ret$n = readBin(f,'integer',n=1,size=4,endian='big')

    nrow = readBin(f,'integer',n=1,size=4,endian='big')

    ncol = readBin(f,'integer',n=1,size=4,endian='big')

    x = readBin(f,'integer',n=ret$n*nrow*ncol,size=1,signed=F)

    ret$x = matrix(x, ncol=nrow*ncol, byrow=T)

    close(f)

    ret

  }

  load_label_file <- function(filename) {

    f = file(filename,'rb')

    readBin(f,'integer',n=1,size=4,endian='big')

    n = readBin(f,'integer',n=1,size=4,endian='big')

    y = readBin(f,'integer',n=n,size=1,signed=F)

    close(f)

    y

  }

  train <<- load_image_file('train-images.idx3-ubyte')

  test <<- load_image_file('t10k-images.idx3-ubyte')

  

  train$y <<- load_label_file('train-labels.idx1-ubyte')

  test$y <<- load_label_file('t10k-labels.idx1-ubyte')  

}

#필기체의 글씨가 무엇인지 확인하는 함수 

show_digit <- function(arr784, col=gray(12:1/12), ...) {

  image(matrix(arr784, nrow=28)[,28:1], col=col, ...)

}


train <- data.frame()

test <- data.frame()


# Load data.


load_mnist()


# Normalize: X = (X - min) / (max - min) => X = (X - 0) / (255 - 0) => X = X / 255.

#나눠서 정규화 ㅎㅎ

train$x <- train$x / 255


# Setup training data with digit and pixel values with 60/40 split for train/cv.


inTrain = data.frame(y=train$y, train$x)

inTrain$y <- as.factor(inTrain$y)

trainIndex = createDataPartition(inTrain$y, p = 0.60,list=FALSE)

training = inTrain[trainIndex,]

cv = inTrain[-trainIndex,]
# cv 가 테스트 데이터얌 ㅎㅎ

# SVM. 95/94.


fit <- train(y ~ ., data = head(training, 1000), method = 'svmRadial', tuneGrid = data.frame(sigma=0.0107249, C=1))


results <- predict(fit, newdata = head(cv, 1000))
                         ↑
                         모델

results


confusionMatrix(results, head(cv$y, 1000))



show_digit(as.matrix(training[5,2:785]))


# Predict the digit.


predict(fit, newdata = training[5,])


# Check the actual answer for the digit.


training[5,1]