rTensorで多次元主成分分析をやってみた

RのパッケージのrTensorを使って多次元主成分分析を行ってみた。

多次元主成分分析のやり方は、

http://www.iri.pref.kumamoto.jp/sgk/2011/cdrom/thesis/04_hall/04_session/444.pdf

からダウンロードできる日本語文献のpdfファイル ”多次元主成分分析による医療データの特徴分析”を参考にした。ただし、記述に間違いがあるようなので、同じ著者らによる英語論文"Application of Multi-Dimensional Principal Component Analysos to Medical Data"

https://pdfs.semanticscholar.org/280e/b22f667a781b5c6b19ddc8e270db111daf6b.pdf

も参考にした。具体的には、日本語論文の(2)式の二階テンソルの平均の計算の説明にある総和をnでわるという処理の意味がわからなかったのだが、英語論文の記述から、日本語文献の記述は間違いで、何について平均をとれば良いのかがわかった(英語論文 式(1))。また、日本語文献では中心化処理しかされていないが、英語論文では標準偏差で割って正規化されていた(英語論文 式(2),(3))。また、日本語文献の式(4), (5)の処理の意味が理解できなかったのだが、英語論文 式(4), (5)から、日本語文献の記述は誤りだとわかった。

HOSVDの処理や意味については

HOSVDとHOOIによる画像の低ランク近似 - Qiita

HOSVDによる画像の低ランク近似 ステップ・バイ・ステップ - Qiita

がわかりやすかった。日本語文献には、各モードの主成分の寄与率の計算式は書かれているのだが(式(7))、特異値をどこから得るのかがわからなかった。HOSVDの処理では、テンソルを行列に変換してSVDを適用しているので、ここから得ているのだろうと推測された。rTensorのhosvdの出力には、特異値の情報は含まれていなさそうなので、寄与率を計算するには、

HOSVDによる画像の低ランク近似 ステップ・バイ・ステップ - Qiita

pythonのコードをもとに自作する必要がありそう。rTensorのコードはGitHubで公開されているようなので、hosvdを書きなして特異値を出力できる関数を作成しても良いかもしれない。

https://github.com/cran/rTensor/blob/master/R/rTensor_Decomp.R