kepler-mapper를 사용하여 Topological Data Analysis 같은 것을 시도했습니다.

Topological Data Analysis란?



Deep Learning의 다음은 TDA "토폴로지컬 데이터 분석" 의 기사에도 있듯이, 최근 무언가와 TDA라는 말을 듣게 되었다.

나는 파이썬을 데이터 분석의 메인 언어로 사용하고 있기 때문에 앞으로도 생각하고 파이썬에서 TDA를 움직이고 싶다. ).

이번에는 여러가지 나돌고 있는 소스 가운데, kepler-mapper 을 사용해 Python으로 TDA 해 보았으므로 샘플 소스와 사용법을 정리하려고 생각한다.

우선 이동



우선은 방금전의 kepler-mapper 로부터 km.py 를 DL 한다.
적당한 디렉토리에 두고 이것을 호출하는 프로그램을 작성해 보자.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import km
import numpy as np
import pandas as pd

train = pd.read_csv("test.csv",header = None)
train = train.dropna()
data_columns = [c for c in train.columns if c != 0]
data = np.array(train[data_columns])
y = np.array(train[0])

REDUCER = km.manifold.TSNE()
EPS = 0.3 #最低距離
MIN_SAMPLES = 3 #最低包括ログ数
NR_CUBES = 5
OVERLAP_PERC = 0.3
GRAPH_CHARGE = 50
GRAPH_GRAVITY = 0.5
FILE_NAME = "results.html"
FILE_TITLE = "test_analysis"

# mapperの初期化
mapper = km.KeplerMapper(verbose=1)

# 描写用データの生成(TSNEの場合、N次元のデータを2次元に落とす)
data = mapper.fit_transform(data,projection = REDUCER)

# ノードとリンクを返却する
complex = mapper.map(data,clusterer = km.cluster.DBSCAN(eps=EPS, min_samples=MIN_SAMPLES),nr_cubes=NR_CUBES,overlap_perc=OVERLAP_PERC)

# complexをhtmlに書き出す
mapper.visualize(complex, path_html = FILE_NAME, title=FILE_TITLE, graph_charge=-GRAPH_CHARGE, graph_gravity=GRAPH_GRAVITY, custom_tooltips=y)


먼저 데이터를 읽고 정답 레이블 이외의 데이터
data = np.array(train[data_columns])
로 data에 대입한다.

그런 다음 다양한 매개 변수를 적절하게 설정하십시오.
1. mapperを初期化する(verboseはデバッグモード)
2. 描画用のデータを作成する(次元削減するアルゴリズムをREDUCERに設定。値はkm.pyに設定されている値かsklearn.manifoldにある次元削減アルゴリズム
3. 描画データからノードとリンクを求める。clustererにクラスタリングのアルゴリズムを設定する(サンプルの場合DBSCAN)
4. visualizeにcomplexを渡し、htmlを作成してもらう

이 4단계로 TDA 같은 html 파일을 생성해 줄 수 있다.
csv의 형식은 이런 느낌. 선두행에 정답 라벨을, 이후 1행에 정답 라벨을 나타내는 데이터를 쭉 써 가면 된다.


정답 라벨
데이터 1
데이터 2


A
1
2

B
2
3


TDA 자체는 교사 데이터는 필요없고, visialize할 때의 custom_tooltips에 정답 라벨을 붙여 두면 분석이 하기 쉽기 때문에, 정답 라벨에 대해서는 필요에 따라서 붙이면 된다.

출력의 html 파일은 이런 느낌, 이번은 mnist에 대해서 TDA를 해 보았다.


이 1개 1개의 원(노드)이 클러스터로 되어 있어 선(링크)이 유사도와 같은 것을 나타내고 있는 것 같다.
예를 들면 같은 0에서도 선이 굵은 0도 있으면 가는 0도 있거나, 같은 0에서도 특징의 파악 방법이 보다 세세하게 알고 재미있다.
TDA의 파라미터를 여러가지 바꾸어 보면 또 다른 토폴로지를 할 수 있으므로 여러가지 연구해 보려고 한다.

TDA와 kepler-mapper



TDA에 관한 이론을 조사하고 있으면 노드나 엣지나 여러가지 어려운 표현이 나오는데, 이번 kepler-mapper를 움직여 본 느낌은 이런 것 같다.
  • 어떤 방법으로든 다차원 데이터를 2 차원 데이터로 떨어 뜨린다 (PCA, T-SNE 등)
  • 2 차원 데이터를 어떤 방식 으로든 클러스터링하고 (DBSCAN, K-means 등) 노드와 링크를 얻습니다
  • 그래프로 출력

  • 키가 될 것 같은 것이 1과 2의 로직 선택으로, 이번은 T-SNE와 DBSCAN을 이용하고 있지만 이 경우는 엄밀하게는 TDA가 아닐지도 모른다.

    TDA를 살펴보면 TDA는 단순히 PCA와 같이 차원 삭감을 하는 알고리즘이 아니라 고차원 데이터를 birth와 death라는 2차원 데이터로 표현 가능한 상태로 하는 것이 목적이다. 의 알고리즘인 것 같고, 이 1과 2에 관해서는 본래는 보다 올바른 방법이 있는 것 같은 생각이 든다.
    아마 그래프 표현은 보조적인 것으로, 본래는 퍼시스텐트 호모로지야말로 메인의 이야기일 것이다.

    우선 자기 만족하는 수준으로 프로그램을 이동하는 데 성공했기 때문에,
    여기서부터는 TDA에 관한 이론을 깊게 해 올바른 로직으로 프로그램을 움직이려고 한다.

    좋은 웹페이지 즐겨찾기