プログラミング論II

プログラミング論 II
2009年9月17日
主成分分析
数値積分
http://www.ns.kogakuin.ac.jp/~ct13140/Prog.2009/
A-1
業務連絡
• 来週,小テストを行います.
• 内容は,前期(2009/06/04)にプログラ
ミング論Iに行った内容に酷似しています.
• 持ち込み可です.
A-2
概要
• 主成分分析
– 難しい.簡易に触れるのみ.
• 数値積分
– 易しい.詳しく説明.
A-3
主成分分析
• 主成分分析とは,複数(N個)の要素からな
るデータを,重要なM個(M≦N)の要素に代
表させて把握する手法.
– N個の中からM個を選択するのではない.
• データの要素数を減らす
→ 情報量は失われる
→ 情報の把握が容易になる
重要度の低い情報を捨て,
重要度の高い情報のみにする.
A-4
英語Listeningと
英語Readingの成績
例A(相関の強いデータ)
100
Reading
二つのデータ
(Listening成績
とReading成績)に
非常に強い相関が
あった場合.
90
80
70
60
50
40
右上がりの軸(水色)
でデータを把握すれば
ほぼ正確に,
データを把握する
ことが可能.
30
20
10
0
0
20
40
60
Listening
80
100
A-5
10
0
90
例A(相関の強いデータ)
80
Re
ad
ing
70
60
50
40
• 水色の横軸の値のみを考えれば,
各人の能力はほぼ分かる.
– 2次元データが1次元データになった.
– 厳密さは失われたが,理解が容易に.
30
20
10
0
0
– 横軸は,大まかに英語力を示してい
ると言える.
20
40
Li
st
en
ing
60
A-6
例A(相関の強いデータ)
• 下図の緑色の横の軸1本を
用いて,両データを
代表させた場合,
緑軸の値は英語力を
適切に表現していない.
90
80
80
70
g
60
in
d
a
0
10
次元を減らして,
全体を代表させる
場合は,
軸を適切に選択
せねばならない.
50
60
g
nin
A-7
主成分分析 (2次元値の場合)
• 重心を通り分散が
最大の方向に
軸をとり,それを
第一主成分
英語と数学の成績
100
90
80
70
英語
60
50
とする.
40
• それと垂直方向に
30
重心を通る軸をとり,
20
これを
10
第二主成分とする. 0
0
20
40
60
数学
80
100
A-8
主成分分析 (N次元値の場合)
• N次元空間上で,重心点を通り,最も分散
の大きい方向に軸をとり,それを第一主成
分とする.
• 第一主成分と垂直な軸の中で,重心点を
通り,最も分散が大きい方向に軸をとり,
それを第二主成分とする.
• 以下,同様に第1~第N主成分全てに垂直
で,重心点を通り,分散が最大の方向に第
N+1主成分をとる.
A-9
積分
区分求積法と台形公式のみ解説
A-10
積分
• 不定積分は,「微分」の逆操作.すなわち,
f(x)を不定積分する/の不定積分を求め
るとは,「微分したらf(x)になる関数を探
す」こと.
• 定積分は,関数f(x)とx軸に挟まれる部
分の面積を求めること.
• 本講義では,定積分のみを扱う.
A-11
定積分
b
•  f ( x)dx とは?
a
x=b
f(x)
x=a
y=f(x)と,x軸と
x=aと,x=bで
囲まれた領域の面積を
求めること
x
A-12
区分求積法
• 細かい区間毎の長方形の面積の合計で近似.
b
全短冊の面積の合計と, f ( x)dx はほぼ等しい
a
f(xi) f(xi+1)
f(x)
y=f(x)
この短冊の面積は,
(xi+1-xi) f(xi)
a
xi xi+1
x
b
A-13
区分求積法
• a=x0<x1<…<xn-1<xn=bとして,
f (x0),f (x1),…,f (xn)が既知なら
n 1
a f ( x)dx   f ( xk )(xk 1  xk )
b
k 0
A-14
f(xi) f(xi+1)
左の値を使用
xi xi+1
x
f(xi) f(xi+1)
f(x)
• 当然,
長方形の高さは
左の値を使用し
ても,
右の値を使用し
ても良い.
f(x)
区分求積法
右側の値を使用
xi xi+1
x
A-15
区分求積法の誤差
f(xi+1)
f(x)
f(xi)
この部分が
近似の誤差
xi
xi+1
x
A-16
区分求積法
• より細かい区間に分割するほど誤差は少なくな
る.
• 長方形でなく台形で近似した方が,より正確な近
似になると期待される.
– 台形公式 (これは1次近似である)
• 近傍3点を用い,2次式で近似した方がより正確
な近似になると期待される.
– シンプソンの公式
• 3次式,4次式で近似した方が更に正確.
– ニュートン・コーツの積分公式
A-17
区分求積法台形公式
• 長方形ではなく,台形で近似する.
– より少ない誤差で計算が可能
f(xi)
f(x)
f(xi+1)
xi
x
xi+1
A-18
区分求積法台形公式
• a=x0<x1<…<xn-1<xn=bとして,
f (x0),f (x1),…,f (xn)が既知なら
n 1
1
a f ( x)dx   2  f ( xk )  f ( xk 1)( xk 1  xk )
k 0
b
ba
• 区間[a,b]をn当分した場合,h 
として
n
n

