Skip to content

Latest commit

 

History

History
286 lines (262 loc) · 12.7 KB

questions.md

File metadata and controls

286 lines (262 loc) · 12.7 KB

演習問題

EX 1

Pythonに慣れるために基礎的な演算をやってみましょう.

  1. 1+1の結果を標準出力せよ.
  2. 1から100までの総和を標準出力せよ.
  3. 標準入力で受け取った2つの数値の積を標準出力せよ.
  4. FizzBuzzを実装する
    • 1から標準入力で受け取った整数までの結果を標準出力.
    • 結果とは,次のように定義される.
      • その値が3で割り切れるときは"Fizz"
      • その値が5で割り切れるときは"Buzz"
      • その値が両方で割り切れるときは"FizzBuzz"
      • それ以外の場合,その値そのものを出力する.
    • 入力された整数が6の場合の出力は以下のようになる.
       1
       2
       Fizz
       4
       Buzz
       Fizz
      
  5. 標準入力で受け取った文字列を1行に1文字ずつ標準出力せよ.
    • そのとき,何番目の文字かを同時に表示.
    • 例題
      • 入力: abc
      • 出力:
        1 a
        2 b
        3 c
        
  6. 入力された数値に3桁区切りでカンマ","を入れて標準出力せよ.
    • 1234が入力された場合,"1,234"と出力する.
    • 123が入力された場合,"123"と出力する.
  7. ファイルに書かれている文字を標準出力せよ.
    • bashでいう"cat"コマンドを実装すればよい.
    • ファイル名は"sample.txt"とプログラム中で指定する.
  8. 3.で作ったFizzBuzzをファイルに出力せよ.
    • ファイル名は"fizzbuzz.txt"と固定する.
  9. 標準入力された文字列を逆順で標準出力せよ.
    • 例題
      • 入力: "abcdefg"
      • 出力: "gfedcba"
  10. 標準入力された文字列の長さを標準出力せよ.
    • 例題
      • 入力: "abc"
      • 出力: 3

EX 2

ここでは,データ構造を意識しながら,問題に取り組みましょう.

  1. 2つの点の座標(x1, y1), (x2, y2)を標準入力から受け取り,その点の間のユークリッド距離を標準出力せよ.
    • 座標は小数で与えられ,ユークリッド距離は小数点以下1桁以上表示する.
    • 例題
      • 入力:
        1 2
        1 3
        
      • 出力: 1.0
  2. 3つの座標(x1, y1), (x2, y2), (x3, y3)をそれぞれ標準入力から受け取って,三角形の面積を標準出力せよ.
    • 各行に座標がx yの順にスペース区切りで入力される.
    • 例題
      • 入力:
        1 3
        5 7
        9 2
        
      • 出力: 18
  3. 標準入力から数値を1つ受け取って,その数値が素数かどうか判定せよ.
    • is_primeという関数を作る.
  4. 標準入力で受け取った整数nまでの素数を全て列挙する関数get_all_primesを作成し,そのリストをカンマ区切りで標準出力せよ.
    • 例題
      • 入力: 12
      • 出力: 2,3,5,7,11

list/dictionary

