思っちゃったんだからしょうがない

統計学を学ぶ傍でひっそりとやっていきます。 #statistics #R

AtCoder ABC114 参加メモ

最近AtCoderに参加し始めました!まだまだ弱いので目も当てられないRatingが続いていますが,備忘録的に書きます. AtCoder始めるまで,統計でRやPython,気が向いてc++やJSにちょっと触ったことあるぐらいでしたので,競プロ耐性はほぼゼロです.
AtCoderには,Rの次に慣れているPythonで参加しています. 過去問解いたり,蟻本読んだりして少しずつ勉強進めていますが,現状C問題が解けるか解けないかという間をさまよっています.

A問題

わかる.

B問題

珍しく簡単

s = input()
res = abs(753 - int(s[0:3]))

for i in range(1,len(s)-2):
    if res > abs(753 - int(s[i:i+3])):
        res = abs(753 - int(s[i:i+3]))

print(res)

C問題

時間内に解けませんでした.単純にfor文回したらだめで,どういう方針で解くか悩んでいるうちに時間切れ.終わってから解説読み,一晩寝かして考えたら解けました.

  1. とりあえず可能性のある数字を全部列挙する
    • 列挙するにあたり,まずは7,5,3のいずれかで構成される数字を列挙する.(7だけとか3だけもOK)
  2. 列挙したものの中から,条件を満たす要素数を数える
#----------------
# 入力パート
s = input()
#----------------

#----------------
# 列挙パート
all_list = []

# 3桁未満はありえないので3桁の数を列挙
for i in '753':
    for j in '753':
        for k in '753':
            all_list.append(''.join([i,j,k]))

# 与えられた数字の桁数まで,既に列挙してあるものの先頭に7,5,3を付け足していく
for i in range(4,len(s)+1):
    add_list = []
    for c in '753':
        add_list += [''.join(c+e) for e in all_list]
    all_list += add_list

# 重複を排除する
all_list = set(all_list)
#----------------

#----------------
# 回答パート 
# 各要素を集合に変換して{'7','5','3'}と同じになり,かつ与えられた数以下であるかを判定し合計する
res = sum([True for _ in all_list if set(list(_))=={'7','5','3'} and int(_) <= int(s)])
print(res)
#----------------

競技プログラミングにもっと早く出会いたかった.

Rでcaretがインストールできない人へ

caretを使おうと思ったらそもそもインストールエラーで丸一日潰した話

caret便利そうなので一通り触ってみるかと思ってインストールしたらエラーorz

fatal error: not found omp.h

色々調べまくってOpenMPをちゃんと呼び出せてないらしいということまでが分かったが 解決できず丸一日を費やしてしまってもうRは終わったんやとおもってた。

次の日気を取り直してまた調べてたら、以下の記事を見て、

qiita.com

まさかそもそもhomebrewからRをインストールしたせいか・・・、と疑い 一旦homebrewからRを抹消して直でCRANからインストールしてみたら・・・、

普通に動いた

しばらくはhomebrew経由でRをインストールするのはやめようと思いました。

検証はしていないのですが、 Rで not found omp.h というエラーが出ていてhomebrew経由で インストールしているからは一旦やめてみるのが良いかもしれません。

prettydocパッケージを使ってみた

Rstudio、Rmarkdownで資料作成するとき、いい感じのテンプレート提供してくれるパッケージを使って見ました。

 

>|r|
install.packages("prettydoc")
||<

これを走らせておいて、

Rstudioで file ->  New file -> R markdown -> From Template からPretty Document が2種類追加されている。どちらかを選んで作成するだけ。

 

そんなに堅苦しくない報告書やレポートを作るのに便利かも!

開発者のデモページはこちら

Creating Pretty Documents from R Markdown

R で Nelder and Mead 法を実装してみる(勉強のため)

久しぶりの更新です。事情によりNelder and Mead法を実装する必要が出たのでやってみました。参考文献はNelder and Mead(1965)と

ネルダー–ミード法 - Wikipediaです。お世話になりました。

ネルダーミード法はRのoptim関数で使われていたり、調べたらRのパッケージとしても公開されていたり、別に自分で実装しなくてもいい人はたくさんいると思いますが、私はそういうわけにも行かなかったのでやりました。そしてついでにブログに書きます。

 

この方法の一番の特徴は導関数を求めなくてもいいという点ですね。実行するために必要なのは

  • 関数形: y=f(x)
  • 初期値: x_{init}
  • パラメータ  \alpha, \gamma, \rho, \sigma
  • 定量 criterion

になります。今回のシミュレーションでは論文のResultの1個目としました。(下記)

  •  f(x) = 100(x_2 - x_1^2)^2 + (1 - x_1)^2
  •  x_{init} = (-1.2, 1)
  •  \alpha = 1, \gamma=2, \rho = 0.5, \sigma=0.5
  •  criterion = \sqrt( \sum_{i=1}^{n+1} ( f(x_i) - \bar{ f(x_i) } )^2 )  

