この記事は古川研究室 Advent_calendar 9日目の記事です。
本記事は古川研究室の学生が学習の一環として書いたものです。内容が曖昧であったり表現が多少異なったりする場合があります。
はじめに
Beverage Preference Data Set の紹介をかねて記事を描こうと思ったのですが、まだプログラムが動いていないので、随時編集していきます.
Beverage Preference Data Set
Beverage Preference Data Set は古川研究室が公開している関係データの実データです. 細かい規約等はリンク先を参考にしてください.
604人のユーザーに 14種類の飲料水 を 11のシチュエーションごとにどう評価するのかアンケートをとったデータです.
つまり, (人) x (飲料水) x (状況) の3つの母集団の要素の組み合わせによって観測された関係データです.
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$$
U(ユーザー)は楕円状に散布してて, V(飲料水)は2種類だけ他と距離が離れて違うものがありそうです.
# まとめ
HOSVDとかTuckerとかも試してみたいです. 時間が取れたらまた手を入れてみます.
今回は線形なテンソル分解手法を試しましたが、非線形テンソル分解に相当する Tensor SOM も存在します.
気になる方は是非以下のリンクでぽちぽち遊んでみてください.