Skip to content

Latest commit

 

History

History
203 lines (132 loc) · 7.18 KB

ml_intro.md

File metadata and controls

203 lines (132 loc) · 7.18 KB

Python入門課題 Pythonを使ってみよう(機械学習コースワークサンプル用)


このテキストについて

テキストの目的

  • 基礎的なプログラミング力を確認する
  • プログラミングを何らかしらの問題に対して適用してみる
  • 随時調査しながら進められるようにする

どのように学ぶか

DIVERのPython入門テキストで得たことを生かし、問題を解いていってください。新しいことも登場するので、調査しながら進めていくことになります。


紙を折る

紙を折り続けると厚さが増していき、43回で月に届くという話があります。しかし、実際には10回も折ることができません。また、手計算も大変です。

そこで今回の課題では 1枚の紙を43回折り曲げた時の厚さを計算するプログラム を作成します。

43回折った紙の厚さ $t_{43}$ は、折る前の紙の厚さ $t_{0}$ を使い以下の数式で求まります。

$$ t_{43} = t_{0}×2^{43} $$

折る前の紙の厚さ $t_{0}$0.00008mとします。一般的なコピー用紙の厚さです。

2つの方法による厚さの計算

プログラミングでは同じ動作を様々な方法で記述することができます。今回は以下の2つを作成してください。

  • べき乗の算術演算子を使用
  • for文を使用

【問題1】べき乗の算術演算子を使用して作成

べき乗の算術演算子を使用したプログラムを作ってください。
雛形として紙を1回折った時の厚さを計算するコードを用意しました。これを43回折った時のコードに書き換えてください。

雛形

"""
紙を1回折った時の厚さを計算するコード
"""

THICKNESS = 0.00008

folded_thickness = THICKNESS*2

print("厚さ: {}メートル".format(folded_thickness))

【問題2】単位の変換

単位がメートルだと実感が湧きづらいので、◯◯万キロメートル に変換して表示させてください。

サンプルとして ◯◯キロメートル に変換したコードを用意したので、参考にして取り組んでください。小数点以下は2桁まで表示されるようにも指定しています。

サンプルコード

# メートルをキロメートルに変換して小数点以下2桁で表示する
print("厚さ: {:.2f}キロメートル".format(folded_thickness/1000))

「月までの距離」を検索して、折った紙が月に届くかどうか確認してみましょう。

【問題3】for文を使用して作成

次に、for文を使用したプログラムを作ってください。

べき乗の算術演算子は使ってはいけません。算術演算子は四則演算(+-*/)のみ使えます。

ヒント

べき乗は以下のように掛け算の繰り返しに置き換えることができます。

$2^3=2×2×2\ 2^5=2×2×2×2×2$

【問題4】計算時間の比較

2つの方法はどちらが正しいわけでもありませんが、コードの良さを評価する際には以下のような着目点があります。

  • 計算速度
  • メモリの使用量
  • 可読性
  • 拡張性
  • 再利用性

今回は計算速度を比較してみます。以下の雛形を使用して、2つの方法の計算時間を出力してください。そして、それぞれの計算時間の関係を簡単に説明してください。どちらの書き方が良さそうでしょうか。

雛形

import time
start = time.time()
#####
# ここに上で書いたコードを貼り付ける
#####
elapsed_time = time.time() - start
print("time : {}[s]".format(elapsed_time))

過程の可視化

折り曲げた時の厚さを毎回記録しておき、それを折れ線グラフで可視化してみます。

数式を一般化し、n回折った紙の厚さ $t_{n}$ は以下のように表せます。

$$ t_{n} = t_{0}×2^{n} $$

これは指数関数です。指数関数は値が急激に増加する性質があります。厚さが急激に増えて月に到達する様子をグラフで見てみましょう。

【問題5】リストへの保存

ここまでは43回折った後の最後の値だけを使用していましたが、グラフで可視化するためには過程の値も必要です。for文を使用したコードに、過程の値合計44個を記録するコードを加えてください。

ヒント

  • 空のリストを作成する。
  • 折る前の値をリストに追加する。
  • for文の中でn回折った時の値をリストに追加していく。

最終的にリストに44個の値が格納されていることをlen関数を用いて確認しておきましょう。

【問題6】折れ線グラフの表示

グラフの描画には Matplotlib という ライブラリ を用います。リストへ記録するコードの後ろで以下の雛形を使用してください。

雛形

"""
グラフを表示する。タイトルと軸ラベル名付き。
"""
import matplotlib.pyplot as plt
%matplotlib inline

plt.title("thickness of folded paper")
plt.xlabel("number of folds")
plt.ylabel("thickness[m]")
plt.plot(リスト名) # 「リスト名」のところにリストの変数名を入れる

グラフを表示させた場合はそれに対する考察が重要です。厚さがどのように変化しているかを簡単に説明してください。

【問題7】グラフのカスタマイズ

グラフをより見やすくカスタマイズしてみましょう。カスタマイズしたグラフを最低3種類作成してください。例えば以下のように書き換えることで、線の色を赤に変更できます。

サンプルコード

"""
赤い折れ線グラフを表示する。
"""
plt.title("thickness of folded paper")
plt.xlabel("number of folds")
plt.ylabel("thickness[m]")
plt.plot(リスト名, color='red')

どのようなことができるかはMatplotlibの公式ドキュメントを参考にします。

matplotlib.pyplot.plot — Matplotlib 3.0.2 documentation

カスタマイズ例

  • 線の色を青と赤以外にする。
  • 線を太くする。
  • 線を点線にする。
  • 値のフォントサイズを変更する。

上記のページに載っていないカスタマイズも可能です。

サンプルコード

"""
軸の値を大きく表示する。
"""
plt.title("thickness of folded paper")
plt.xlabel("number of folds")
plt.ylabel("thickness[m]")
plt.tick_params(labelsize=20) # 軸の値に関する設定を行う
plt.plot(リスト名)

このplt.tick_params()に関しては以下のページで説明されています。

matplotlib.pyplot.tick_params — Matplotlib 2.1.1 documentation

様々なカスタマイズ方法を調べて見やすいグラフを作成しましょう。

この課題への回答を分かりやすく綺麗なものにまとめられたら完成です。