相変わらずPCAごときで躓く
なんっちゅうか…かなりへこむけども、PCAが良く分かっていないということで。
まずもって、何をやっているかと言うのはこういうことです。
『16msのフレーム間隔, 8msのフレーム送りで作った音素ラベルの、2^n秒(1<=n<=6程度)毎の出現確率をベクトルの要素としたデータ群を、PCAで3次元に落としてkd-TreeとかOct-tree使ってHash化みたいに出来ないか?』というお話。
で、音素変換ではうちの研究室では前から岡教授が作ったSpectrum Vector Patternという方向性パターンを使ったデータをKL展開で50次元に落として、Bayes識別でもって音素に変えてるんだけども…まぁ、ノイズが乗ってるとか、音声だけじゃなくて音楽もバックに乗ってるとか、かなり過酷な条件で認識出来てるか…と言うのは置いといて、コーディングしたモノを単純にKL展開で3次元に落としたい…と。
で、PCAなんすよ。
PCAって、数理的な話をすると、個の要素を持つベクトルが、
な感じになっているとすると、はの縦に長いMatrixになっていると。とりあえず、ここではXは、クラスの平均でもって既に引いてある、として、で、共分散行列をベクトルの要素に関しての形で出すとすると、
になって、ここでこの共分散行列{tex:V}に対しての固有値問題に行くことになるんすよね?(で合ってると思うんだけど)
でまぁ、もうちょっと行くと、固有値出すやつとして、このケースだと、固有値を並べた対角行列と、各次数に準ずる固有ベクトルを並べたという直交行列があって、
の形で書けるわけで、を固有値展開したとすると、という形で成るわけで…、後は、このを使って、主軸変換を掛ければいいから、
と、 とを考えると、
より、
と置けると。間違ってないかな…まぁ、Matlab上ではどうやら上手く行ってるようなので。
ここからがとりあえず問題。SVDでやろうとした場合での対応で、ここで言うとの対応で、これをSVD掛けた場合、(ここからのは共分散じゃないです)
となって、 は行列、Vは行列になるもののはMatlab上で切り捨て可能で…、そうすると、固有値に対する対角行列はこの場合もで、を右から両辺に掛けてやると、
となって、このケースでもちゃんと主軸変換の定義に乗っ取れるので、後は
として同じ扱い、と捉えて良かったんだよね…?(汗