関数定義とサンプルコードも載せておきます。でも初期値依存するので場合によっては正解に収束していないケースも・・・。

 

Nelder and Mead 1965 for R

 

Sample Nelder and Mead 1965 1 for R

Rで日本地図を書く(たぶん最終回)

一体Rで何をしたいんだというのは置いといて、自分の作業内容でRで日本地図を柔軟に書きたいなぁと思ったので、これまで書いてきたコードをちょこっと改良しました。多分今回作ったのでだいたいやりたいことはできるはずなので最終回のはず。

一応本の方もちゃんと読み進めています。一応。

 

今回ので何ができるようになったのかというと、

  • 指定した都道府県のみをかけるようにした
  • 描画範囲を自動と任意とで使い分けができるようにした

の2点です。

まずは、以下のコードで世界地図がのデータから日本のデータを引っ張ってきます。この時に全部描く用と県毎に描く用のデータを分けて作っています。データについては前回か前々回のブログを参照ください。

gist5ec1f0eec3d282aa9db3bcb9892d486e

 

これでmap.dataとmap.Allというリストができました。これらを使ってプロットする関数を次のように2Dと3Dに分けてそれぞれ定義します。

 

gist58eb3c17bb62660d01a8bbdea6496c74

gist02d8484b4d91bf698fdb7c692d6c0131

すごい手抜きなブログですが、内容は以上です。

こんな感じでプロットできます。

1つ目は3dプロットの全国地図

もう1つのは2dプロットの熊本、神奈川、埼玉、青森、新潟、岡山、京都、岐阜の地図です。

f:id:forest-of-sheep-and-steel:20161221205737p:plainf:id:forest-of-sheep-and-steel:20161221205734p:plain

 

 

年内にもう一回更新したいなと思ってます。普通に統計の話で・・・。

以上でーす。

更新:ちなみに、shapeファイルを扱うRのパッケージもあるので、こんなめんどくさいことは実はやらなくてもいいのです笑

Rで日本地図を書く(3次元で)②

よくよく見たら、この前書いた日本地図、県境がかなり適当。細々した島も無い。特に沖縄が適当。ってことで、もっといい地図はないのものか探してきました。んで、見つけたのがこのデータ!

www.naturalearthdata.com

今回は上から5グループ目の

Admin 1 – States, Provinces

という見出しの Download as scale ranks というデータを使いました。

さっそくコードを。。

gist025531edb17547aa2803766ad18887a4

このデータは県境もあるし、結構細かいし、なかなか良いと思う。二次元にプロットするとこんな感じ。

gist57b20e6b5ba46b69e03f6fed1b45a176

f:id:forest-of-sheep-and-steel:20161101005200p:plain

3次元で写したい場合はこちら。

gist283c11451c49f1949bbd652d1710bfa6

結果はこんな感じ。いい感じ。。

f:id:forest-of-sheep-and-steel:20161101005355p:plain

そもそも何がやりたかったかというと、天気予報とかでよくある降水量のバーがついた地図を作りたかったのです。降水量のデータはちょっと載せられないのでサンプルデータで書いた結果だけ。やってみればそんなに苦労せずできますね!

f:id:forest-of-sheep-and-steel:20161101010246p:plain

そういえば最近、PVが20を超えました笑

全く関係ない話2(対数関数の性質)

高校で初めて対数関数を習ったとき、それを使うメリットがわからなかった。今は理解しているつもりだけど、こんな説明があったら理解の助けになるのかなと思って作図。またまたx軸, y軸を平行にしてどのように値が変化されているのか確認する。普通の二次元プロットでもわかる人はわかるんだろうけど・・・。

f:id:forest-of-sheep-and-steel:20161030160548p:plain

gisteef85984474dbb1c667ca76f1eb0bed9

 

上の横軸がxの値、下の横軸がyの値ですね。ちなみに、この時対数の底の値はネイピア数eとしています。適当にxの値を2つ持ってきたときに、それを対数変換によってy軸に移しても、それぞれのx軸での大小関係は保たれたままy軸に移ってる事がわかると思います。

これが結構大切で、大小関係を評価したいとき、対数を取っても問題ないというのはこの性質からきているんですね。

もう一点は、対数関数の場合、xは0より大きいという制約がありますね。それを踏まえて、この対数関数は、すごく小さい数(1より小さく0より大きい)は負のより大きい数字に、すごく大きい数は正のより小さい数字にしてくれるという性質があります。

0.001 -> -6.907,   1000 -> 6.907,

のように、0.001と1000ではその差が999.9もあったのに、2つの対数をとると、大小関係を保ったまま、-6.907, 6.907とその差が13.815となっています。極端に大きい数字とか、極端に小さい値を扱う時、対数をとると普段使っているようなスケールの数字に変換してくれるんですね。しかも大小関係は保存してくれるという嬉しさです。

とりあえず以上。。。