わんくま同盟 熊本勉強会 #06
Pythonで始めた数値計算の授業
ver. 1.1
2018-04-14 14:30-15:20
森下功啓
*2017年度の数値計算の授業で取り組んだ結果について報告
しました。採点の方法とか、学生の躓いた点とかです。
わんくま同盟 熊本勉強会 #06
自己紹介
属性
• 熊本高専 建築社会デザイン工学科 助教
• 専門は衛星測位や電子回路
• センサーで集めたデータを処理するのが好き
• 機械学習歴8年ほど
• そこそこ使える言語
– Python, C/C++, C#, VB, VB.NET, 後はかじった位
が大好きです
わんくま同盟 熊本勉強会 #06
目次
• 背景
• 評価をどう実現する問題
• 採点をどうする問題
• 実際の採点
• まとめ
• 付録
わんくま同盟 熊本勉強会 #06
背景
熊本高専建築社会デザイン工学科では、4年次に数値
計算を学びます。建築と土木の学生が対象です。低学
年時にCのアルゴリズムを受講済みです。
数値計算・・・数値微分とか、
数値積分とか、ニュートン法とか、掃
き出し法とか。工学的な問題を計算
機で解くために必要な技術。
①𝑥 𝑘の初期値𝑥0
更新値𝑥1
②𝑓 𝑥0 を計算
③𝑥0における接線の傾き(微分値)を求める
④接線とy = 0の交点の𝑥座標で𝑥 𝑘を更新
⑤以下、解が収束するまで繰り返す
O
𝑥
𝑦
図 ↑ニュートン法
わんくま同盟 熊本勉強会 #06
この講義が目指すこと
工学的な計算をプログラムで表現する技の習得
数学的な知識
• 線形代数
プログラミングの一般知識
• 基本的には上から下の順で実行される
• 変数と関数と型
• 関数の呼び出しと引数と返り値
• 変数や関数のスコープ
• 並列的に実行される訳ではない(並列
処理は意識して作らないとできない)
プログラミング言語の知識
• 固有の構文とルール
• 固有のライブラリ
アルゴリズムの知識
• 計算の流れのアイデア
• 固有の言語での書き方
わんくま同盟 熊本勉強会 #06
何の言語で授業をしようか?
わんくま同盟 熊本勉強会 #06
掃き出し法の実装における言語間比較
↑は短いが、副作用対策
などを施すと長い
https://goo.gl/ux9gbP 文字が小さいのに入り切らない
https://goo.gl/YG9LeM
短いことは正義だ
ポ
イ
ン
タ
命
C
言
語
嫌
わ
れ
て
い
る
言
語
No.
2
VBA
短
い
Python
わんくま同盟 熊本勉強会 #06
VBA
• Microsoft Office用マクロ言語
• 「Excelのない職場はほぼ無い」・・・ほんと?
• MacのVBA開発画面が超貧弱
開発環境@Mac
わんくま同盟 熊本勉強会 #06
VBAの問題点
• 配列が使いづらい
• 数値計算用の関数はほぼ自作
• 自作した基本関数の行数で圧倒される
https://gist.github.com/KatsuhiroMorishita/16578b870d705731a8894222a486f065
↑行列の計算関係の基本関数だけで500行を超えた
わんくま同盟 熊本勉強会 #06
行数で圧倒されるのはC言語も同じ
(しかも、バグを見つけにくい)
わんくま同盟 熊本勉強会 #06
VBA/Cを使うと、15回の講義では
深いところまで教えることができない。
2017年度は でやってみた
Python
*Pythonは管理者権限がなくてもインストールができるのも良い
わんくま同盟 熊本勉強会 #06
設定した受講生のゴール
到達目標
理想的な到達レベル
の目安(優)
標準的な到達レベル
の目安(良)
未到達レベル
の目安(不可)
数式をパソコンで計
算できる
数式のグラフを描画
できる
数式をプログラムで表
し、少なくとも1つの解
を得ることができる
数式を読めない
微分と積分を計算機
で解くことができる
ニュートン法を利用し、
方程式を解ける
プログラムを用いて、
任意の方程式の微分
と積分を計算できる
微分・積分を理解
できない
連立方程式を解くこ
とができる
最小二乗法を用いて、
未知数以上の数から
なる連立方程式を解
ける
行列計算を用いて連
立方程式を解ける
連立方程式を手
計算で解けない
フーリエ変換や関数
近似など、実用的な
計算ができる
FFT(高速フーリエ変
換)を利用して信号に
含まれる周波数を特
定できる
信号にsinとcosを掛け
合わせて、相対的な相
関量を計算できる
信号に含まれる波
の周波数を求める
アイデアを説明で
きない
わんくま同盟 熊本勉強会 #06
授業スケジュール
1週 ガイダンス,Pythonの変数型と基本構文と開発方法
2週 Pythonのオブジェクト指向とライブラリの使い方
3週 数式の表現,グラフの描画
4週 数値微分,数値計算上の注意
5週 ニュートン法
6週 数値積分
7週 中間試験
8週 試験返却と解説
9週 pandasを用いた表データの処理
10週 ベクトル
11週 行列
12週 最小二乗法
13週 データの関数近似
14週 フーリエ変換
15週 期末試験
16週 試験返却と解説
この辺はPythonだから1コマでできる
わんくま同盟 熊本勉強会 #06
評価をどう実現する問題
わんくま同盟 熊本勉強会 #06
プログラムの良さの測り方
1. 最低限、エラー無く動くこと
2. 論理(ロジック)に誤りがないこと
3. 可読性が高いこと(読みやすい)
4. 再利用性が高いこと(使い回しのしやすい
この講義では、2.まで評価
わんくま同盟 熊本勉強会 #06
森下は、プログラミング能力を測る指標としての
ペーパー試験結果を全く信じていません。
プログラムは動いてなんぼです。
→試験中にプログラムを作成してもらう
わんくま同盟 熊本勉強会 #06
部分点はどうする
• そもそも、何を根拠に部分点とするのか?
• 受験者が解答中に何を考えていたかなんて分かりようがない
• 模範解答と解答の類似度で測ればよいのか?
• 「コピペしたがライブラリをimportし忘れ」は質が悪い → 類似度は使えない
• 数学における解答は1行1行が解へ向かう流れであり、部分点を配置できる。だ
が、プログラムには1行1行が必須でもなければ流れも一定ではないし、関数同
士が協調すらする。アルゴリズムはソースコードの全体で体現している。
• 多数の問題を出題し、満点を100点以上として、100点打ち切りで良いのでは
試験において部分点は配置しないものとした
わんくま同盟 熊本勉強会 #06
つまり、
試験は実際にプログラムを書いてもらうこととし、
「結果の正しいコードを書けたかどうか?」
が試験の評価指標となる
わんくま同盟 熊本勉強会 #06
ということで、今度は「学生が解答した関数の出力
が正しいことを確認する方法」を考える
わんくま同盟 熊本勉強会 #06
出題例
• 以下の式において、 Ԧ𝑥を求める関数
return_answer()を実装せよ
• ここで、 Ԧ𝑥, Ԧ𝑦, Ԧ𝑧はベクトルであり、𝐴は行列である
• return_answer()における引数yとzは1次元の
ndarray型とし、Aはmatrix型とし、返り値は1次元
のndarray型とする
5 Ԧ𝑦 + Ԧ𝑧 = 𝐴 Ԧ𝑥
わんくま同盟 熊本勉強会 #06
解答例
*試験では解答のひな形とし
て、関数の宣言と引数を記述
済みで、かつこの関数をテスト
する処理まで記載済みのもの
を配布しました。この例では学
生は14-20行目だけを記述す
ればOKです。
わんくま同盟 熊本勉強会 #06
教員の作った
Pythonの関数
学生の作った
Pythonの関数
Pythonで記述した
採点プログラム
採点時のファイル構成
①
②
③
④
引数は様々なパターンを試す
わんくま同盟 熊本勉強会 #06
教員の作った
Pythonの関数
学生の作った
Pythonの関数
Pythonで記述した
採点プログラム
解答は問と1つのファイルを紐付けた
①
②
③
④
学生はエラーを作り込みやすいの
で、設問毎にファイルを分けた。
分けないと0点になりかねない
わんくま同盟 熊本勉強会 #06
採点のためのファイル構成
←↑同じディレクトリ
採点スクリプト
解答評価モジュール
解答例のスクリプト
学生の提出した解答
わんくま同盟 熊本勉強会 #06
2017年度中間試験の点数分布
学生間での教え合いが2017年度はかなり少なかった・・・。
Pythonの見た目の簡単さから、試験を舐めていた感は在る。
参考:
VBAでの試験@2016年度
なぜか、得点が下がった・・・
わんくま同盟 熊本勉強会 #06
科目の総合的な評価は、、、
• 試験に部分点は無い
• 試験は正しい解を求められたかを問う
• とはいえ、全くプログラムを理解できない人はいる
• 以下の様に科目の評価比率を設定
• 真面目なら試験が駄目でもなんとかなる
試験:小テスト:ノート = 6:3:1
わんくま同盟 熊本勉強会 #06
採点をどうする問題
わんくま同盟 熊本勉強会 #06
解答のパターン
• 文字列(str)
• 数値(int, float, numpy.float64など)
• None
• 複素数
• 文字列 or 数値を格納した配列(list)
• pandasのDataFrame
• 2次元配列(listの入れ子、ndarray, matrix)
numpyが提供する型
*Excelで試験するより、変数のバリエーションが増えた・・・
わんくま同盟 熊本勉強会 #06
採点上の課題
• 個々人の計算条件により、模範解答と解答が一致しない
– アルゴリズム
– 微分や積分に使う微小幅
– 解の収束条件
– 初期条件
• 文法・論理上のエラーはないが、実用的な計算速度でない
• 見かけ上の誤差小への対応
– 特定の変数範囲では相対的な誤差が小さいこともある
• 模範解答と学生の解答とで返り値の型が異なる場合がある
– 正解は”解なし”なのに数値を返してきたとか
わんくま同盟 熊本勉強会 #06
対策
• 初期条件
– 問題文に明示
• 実用的な計算時間でない
– 動かないのだから、不可
• 見かけ上だけ誤差小
– 問題文に入力する変数範囲を明示するのが妥当
– その上で、複数回関数を呼び出して、確認する
• 型が異なる
– 数値は全てfloat型に統一して評価
– 「解なしの場合は”解なし”を返す」など、予め定めておく
– 基本的に、型が異なる場合は、不可とする
わんくま同盟 熊本勉強会 #06
誤差に対する対応
• 微積では、微小変化量を妥当に設定する必要がある
• 妥当な実装ならば、誤差は1%もない
わんくま同盟 熊本勉強会 #06
行きついた評価プログラム
Download:
https://gist.github.com/Katsuh
iroMorishita/403a4e2e03f3c6
b17eb86db53c981749
学生の作成した解答はモ
ジュールとして読み込んで、そ
の中の関数を呼び出して得た返
り値を左のロジックに掛ける
わんくま同盟 熊本勉強会 #06
実際の採点
時間が余れば
わんくま同盟 熊本勉強会 #06
採点中に出たエラーと原因
• module 'exam1_**_taro_tanaka.p**' has no attribute 'return_answer‘
– モジュール内にreturn_answerという関数が存在しない
• invalid syntax (p03.py, line 11)
– モジュールp03の11行目に文法(構文)エラー
• name 'x' is not defined
– xは定義されていない(何も代入していない変数や、定義していない関数の呼び出しなどが原因)
– スコープを意識する必要がある
• return_answer() missing 2 required positional arguments: 'x_init' and 'dx‘
– 「引数としてx_initとdxが足りない」(引数が問題文の指定と異なる)
• No module named 'exam1_XX_taro_tanaka.p07‘
– モジュールexam1_XX_taro_tanaka.p07が存在しない
• bad operand type for unary -: 'numpy.ufunc‘
– 演算子の使い方が間違っている
• unindent does not match any outer indentation level (p03.py, line 13)
– モジュール-03の13行目でインデントレベルのエラー(周りとレベルがマッチしない)
たぶん、実行していない
わんくま同盟 熊本勉強会 #06
これか・・・?
https://togetter.com/li/1212450
*中間試験で懲りたのか、受験者は期末試験では実行する様になった・・・
わんくま同盟 熊本勉強会 #06
採点の様子
*学生の名前が出てくるので、録画を止めて実行
わんくま同盟 熊本勉強会 #06
学生が躓いたポイント
• 以下にまとめました
– https://www.evernote.com/l/AagJu-P13q9BA5m_M43vAUlQsVDH62ag4mU
• 良いアドバイスが有れば切望してます・・・
わんくま同盟 熊本勉強会 #06
まとめ
わんくま同盟 熊本勉強会 #06
まとめと追記
• 数値計算をPythonで教えてみました
• numpyのお陰で超楽
• オブジェクト的な概念はほぼ理解させられなかったorz
• ネット上に問題が転がっていないので、問題を作るの
は大変だった
• 実行速度はVBAよりPythonの方が1000倍くらい速い
(体感)ので、実行速度の面で困ることはなかった
• 昨年度のクラスよりもガツガツ感がなかったが、何とか
なった。VBAだと死屍累々だった気がする
• 卒研が少し楽になるか・・・・も?
わんくま同盟 熊本勉強会 #06
オブジェクト指向への理解を深めることは今後の課題
わんくま同盟 熊本勉強会 #06
作った問題は公開中
• 問題に対する説明が足りませんが、公開しています
• ご感想など頂けたら幸いです
https://github.com/KatsuhiroMorishita/numeric_calculation_with_python
わんくま同盟 熊本勉強会 #06
今年度もPythonでやります
わんくま同盟 熊本勉強会 #06
付録
わんくま同盟 熊本勉強会 #06
PyCon Kyushu 2018をヨロシク!!
44
http://kyushu.pycon.jp/
https://pycon-kyushu.connpass.com/event/84062/
スピーカーも募集中です!!

Pythonで始めた数値計算の授業@わんくま勉強会2018-04