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
115
116
117
118
119
120
121
# -*- coding: utf-8 -*-
"""Day 09_Multivariable Gaussian Classifier.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 + 'winery/winery-multivariate/'+'wine.data.txt', delimiter=',')
 
featurenames = ['Alcohol''Malic acid''Ash''Alcalinity of ash','Magnesium''Total phenols'
                'Flavanoids''Nonflavanoid phenols''Proanthocyanins''Color intensity''Hue'
                'OD280/OD315 of diluted wines''Proline']
 
# Split 178 instances into training set (trainx, trainy) of size 130 and test set (testx, testy) of size 48
np.random.seed(0)
perm = np.random.permutation(178)
trainx = data[perm[0:130],1:14]
trainy = data[perm[0:130],0]
testx = data[perm[130:178], 1:14]
testy = data[perm[130:178],0]
 
"""j = 1, 2, 3 <= 1, 2, 3 번 와인공장"""
 
## x = 데이터 프레임, y = 각 피처의 라벨 gernerative model을 사용하기 위해 필요한 파라미터를 리턴하는 함수.
def fit_generative_model(x,y):
    
    #와인 공장 갯수 3개
    k = 3  
    
    # 피처의 갯수
    d = (x.shape)[1]
    
    #13개 피처 각각의 평균 0번은 쓰지 않고 1, 2, 3번 인덱스만 사용.
    mu = np.zeros((k+1,d))
    
    #13 피처 각각의 표준편차 4행 13열 13깊이
    cov_mat = np.zeros((k+1,d,d))
    
    #클래스 분류시 가중치로 쓰일 pi변수 1, 2, 3번 인덱스만 사용.
    pi = np.zeros(k+1)
    
    
    #타겟 클래스의 수만큼 도는 포문
    for label in range(1,k+1):
        
        #타겟 클래스가 label과 일치하는 인덱스 추출. ( 1~3 )
        indices = (y == label)
        
        #해당 클래스의 평균을 mu의 클래스 번호 인덱스에 할당.
        mu[label] = np.mean(x[indices,:], axis=0)
        
        #해당 클래스의 공분산 매트릭스를 mu의 클래스 번호 인덱스에 할당.
        cov_mat[label] = np.cov(x[indices,:], rowvar=0, bias=1)
        
        #전체 y의 수에서 해당 타겟 클래스의 갯수를 pi의 타겟클래스 인덱스에 저장. 나중에 가중치로 쓰일 예정
        pi[label] = float(sum(indices))/float(len(y))
    return mu, cov_mat, pi
 
# Fit a Gaussian generative model to the training data
mu, cov_mat, pi = fit_generative_model(trainx,trainy)
 
## 타겟 클래스 갯수
= 3
 
## 테스트셋의 타겟 벨류의 갯수 = np
nt = len(testy)
 
## 테스트 스코어를 저장할 변수 행 갯수 = 테스트셋 , 열갯수 = 4, 0번 인덱스 사용 x
score = np.zeros((nt, k+1))
 
 
## 테스트셋의 갯수만큼 도는 포문
for i in range(0, nt):
    
    ## 타겟 클래스의 갯수만큼 도는 포문
    for targetClass in range1, k+1 ):
 
        #P( testX[i] )를 구하는 과정, testx[i]를 하나의 점으로 평균이 mu[i]이고 공분산 행렬이 cov_mat[i]인
        #다차원 가우스 확률밀도함수내에 표시하고 그때의 확률이 얼마가 되는지 계산한다.
        score[ i, targetClass ] = np.log( pi[targetClass] ) + \
        multivariate_normal.logpdf( testx[i, : ], mean = mu[targetClass, : ], cov = cov_mat[ targetClass, :, : ] )
        
        ##nt[i]가 가중치 pi[i]와 평균이 u, 공분산 매트릭스가 cov인 다차원 가우스 확률 밀도 함수로 구한 P(nt[i])를 곱해서
        ## 그 값이 제일 높은 타겟 클래스에 속하도록 한다. => 실제로는 계산 단순화를 위해서 둘다 로그를 씌워서 더한다.
 
# score의 한 행이 하나의 레코드 이므로, 1, 2, 3번 인덱스 중 제일 확률이 높게나온 와인 공장으로 예측한다.
# 그때 argmax는 해당 인덱스를 리턴하므로 인덱스에 1을 더해서 와인 공장 번호를 바로 predictions에 넣도록 한다.
predictions = np.argmax( score[ : , 1:4 ], axis = 1 ) + 1        
        
## 예측과 실제 testy의 라벨을 비교해서 틀린것을 센다.    
errors = np.sum( predictions != testy )    
 
print ("Errors: " + str(errors) + "/" + str(nt))
 
cs


+ Recent posts