LoginSignup
7
1

More than 3 years have passed since last update.

Beverage Preference Dataset(関係データ) にテンソル分解かけて可視化してみた

Last updated at Posted at 2019-12-09

この記事は古川研究室 Advent_calendar 9日目の記事です。
本記事は古川研究室の学生が学習の一環として書いたものです。内容が曖昧であったり表現が多少異なったりする場合があります。

はじめに

Beverage Preference Data Set の紹介をかねて記事を描こうと思ったのですが、まだプログラムが動いていないので、随時編集していきます.

Beverage Preference Data Set

Beverage Preference Data Set は古川研究室が公開している関係データの実データです. 細かい規約等はリンク先を参考にしてください.

604人のユーザーに 14種類の飲料水 を 11のシチュエーションごとにどう評価するのかアンケートをとったデータです.

つまり, (人) x (飲料水) x (状況) の3つの母集団の要素の組み合わせによって観測された関係データです.
image.png

import

Beverage Preference Data Setをインポートする手順は以下になります.
download_file と zip_extractのメソッドは
Python Tips:zip ファイルをインターネットからダウンロードして利用したい
からお借りしました.

import pandas as pd
import numpy as np

filename = download_file('http://www.brain.kyutech.ac.jp/~furukawa/beverage-e/BeveragePreferenceDataset.zip')
zip_extract(filename)
df = pd.read_table('./BeveragePreferenceDataset/Beverage604.txt', header=None, delim_whitespace=True)
df.shape
# (8456, 11)

このDataframeを3次のテンソルデータに変換します.


X = np.zeros((604, 14, 11))
for i in range(X.shape[0]):
  Before = i * 14
  X[i] = df.iloc[Before:(14*(i+1))].values
X.shape
# (604, 14, 11)

テンソル分解

CP 分解

CP分解については
先駆者様(pytorchでテンソル分解(CP分解))がいらっしゃるので軽く説明してちゃっちゃと実行しちゃいます.

CP 分解は行列分解の率直な一般化で, 3次テンソル$X$ を3つのベクトルを使って 以下のように分解します.

$$X = \sum_{r=1}^R u_r \circ v_r \circ w_r$$

image.png

$R=1$
image.png

$R=2$
image.png

image.png

U(ユーザー)は楕円状に散布してて, V(飲料水)は2種類だけ他と距離が離れて違うものがありそうです.

 まとめ

HOSVDとかTuckerとかも試してみたいです. 時間が取れたらまた手を入れてみます.
今回は線形なテンソル分解手法を試しましたが、非線形テンソル分解に相当する Tensor SOM も存在します.
気になる方は是非以下のリンクでぽちぽち遊んでみてください.

TensorSOM3Viewer(飲料水データ)ver日本語

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1