TF(Term Frequency) Model

  • 이 단어가 문장에서 얼마나 나왔나.
  • Vector space model
  • 단어의 수가 갯수가 디멘전의 수가 된다. 


TF-IDF Model

  • 이 단어가 나온 문장이 몇개인가.
  • 문서들에서 일반적으로 나오는 단어들보다 잘나오지 않는 단어가 중요;
  • N = 전체 문서의 수 , df = 단어가 나온 문서의 수




* Stop words 나 Keywords 를 통해 특정 단어를 제거하거나 선택 할 수 있으며, General한 단어는 일반적으로 stop words로 등록해 제거한다.



Word Count

import collections


file = open('data/test2.txt')


word_list = file.read().split()

word_count = collections.Counter(word_list)

result = word_count.most_common(30)

print(result)


Keyword 뽑기

import os


file_list = os.listdir(r'C:\Users\User\비정형데이터\data')

print(file_list)


word_list = []

keywords = ['Mangkhut','damage','Philippines','the']

for i in file_list:

    file = open(r'C:\Users\User\비정형데이터\data/'+i)

    split_word = (file.read().split())

    

    for word in split_word:

        if word in keywords:

            word_list.append(word)


word_count = collections.Counter(word_list)

print(word_count)


CountVectorizer


from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer


c_vetorizer = CountVectorizer(analyzer='word')

doc = ['boring anwer phrase', 'terrible phrase', 'sleep phrase', 'phrase on stackoverflow', 'phrase on stackoverflow']

count = c_vetorizer.fit_transform(doc)

print(c_vetorizer.get_feature_names())

print(count.A)


TfidfVectorizer


vectorizer = TfidfVectorizer(analyzer='word')
doc = ['boring anwer phrase', 'terrible phrase', 'sleep phrase', 'phrase on stackoverflow', 'phrase on stackoverflow']
count = vectorizer.fit_transform(doc)
print(vectorizer.get_feature_names())
print(count.A)



K-Means Clustering


Clustering

- 개인 또는 개체 중에서 유사한 것들을 몇개의 집단으로 그룹화 하는 방법.

- 데이터 자체에만 의존하여 자료를 탐색하고 요약하는 분석 기법.

- 전체 데이터를 군집을 통해  잘 구분하는 것이 목적.

- 모델로는 Hierarchical Clustering, K-means Clustering 등이 있다.


군집의 유형

- 상호배반적(disjoint) 군집 : 상호 배반적 군집(오직 하나의 군집에만 속함)

- 계보적 군집(hierarchical) 군집(한 군집이 다른 군집의 내부에 포함되는 형식)

- 중복(overlapping) 군집(두 개이상의 군집에서 동시에 관찰되는 형식)

- 퍼지(fuzzy) 군집(관찰단위가 소속되는 특정한 군집이 아니라, 각 군집에 속할 가능성을 표현)


K-Means Clustering

- k-means 에서는 사전의 K를 정해주어야한다. k값에 따라 결과 값의 차이가 많이 나기떄문에 적합한 K를 구해줘야한다.

- 적절한 K를 구하는 방법에는 실루엣 계수, 엘보우 기법 등이 있다.


*알고리즘

1. 군집 수 K를 설정.

2. 초기 K개의 군집의 중심을 랜덤으로 선택.

3. 관찰된 데이터를 설정된 k개의 중심 중 거리가 가까운 지점에 군집으로 할당.

4. 각 군집별로 할당된 데이터를 바탕으로 새로운 중심 계산.

5.  3~4 의 과정을 반복해 중심의 차이가 없을때 까지 반복.


Hierarchical Clustering

- 최단 연결법, 최장 연결법, 평균 연결법 등이 있다.

- 최단 연결법의 경우 관찰된 데이터중 가까운 데이터끼리 묶어감으로써 군집을 만들어가는 방법이다.

- Hieracrchical 한 구조를 가지며, Dendrogram으로 표현 된다. 직접 보고 군집을 나눌수 있는 장점이 있다.


*알고리즘

- 가장 가까운 데이터 끼리 묶음.

* 색별로 군집을 설정한 것을 볼수 있다. 사용자에 요구에 따라 변경 가능 할 수있다.

  ex) 빨강,초록 n 파랑,하늘색을 같은 군집으로 묶을 수 있다.



from sklearn.cluster import KMeans


kmeans = KMeans(n_clusters=4)

kmeans.fit(X)

y_kmeans = kmeans.predict(X)


plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')


centers = kmeans.cluster_centers_

plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5);




from sklearn.metrics import pairwise_distances_argmin


def find_clusters(X, n_clusters, rseed=2):

    # 1. Randomly choose clusters

    rng = np.random.RandomState(rseed)

    i = rng.permutation(X.shape[0])[:n_clusters]

    centers = X[i]

    

    while True:

        labels=pairwise_distances_argmin(X,centers)

        new_center=np.array([X[labels==i].mean(0) for i in range(n_clusters)])

        if np.all(centers==new_center):

            break

        centers=new_center

        

    return centers, labels


