출처입니다~ 자세한 내용은 밑에 기사에서 확인해주세요^^

(https://news.samsung.com/kr/%ec%82%bc%ec%84%b1-ai-%ed%8f%ac%eb%9f%bc-2019-%ea%b8%b0%ec%88%a0-%ed%95%9c%ea%b3%84-%ea%b7%b9%eb%b3%b5%ec%9d%84-%ec%9c%84%ed%95%b4-%ea%b8%80%eb%a1%9c%eb%b2%8c-%ec%a0%84%eb%ac%b8)

 

‘삼성 AI 포럼 2019’ 기술 한계 극복을 위해 글로벌 전문가 한 자리에

삼성전자는 AI 기술의 무한한 가능성에 주목하고, 이를 통해 더 나은 미래를 실현하고자 다양한 시도를 하고 있다. 이 같은 노력의 일환으로 지난 4일과 5일 서초사옥 다목적홀과 서울 R&D 캠퍼스에서 ‘삼성 AI 포럼 2019’가 진행됐다. 올해로 3회차를 맞은 ‘삼성 AI

news.samsung.com

 

내용요약

최근 AI 기술은 특정 알고리즘에 따라 주어진 데이터를 단순히 연산하는 것에 그치지 않고, 인간처럼 사고하고 행동하는 수준에 가까워지고 있습니다.

빅데이터가 확보되어, 딥러닝 기술과 AI의 발전을 과속화 시키고 있습니다.

 

AI전문가들에 의하면 기술 발전이 다음 단계로 넘어가기 위해서는

1. 알고리즘 효율화

2. 시스템 구축 비용 절감

3. 데이터 학습방식 개선

등을 꼽았습니다.

 

또한 미래 AI 기술의 방향성은

1. 무선 네트워크 제어

2. AI 자율성 증대

3. 적용 분야 확대

등을 제시했습니다.

 

GAN(Generative Adversarial Network, 생성적 적대 신경망)

생성적 적대 신경망(GAN)이란 두개의 네트워크로 구성된 심층 신경망 구조입니다. 최대한 진짜 같은 데이터를 생성하려는 생성 모델(generator)과 진짜와 가짜를 판별하려는 분류 모델(discriminator)이 각각 존재하여 서로 적대적으로 학습합니다.

GAN은 다음과 같은 동작으로 이루어집니다.

- 생성 모델이 임의의 수를 입력받아 생성한 이미지로 반환합니다.

- 이렇게 생성된 이미지와 실제 데이터 세트에서 가져온 이미지들을 분류 모델에 전달합니다.

- 분류모델에서는 실제 이미지와 가짜 이미지를 판별해 0과 1사이의 확률값으로 반환시킵니다.

( 1 : 실제 이미지, 0 : 가짜 이미지)


RNN(Recurrent Neural Network, 순환 신경망)

순환 인공 신경망(RNN)은 유닛간의 연결이 순환적 구조를 갖는 특징을 갖는 인공 신경망입니다.

이러한 구조를 가지고 있기 때문에 시계열 데이터와 같이 시간의 흐름에 따라 변화하는 데이터를 학습시킬 수 있습니다.

순환 신경망의 대표적인 예는 글자나 문장을 완성해주는 알고리즘입니다. 문장 데이터의 경우에 앞 뒤 데이터간의 연관성을 가지고 있습니다. 예를 들어, '안','녕','하' 다음에 나올 글자는 '세'일 확률이 크며, 그 다음으로 '요'가 나올 확률이 큽니다. 이렇게 RNN은 앞 뒤의 데이터 간에 연관성이 있는 데이터셋에 사용될 수 있습니다. 또한 필기체 인식이나 음성 인식과 같이 시변적 특징을 가지는 데이터를 처리할 때 사용할 수 있습니다.

 

GNN(Graph Neural Network)

GNN은 그래프 구조에서 사용하는 인공 신경망입니다. CNN이나 RNN 등의 인공 신경망들은 보통 벡터나 행렬 형태로 input이 주어지는데 반해서 GNN의 경우에는 input이 그래프 구조라는 특징을 가지고 있습니다. 

 

posted by 스노(Snow)
:
Python 파이썬/머신러닝 2019. 11. 12. 01:12

군집분석은 주어진 데이터셋 내에서 각 객체의 유사성을 측정하여 집단을 분류하고 군집으로 나누는 비지도 기계 학습 기법입니다. 데이터의 분할 및 요약에 널리 사용되고 있으며, 데이터에서 유용한 지식을 추출하는 데 활용됩니다.

군집분석을 통해 수백만의 데이터를 직접 확인하지 않고 각각의 대푯값만을 확인해 전체 데이터의 특성을 파악할 수 있습니다.

 

군집을 분류하는 데 있어 가장 기본적인 가정은 군집 내에 속한 객체들의 특성은 서로 동질적이고, 다른 군집에 속한 객체들 간의 특성은 서로 이질적이 되도록 분류해야 합니다.

군집화를 수행할 시 주요적으로 고려할 사항으로는 어떤 알고리즘을 사용할지, 어떤 거리 척도를 사용할지, 최적 군집 수는 어떻게 결정할지 등이 있습니다.

 

대표적인 군집분석기법으로는 k-means이 있으며, partitioning, categorical, k-medoid, clara, clarans 등이 있습니다.

 

객체의 종류에 따라 다양한 유사도 기준이 적용됩니다. 대표적인 유사도 척도로 유클리디안 거리가 있으며, 맨하탄 거리, 마할라노비스 거리, 상관계수 거리 등이 있습니다.

posted by 스노(Snow)
:

출처입니다. 자세한 내용은 밑에 뉴스에서 확인해주세요~

(http://www.munhwa.com/news/view.html?no=2019110401031503009001)

 

연주 데이터에 감정 표현하는 ‘머신러닝’… 인간 창의성에 도전

■ 연주자 감성까지 반영하는 ‘음악AI’ 연구카이스트·서울대 3년째 개발중즉흥변주·모방 수준 뛰어넘어스스로..

www.munhwa.com

내용 요약

카이스트와 서울대 교수분들이 3년째 '인간 작곡가와 연주자의 감성을 인공지능 피아노에 담는다는 주제를 목표로 하고 있다고 합니다. 기존 데이터와 비슷한 경과가 나오는 모방 기반의 생성 기술은 어렵지 않지만, 지금까지와 전혀 새로운 창작을 할 수 있을지는 의문이라고 하네요. 연구가 어려운 점으로는 음악 데이터의 부족과 시간과 돈의 제약 융합 미비라고 합니다. 그리고 과학자와 음악가들의 협업이 국내에선 덜 활발하다는 이야기도 있었습니다.

 

용어설명

GAN(Generative Adversarial Network, 생성적 적대 신경망)

생성적 적대 신경망(GAN)이란 두개의 네트워크로 구성된 심층 신경망 구조입니다. 최대한 진짜 같은 데이터를 생성하려는 생성 모델(generator)과 진짜와 가짜를 판별하려는 분류 모델(discriminator)이 각각 존재하여 서로 적대적으로 학습합니다.

GAN은 다음과 같은 동작으로 이루어집니다.

- 생성 모델이 임의의 수를 입력받아 생성한 이미지로 반환합니다.

- 이렇게 생성된 이미지와 실제 데이터 세트에서 가져온 이미지들을 분류 모델에 전달합니다.

- 분류모델에서는 실제 이미지와 가짜 이미지를 판별해 0과 1사이의 확률값으로 반환시킵니다.

( 1 : 실제 이미지, 0 : 가짜 이미지)

posted by 스노(Snow)
:
Python 파이썬/머신러닝 2019. 11. 11. 18:43

이론 부분은 전편에서 확인해주세요(https://sno-machinelearning.tistory.com/61)

 

K-최근접 이웃 알고리즘 (KNN)

K-최근접 이웃 알고리즘은 특정 공간 내에서 입력과 가장 근접한 K개의 요소를 찾아서 더 많이 일치하는 것으로 분류하는 알고리즘으로 가장 간단한 기계학습 알고리즘입니다. 그림으로 살펴보도록 하겠습니다...

sno-machinelearning.tistory.com

KNN알고리즘을 파이썬으로 간단하게 표현했습니다.

 

우선 필요 패키지부터 불러옵니다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

그 후 데이터를 불러옵니다. (데이터는 네이버의 2019년 자동차 데이터 중 일부를 가져왔습니다.)

 

data = pd.read_csv('cars.csv', encoding="euc-kr")
data.city_mpg = data.city_mpg*10   # 변수끼리 간단하게나마 비율을 맞추었습니다.

df_z = np.array(data.fuel)

df_xy = data[["hp", "city_mpg"]]
data_xy = df_xy.as_matrix()

그다음에는 새롭게 분류할 데이터를 생성합니다.

 

hp = int(input('마력 입력 : '))
mpg = float(input('도심연비 입력 : '))*10
target = [hp, mpg]

 

dataset을 만들어 데이터를 분석하기 쉽게 만들어, 분류대상 및 범주를 생성합니다.

def data_set():
	size = len(df_xy)
	class_target = np.tile(target, (size, 1))
	class_z = np.array(df_z)
    return df_xy, class_target, class_z
dataset, class_target, class_z = data_set()

유클리디안 거리 공식(Euclidean Distance)을 이용하여, 분류할 대상과 분류범주와의 거리를 구합니다.

그후, 가까운 값에따라 오름차순으로 정렬한 후 그 값에 따라 어떤 카테고리에 가까운지 분류합니다.

def classify(dataset, class_target, class_category, k): 

    diffMat = class_target - dataset 
    sqDiffMat = diffMat**2  
    row_sum = sqDiffMat.sum(axis=1) 
    distance = np.sqrt(row_sum) 
    sortDist = distance.argsort() 
     
    class_result = {} 
    for i in range(k): 
        c = class_category[sortDist[i]] 
        class_result[c] = class_result.get(c, 0) + 1 

    return class_result

 

이제 k값을 입력하는 코드와 함수를 호출하는 코드를 작성합니다.

 

k = int(input('k값을 입력해주세요 :')) 
class_result = classify(data_xy, class_target, class_z, k)  # classify()함수호출 
print(class_result)

 

k값을 입력해주세요 :5

{'가솔린': 3, '디젤': 2}

 

위의 결과를 확인하였을 때, 내가 분류할 대상은 '가솔린' 연료 사용 카테고리에 가장 가까운 것을 알 수 있습니다.

 

def resultprint(class_result): 
    hev = Gas = die = 0 
     
    for c in class_result.keys(): 
        if c == '하이브리드': 
            hev = class_result[c] 
        elif c =='가솔린': 
            Gas = class_result[c] 
        else : 
            die = class_result[c] 

    if hev > Gas and hev > die: 
        result = "분류대상은 하이브리드 입니다." 
    elif Gas > die and Gas > hev: 
        result = "분류대상은 가솔린 입니다" 
    elif die > hev and die > Gas: 
        result = "분류대상은 디젤 입니다." 
    else: 
        result = "k값을 변경해주세요." 
         
    return result


print(resultprint(class_result))

 

출력결과로는

분류대상은 가솔린 입니다.

라고 나올것입니다.

 

밑의 그림은 보기 쉽도록 시각화한 그래프입니다.

파란색 동그라미가 가솔린, 녹색 십자가가 하이브리드, 회색 엑스가 디젤입니다. 그리고 적색 별이 타켓입니다.

그래프는 밑에 있는 코드로 작성할 수 있습니다.

 

for c in range(len(df_xy)): 
    data_xy[c][1] = data_xy[c][1]/10 
    if df_z[c] == '가솔린':  
        plt.scatter(data_xy[c][0],data_xy[c][1],marker='o',color='b') 
    elif df_z[c] == '하이브리드': 
        plt.scatter(data_xy[c][0],data_xy[c][1],marker='+',color='g') 
    else: 
        plt.scatter(data_xy[c][0],data_xy[c][1],marker='x',color='gray') 
plt.scatter(hp,mpg/10,marker='*',color='r') 
plt.show()

 

 

출처 : 

자동차 데이터 (https://auto.naver.com/car/mainList.nhn)

 

posted by 스노(Snow)
:
Python 파이썬/머신러닝 2019. 11. 11. 01:29

K-최근접 이웃 알고리즘은 특정 공간 내에서 입력과 가장 근접한 K개의 요소를 찾아서 더 많이 일치하는 것으로 분류하는 알고리즘으로 가장 간단한 기계학습 알고리즘입니다.

 

그림으로 살펴보도록 하겠습니다.

최근접 이웃 알고리즘은 그림 속의 물음표의 주변에 세모가 있기 때문에 세모라고 판단하는 알고리즘입니다.

 

다음 그림도 살펴보겠습니다.

위의 그림은 주변에서 몇 개를 골라서 볼 것인가에 따라 물음표의 분류가 바뀝니다.

이렇게 주변에 있는 몇 개의 요소들을 같이 봐서 가장 많이 골라내는 것을 K-최근접 이웃 알고리즘(KNN)이라고 할 수 있습니다. KNN 알고리즘에서 K는 주변의 개수를 의미한다고 보시면 됩니다.

 

K가 1일 때는 동그라미라고 판단하겠지만, K를 3으로 변경한다면 세모라고 판단할 것입니다.

 

하지만 문제가 있습니다. 과연 K는 몇인가 가장 좋을까요?

위의 그림에서 확인할 수 있듯이, 물음표를 네모인지 세모인지 결론을 내릴 수 없게 됩니다.

 

위의 그림 처럼 k값이 커지면 항목 간의 경계가 불분명해지며, 결론을 내기 더 힘들어 질 수 있습니다.

k를 홀수로 한다고 해결되는 거 아닙니다.

이진(2개의 항목) 분류 문제에서는 홀수인 K를 선택하는 것이 바람직 하지만 항목이 여러개일 수도 있습니다.

 

따라서, KNN알고리즘을 사용할 때는 분류될 그룹의 종류등을 고려하여 적절한 K값을 설정하는 것이 중요합니다.

 

posted by 스노(Snow)
:
Python 파이썬/머신러닝 2019. 11. 6. 19:54

아는 사람이 졸업작품으로 '날씨에 따른 중국집 배달 수를 조사'하고 싶다고 하여서 참고하라고 만들어보았습니다.

 

우선 필요할 듯한 패키지입니다.

 

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
import matplotlib.ticker as plticker 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import LogisticRegression 
import os 
import tensorflow as tf 
import statsmodels.formula.api as sm 
from patsy import dmatrices

 

지인의 데이터를 확인하지 못하여 임의로 만들었습니다.

data.csv

x1 x2 x3

1  0  0   - 맑음

0  1  0   - 흐림

0  0  1   - 비

0  0  0   - 눈

 

순위가 정해지지 않은 범주형 데이터를 분석할 때에는 변수를 위와 같이 만들어야합니다.

 

일단 데이터를 불러옵니다.

 

data = pd.read_csv('data.csv')


model = sm.ols(formula = 'y ~ x1 + x2 + x3',data=data).fit() 
model.summary()

 

선형회귀표입니다.

P>|t| 가 0.05 보다 높으면 쓸모 없는 변수이지만, x1,x2,x3는 날씨라고 하는 한 변수의 더미변수이기 때문에 전부 버려야하는 상황이 아니면 버리지 않습니다.

Adj.R-squared 는 수정된 상관관계입니다. 실제로 종속변수에 영향을 주는 독립변수들에 의해 설명되는 분산의 비율을 알려줍니다. 이번 블로그의 주제인 '날씨에 따른 중국집 배달 수를 조사'는 사회과학에 속하기에 시계열, 패널 데이터가 아닌 이상 결정계수가 낮을 가능성이 매우 크지만, 적절한 추정방법을 사용했다면 작더라도 상관은 없습니다.

 

다루기 편하게 x와 y를 NumPy 배열로 변경합니다.

 

multi_y = np.array(data.y)
df_x = data[["x1", "x2", "x3"]] 
multi_x = df_x.as_matrix()

 

그 다음부터는 본격적으로 tensorflow를 사용하겠습니다.

with tf.Graph().as_default() as multi_regresstion:
    num_x = 3     # x변수는 몇개? 
    X = tf.placeholder(tf.float32, [None, num_x], name='X')
    Y = tf.placeholder(tf.float32, [None], name='Y')
    lr = tf.constant(1e-3,tf.float32)
    W = tf.get_variable("W", [1,num_x], tf.float32)
    b = tf.get_variable("b",dtype=tf.float32,initializer=tf.constant(1.,tf.float32)) 
     
    h = tf.matmul(W,X,transpose_b=True) + b
    cost = tf.reduce_mean(tf.square(tf.subtract(h,Y))) 
    train = tf.train.GradientDescentOptimizer(lr).minimize(cost)

우선 multi_regresstion이라는 이름을 가진 그래프를 만듭니다. 

그후 placeholder 2개를 그래프에 추가합니다. placeholder는 외부데이터를 받아서 저장하는 변수로,

tf.placeholder(자료형, 텐서모양,이름)으로 구성됩니다.

tf.constant는 상수를 정의해주며, tf.constant(값, 자료형)으로 구성됩니다.

tf.get_variable은 학습 중에 계속 변하는 변수이며, tf.get_variable(이름,자료형,초기값)으로 구성됩니다.

여기까지가 선형회귀에 필요한 변수입니다.

 

cost는 계산할 오차이며, 이 오차를 줄이기 위해 GradientDescent알고리즘을 이용하였습니다.

 

이제 그래프 그리기는 모두 끝났으며, Session을 사용하여 방금 만든 그래프를 불러옵니다.

with tf.Session(graph=multi_regresstion) as sess:
    sess.run(tf.global_variables_initializer()) 
    for i in range(3000):
        _,l = sess.run([train,cost],feed_dict={X:multi_x,Y:multi_y}) 
        print("loss",l) 
    W_multi, b_multi = sess.run([W,b])

학습을 진행할 수록 loss(cost)가 줄어드는 것을 볼 수 있습니다. (만약 NA값이 뜨거나 점점 커지면 식의 설명력이 너무 낮아서 변수를 바꾸거나 다른 방법을 써야 합니다. 이건 나중에 쓸 일이 있으면 올리겠습니다.)

 

for j in range(len(multi_x)): 
    sum = 0 
    for i in range(3): 
        sum += W_multi[0][i] * multi_x[j,i] 
    print(multi_y[j],sum+b_multi) 
print(W_multi,b_multi)

 

이제 학습을 마쳤으니 결과를 확인할 차례입니다.

실행시에 위와 비슷한 결과가 나옵니다.

결과적으로

h = -2.593823*x1 + 1.0692451*x2 + 3.6352885*x3 + 5.5272436

라는 식을 얻을 수 있습니다.

 

def weather(weather): 
    if weather == '맑음': 
        a,b,c = 1,0,0 
    elif weather == '흐림': 
        a,b,c = 0,1,0 
    elif weather == '비': 
        a,b,c = 0,0,1 
    elif weather == '눈': 
        a,b,c = 0,0,0 
    else: 
        a,b,c = 'error' 
    d = W_multi[0][0]*a+W_multi[0][1]*b+W_multi[0][2]*c+b_multi 
    return(a,b,c,d)

 

이제 새로운 값을 얻었을 경우 값 예측을 만들면 됩니다.

 

weather('눈')

 

posted by 스노(Snow)
:

필요 패키지를 다운로드합니다.

데이터 처리부

데이터 및 타겟을 인코더 및 디코더 합니다.

모델구동기로 만들었던 모델을 불러옵니다.

답변 생성 함수를 만듭니다.

입력 문장 처리(토큰화)함수를 만듭니다.

그 후, 원하시는 스토리로 게임을 제작하시면 됩니다.

 

텍스트 창을 깨끗하게 정리하는 함수 제작

주머니 제작 및 주머니 확인 함수 제작

프롤로그 함수

2번방

 

게임 구동

플레이어가 '주변을 살피다'라고 적으면,

'주변','살피'로 인식되어 rawdata에 있는 데이터들을 검색하여, 같은 토큰으로 인식하는 '주변을 산핀다'의 답변을 불러옵니다. '주변을 살핀다' 의 답변은 0001이며, 답변과 같은 숫자의 이야기를 불러오는 식으로 진행하며, 중복과 랜덤하게 불러오기, 이미지 출력등을 활용하여 플레이어에게 몰입감을 더 줄 수 있게합니다.

posted by 스노(Snow)
:

한국어 자연어 처리를 위해 KoNLPy를 설치하였습니다.

설치방법 (https://konlpy-ko.readthedocs.io/ko/v0.4.3/)

그 후, raw_data에서 파일을 가져와 데이터셋에 맞추어 질문과 답변을 추출합니다.

raw 데이터

추출된 질문 데이터

그 후, 문장을 토크나이징 및 벡터화 하여 문자열을 정수 인덱스로 변환 시킵니다.

답변 또한 토큰화를 시킵니다.

함수형 AIP를 통하여 모델을 생성합니다.

IN(Padding된 질문, 답변) target( 학습된 target 값) 학습을 한 후, 모델을 저장합니다.

모델 객체를 생성하여 입력데이터로써 레이어를 받은 상태에서 LSTM을 통해 얻은 hiddlen Layer와 Cell Layer를 받습니다. 그 후, 모델을 저장합니다.

 

전체 프로그램 코드는 차후 github에 올리겠습니다.

posted by 스노(Snow)
: