yuya競プロ精進

主に競プロに関して。たまに機械学習。

Google Code Jam Crazy Rows (Python)

 行列を隣り合った行の入れ替えによって下三角行列に変形する問題

あらかじめ 各行の最後に1が出る場所を記録しておくことで,

O(n^2)に抑えることができる.

 

Pythonで書いてみた.

たぶんコードは合ってるはずなんじゃが,間違ってたら教えておくれやす.

 

n = int(input())
m = [map(int, input().split()) for _ in range(n)]

res = 0

a = [0]*n

for i in range(n):
 a[i] = -1
 for j in range(n):
  if m[i][j] == 1:
   a[i] = j

 

for i in range(n):
 pos = -1
 for j in range(i, n):
  if a[j] <= i:
   pos = j
   break

 for j in range(pos, i, -1):
  a[j], a[j-1] = a[j-1], a[j]
  res += 1

 

print(res)

半年ぶりに競プロに復活

久々の投稿。

一昨日の土曜日、Atcoder主催のプログラミングコンテストABC158に久々に出た。

たぶん半年ぶりの参加だったと思う。

わけあって休学を始めたと同時にプログラミングを始め、自然と競プロをやるようになっていた自分を、懐かしく感じた。

それまではC++を主に使っていたが、今回はPythonのみで挑戦をした。

結果はABCDの四完。EとFに手も足も出なかったのがとても悔しい。

色は変わらず緑で、Ratingの値は少しだけ上昇した。

 

久々にコンテストに参加して最初に感じたことは、意外と体に身についているんだなということ。

半年前にバリバリ過去問を解いていた頃に比べ、解法を考える力やプログラムの実装力が落ちたのは確かだが、根本的なアルゴリズムやプログラムを作る考え方は忘れてはいなかった。ABCDを解けたことがそれを実証していると思う。

 

改めて、プログラミングに出会ったこと、競プロ、Atcoderというサイトに出会ったことは自分に大きな価値を与えてくれているんだなと感じた。

 

与えてくれた価値をさらに伸ばすために、今後もAtcoderを中心に様々なプログラミングコンテストに参加していきたいと思う。

まずは水色になることを目標に頑張ろう。(入水というらしい。。)

 

p.s 解説のすぬけさんを久々にみて、なぜか安心した。わら

Macで仮想環境を作ってpythonのmatplotlibを使うの巻

Pythonの仮想環境として今日は「venv」を使いました。

手順

1.新しい環境の作成

$ python3 -m venv [name] ...nameには作りた仮想環境の名前を入れます。

2.Activate

$ source [name]/bin/activate ...仮想環境を始めるためのコマンドです。

3.Deactivate

$ deactivate ...仮想環境を終了させるためのコマンドです。

matplotlib

1.パッケージのインストール

$ pip install numpy ...数値計算を行うライブラリです。
$ pip install matplotlib ...グラフ描画を行うライブラリです。
$ pip install PyQt5 ...グラフを描画する場所を提供するライブラリです。

2.backendの変更

echo "backend : Qt4Agg" >> ~/.matplotlib/matplotlibrc 
...PyQt5ライブラリを使ってグラフを描画するための設定です。ホームディレクトリ内にある.matplolibディレクトリ内にmatplotlibrcファイルを作ってそこに書き込みます


以上です!

python pipによるパッケージインストール

pipによるパッケージのインストール

pip install [パッケージ名]

pipでインストールしたパッケージ表示

pip freeze

pipのバックアップの取り方

pip freeze > pip.txt

バックアップの復帰

pip install -r pip.txt


matplotlibの注意点

matplotlibをインポートしようとすると
「ImportError: Python is not nstalled as a framework....」というエラーが出ることがある。
こんな時は、matplotlibの設定ファイル(matplotlibrcというファイル)の
「backend : macosx」という箇所を、
「backend : Tkagg」に変更することで解決する。

この設定ファイルは
$ python -c "import matplotlib;print(matplotlib.matplotlib_fname())"
で場所がわかる。

python pyenvでのインストールメモ

インストールできるバージョンの確認

pyenv install -l

バージョンを指定してインストール

pyenv install 3.7.1

これだとエラーが出ることがある。
自分は「zipimport.ZipImportError: can't decompress data; zlib not available」というエラーメッセージが出た。
この「zlibエラー」は次のようにインストールすることで解決する。

CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \
LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib" \
PYTHON_CONFIGURE_OPTS=--enable-unicode=ucs2 \
pyenv install -v 3.7.1

アクティブにするバージョンの選択

pyenv global 3.7.1

バージョンの確認

pyenv versions もしくは python --version

機械学習2

前回の続き

性能を評価する指標を決めておく必要がある
どのモデルが性能の良いものか判断ができなくなるから
数種類のアルゴリズムを比較することが不可欠
よく使用される指標は正解率

モデルの汎化性能をテストする必要性がある
(未知のデータにも対応できる力)
これについてはトレーニングデータセットをさらに、トレーニング用のサブセットと検証用のサブセットに分割して、様々な交差検証の手法を試すという方法がある
それで最終的に最適化に成功したと思われつモデルをテストデータセットでテストしてモデルの汎化性能を評価する

↑この評価によって、汎化誤差を評価できる。
この誤差が少なく性能に納得が行けば、このモデルを使って将来のデータを予測できる


などを学習して機械学習の大まかな流れと概念を理解し始めた。

友達はフランス語の文法を習得する間際で、間違いを繰り返してうわーと言いながら頑張っている。
趣味でフランス語を勉強するというおしゃれな彼を今後も応援していきたい。

機械学習

今日は友達と勉強会
友達はフランス語の勉強、自分は機械学習についての勉強をした。

機械学習は大きく分けて3種類ある。
教師あり学習教師なし学習強化学習である。

教師あり学習はラベル付きのトレーニングデータ(答えがあるデータ)を用意して、それを機械学習アルゴリズムによって予測データのモデルを作り出す。
そして、未知のデータや将来のデータを予測する。
分類と回帰の2種類などがある。

教師なし学習はラベル付けされていないデータや構造が不明なデータを扱って、クラスタリングや次元削除によってモデルを構築する。

強化学習は環境とのやり取りを通じて報酬を最大化しようとすることでモデルを構築する。

機械学習では前処理がとても大切になってくる。
生のデータがアルゴリズムの性能を最適化するのに必要な形式で提供されることは滅多にない。
特徴量を抽出する、特徴量の尺度を揃える(特徴量のスケジューリング)、特徴量の重複を避けるために低次元の部分空間に圧縮する(次元削除)、データの無関係な特徴量を削除する(次元削除)
することが重要になってくる。

データセットを分割する
レーニングデータセットとテストデータセット
レーニングデータセットはモデルをトレーニングして最適化するために使用して、テストデータセットは最終モデルを評価する時まで取っておく