リストと辞書の基本的な概念を理解するための練習問題

  1. 空白で区切られた整数を受け取って昇順に並び替えて標準出力せよ.
    • 並び替えにはsortメソッドなどを使用しても良い.
    • 例題
      • 入力: 10 5 2 7 8
      • 出力: 2 5 7 8 10
  2. 文字列を受け取って,それぞれの文字の出現回数を標準出力するプログラムを作成せよ.
    • 文字列は[a-zA-Z]で構成されるものとする.
    • 大文字小文字の区別は行わない.
    • 出現回数はアルファベット順に以下のように出力する.
    • 例題:
      • 入力: Hello world
      • 出力:
        D: 1
        E: 1
        H: 1
        L: 3
        O: 2
        R: 1
        W: 2
        
  3. ファイル名をコマンドライン引数で受け取り,そのファイル内の単語の頻度を降順に標準出力せよ.
    • ファイル内には単語がスペース区切りで書かれている.
    • ファイルは複数行あり,全ての行にわたっての単語の頻度を求める.
    • 単語の頻度が同じ場合は,単語の辞書順に出力する.
    • 例題:
      • ファイル内のデータ(sample.txt):
        aaa aa ab aa
        aa ba aaa ab
        
      • 出力:
        aa 3
        aaa 2
        ab 2
        ba 1
        
  4. 標準入力から文字列を2つ受け取り,1つ目の文字列中に現れる2つ目の文字列の個数を数えよ.
    • 入力例: abcdeaabccd cd
    • 出力例: 2
  5. 標準入力で,数列の長さ,昇順に並んだ数列,数値が与えられ,その数列内にその数値が含まれるかどうかを'YES', 'NO'で返せ.
    • 例題
      • 入力:
        13
        1 3 4 5 6 7 8 10 15 16 18 19 28 
        15
        
      • 出力: YES
    • 最初に数列に含まれる数値の個数があり,次の行に数列が与えられる.3行目に探す対象となる数値が与えられる.
    • 可能であれば昇順に並んでいることを利用して,二分探索などの高速な手法を用いよ.
  6. 深さ優先探索を用いるリンク先の問題を解く.
    • AtCoderアカウントがある場合は,提出し実行確認してみよう.

Chapter 0

  1. 余接関数を求める関数cot(theta)を実装せよ.
    • thetaはラジアンで入力されるとする.
    • 三角関数の値はmathnumpy等を用いてよい.
  2. 平方根を求める関数square_root(x)を実装せよ.
    • xに負の値が入力された場合には-1を返すようにせよ.
    • xに数値以外が入力された場合にはNoneを返すようにせよ.
  3. サイコロシミュレータ関数diceを実装せよ.
    • 出目は1-6でそれぞれの出目の確率は同様に確からしいとする.
    • (一度の実行で1-6の整数が1つ返る関数を作成する.)
  4. 整数0から100までの一様乱数をn個のリストを返す関数random_nを実装せよ.
    • 整数nは標準入力で受け取る.
  5. 標準入力から数値列を受け取り,その平均と標準偏差(母標準偏差)を標準出力せよ.
    • 例題
      • 入力: 81.65 97.52 95.25 92.98 86.18 88.45
      • 出力: 平均: 90.34, 標準偏差: 5.46
  6. 2次元ベクトルを入力して,それを行列Aで変換した値を出力する関数transA(x)を実装せよ.
    • 行列Aは固定で,A=[[1, 3], [7, 6]]
    • Axを返す関数を設計する.
    • 例題
      • 入力: 2 3
      • 出力: 11 32
  7. 25を書き換えて,行列Aも入力として受け取るような形にせよ.
    • ベクトルの次元数d,変換後の次元数mとする.
    • 入力フォーマットは次のようにする.
      d m
      e1 e2 ... ed
      A11 A12 ... A1d
      A21 A22 ... A2d
      :
      Am1 Am2 ... Amd
      
    • 例題
      • 入力:
        2 3
        1 7
        2 4 
        1 7
        10 4
        
      • 出力:
        30 50 38
        
  8. 標準入力で,点数を表す数値nと各点の座標(x, y)を受け取り,それらの間の距離を全て求め,行列表記で返せ.
    • 行列の(i,j)要素はi番目とj番目の点のユークリッド距離とする.
      • ユークリッド距離は小数点以下4桁まで出力
    • すべての要素について愚直に計算するようにせよ.(28との測度比較のため)
    • 入力される座標の各要素は実数である.
    • 例題
      • 入力:
        3
        1 2
        1 3
        2 3
        
      • 出力:
        0.0000 1.0000 1.4142
        1.0000 0.0000 1.0000
        1.4142 1.0000 0.0000
        
  9. 27で作った関数の実行速度を計測し,それよりも高速な手法を検討せよ.
    • 実行速度を求めるために,データサイズを工夫した入力例を作るとよい.
    • また,1回の実行速度ではなく10回以上の実行の平均速度を使う.
    • 実行速度の計測にはtimeモジュールを利用するなどが考えられる.
  10. πを求める関数calculate_piを実装せよ.
    • math.piなど円周率をすでに計算された値を使ってはいけない.
    • 例えば,モンテカルロ法を用いてシミュレーション的に求める方法がある.
      1. 正方形の中に内接するような円を描く.
      2. 正方形の内部にランダムに$n$個の点を打つ.
      3. $n$点の中で円の内部に含まれる数を数えて,これを$k$個とする.
      4. $\pi \approx \frac{4k}{n}$が成り立つ.

