データの検索

トポロジーのデータの検索方法のチュートリアル

このチュートリアルではirisデータを可視化し、検索します。以下のことが学べます。

  • どのようにReNomTDAを使ってトポロジーを作成するか。

  • どのようにトポロジーを検索するか。

必要なモジュール

In [1]:
import numpy as np

from sklearn.datasets import load_iris

from renom_tda.topology import Topology
from renom_tda.lens import PCA

データセット

次にデータをロードします。scikit-learnのload_iris関数を使います。

irisデータセットは4つの変数からなる150行のデータセットです。

In [2]:
iris = load_iris()

data = iris.data
target = iris.target

ラベルデータとカラム名データの作成

テキストデータとカラム名データの作成

このチュートリアルではアヤメの品種名を使います。

In [3]:
setosa = ["setosa"] * 50
versicolor = ["versicolor"] * 50
versinica = ["versinica"] * 50
species = np.array(setosa + versicolor + versinica).reshape(-1, 1)

text_data_columns = ["species"]
number_data_columns = ["sepal length", "sepal width", "petal length", "petal width"]

トポロジーインスタンスの作成

次にトポロジークラスのインスタンスを作成します。

In [4]:
topology = Topology()

データのロード

次にインスタンスにデータをロードします。
load_data関数を使って、インスタンスにデータを入力します。
In [5]:
topology.load_data(data, number_data_columns=number_data_columns, text_data=species, text_data_columns=text_data_columns)

入力したデータは次のように確認できます。

In [6]:
print(topology.number_data_columns)
['sepal length' 'sepal width' 'petal length' 'petal width']
In [7]:
print(topology.number_data.shape)
(150, 4)
In [8]:
print(topology.text_data_columns)
['species']
In [9]:
print(topology.text_data.shape)
(150, 1)

ポイントクラウドの作成

次に、ポイントクラウドと呼ばれる低次元空間に投影したデータを作成します。

データを低次元空間に射影する際に2つのパラメータを設定します。

metricは、データ同士の距離をどのように測るかの指標となります。lensとは、ポイントクラウドに投影する軸になります。

このチュートリアルではMetricをNoneに、lensをPCAに設定します。これは、通常のPCAを用いた2次元への次元削減を意味します。

In [10]:
metric = None
lens = [PCA(components=[0, 1])]
topology.fit_transform(metric=metric, lens=lens)
None
projected by PCA.

位相空間へマッピング

次に、トポロジーを作成します。

map関数を使ってポイントクラウドのデータを位相空間にマッピングします。

このときに、3つのパラメータを設定します。

resolutionとは、ポイントクラウドの分割の数を表していて、ノードの数に関係します。

overlapとは、データの繋がりやすさを表します。

epsとmin_samplesはデータをクラスタリングする時に使います。

In [11]:
topology.map(resolution=15, overlap=0.5, eps=0.1, min_samples=3)
created 70 nodes.
created 192 edges.

トポロジーの色付け

次にcolor関数を使ってトポロジーの色を決定します。

このチュートリアルでは、irisデータセットのラベルを用いて色付けします。

color_methodは’mean’か’mode’を、color_typeは’rgb’か’gray’を指定します。

In [12]:
topology.color(target, color_method="mode", color_type="rgb")
topology.show(fig_size=(10, 10), node_size=10, edge_width=2)
../../../_images/notebooks_tda_search-data_notebook_21_0.png

ノードIDからデータの検索

次にノードIDからデータを検索します。

ノードデータを表示することができます。またこの関数は同様のデータをreturnします。

In [13]:
return_data = topology.search_from_id(0)
node id: 0
coordinate: [ 0.02756928  0.28271102]
data ids: [8, 13, 38]
text data columns:
['species']
text data:
[['setosa']
 ['setosa']
 ['setosa']]
number data columns:
['sepal length' 'sepal width' 'petal length' 'petal width']
number data:
[[ 4.4  2.9  1.4  0.2]
 [ 4.3  3.   1.1  0.1]
 [ 4.4  3.   1.3  0.2]]
In [14]:
return_data
Out[14]:
{'coordinate': array([ 0.02756928,  0.28271102]),
 'data_ids': [8, 13, 38],
 'id': 0,
 'number_data': array([[ 4.4,  2.9,  1.4,  0.2],
        [ 4.3,  3. ,  1.1,  0.1],
        [ 4.4,  3. ,  1.3,  0.2]]),
 'number_data_columns': array(['sepal length', 'sepal width', 'petal length', 'petal width'],
       dtype='<U12'),
 'text_data': array([['setosa'],
        ['setosa'],
        ['setosa']],
       dtype='<U10'),
 'text_data_columns': array(['species'],
       dtype='<U7')}

値からのノードデータの検索

次に値を使ってノードデータを検索します。

始めに検索に使う辞書を作成します。
検索の辞書は4つのパラメータを持ちます。

品種が’versicolor’のノードを検索します。

In [15]:
search_dicts = [{
    "data_type": "text",
    "operator": "=",
    "column": "species",
    "value": "versicolor"
}]
その時search_from_values関数を使います。
この関数は3つの引数を持ちます。
search_dictsは検索条件のリストを入力します。

複数の検索条件を指定することもできます。

インスタンスに入力していないデータから検索することもできます。
この時、targetという引数を使います。
次に、検索するカラムをカラム名で入力するか、カラムのインデックスを入力するか選択できます。
search_typeの引数が’column’のときカラム名で検索し、’index’のときカラムのインデックスから検索します。
In [16]:
topology.color(target, color_method="mode", color_type="rgb")
node_index = topology.search_from_values(search_dicts=search_dicts, target=None, search_type="column")
topology.show(fig_size=(10, 10), node_size=10, edge_width=2)
../../../_images/notebooks_tda_search-data_notebook_30_0.png

その他の場合

In [17]:
search_dicts = [{
    "data_type": "number",
    "operator": ">",
    "column": 0,
    "value": 6.0
}]
In [18]:
topology.color(target, color_method="mode", color_type="rgb")
node_index = topology.search_from_values(search_dicts=search_dicts, target=None, search_type="index")
topology.show(fig_size=(10, 10), node_size=10, edge_width=2)
../../../_images/notebooks_tda_search-data_notebook_33_0.png

複数の検索パラメータを入力します。

In [19]:
search_dicts = [{
    "data_type": "number",
    "operator": "=",
    "column": "target",
    "value": 1
}, {
    "data_type": "number",
    "operator": ">",
    "column": "sepal length",
    "value": 6.0
}]
In [20]:
topology.color(target, color_method="mode", color_type="rgb")
node_index = topology.search_from_values(search_dicts=search_dicts, target=target, search_type="column")
topology.show(fig_size=(10, 10), node_size=10, edge_width=2)
../../../_images/notebooks_tda_search-data_notebook_36_0.png