情報処理概論

九州大学 工学部地球環境工学科 講義資料 担当：木村07 グラフ描画／数値計算ライブラリ

１） グラフ描画ライブラリ matplotlib
Pythonでグラフを描画したり、イメージを表示させたりする際に使用するライブラリ
散布図・折れ線グラフ・棒グラフ・円グラフ・等高線図・３Dグラフ表示など

２） 数値計算ライブラリ numpy
ベクトルや行列などの計算

グラフ描画ライブラリ matplotlib をインストールする
Windows10の場合：コマンドプロンプト上で＞ pip install matplotlib
を実行

インストールがうまく行かない場合、インターネットを検索して解決してくださいimport matplotlib # グラフ描画ライブラリ
matplotlib.use('Agg') # グラフを画面に表示しないで画像ファイルとして保存する
import matplotlib.pyplot as plt#-----データを定義
num_list_x=[0,3,6,11,12,7, 2,1] # xデータ
num_list_y=[3,4,3, 4, 8,9,10,6] # yデータ例１ 散布図の画像生成#----figure画面figの生成
fig = plt.figure()#----figure画面へ埋め込まれるデータプロット領域axを生成
ax = fig.add_subplot(1, 1, 1) # fig.add_subplot(行,列,場所)を表します。
#----データプロット領域axにx軸のラベル設定
ax.set_xlabel('x axis’)#----データプロット領域axにy軸のラベル設定
ax.set_ylabel(‘y’)#----データプロット領域axにデータの散布図描画
ax.scatter(num_list_x, num_list_y)

実行結果：
figure.png#----データプロット領域axに legend と title を表示
ax.legend(loc='best')
ax.set_title('Plot of sample 1')#---描画したグラフを png 形式の画像ファイルとして保存
plt.savefig('figure.png') # 【注意】予め matplotlib.use('Agg') を実行しておくこと

figure内部にsubplotのaxを生成

例２ 折れ線グラフの画像生成
前スライドの以下の部分#----データプロット領域axにデータの散布図描画
ax.scatter(num_list_x, num_list_y)

ここをax.plot(num_list_x, num_list_y)または
ax.plot(num_list_x, num_list_y, linestyle='-', color='b', label='sample 1',marker='x’)
または
ax.plot(num_list_x, num_list_y, linestyle='--', color=[0.5,0.9,0], label='sample 1',marker='^‘)
へ変更

数値計算ライブラリ numpy をインストールする
Windows10の場合：コマンドプロンプト上で＞ pip install numpy
を実行

pipでインストールしたライブラリをアンインストールする場合は> pip uninstall numpy
でOKimport numpy as np #----数値計算ライブラリ
import matplotlib # グラフ描画ライブラリ
matplotlib.use('Agg') # グラフを画面に表示しないで画像ファイルとして保存する
import matplotlib.pyplot as plt

例３ 単純回帰x_list=[] #数字のリストを作成 最初は空っぽ
y_list=[] #数字のリストを作成 最初は空っぽ#--------データをファイルから読み込みwith open("data07_2.txt","r") as datafile:
while True:lineStr = datafile.readline().strip()
if lineStr=="":break# print( lineStr )moji_list=lineStr.split(sep=",") #----文字列lineStrをカンマで分割してリストmoji_jist生成
x_list.append( float(moji_list[0]) )y_list.append( float(moji_list[1]) )model = np.polyfit(x_list, y_list, 1)
modelfunc = np.poly1d( model ) # 回帰モデルから1次式を得る

プログラムの続きは次スライド

np.polyfit(x,y,n): n次式で2変数の回帰分析

前スライドのプログラムの続き#----figure画面figの生成
fig = plt.figure()#----figure画面へ埋め込まれるデータプロット領域axを生成
ax = fig.add_subplot(1, 1, 1) # fig.add_subplot(行,列,場所)を表します。
#----データプロット領域axにx軸のラベル設定
ax.set_xlabel('x axis')#----データプロット領域axにy軸のラベル設定
ax.set_ylabel('y')#----データプロット領域axにデータの散布図描画
ax.scatter( x_list, y_list )#----データプロット領域axにデータのグラフ描画
ax.plot( x_list, modelfunc(x_list) )前スライドで計算した回帰モデル#----データプロット領域axに legend と title を表示
ax.legend(loc='best')
ax.set_title('Plot of data07_2.txt')#---描画したグラフを png 形式の画像ファイルとして保存
plt.savefig('figure07_2.png') # 【注意】予め matplotlib.use('Agg') を実行しておくこと

実行結果：
figure07_2.png

多重回帰
観測値 y を変数x1 , x2 , xK

を用いて以下の式で説明する：y  b0  b1 x1  b2 x2    bK xK  e
確率変動・誤差
このとき、n 個の観測値 ( y1 , x11 , x12 ,  x1K ), ( y2 , x21 , x22 ,  x2 K ), ( yn , xn1 , xn 2 ,  xnK )によって係数 b0 , b1 , b2 ,  bK の最小２乗推定量を求める。ここで、

 y1 
y 2y   yn 

目的変数
行列

1 x11
1 x21X 
1 xn1

説明変数
行列x12x22

xn 2

 x1K  b0 b 
 x2 K b 1   回帰係数    行列   xnK bK 2

 e1 e 2e   と表すと、
en 

誤差変数
行列y  Xb  e

誤差変数行列 e の平方和e

線形表現→ 回帰推定（最小２乗法）

回帰モデルを最小にする b を求める

データから回帰モデルを得て何がうれしいか？
回帰モデルによる推定
未知の説明変数（回帰変数）の値が目的変数（被回帰変数）の値

yqyq( xq1 , xq 2 ,  xqK )で与えられたときのをデータから推定できる！

 b0  b1 xq1  b2 xq 2    bK xqK

推定値

それでは、回帰係数行列

 b0 b b 1 bK 

誤差eの項はゼロで計算をデータからどのように求めるか？

誤差ベクトル e の平方和e2を最小にする b を最尤推定値b̂ と表すと、単純回帰の場合と同様に、回帰係数の各要素で誤差ベクトルの平方和を偏微分し、これらが全てゼロとした連立方程式を立てて解くことにより、回帰係数ベクトルは以下の式で計算される：ˆb  X Trans X 1 X Trans y
ただし X

e2の最小値Trans

Xの擬似逆行列は X の転置行列を表す。

pseudo-inverse matrix
ただしXはm行n列、m > n

S e を残差平方和といい、Se  yTransで与えられる。

I  XX
X



TransX

 X
1Trans

y±σ の範囲内に68.27％のデータが存在Seより、回帰で推定する場合の精度が分かるn【システム設計工学演習問題】 2019.12.6 学籍番号

氏名

自動車の燃費について以下のようなデータがある。
「クラウン」から「ギャラン∑」までのデータを利用して車種「ルーチェ」の10モード走行性能 y を予測するには、どのような計算をしたら良いか？表の数値を使って行列X,Yを作成し、それらを使って具体的な計算方法を説明せよ。

車名x1x2x3X4x5x6

yクラウン

1.360

4.778

2.4251

125

17.5

8.8

8.7

マークII

1.245

4.100

2.4082

125

17.5

8.8

9.5

カムリ

1.070

3.214

2.3575

120

17.6

8.7

10.6

ソアラ

1.235

4.100

2.3052

125

17.5

8.8

9.2

セドリック

1.420

4.625

2.4251

130

17.5

9.5

8.9

ローレル

1.175

3.889

2.3660

125

17.0

9.1

9.2

スカイライン

1.175

4.111

2.3198

125

17.0

9.1

9.2

レパード

1.220

3.900

2.2899

125

17.0

9.1

9.4

カペラ

1.030

3.450

2.3829

120

17.0

8.6

10.2

ギャラン∑

1.180

3.665

2.3645110

16.7

8.510.6

ルーチェ

1.150

3.909

2.3829

120

17.0

8.6？

x1:車体重量(1000kg）， x2：減速比， x3：幅×高さ(m2)， x4：最大出力(ps)，x5：最大トルク(kgm)， x6：圧縮比， y：10モード走行(km/ℓ)
早川 毅 著「回帰分析の基礎」朝倉書店（1986）より引用

import numpy as np #----数値計算ライブラリ
from numpy import linalg as LA #----行列計算モジュール

例4 多重回帰#-----データをリストへ格納して定義# [1, 車体重量(1000kg）,減速比,幅×高さ(m2),最大出力(ps),最大トルク(kgm),圧縮比]# ^^最初の要素は1
data_x_list = [[ 1.0, 1.36 , 4.78 , 2.43 , 125 , 17.5 , 8.8 ]] # クラウン
data_x_list.append([ 1.0, 1.25 , 4.10 , 2.41 , 125 , 17.5 , 8.8 ] ) # マークII
data_x_list.append([ 1.0, 1.07 , 3.21 , 2.36 , 120 , 17.6 , 8.7 ] ) # カムリ
data_x_list.append([ 1.0, 1.24 , 4.10 , 2.31 , 125 , 17.5 , 8.8 ] ) # ソアラ
data_x_list.append([ 1.0, 1.42 , 4.63 , 2.43 , 130 , 17.5 , 9.5 ] ) # セドリック
data_x_list.append([ 1.0, 1.18 , 3.89 , 2.37 , 125 , 17.0 , 9.1 ] ) # ローレル
data_x_list.append([ 1.0, 1.18 , 4.11 , 2.32 , 125 , 17.0 , 9.1 ] ) # SKYLINE
data_x_list.append([ 1.0, 1.22 , 3.90 , 2.29 , 125 , 17.0 , 9.1 ] ) # レパード
data_x_list.append([ 1.0, 1.03 , 3.45 , 2.38 , 120 , 17.0 , 8.6 ] ) # カペラ
data_x_list.append([ 1.0, 1.18 , 3.67 , 2.36 , 110 , 16.7 , 8.5 ] ) # ギャランΣ#------------各車種の10モード走行燃費(km/L)
data_y_list = [[ 8.7],[9.5],[10.6],[9.2],[8.9],[9.2],[9.2],[9.4],[10.2],[10.6]]#-------データのリストから行列を生成
matrix_x = np.matrix( data_x_list ) # 行列x生成
matrix_y = np.matrix( data_y_list ) # 行列y生成
print( matrix_x ) # 確認用
print( matrix_y ) # 確認用

プログラムの続きは次スライド前スライドのプログラムの続きˆb  X Trans X 1 X Trans y#--------行列xとyから回帰パラメータbを求める
param_b = LA.inv(matrix_x.T @ matrix_x) @ matrix_x.T @ matrix_y
逆行列 転置行列 @は行列の積##-------推定対象のルーチェの要目
query_x = np.matrix([[1.0, 1.15 , 3.91 , 2.38 ,print("query_x = ")print( query_x )120 , 17.0 , 8.6 ]])#-------回帰パラメータbと推定対象の要目から、推定対象のyを推定
estimated_y = query_x @ param_b #---行列の積
print("estimated_y = ")print( estimated_y ) # 推定値を画面に出力 （ちなみに観測データでは9.8）

課題：多重回帰プログラム
１） 例４のプログラムにコードを追加し、残差平方和Seとデータ個数から推定精度σを計算して表示すること【ヒント】

課題のプログラムでは、この値を数字ではなく、ﾃﾞｰﾀがさらに追加されてもプログラムを変更せずに済むように他の行列（リスト）の要素の個数から自動的に与えるようにすること

１） NxNの正方行列の単位行列は、numpy.eye( N ) で与えられる。
２） x の平方根は numpy.sqrt( x ) でも得られる以上のプログラムを作成せよ．
プログラムの先頭行にコメント文で自分の氏名と学籍番号を入れておくこと# ← この記号より左側の文字列はコメントになる＊データファイルdata.txtの読み込みにおいて、文字コードに関するエラーが解消しない場合、データファイルの文字コードをSHIFT JISにして保存してみよ。

まとめ

グラフ描画ライブラリ matplotlib
数値計算ライブラリ numpy
ベクトルや行列の計算／多項式近似

第７回 レポート課題提出方法
課題のプログラムを下記の課題提出用フォルダへ、課題の番号と提出者が分かるようにファイル名を以下のようにしてアップロードせよ
第７回1TE19xxxZ名前.py
https://share.iii.kyushu-u.ac.jp/public/lRbwAAVITI5A2X4BE45t6TqQIE0UQSQUl5Bap_kZ_sjy

講義資料、および上記フォルダへのリンクは下記ホームページから
http://sysplan.nams.kyushu-u.ac.jp/gen/edu/InfoProcess/2019/index.html

プログラムがエラーで動かないときエラーメッセージをよく読もう
エラー箇所の行が表示されているはず（その１行前も怪しい）
文字が全角になっていないか確認すること
カッコ（）やクォーテーション””が全角になっていないか？
空白部分に全角の空白が紛れ込んでいないか？
インデントは「文字数」でそろえないとエラーになる