トップ   新規 一覧 単語検索   ヘルプ   最終更新のRSS

MATLAB Tips のバックアップ差分(No.2)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
&pgid(,MATLAB Note);

*MATLAB Note / MATLAB Tips [#ud04378b]
#contents

**オンデマンドセミナー「機械学習: データの自動分類とパターン識別 」 [#o2e6fd9b]
-http://www.mathworks.co.jp/webex/recordings/JP_20110823_MachineLearning/index.html

-Neural Network ToolboxのGUIツール
--トレーニングデータ:学習に使うデータ、デフォルトではデータ全体の70%
--バリデーションデータ:過適応を防ぐため、学習途中のモデルにこのデータを与え、認識率が悪くなりだす前に学習を止める。15%
--テストデータ:上記プロセスに一切使わない、最終的なモデルの評価用データ。15%
--学習結果は混同行列の形で視覚化できる。各データの正解データが何で、モデルではどのクラスタに分類されたか。

-ランダム要素統制
--関数の最初に以下のコードを入れておけば同じ乱数が生成されるのでニューラルネットの結果が同じになる。
 seed = 0;
 rng(seed);
--※ニューラルネット、決定木は乱数に依存する

-バギングされた決定木
--2300特徴量、4クラス、データ数60で正確高速な分類
--ランダムに選んだデータを使って複数の決定木を作り、多数決で最適なものを作る
--DeltaCritDecisionSplit で特徴量ごとの寄与度を表示できる(数値が大きいほど寄与度大)。
--信頼性の値も得られる

-Statistics Toolbox で可能な機械学習の手法の例
--Linear and Quadratic Discriminant Analysis
--決定木
--ナイーブベイズ
--特徴量選択アルゴリズム(Sequential Forward and Backward Feature Selection)
--モデル選択(クロスバリデーション、混合行列、ROCパフォーマンス曲線)

-Bioinformatics Toolbox で可能な機械学習の手法の例
--SVM
--K-近傍法
--Feature ranking, randomized feature selection

**コマンド [#g3f1131e]
***基本 [#o0604f9e]
-MATLABの関数やコマンドは、すべて
 >> edit コマンド(関数)名
とすることで中身を確認できます。
-各コマンドのヘルプ:MATLABウインドウ上で、
 >> help コマンド名

***プログラミング全般 [#z7a66518]
-EXIST   変数や関数が定義されているかどうかのチェック
-NARGIN  [[引数の数を得る:ftp://ftp.eng.auburn.edu/pub/bhidetm/t/jhelp/techdoc/ref/nargin.html]]

***文字列操作 [#l2891eb1]
-STRCAT   文字列を連結する

***文字列マッチング [#he4116f4]
-STRFIND   一方の文字列内にある文字列の検出
-STRMATCH   適合する文字列の検出

***ベクトル操作 [#ed75cfc7]
-ROT90   行と列を入れ替え
-FIX(X) Xの要素をゼロ方向の最も近い整数に丸める(小数点以下切り捨て)

***重複なしで配列をソート [#uefbda75]
-関数 unique を使う。

***引数の数を得る [#t0b0c3f8]
-例外処理などのために、関数に与えられた引数の数を得るには、nargin を使います。

***NaNを検出する [#y08cf77d]
-[[NaNを取り除く(Nobuhito Mori):http://www.oceanwave.jp/index.php?MATLAB/NaN%A4%F2%BC%E8%A4%EA%BD%FC%A4%AF]]

***2つのベクトルの共通部分を得る(積集合) [#d2bfbbfa]
-[[intersect 関数:http://www.mathworks.co.jp/jp/help/matlab/ref/intersect.html]]を使います。


**セル配列 [#a13075f6]
***セル配列を数値型に変換 [#h347466a]
-[[参考 データタイプ:http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/matlab/ref/?/matlab/support/manual/r13/toolbox/matlab/ref/func_b23.shtml]]
-セル配列に、文字列型の数字データが入っているときは、配列に変換しようとしても、エラーが出ます。
 C = {'0';'1.2'}
 cell2mat(C)
 
 ??? エラー: ==> cat
 CAT引数の次元が一致していません
-ファイル読み込みの時などによく起こるエラーです。
-解決するには、
 C = {str2num('0');str2num('1.2')}  %数値型でセル配列に格納
 cell2mat(C)
 
 ans =
          0
     1.2000
-ファイル読み込みは以下のようにすればOK(ファイル中に、数字データしかない場合)
 inputLine = textread( 'test.txt', '%s');  %セル配列としてinputLineに格納
 dataLine = [];
 for count = 1:1:length(inputLine)         %各行を読み込む
     dataLine = [dataLine ; str2num(inputLine{count, :})];
 end
 dataLine

***セル配列の宣言、参照、削除 [#v8257d0e]
-宣言は
 A = cell(3,1);
 A{1} = 'a'
 A{2} = 'aa'
 A{3} = 'aaa'
-参照は
 >> A(2)
 
 ans = 
    'aaa'
 
 >> A{2}
 
 ans =
 aaa
-2番目のセルを削除したいとき
 >>A(2) = []
 
 A = 
     'a'
     'aaa'

***文字列として取り出す [#afa6799d]
 A = cell(3,1);
 A{1} = 'a'
 A{2} = 'aa'
 A{3} = 'aaa'
 
 A(1) = strcat(A(1),'b');
 A
 
 A = 
     'ab'
     'aa'
     'aaa'

***各セルに次数の異なる数値データを代入する [#j8fb64aa]
 >> A = cell(2,1)
 
 A = 
      []
      []
 
 >> A{1} = [1 2]
 
 A = 
     [1x2 double]
               []

 >> A{2} = [1 2 4]
 
 A = 
     [1x2 double]
     [1x3 double]
 
 >> A{2}
 
 ans =
      1     2     4
 
 >> A(2)
 
 ans = 
     [1x3 double]

***セル配列内の条件抽出 [#t2ea7613]
-find関数は使えないので、[[strcmp関数:http://www.mathworks.com/help/ja_JP/techdoc/ref/strcmp.html;jsessionid=n5sVMH2QJd6Jjp6QWhT3mYZLYGlT2LKByqnPTC0nJzDJ5Hh1ngDP!2139304876]] を使います。

***セル配列が空行列(Empty cell array)かどうか [#rfc419c2]
-[[isempty関数:http://www.mathworks.com/help/ja_JP/techdoc/ref/is.html]]を使います。

**文字列処理 [#g84d8ad3]
***文字列を分割するには [#l7b24e66]
-[[split.m:http://shower.human.waseda.ac.jp/~m-kouki/matlab/split.m]]

***引用符を文字列として指定するには [#je1ab029]
-文字列式で引用符記号「'」を使用するには、シングルクォートを2つ重ねて「''」とします。
-例
 >> input = 'test dayo.';             %変数inputに文字列「test dayo.」を代入
 >> output = strcat('''',input,'''')  %変数outputに「'」+ input +「'」を代入(strcat:文字列を連結する)
これでoutputの中身は、「'test dayo.'」となります。

-[[その他のエスケープ文字を表示するには:http://shakosv.sk.tsukuba.ac.jp/ShakoDoc/MATLAB5/jhelp/techdoc/ref/sprintf.html]]


**呼び出し [#r07f4695]
***コマンドラインからMATLABを呼び出す [#we8fe515]
-Mファイルをコマンドラインから実行するには
--testmatlab.m
 A = [1 2 3 ;
     4 5 6 ;
     7 8 9];
 newA = calcA( A );
 csvwrite('testmatlab.csv', newA);
 disp(A); 
--calcA.m
 function [ newA ] = calcA( A )
 newA = A * 10;
-上記を同じディレクトリにおいて、
 /etc/matlabR2007b/bin/matlab -nodisplay < testmatlab.m
--testmatlab.csv ができる。
--testmatlab.m は function 表記ができない (Error: Function definitions are not permitted at the prompt or in scripts. になる)が、中で別の関数を呼び出すことは可能。
***JavaからMATLABを呼び出す [#ze059395]
-引用元:[[HOWTO Call Matlab from Java:http://shatterednirvana.wordpress.com/2007/07/12/howto-call-matlab-from-java-kinda/]]
-'''[[CallingMatlab.java:http://shower.human.waseda.ac.jp/~m-kouki/pg/CallingMatlab.java.txt]] '''
--通常の出力とエラーメッセージを別のストリームで取得しています。
--エラーサンプル:'''[[testmatlabE.m:http://shower.human.waseda.ac.jp/~m-kouki/pg/testmatlabE.m]]'''
--実行例
 $ java CallingMatlab testmatlabE.m
 0
 1                                      < M A T L A B >
 2                          Copyright 1984-2007 The MathWorks, Inc.
 3                                 Version 7.5.0.338 (R2007b)
 4                                       August 9, 2007
 5
 6
 7          To get started, type one of these: helpwin, helpdesk, or demo.
 8          For product information, visit www.mathworks.com.
 9
 10       >> >> >> >>      1     2     3
 11            4     5     6
 12            7     8     9
 13
 14       >>
 ERROR    ??? Error using ==> plus
 ERROR    Matrix dimensions must agree.
 ERROR
 ERROR    ??? Undefined function or variable 'newA'.
 ERROR
 ERROR

***MATLABからJavaプログラムを使うには [#q73b1a94]
-[[参考 MATLABからのJavaの利用:http://dl.cybernet.co.jp/matlab/support/manual/r14/toolbox/matlab/matlab_external/?/matlab/support/manual/r14/toolbox/matlab/matlab_external/ch_java.shtml]]
+使いたいJavaプログラムのclassファイルを作成して、ひとつのフォルダにまとめておきます。
+ (MATLABのインストールフォルダ)\toolbox\local\classpath.txt の最後の行に、上記のclassファイル用フォルダのパスを追記します。(もしくは、MATLABのウインドウ上でclassファイルフォルダを右クリック→「パスに追加」)
+MATLABを再起動します。
+MATLABのコマンドラインで、
 >> javaMethod(メソッド名,クラス名,引数1,引数2,...) 
とすることで実行できます。詳しくはMATLABのヘルプ(>> help javaMethodと入力)を参照してください。

***MATLABからCプログラムを使うには [#yb816f82]
-[[参考 MATLABからの C および Fortran プログラムの呼び出し:http://dl.cybernet.co.jp/matlab/support/manual/r14/toolbox/matlab/matlab_external/?/matlab/support/manual/r14/toolbox/matlab/matlab_external/ch_mex_i.shtml]]
-[[MEX-ファイル チュートリアル:http://www.cybernet.co.jp/matlab/library/library/detail.php?id=TT024]]

**入出力 [#f9b1ac73]
-[[mファイル実行中にキーボード入力を受け付ける :http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/matlab/matlab_prog/?/matlab/support/manual/r13/toolbox/matlab/matlab_prog/ch1_mf43.shtml]]

**例外処理 [#k612fab3]
-[[参考:http://dl.cybernet.co.jp/matlab/support/manual/r14/toolbox/matlab/matlab_prog/?/matlab/support/manual/r14/toolbox/matlab/matlab_prog/ch_error.shtml]]

**時間処理に関して [#p4cbddf5]
***タイマー [#z483a435]
-[[あるコードからあるコードまでの実行時間を計る(ストップウォッチタイマ):http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/matlab/ref/?/matlab/support/manual/r13/toolbox/matlab/ref/tic.shtml]]
-[[キーボードからの反応時間測定:http://www.dips-kwansei.gr.jp/psyche/matlab_intro/response.html]]
-WAV ファイルの再生時間を知るには
--音を取り込んだ変数のベクトル数をサンプリング周波数で割ります。
 filename = '001.wav';
 [data,Fs,Bits] = wavread(filename);
 totaltime = (length(data) - 1) / Fs      %Fsからファイルの秒数を取得
--注意 length(data) は、(Fs * ファイルの秒数) + 1 になるので(「1秒につき4サンプル」なら、0~1秒区間のサンプル数は5個)、(length(data)-1) をサンプリング周波数で割ります。

***Psychophysics Toolbox の時間同期に関して [#l83f363b]
-時間の同期はWindowsよりもMacの方がうまくいくらしい。
--[[松井様からいただいたメール(限定公開):http://shower.human.waseda.ac.jp/~m-kouki/pass/HowToPsycoToolbox.txt]]

**コマンドラインの命令文を文字列としてプログラム内で実行するには [#xc73851e]
-[[eval関数:http://www.mathworks.co.jp/help/ja_JP/techdoc/ref/eval.html]]を使います。
-(決まった文字列)(数字).mat のようなファイルを 1~200 まで順番に load で読み込む、といったときに有効。