Chapter 1

可視化

matplotlibモジュールを利用する.

  1. 10個の点を表示せよ.
    • 各点の座標は-3から3までの一様分布でランダムに生成
    • 散布図として図示する
  2. 100個の点を透明度のある点として表示せよ.
    • 各点の座標は前の問題と同様にランダムで生成
    • 色は0から1までの値でランダムに設定
  3. 平均0,標準偏差2の正規分布から生成したサンプルのヒストグラムを表示せよ.

pandasモジュールについて

Yahoo Financeからデータを1年分取得して,"GOOG.csv"という名前で保存せよ. 既にあるGOOG.csvを使用してもよい.

  1. csvにある列名をリストで標準出力せよ.
  2. "Adj Close"の列をグラフとしてプロットせよ.
    • ただし,時系列順に並び替えて表示する.
  3. 最近1ヶ月にしぼって,データフレームを作成せよ.
  4. "Adj Close"の列に関して前日との差分をとって株価の前日比を計算し,"DoD"という列を作成せよ.
  5. 前日比が大きく変動している("DoD"が±1USDよりも大きい)行を抽出せよ.
  6. sample.csvについて,欠損値を補完して表示せよ.
    • 補完の方法は,いくつか存在する.
    • それらを調べて確認してみよう.

Chapter 2

  1. (任意の)回帰モデルをscikit-learn準拠でコーディングし, 実験せよ.
    • まずはMyLinearRegression()クラスを完成させて,単回帰モデルを実装してみよ.
    • 重回帰モデルなどの他の回帰モデルを実装してもよい.
    • データはX_train.csvy_train.csvを用いよ.
    • 評価はX_test.csvで行う. 予測結果を../text/data/y_pred.csvとして保存せよ.
    • 提出は完成したMyLinearRegression()クラスのみで構わない.

Chapter 3

  1. 最急降下法の実装に取り組み,コードを実装せよ.
  2. ニュートン法の実装に取り組み,コードを実装せよ.
  3. ロジスティック回帰の実装に取り組み,コードを実装せよ.
    • fit関数を完成させることで再急降下法を用いたパラメータ推定ができるようにする.
    • (オプション課題)newton_fit関数を完成させることでニュートン法を用いたパラメータ推定を行えるようにする.

Chapter 4

  1. ジニ係数を求める関数を作成せよ
  2. ジニ係数をもとにベストなデータ分割を行う関数を作成せよ
  3. DecisionTreeNodeを完成させ,決定木を実装せよ
  4. my_RandomForestClassifierを完成させ,ランダムフォレストを実装せよ.

Chapter 5

  1. k-means法を実装せよ
  2. クラスmy_GMMを完成させることで混合ガウス分布を推定するEMアルゴリズムを実装せよ.

最終問題

Kaggleのデータ分析コンテストに挑戦する.

  • 提出はデータ分析に使用したコード(.py)と予測結果の出力(.txt)の二つを提出せよ.
  • 予測精度の高さとコードの内容を総合的に評価する.
  • 49,50のいずれかに挑戦せよ.(両方に取り組んでも構わない)
  1. House Prices: Advanced Regression Techniquesのデータ分析に挑戦せよ.
  2. Titanic データセットのデータ分析に挑戦せよ.

Chapter 6〜Chapter 10

チャレンジ課題

51~55. chapter6〜Chapter 10を読んだ上でそれぞれのコードに対し条件を変えて実験を行いどんな変化が起こったかを確認せよ.

  • それぞれの実験の結果をレポートにて報告せよ.
  • コードを変えることでどのような結果の変化が起こったか,またそれはなぜだと考えられるか考察せよ.