1
b
h

f ( x)dx 
f ( xk )  f ( xk 1 )
a
2 k 0


A-19
C言語プログラミング
b
•  f ( x)dx を求めるには?
a
h = (b-a)/N;
N当分すると仮定
f(x)
f(x1) f(x2)
h
a x 1 x2 x3 x4 x
x0
bx
n
A-20
C言語プログラミング
b
•  f ( x)dx を求めるには?
a
x0~xnを表示してみる.
N当分すると仮定
f(x1) f(x2)
f(x)
h = (b-a)/N;
x0 = a;
x1 = a + h*1;
x2 = a + h*2;
:
xi = a + h*i;
なので,
h
for(i=0; i<=N; i++){
printf("%lf\n", a+h*i); ax0 x1 x2 x3 x4
}
x
bx
n
A-21
C言語プログラミング
b
•  f ( x)dx を求めるには?
a
N当分すると仮定
各短冊の面積を表示してみる.
xi~xi+1の短冊の横の長さは h,
縦の長さは f (xi) なので,
h = (b-a)/N;
f(x)
for(i=0; i<N; i++){
xi = a+h*i;
f(x1) f(x2)
h
area = f(xi)*h;
printf("%lf\n",area);
}
関数 double f(double d)が
存在していると仮定.
ax x1 x2 x3 x4
0
x
bx
n
A-22
C言語プログラミング
b
•  f ( x)dx を求めるには?
a
全短冊の面積の合計を出す.
すなわち,定積分.
N当分すると仮定
f(x1) f(x2)
for(i=0; i<N; i++){
xi = a+h*i;
f(x)
h = (b-a)/N;
sum = 0.0;
h
area = f(xi)*h;
sum += area;
}
printf("%lf\n", sum);
ax x1 x2 x3 x4
0
x
bx
n
A-23
例(伊)
• y=x2 と x軸と x=1 と x=3 で囲まれ
た領域の面積は?
12
y=x2
10
8
y 6
4
2
0
0
0.5
1
1.5
x
2
2.5
3
3.5
A-24
例(伊)
100分割,非台形
#define NUM 100
#include <stdio.h>
void main(){
int i;
double x, y, sum, h;
h = 2.0/NUM;
sum = 0.0;
for(i=0; i<NUM; i++){
x = 1.0 + h*i;
y = x*x;
sum += y*h;
}
printf("%lf\n", sum);
}
A-25
#define NUM 1000
#include <stdio.h>
void main(){
int i;
double xa, xb, ya, yb, sum, h;
h = 2.0/NUM;
sum = 0.0;
for(i=0; i<NUM; i++){
xa = 1.0 + h*i;
xb = 1.0 + h*(i+1);
ya = xa*xa;
yb = xb*xb;
sum += (ya+yb)*h/2.0;
}
printf("%lf\n", sum);
}
例(伊)
1000分割,台形
A-26
例(伊)
3 2
26
x dx 
 8.66666 
1
3

100分割
左値を
使用
右値を
使用
台形
1000分割
面積
誤差
面積
誤差
8.5868
0.079867
8.658668
0.007999
8.7468
0.080133
8.674668
0.008001
8.6668
0.000133
8.666668
0.000001
A-27
例(呂)
• 下の扇形(1/4円)の面積は?
 x, 1  x 2 




1.0
0.8
0.6
0.4
0.2
0
0
0.2
0.4
0.6
0.8
1.0
A-28
例(呂)
1000分割,非台形
#define NUM 1000
#include <stdio.h>
#include <math.h>
double f(double x){
return
sqrt(1-x*x);
}
void main(){
int i;
面積=0.785889
double x, y, sum, h;
PI=3.143555
h = 1.0/NUM;
sum = 0.0;
for(i=0; i<NUM; i++){
x = h*i;
y = f(x);
sum += y*h;
}
printf("面積=%lf\nPI=%lf\n", sum, sum*4);
}
A-29