centers, labels = find_clusters(X, 4)

plt.scatter(X[:, 0], X[:, 1], c=labels,s=50, cmap='viridis');



해결.. 자신에게 맞게

pip3 install dask

conda install dask


Traceback (most recent call last):

  File "main.py", line 5, in <module>

    from model import Model

  File "/home/answn3475/code/CycleGAN/model.py", line 2, in <module>

    import tensorflow.contrib.slim as slim

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/__init__.py", line 35, in <module>

    from tensorflow.contrib import distributions

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/distributions/__init__.py", line 38, in <module>

    from tensorflow.contrib.distributions.python.ops.estimator import *

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/distributions/python/ops/estimator.py", line 21, in <module>

    from tensorflow.contrib.learn.python.learn.estimators.head import _compute_weighted_loss

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/__init__.py", line 95, in <module>

    from tensorflow.contrib.learn.python.learn import *

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/__init__.py", line 28, in <module>

    from tensorflow.contrib.learn.python.learn import *

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/__init__.py", line 30, in <module>

    from tensorflow.contrib.learn.python.learn import estimators

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/estimators/__init__.py", line 302, in <module>

    from tensorflow.contrib.learn.python.learn.estimators.dnn import DNNClassifier

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/estimators/dnn.py", line 35, in <module>

    from tensorflow.contrib.learn.python.learn.estimators import dnn_linear_combined

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/estimators/dnn_linear_combined.py", line 36, in <module>

    from tensorflow.contrib.learn.python.learn.estimators import estimator

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py", line 52, in <module>

    from tensorflow.contrib.learn.python.learn.learn_io import data_feeder

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/learn_io/__init__.py", line 26, in <module>

    from tensorflow.contrib.learn.python.learn.learn_io.dask_io import extract_dask_data

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/tensorflow/contrib/learn/python/learn/learn_io/dask_io.py", line 33, in <module>

    import dask.dataframe as dd

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/dask/dataframe/__init__.py", line 3, in <module>

    from .core import (DataFrame, Series, Index, _Frame, map_partitions,

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/dask/dataframe/core.py", line 33, in <module>

    from .utils import nonempty_sample_df

  File "/home/answn3475/anaconda3/lib/python3.5/site-packages/dask/dataframe/utils.py", line 15, in <module>

    is_datetime64tz_dtype = pd.core.common.is_datetime64tz_dtype

AttributeError: module 'pandas.core.common' has no attribute 'is_datetime64tz_dtype'



t-SNE(Stochastic Neighbor Embedding)

  • 차원축소(dimesionality reduction)
  • 시각화(visualization)

Stochastic Neighbor Embedding

  • 고차원 데이터 x를 이웃 간의 거리를 보존하며 저차원의 y로 학습.
  • 거리 정보(Euclidean distances)를 확률적으로 나타냄.

crowding problem
  • 비선형 차원축소 기법 적용 시 다수의 관측치들이 겹쳐 보이는 문제.
  • 기존의 SNE 경우 정규분포를 이용하여 유사도를 계산했지만, 이를 방지하기 위해 T 분포를 사용.

paper : http://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf



MNIST Data 시각화



원본 데이터와 Epoch 1 학습시.


Epoch 5.



Epoch 1 ~ 30



Code: https://github.com/MOONJOOYOUNG/DeepLearning/tree/master/TSNE

Softmax fuction 소프트맥스 함수.

  • 함수의 출력을 '확률'로 해석할 수 있는 함수.
  • 출력 범위 = 0 ~ 1.0
  • 출력 총 합 = 1


import numpy as np

#softmax
a = np.array([0.5,1.6,5.3])
print(a)

exp_a = np.exp(a)
print(exp_a)

sum_a = np.sum(exp_a)
print(sum_a)

y = exp_a / sum_a
print(y)

[0.5 1.6 5.3]

[  1.64872127   4.95303242 200.33680997]

206.93856366988692

[0.0079672 0.0239348 0.968098 ]


def softmax(input):
exp_input = np.exp(input)
sum_input = np.exp(input)
y = exp_input / sum_input
return y


Softmax의 오버플로우 방지

-지수함수의 경우 같이 커질수록 높은 값을 갖게된다. 가령 e^1000을 하게 되면 무한대를 뜻하는 값을 리턴하게 된다. 이를 방지하기위해 지수함수의 특성을 이용해 오버플로우를 방지한다.


-> 지수 함수의 경우 어떤수를 더하거나 빼도 결과는 바뀌지 않는다. 이를 이용해 input 값에 어떠한 값을 더하거나 빼주어 정규화를 한다고 생각하면 이해하기 쉽다.


코드에선 input 값들중 최대값을 빼주는 식으로 연산을 한다.

def softmax(input):
rl = np.max(input)
exp_input = np.exp(input - rl)
sum_input = np.exp(input)
y = exp_input / sum_input
return y

[0.5 1.6 5.3]

[0.00822975 0.02472353 1.        ]

1.0329532735193594

[0.0079672 0.0239348 0.968098 ]

+ Recent posts