AND演算(AND operation)でSVM(Support Vector Machine)で解いてみる
サンプルコード:
echo on
% AND演算でSVM(サポートベクターマシン)で解いてみる
X=[0 0; 0 1; 1 0; 1 1; ];
G=[0; 0; 0; 1;];
% クロスバリデーションインデックスの生成
[train, test] = crossvalind('holdOut',G);
cp = classperf(G);
% サポートベクトルマシーンクラスタリングの学習
svmStruct = svmtrain(X(train,:),G(train),'Kernel_Function','polynomial', 'showplot',true,'Method','LS');
%svmStruct = svmtrain(X(train,:), G(train), 'showplot', true, 'Kernel_Function', 'polynomial', 'Polyorder', 3);
%r=svmtrain(train_set,%train_response,'Kernel_Function','rbf','showplot','true');
%svmStruct = svmtrain(X(train,:), G(train), 'showplot', true, 'Kernel_Function', 'quadratic');
% サポートベクトルマシーンを利用したクラスタリング
classes = svmclassify(svmStruct,X(test,:),'showplot',true);
grid on
% クラスタリングのパフォーマンスを計算
classperf(cp,classes,test);
% 正答率を表示する
cp.CorrectRate
実行結果:
% AND演算でSVM(サポートベクターマシン)で解いてみる
X=[0 0; 0 1; 1 0; 1 1; ];
G=[0; 0; 0; 1;];
% クロスバリデーションインデックスの生成
[train, test] = crossvalind('holdOut',G);
cp = classperf(G);
% サポートベクトルマシーンクラスタリングの学習
svmStruct = svmtrain(X(train,:),G(train),'Kernel_Function','polynomial', 'showplot',true,'Method','LS');
%svmStruct = svmtrain(X(train,:), G(train), 'showplot', true, 'Kernel_Function', 'polynomial', 'Polyorder', 3);
%r=svmtrain(train_set,%train_response,'Kernel_Function','rbf','showplot','true');
%svmStruct = svmtrain(X(train,:), G(train), 'showplot', true, 'Kernel_Function', 'quadratic');
% サポートベクトルマシーンを利用したクラスタリング
classes = svmclassify(svmStruct,X(test,:),'showplot',true);
grid on
% クラスタリングのパフォーマンスを計算
classperf(cp,classes,test);
% 正答率を表示する
cp.CorrectRate
ans =
1
FMINBND 1 変数の範囲の制約付きの非線形関数の最小化
サンプルコード:
echo on f = 'x^2 - 2*x + 5' xmin=fminbnd(f,-5,5) fx = inline(f) % INLINEオブジェクトの作成 fx(xmin)
実行結果:
echo on
f = 'x^2 - 2*x + 5'
f =
x^2 - 2*x + 5
xmin=fminbnd(f,-5,5)
xmin =
1
fx = inline(f) % INLINEオブジェクトの作成
fx =
インライン関数:
fx(x) = x^2 - 2*x + 5
fx(xmin)
ans =
4
TAYLOR テイラー級数展開
サンプルコード:
echo on syms x n = 4 taylor(exp(x),n) taylor(sin(x),n) taylor(cos(x),n) taylor(tan(x),n) taylor(exp(i*x),n) taylor(1/(1-x)) taylor(sqrt(1+x))
実行結果:
echo on
syms x
n = 4
n =
4
taylor(exp(x),n)
ans =
x^3/6 + x^2/2 + x + 1
taylor(sin(x),n)
ans =
x - x^3/6
taylor(cos(x),n)
ans =
1 - x^2/2
taylor(tan(x),n)
ans =
x^3/3 + x
taylor(exp(i*x),n)
ans =
i*x - x^2/2 - (i*x^3)/6 + 1
taylor(1/(1-x))
ans =
x^5 + x^4 + x^3 + x^2 + x + 1
taylor(sqrt(1+x))
ans =
(7*x^5)/256 - (5*x^4)/128 + x^3/16 - x^2/8 + x/2 + 1
MATLABからSQLite 3にアクセス方法
ODBCドライバの利用法
1. SQLite 3 ODBC Driver(http://www.ch-werner.de/sqliteodbc/)のページからEXEファイルをダウ ンロードし,インストールする。
2. Windows XPコントロールパネルから、「管理ツール」->「データ ソース (ODBC)」を起動する。
3. MatlabからSQLite3にアクセスしてみる。
サンプルコード:
connect = database('データソース名','','')
sql = 'select * from table_name';
curs = exec(connect,sql);
setdbprefs('DataReturnFormat','structure');
data = fetch(curs);
close(curs);
MATLABで主成分分析
サンプルコード:
%米国各都市の犯罪比率調査(R言語のViolent Crime Rates by US State)
%1973年アメリカの10万人あたりの、殺人件数、暴行件数、都市部の人口割合、強姦件数のデータ
%Murder :殺人犯罪の比率(10万人あたり)
%Assault :暴行犯罪の比率(10万人あたり)
%UrbanPop :各都市の総人口に占める都心部在住者の割合
%Rape :レイプ犯罪の比率(10万人あたり)
USArrests = [
%Murder Assault UrbanPop Rape
13.20 236.00 58.00 21.20 % Alabama
10.00 263.00 48.00 44.50 % Alaska
8.10 294.00 80.00 31.00 % Arizona
8.80 190.00 50.00 19.50 % Arkansas
9.00 276.00 91.00 40.60 % California
7.90 204.00 78.00 38.70 % Colorado
3.30 110.00 77.00 11.10 % Connecticut
5.90 238.00 72.00 15.80 % Delaware
15.40 335.00 80.00 31.90 % Florida
17.40 211.00 60.00 25.80 % Georgia
5.30 46.00 83.00 20.20 % Hawaii
2.60 120.00 54.00 14.20 % Idaho
10.40 249.00 83.00 24.00 % Illinois
7.20 113.00 65.00 21.00 % Indiana
2.20 56.00 57.00 11.30 % Iowa
6.00 115.00 66.00 18.00 % Kansas
9.70 109.00 52.00 16.30 % Kentucky
15.40 249.00 66.00 22.20 % Louisiana
2.10 83.00 51.00 7.80 % Maine
11.30 300.00 67.00 27.80 % Maryland
4.40 149.00 85.00 16.30 % Massachusetts
12.10 255.00 74.00 35.10 % Michigan
2.70 72.00 66.00 14.90 % Minnesota
16.10 259.00 44.00 17.10 % Mississippi
9.00 178.00 70.00 28.20 % Missouri
6.00 109.00 53.00 16.40 % Montana
4.30 102.00 62.00 16.50 % Nebraska
12.20 252.00 81.00 46.00 % Nevada
2.10 57.00 56.00 9.50 % New Hampshire
7.40 159.00 89.00 18.80 % New Jersey
11.40 285.00 70.00 32.10 % New Mexico
11.10 254.00 86.00 26.10 % New York
13.00 337.00 45.00 16.10 % North Carolina
0.80 45.00 44.00 7.30 % North Dakota
7.30 120.00 75.00 21.40 % Ohio
6.60 151.00 68.00 20.00 % Oklahoma
4.90 159.00 67.00 29.30 % Oregon
6.30 106.00 72.00 14.90 % Pennsylvania
3.40 174.00 87.00 8.30 % Rhode Island
14.40 279.00 48.00 22.50 % South Carolina
3.80 86.00 45.00 12.80 % South Dakota
13.20 188.00 59.00 26.90 % Tennessee
12.70 201.00 80.00 25.50 % Texas
3.20 120.00 80.00 22.90 % Utah
2.20 48.00 32.00 11.20 % Vermont
8.50 156.00 63.00 20.70 % Virginia
4.00 145.00 73.00 26.20 % Washington
5.70 81.00 39.00 9.30 % West Virginia
2.60 53.00 66.00 10.80 % Wisconsin
6.80 161.00 60.00 15.60 % Wyoming
];
[N M] = size(USArrests); % 行列のサイズ
m = mean(USArrests); % 配列の平均値
s = std(USArrests); % 標準偏差
label = { 'Murder'; 'Assault'; 'UrbanPop'; 'Rape' };
%主成分分析の前に,平均が0,分散が1になるように正規化する。
USArrests2 = (USArrests - repmat(m, N, 1)) ./ repmat(s, N, 1);
% 主成分分析を行う。
[pc, score, latent, tsquare] = princomp(USArrests2);
%bar(score(:, 1 : 2));
%パレート図
per = latent / sum(latent);
pareto(per,label);
plabel = { '第1主成分','第2主成分','第3主成分','第4主成分' };
str = sprintf('%14s ',' ');
for i=1:4
str = sprintf('%s %10s',str,plabel{i});
end
disp(str);
for i=1:4
str = sprintf('%14s : ',label{i});
for j=1:4
str = sprintf('%s %10.2f',str,pc(i,j));
end
disp(str);
end
str = sprintf('%14s : ','寄与率(%)');
for i=1:4
str = sprintf('%s %10.2f',str,per(i)*100);
end
disp(str);
str = sprintf('%14s : ','累積寄与率(%)');
sum = 0;
for i=1:4
sum = sum + per(i);
str = sprintf('%s %10.2f',str,sum*100);
end
disp(str);
実行結果:
第1主成分 第2主成分 第3主成分 第4主成分
Murder : -0.54 0.42 -0.34 0.65
Assault : -0.58 0.19 -0.27 -0.74
UrbanPop : -0.28 -0.87 -0.38 0.13
Rape : -0.54 -0.17 0.82 0.09
寄与率(%) : 62.01 24.74 8.91 4.34
累積寄与率(%) : 62.01 86.75 95.66 100.00
EIG は、固有値と固有ベクトルを計算します。
サンプルコード:
echo on A = 1/8*[20 6 -4; 4 18 4; -6 -3 10] [v,d] = eig(A)
実行結果:
echo on
A = 1/8*[20 6 -4; 4 18 4; -6 -3 10]
A =
2.5000 0.7500 -0.5000
0.5000 2.2500 0.5000
-0.7500 -0.3750 1.2500
[v,d] = eig(A)
v =
0.8571 0.4851 -0.6667
0.2857 -0.4851 0.6667
-0.4286 0.7276 0.3333
d =
3.0000 0 0
0 1.0000 0
0 0 2.0000
LIMIT シンボリック式の極限値
サンプルコード:
echo on syms x n h limit((1+1/x)^x,x,inf) limit((1+n/x)^x,x,inf) limit(sin(x)/x) limit((sin(x + h) - sin(x))/h, h, 0) limit(1/x, x, 0, 'right') limit(1/x, x, 0, 'left')
実行結果:
echo on syms x n h limit((1+1/x)^x,x,inf) ans = exp(1) limit((1+n/x)^x,x,inf) ans = exp(n) limit(sin(x)/x) ans = 1 limit((sin(x + h) - sin(x))/h, h, 0) ans = cos(x) limit(1/x, x, 0, 'right') ans = Inf limit(1/x, x, 0, 'left') ans = -Inf
よく利用される MATLABのシンボリック
SYM シンボリックな数値、変数、オブジェクトの作成
サンプルコード:
例: sym('x') sym(1/3,'r')
SYMS シンボリックオブジェクト作成のショートカット
例: syms x y z
VPA 可変精度の演算
例:vpa(pi,128)
DOUBLE 倍精度に変換
例: double(x)
CHAR キャラクタ配列(文字列)の作成
例: char(x)
FINDSYM シンボリック式、または、行列内の変数の検出
例: syms x y z, z=x^2+y^2, findsym(z) は、x,yを出力する
FINVERSE 逆関数
finverse(f)
SYMSUM シンボリックな総和
SYMSUM(S, v) は、v について無限大の総和を求めます。
SYMSUM(S, a, b) と SYMSUM(S, v, a, b)は、a から b までのシンボリック式
の総和を求めます。
SOLVE 代数方程式のシンボリックな解
例: solve('x^2-1=0')
CLASS オブジェクトの作成、または、オブジェクトのクラスの出力
例: class(obj)
SUBEXPR 共通する部分式による式の書き換え
SIMPLE シンボリック式、または、行列の最も短い表現の検索
PRETTY シンボリック式のプリティプリント
LATEX シンボリック式の LaTeX 表現
PRIMES 素数のリストの作成
EXPAND シンボリックな展開
COLLECT 係数をまとめます。
NUMDEN シンボリック式の分子と分母
SUBS シンボリックな代入
COMPOSE 関数の合成,COMPOSE(f,g)は、f(g(y))を出力します
DIFF 微分
DIFF(S) は、FINDSYMで決定されるような自由変数に関して、シンボリック式 S
を微分します。
INT 積分
INT(S) は、FINDSYM で定義されるようなシンボリック変数について、S の
不定積分を出力します。
DSOLVE 常微分方程式のシンボリックな解
例: x = dsolve('Dx = -a*x','x(0) = 1','s') は、つぎの結果を出力します。
x = exp(-a*s)
TAYLOR Taylor 級数展開
TAYLOR(f) は、f に対して5次の Maclaurin 多項式近似を出力します。
3つのパラメータを任意の順序で与えることができます。
例: taylor(sin(x),pi/2,6) は、1-1/2*(x-1/2*pi)^2+1/24*(x-1/2*pi)^4 を
出力します。
DET シンボリックな行列式
DET(A)は、シンボリック行列Aの行列式です。
DIRAC Delta関数
HEAVISIDE Step関数
FOURIER フーリエ積分変換
IFOURIER 逆フーリエ積分変換
LAPLACE ラプラス変換
ILAPLACE 逆ラプラス変換
INT 積分
INT(S) は、FINDSYM で定義されるようなシンボリック変数について、S の 不定積分を出力します。S は、シンボリックオブジェクト(行列またはスカラ)です。 S が定数ならば、積分は、'x' について計算されます。
サンプルコード:
echo on syms a x n int(x^n) int(exp(a*x)) int(log(x)) int(cos(x)) int(sin(x)) int(sinh(x)) int(cosh(x))
実行結果:
echo on syms a x n int(x^n) ans = piecewise([n = -1, log(x)], [n <> -1, x^(n + 1)/(n + 1)]) int(exp(a*x)) ans = exp(a*x)/a int(log(x)) ans = x*(log(x) - 1) int(cos(x)) ans = sin(x) int(sin(x)) ans = -cos(x) int(sinh(x)) ans = cosh(x) int(cosh(x)) ans = sinh(x)
DIFF 微分
DIFF(S) は、FINDSYM で決定されるような自由変数に関して、シンボリック式Sを微分します。
サンプルコード:
echo on syms a x n diff(x^n) diff(exp(a*x)) diff(log(x)) diff(cos(x)) diff(sin(x)) diff(sinh(x)) diff(cosh(x))
実行結果:
echo on
syms a x n
diff(x^n)
ans =
n*x^(n - 1)
diff(exp(a*x))
ans =
a*exp(a*x)
diff(log(x))
ans =
1/x
diff(cos(x))
ans =
-sin(x)
diff(sin(x))
ans =
cos(x)
diff(sinh(x))
ans =
cosh(x)
diff(cosh(x))
ans =
sinh(x)
=~ 等しくない
サンプルコード:
array = [ 1 3 5 7 11 ]; result = array ~= 5
実行結果:
result =
1 1 0 1 1
== 等しい
サンプルコード:
array = [ 1 3 5 7 11 ]; result = array == 5
実行結果:
result =
0 0 1 0 0
配列
サンプルコード:
array1 = [ 1 3 5 7 11 ] array2 = [ 1; 3; 5; 7; 11; ]
実行結果:
array1 =
1 3 5 7 11
array2 =
1
3
5
7
11
>= より大きいか等しい
サンプルコード:
array = [ 1 3 5 7 11 ]; result = array >= 5
実行結果:
result =
0 0 1 1 1
<= より小さいか等しい
サンプルコード:
array = [ 1 3 5 7 11 ]; result = array <= 5
実行結果:
result =
1 1 1 0 0
> より大きい
サンプルコード:
array = [ 1 3 5 7 11 ]; result = array > 5
実行結果:
result =
0 0 0 1 1
< より小さい
サンプルコード:
array = [ 1 3 5 7 11 ]; result = array < 5
実行結果:
result =
1 1 0 0 0
FORループ 指定回数の繰り返しステートメント
サンプルコード:
array = [ 1 3 5 7 11 ];
for i = 1:length(array)
disp( array(i));
end
実行結果:
1
3
5
7
11
IF 条件実行ステートメント
サンプルコード:
array = [ 1 3 5 7 11 ];
for i = 1:length(array)
if array(i) > 5
disp( array(i));
end
end
実行結果:
7
11
MATLABは、MathWorks社が開発している数値解析ソフトウェアでありその中で使うプログラミング言語の名称でもある。
MATLABは、MATrix LABoratoryを略したものであり、行列計算、ベクトル演算、グラフ化や3次元表示などの豊富なライブラリを持った、インタプリタ形式の高性能なテクニカルコンピューティング言語、環境としての機能を持つ。標準で数多くのライブラリを有しているが、それ以上のデータ解析や統計、アプリケーション展開などが必要な場合にはToolboxと呼ばれる拡張パッケージをインストールすることで、MATLABの機能拡張を図ることができる。
MATLABを用いると、C言語やFORTRANといった従来のプログラミング言語よりも短時間で簡単に科学技術計算を行うことができる。類似フリーウェアにScilab、GNU Octave、FreeMatなどがある。