BL-SOMはアルゴリズムの性質上、主成分分析を必要とします。
ですので、R言語を利用して、機械学習用データセット作成ツールで作成したSOM学習用データセットを用いて
主成分分析を行う必要があります。また、その際にRを用いて以下の3つのデータセットを作成する必要があります。
- vector_Ave.txt ....... 入力平均ベクトルが保存されたファイル
- rotation.txt ....... 第1主成分、第2主成分の固有ベクトル
- sdev.txt ....... 第1主成分、第2主成分の標準偏差
作成した3つのファイルは,機械学習用データセット作成ツールで作成される PCA 又は、PCA01 フォルダの中に保存してください。
DataBaseMakerを使って、位置推定を行いたい環境で測定を行ってください。
BataBaseMakerで保存されたファイル群に対して
機械学習用データセット作成ツールを使って、SOM学習用データセットを作成してください。
2で作成した pca_target.csv 又は、pca_01_target.csv を用いて、主成分分析を行う。
以下に手順を示す。
pca<-read.csv("pca_target.csv",header=TRUE)
pca<-pca[2:ncol(pca)]
ラベルの確認は、以下のコマンドなどで確認する。
fix(pca)
resultF<-prcomp(pca,scale=F)
resultT<-prcomp(pca,scale=T)
固有ベクトルを抜き出して
rotation <- resultF$rotation[,1:2]
or
rotation <- resultT$rotation[,1:2]
任意のファイルパスに保存する
write.table(rotation,"PCA\\rotation.txt",quote=F)
標準偏差を抜き出して
sdev<-resultF$sdev[1:2]
or
sdev<-resultT$sdev[1:2]
任意のファイルパスに保存する
write.table(sdev,"PCA\\sdev.txt",quote=F)
行列の次元毎の平均値を計算して保存
aveVec<-colMeans(pca)
write.table(aveVec,"PCA\\vector_Ave.txt",quote=F)
※BLSOM.cpp, BLSOM.h はEigenライブラリを使用します。インストールするか、直下に保存してincludeしておいてください。 BLSOM.cpp、BLSOM.h、position.h をincludeすれば、お好きなプロジェクトで利用できますが、二次配布は禁止です。(誰もしないと思うけど…)
また、BLSOM.cppでは、cudaではなく、ampを利用している為、実行速度がcuda比べて若干遅い。設計がampの制約に縛られている。等の問題点があります。
もし、不明なエラーが出た場合は、GPUの性能不足である可能性があります(1処理が2000msを超えるとカーネルが強制終了する等の縛りなどがある)
以下に、注意すべき関数のみ説明を行う。 main.cppの36行目に利用されている **averageClassication(std::string filepath)**について
batchSom.averageClassification("任意のファイルパス\\No.1.epc"); //実行時、average_epoc.txtが作成される。
では、U-matrixで得られるイメージ画像に割り振られる座標に割り振られた連番に対応するベクトルデータを選択する。
サンプルでは、平均ベクトルを作るのが面倒なので、Np.1.epcをU-matrix上に割り振っている。 この時、対象となるファイルは、epc形式と同じフォーマットで作成する必要がある。(ラベル、ヘッダが必要。区切り文字は \t )
batchSom.averageClassification("任意のファイルパス\\No.1.epc");
で、得られたaverage_epoc.txtと
std::string mapName[] = { "HimejiGF","UnivHyogo2_4","UnivHyogo2_4_01" };
std::string outputName = mapName[1] + "_iA_" + std::to_string(initAlfa) +"_iB_" + std::to_string(initBeta) +"_timeA_" + std::to_string(timeAlfa) +"_timeB_" + std::to_string(timeBeta) +"_Learn" + std::to_string(learn_num) +".umat";
std::cout << "Output Umatrix" << std::endl;
std::ofstream outputfile(outputName);
for (int i = 0; i < batchSom.MapHeight(); i++){
for (int j = 0; j < batchSom.MapWidth(); j++){
outputfile << umat[i][j] << "\t";
}
outputfile.seekp(-1, std::ofstream::ios_base::end);
outputfile << "\n";
}
outputfile.seekp(-1, std::ofstream::ios_base::end);
outputfile << "\0";
outputfile.close();
std::cout << "Finish Umatrix" << std::endl;
で、得られたumat形式のファイルを利用して、U-matrixを実行する。
推定エリア色分けツールを利用して、クラスタリング結果を可視化する。