パターン認識演習 課題6課題6 フィッシャーの判別分析
課題6.1 プログラムの作成
フィッシャーの判別分析を行うプログラムを作成せよ。
以下にプログラムの流れの例を示す。
1. クラスω1 に属するデータをファイルから読み込む
2. クラスω2 に属するデータをファイルから読み込む
3. クラスω1 に属するデータの平均m 1 を求める
4. クラスω2 に属するデータの平均m 2 を求める
5. クラスω1 の変動行列S1 を求める
6. クラスω2 の変動行列S2 を求める
7. クラス内変動行列Sw を求める
8. Sw の逆行列Sw -1 を求める
9. 変換ベクトルw（教科書では、行列A）を求める
10. 変換ベクトルwを正規化
11. クラスω1 のデータに対する変換値yを求め、ファイルに出力12. クラスω2 のデータに対する変換値yを求め、ファイルに出力
なお、逆行列は以下の関数を利用してよい。
逆行列を求める関数inverse
逆行列を求める関数inverseの使用例#include <stdio.h>#include <stdlib.h>main(){
int i, j, k, n;double **mat, **inv;/*次元入力*/printf( "Dimension=" );scanf( "%d", &n);/* メモリ確保 */mat = (double**)malloc(n*sizeof(double*));inv = (double**)malloc(n*sizeof(double*));for( i = 0; i < n; i++ ){mat[i] = (double*)malloc(n*sizeof(double));inv[i] = (double*)malloc(n*sizeof(double));}/*行列入力*/printf( "Matrix=¥n" );for( i = 0; i < n; i++ ){for( j = 0; j < n; j++ ){scanf( "%lf", &mat[i][j] );}}/*逆行列*/inverse(mat, inv, n);/*逆行列出力*/
printf( "Inverse Matrix=¥n");for( i = 0; i < n; i++ ){for( j = 0; j < n; j++ ){printf( "%g ", inv[i][j] );}printf("¥n" );}}Dimension=2
Matrix=
1 2
2 3
Inverse Matrix=-3 2
2 -1

入力ファイル例-----cls1.dat----4 2 //データ数 次元数
1 2 //x 1
4 4 //x 22 11 //x 3
5 11 //x 4-----cls2.dat----4 2 //データ数 次元数
5 2 //x 56 4 //x 66 8 //x 711 10 //x 8

出力ファイル例-----cls1.out-----0.234613 1 //y 1 クラス-2.34205 1 //y 2 クラス
1.98707 1 //y 3 クラス-0.822167 1 //y 4 クラス-----cls2.out-----3.98027 2 //y 5 クラス-4.21488 2 //y 6-2.81128 2 //y 7

クラス-6.79154 2 //y 8クラス

課題6.2クラス

手書き文字データの判別手書き文字データのGlucksmanの特徴を用いて、 二つの文字クラスを判別分析せよ。
ただし，このとき16次元のGlucksmanの特徴を用いる物とする．
16次元のGlucksmanの特徴を求めるには，前回の課題で配布したglucksman.hで定義されている定数DIMを 2にすればよい． 具体的には，glucksman.hを#ifndef _GLUCKSMAN/*16次元のGlucksmanの特徴を求める場合は2*//*81次元のGlucksmanの特徴を求める場合は3*//*コメントアウト*//*#define DIM 3*//*追加*/#define DIM 2#define ELM_SIZE (DIM*DIM*DIM*DIM)
typedef struct {int **data;
int width;
int height;} MojiData;
void getGlucksmanVector(MojiData *mojiData, int data[]);#endif /*_GLUCKSMAN*/とすればよい．
用いるデータは、learndataとし、一クラス100個のデータを用いる。
また、データはGlucksmanの特徴に変換し利用する。
比較は、すべての組み合わせについて行い，それぞれのクラス内クラス間変動比(教科書P.117
式6.97〜98)を求めよ．
求めたクラス内クラス間変動比は表にまとめること．
なお，
0と70と82と34と98と9については，判別結果の図をレポートに載せること．

次元の圧縮
Glucksmanの特徴では、判別しようとするすべての文字において， 同一の値をとる要素が存在することがある。
このような要素は，判別に利用できないばかりでなく， このような要素を利用することで、逆行列Sw -1 を 求めることができなくなる。
そのため、このような特徴量として役に立たない要素を排除する必要がある。
すなわち、すべての文字において0となる要素をのぞいた特徴量を用いて 比較を行うこと。
次元圧縮の例

0 0 1 2 50 3 1 2 40 4 3 4 8という特徴量があったならば、最初の要素はすべての文字で値が0であるため， 特徴量として利用できない． そこで，
0 1 2 53 1 2 44 3 4 8と該当する要素を削除する。

Gnuplotの利用方法
課題6.2の結果を図示の際には、以下のようにgnuplotを利用してよい。
gnuplotの使い方:
ファイル"cls1.out", "cls2.out"をy軸の範囲0-3でプロット。
同じ図をepsファイルとして、"fisher.eps"に出力する$ gnuplot
G N U P L O T
Version 4.0 patchlevel 0
last modified Thu Apr 15 14:44:22 CEST 2004
System: Linux 2.4.27-2-386
Copyright (C) 1986 - 1993, 1998, 2004
Thomas Williams, Colin Kelley and many others
This is gnuplot version 4.0. Please refer to the documentation
for command syntax changes. The old syntax will be accepted
throughout the 4.0 series, but all save files use the new syntax.
Type `help` to access the on-line reference manual.
The gnuplot FAQ is available fromhttp://www.gnuplot.info/faq/
Send comments and requests for help to<gnuplot-info@lists.sourceforge.net>
Send bugs, suggestions and mods to<gnuplot-bugs@lists.sourceforge.net>

Terminal
gnuplot>
gnuplot>
gnuplot>
gnuplot>
gnuplot>$ ls
cls1.out$

type set to 'x11'
plot"cls1.out" u 1:$0,"cls2.out"u 1:$0 //cls1.outとcls2.outをプロット
set terminal png //出力形式をpngファイルにする
set output "fisher.png" //出力ファイルをfisher.pngにする
replot //いざ出力
quit //gnuplot終了
cls2.out fisher.png←できたプロット結果:fisher.png
クラスω1 のデータとクラスω2 のデータが判別出来ていることが確認できる。

課題6.3

変換ベクトルに関する考察

課題6.2で得られた変換ベクトルwについて， 特に特徴的な変換ベクトルを1つあげ考察せよ．

課題6.4

筆者の判別分析

実験で取得した「5」について，自分で書いた文字と他人が書いた文字で判別可能かどうか確認
せよ．
各自が書いた5のデータについては，こちらからダウンロードできる．
解凍方法は以下の通り。
$ tar zxf five.tgz

解凍が終了すると、
学籍番号/5-00.dat
学籍番号/5-01.dat

・・・
学籍番号/5-29.datというデータが得られる． 自分の学籍番号の直下に入っているデータは，自分で書いた文字である．
自分で書いた5と他人が書いた5について判別分析可能かどうか調べよ．
なお，同一文字を処理するため，次元を圧縮しなければ逆行列は求められない可能性が高いので， 注意すること．

応用課題6.5

いろいろなデータの判別分析

時間があまっている人はやってください
興味がある分野のデータを用いた判別分析せよ。
もし、判別が困難なデータだった場合は、その理由を考察すること。