pythonのlambda(無名関数)の使い方、map関数との組み合わせについて



 

lambdaとは「無名関数」とも呼ばれています。名前の通り、「関数なのに名前がない関数」です。
通常プログラミングにおける「関数」というと名前をつけるのが普通ですよね?下の例をみてください。

 

と普通は上記のように関数には名前をつけることで、いつでもどこでも関数名を宣言することでその関数の処理を行えるわけです。

 

しかし、全部の関数に名前が必要でしょうか?例えば一回しか使わない(ある特定の場所でしか使わない)処理があるとしましょう。そんな時に関数として定義しなくても、その場だけで使える関数が「lambda(無名関数)」というわけです。

 

全体としてはそんなに重要ではないけど、これがあればこの瞬間だけものすごく助かるというものです。オーダーメイドのスーツを作っても自分以外の人にとっては無価値ですが、自分からしたらものすごく大事ですよね。そんなイメージです。

 

文章だけでは使い方がわからないと思うので簡単な例を示します。

 

これを通常の関数でかくと

 

となります。行数も減っていますね。

上の例からもわかる通りlambdaの使い方は{lambda 引数:返り値}という形になります。

 

***応用例***

これまでの説明でも「lambda」の素晴らしさはわかっていただけたかと思いますが、「lambda」の真髄は「他の関数との組み合わせ」で最大の効果を発揮することです。

 

map関数と組み合わせた例をみましょう。

関数を定義した後に、改めてmap関数内で上で定義した関数を宣言していますね。

これをlambda(無名関数)を用いると…

 

となります。map関数はmap(関数,[…, …, …])という形式をとり、第1引数で指定した関数の処理を第2引数で指定したリストの各要素に対して関数の処理を実行します。なので得られる結果はlist型であることに注意してください。

 

参考文献はこちらです。

 


スポンサーリンク

記事が役に立ったらシェア!

djangoでログイン機能を実装する



djangoでwebアプリを開発し始めたました。今回はログイン機能を実装したのでまとめます。

参考文献はこちらです。

 

 

appの概要

ログインページ→ログインする→appのトップページという設計です。

ログイン機能を実装するにあたってあまり必要ないですが「数式とそのtexコマンドが一発で確認できる」という、いうなればtexの数式チートシートです。app名は「RAKURAKUtex」です。

 

ログイン機能の実装

  • accountsアプリの作成

appがあるディレクトリにいき、以下を実行します。

他のアプリ作成時同様、myapp/setting.pyに以下を追記する。

ログインするためのurlとログアウトのurl、リダイレクト先のurl(ログイン後に飛んだ先のurl)もここで設定してしまいましょう。

 

  • URLの設定

myapp/urls.pyに以下を追記します。

次にaccountsディレクトリ内にいき、新たに以下の内容で「urls.py」を作成します。

  • templatesの作成

accountsディレクトリ内に、templatesディレクトリを作成。さらにそのtemplatesディレクトリ内にaccountsディレクトリを作成。そしてその中でlogin.htmlを以下の内容で作成する。

ディレクトリ構造は→accounts/templates/accounts/login.html となります。

 

ログアウトページのtemplatesも同様に作成します。accounts/templates/accounts内にlogged_out.htmlを以下の内容で作成します。

以上で実装は完了です。試してみましょう。

 

実際に動かす

  • http://127.0.0.1:8000/accounts/login/にアクセスします

ログインをクリックすると、

RAKURAKUTeXのページ(settings.pyで指定したリダイレクト先のurl)に行きます。

試しにログアウトも動くかどうか確認します。

  • http://127.0.0.1:8000/accounts/logged_out/にアクセスします

 

うまく動いているようです。しかしこれだとログアウトをwebアプリから直接できるわけではないので、ログアウトページを作成しただけになります。ログアウトの機能も作ったらまた更新します。

 


スポンサーリンク

記事が役に立ったらシェア!

macのGrapherはかなり優秀(ルンゲクッタ法の刻みとか変えられる)




macにデフォルトで入っているアプリケーションに「Grapher」というものがあります。「Launchpad」→「その他」の中に格納されているため以外に知らない人も多いです。

「Grapher」とはグラフ作成ツールです。gnuplotとかWolframと同じようなものです。今回はそんな「Grapher」のある機能を知ってしまったので紹介します。

 

微分方程式の近似解法を選択できる

無料のくせにその汎用性は素晴らしいです。微分方程式を解かせることはもちろん、「オイラー法」「ルンゲクッタ法」と選択できます。

さらに

その解の刻み幅まで選択できます。なんともありがたい。こんな素晴らしいツールがあるなんて知らなかった。自分は使ったことないですが、gnuplotみたいにデータをファイル出力することもできるみたいです。

 

近似解法の設定

今回は、例題にある「Differential Equations」を用います。

  • 開くと右上に「インスペクタ」と書かれた青のiマークがあると思います。そこをクリックします

 

  • そうすると設定用の小さなウィンドウが開きます。そこの中の「積分器」というのをクリックすると近似解法を選択できます。
  • その下のステップサイズを自分で入力すると解の刻み幅を任意に変更できます。

 

 

試しに「0.5」にしてみます…

 

解がかなり粗いのでギザギザですね笑

 

最後に

以上「Grapher」を用いた微分方程式の解法などの設定方法に述べてきました。「Grapher」にはもっと便利な機能がありそうなので、また新たに発見したら更新します。

 

 

 


スポンサーリンク

記事が役に立ったらシェア!

pythonでモンテカルロう!(3章)




 

「Rによるモンテカルロ法」という書籍を用いてモンテカルロ法について勉強したことをまとめていこうと思います。

>>Rによるモンテカルロ法入門
  

本書に記載されているRのサンプルコードを写経しても意味ないので、pythonでコードを書き直しながら理解を深めていこうと思います。


古典的なモンテカルロ積分

 

\begin{eqnarray}
E_f[h(X)] = \int_\chi h(x)f(x) dx
\end{eqnarray}

上式の積分の計算をする際に、密度fからサンプル(X1,…..,Xm)を生成し近似として以下の経験平均を算出します。その際にfは様々な確率分布が用いられます。モンテカルロシミュレーションには正規分布や、ポアソン分布、コーシー分布が用いられることが多いようです。

\begin{eqnarray}
\overline{h}(m) = \frac{1}{m}\sum_{j=1}^m h(x_j)
\end{eqnarray}

h(m)は大数の強法則により、サンプル数を増やすとEf[h(x)]に収束します。

試しに例3.3を解いてみます。

 

例3.3

 

次の関数を一様乱数を用いて、独立同分布の乱数を発生させて、\(\sum h(Ui)/n\)によって\(\int h(x) dx\)を近似することができます。

\begin{eqnarray}
h(x) = \{\cos(50x)+ \sin(20x)\}^2
\end{eqnarray}

pythonで実装すると以下のようになります。

 

>>描画結果と詳しい解説は以下の記事

例題3.3は一様乱数ですが、サンプル(X1,…….Xm)を確率分布から発生させる場合の問題もあります。

 

練習3.1

以下のコーシーベイズ推定量についてx = 4のときを想定して解いてみます。

\begin{eqnarray}
\delta(x) = \frac{ \int_{-\infty}^{\infty} \frac{\theta}{1 + \theta^2} e^{-(x-\theta)^2/2} d\theta }{\int_{-\infty}^{\infty} \frac{1}{1 + \theta^2} e^{-(x-\theta)^2/2} d\theta}
\end{eqnarray}

このままでは確率分布が使えないので、式変形をします。

\begin{eqnarray}
\delta(x) &=& \frac{ \int_{-\infty}^{\infty} \frac{\theta}{1 + \theta^2} e^{-(x-\theta)^2/2} d\theta }{\int_{-\infty}^{\infty} \frac{1}{1 + \theta^2} e^{-(x-\theta)^2/2} d\theta}\\
&=& \frac{\int_{-\infty}^{\infty} \theta \frac{1}{1+\theta^2} \frac{1}{\sqrt{2\pi}} \frac{\theta}{1 + \theta^2} e^{-(\theta – x)^2 /2} d\theta }{\int_{-\infty}^{\infty} \frac{1}{1+\theta^2} \frac{1}{\sqrt{2\pi}} \frac{1}{1 + \theta^2} e^{-(\theta – x)^2 /2} d\theta}
\end{eqnarray}

こうすると、正規分布とコーシー分布が出てきます。

解き方には2種類あります。

  • 被積分関数を正規分布とし、コーシー分布からサンプリングする方法
  • 被積分関数をコーシー分布とし、正規分布からサンプリングする方法

試しに両方の方法で解いてみて、近似解の精度をみてみましょう。

実行結果は以下です

コーシー分布よりも、正規分布でサンプリング(正規近似)した方が精度は良いみたいです。

コーシー分布は外れ値をとる可能性が大きく、裾が広いのでその影響が出ています。

 

>>コーシー分布と正規分布についてはこちら

今回の被積分関数のプロット図です。青線が\(\delta(x)\)の分子、緑線が\(\delta(x)\)の分母です。

 

 

 


スポンサーリンク

記事が役に立ったらシェア!

python lambda(無名関数)とリスト内包表記の違い




 

リスト内包表記とかlambda式(無名関数)とか書き方たくさんあるけど、どちらがいいんだろうと思ってたので、調べてみました。

なお今回表示させる関数は以下の関数。「ニュートンの蛇形」と言われています。
\begin{eqnarray}
y = \frac{x}{x^2+1}
\end{eqnarray}

 

リスト内包表記

 

 

計算範囲は-1000〜1000ですが、関数に代入する値は0.01をかけた-10〜10です。

実行すると

lambda式(無名関数)

 

無名関数とは「その場限りの関数」です。なので、定義された関数や計算結果を引き継いだりはしません。使い所は難しいですが、慣れればフレキシブルにプログラムをかけるようになると思います。

 

先ほど同様-1000〜1000が計算範囲ですが、実際に関数に代入される値は-10〜10です。


 

比較すると、リスト内包表記は1行、lambda式は6行です。単純にグラフ作成する程度なら「わざわざforループを作って無名関数を使うほどでもない」とういことですね。

あらかじめ他にfor文が上にあり、そのfor文のループ範囲と計算したい関数の計算範囲が一緒なら、無名関数を用意するだけですが、それでもその計算結果を格納するための配列を用意するということを考えれば、やはり「リスト内包表記」が最強な気がする。

for文処理をしない積分計算ならlambda式はかなり威力を発揮しそうですね。

 



記事が役に立ったらシェア!

pythonで積分、平均値推移とその標準誤差にもとづく信頼幅の計算




前回に引き続き、「 Rによるモンテカルロ法入門」のメモ。

前回の記事はこちら。

 

 


今回は
\begin{eqnarray}
h(x) = \{\cos(50x)+ \sin(20x)\}^2
\end{eqnarray}

の積分の近似精度を評価をします。以下では計算回数による、平均値の推移と推定標準誤差にもとづく信頼幅をプロットしてみます。

 

とりあえず計算で求めたい関数をグラフ描画してみる。

そうすると以下のグラフが

そして参考書に基づき、積分区間を0から1の間の乱数で与え、それの平均値と信頼区間95%の範囲の標準誤差をグラフ化するプログラムが以下。

 

 

なお今回は用いていないが、収束を見たい場合、一般的にリスト内の累積和を求めてくれるcumsum()コマンドを用いると良い。そうすると今回のようにfor文内で範囲指定ありのsumコマンドを使う必要がなくなる。

 

例)

 

そして先ほどプログラムの実行結果を示します。積分範囲を0〜1とし,integ関数を用いて積分計算した時の値(0.9652)に収束しています。これを大数の法則と言います。(グラフの横軸は計算回数)

 

labelコマンドを用いたがなぜか判例が表示されないのは許していただきたい。青線が平均値、赤が+の信頼幅における標準誤差、緑が-の信頼幅における標準誤差です。

グラフの形は参考図書と一緒になっているが、「標準誤差」をまだ完全にできていないのでもしかしたら間違ってるかもしれない。

 

標準誤差について

 

試行回数Nが十分大きい時は標準偏差\(\sigma \)を用いて、

\begin{eqnarray}
S,E = \frac{\sigma}{\sqrt{N}}
\end{eqnarray}
と表せる。

上の定義からわかるように、その試行回数によってどの程度のばらつきが生じるかを、全ての組み合わせについて(試行回数)の標準偏差で表現したものである。

なので、誤差評価に標本サイズを加味したい場合は標準偏差ではなく「標準誤差」を用いる。

 

記事が役に立ったらシェア!

pythonでガンマ関数とその近似積分計算




現在「 Rによるモンテカルロ法入門」とpythonを使ってモンテカルロ法について勉強しているのですが、pythonの積分計算を本格的にやったことないなと改めて気づく。

>>Rによるモンテカルロ法入門
   

モンテカルロ法の勉強とは別でpythonで詰まったところのメモも記録していく。

 

今回は「integrate関数とガンマ関数を使う場合の数値計算結果を比較する」例題。

以下のコードを動かす。

 

ValueError: setting an array element with a sequence.

 

って言われたけど、このエラーは基本的に配列の長さが一致してない時に表示されるもの。

試しにfor文を抜け出した後に、print(len(配列),len(配列))で長さが違うかどうか確認

一緒。今回グラフ表示しようと計算している範囲は0〜1000の1001個。

 

どうやら、integrate関数はarray型のリストを返すらしい。なぜかというと、デフォルトでは近似計算による誤差も表示する。そのため

という形式になっている。

試しに簡単な例を示す。

とこんな感じ。

なのでグラフ表示するデータを配列の中から指定してやれば良いだけ。

以下が表示される。

 

Rを使って描画されている著書の結果と同じものができました!

 


まとめ

  • integrate関数はarray型のリストを作成する
  • itnegrate関数は数値計算による誤差も表示する



記事が役に立ったらシェア!

pythonのmin関数(CodingBat)

 

warmup-2

 string_match

Q.

『Given 2 strings, a and b, return the number of the positions where they contain the same length 2 substring. So “xxcaazz” and “xxbaaz” yields 3, since the “xx”, “aa”, and “az” substrings appear in the same place in both strings.』

ex)

string_match(‘xxcaazz’, ‘xxbaaz’) → 3
string_match(‘abc’, ‘abc’) → 2
string_match(‘abc’, ‘axc’) → 0

要するに、連続した2文字を比較した時に、かぶる個数を数えろということである。

自分が書いたコードが以下である。for文処理を何回繰り返すかは、文字列aと文字列bの長さによるので、a>bの時とa<bの時をif文で表現した。

 

しかしpythonには便利な関数min()関数があることをしる(思い出す)。

min(len(a),len(b))でaとbの文字数の少ない方を選択できるわけだ。これを用いると簡単になる。

上のようにもかける。

 

 



 

記事が役に立ったらシェア!

yoemanのJhipsterでwebappの雛形作成してみた

 

Yoemanジェネレータの一つ「Jhipster」でwebappの雛形を作成したのでメモしときます。

公式ドキュメントを参考にしました。かなり密度が濃く英語なので疲れますがその分、有益な情報が詰まっています。

 

前準備

  1. npmを最新版にアップデートします

2. yoeman,bower,gulp-cli,をインストール。すでにインストールされてる場合はいりません。

3. Jhipsterをインストール

 

JHipsterの起動

適当にディレクトリを作成し、以下のコマンドでyoemanを起動する。

その後に「jhispter」を選択する。

そうすると全部で16個質問されるが、雛形を作成する程度なら適当で問題ないと思う。

ついでに自分は以下の設定。

ついでに選択肢については公式ドキュメントの下の部分を見ると良い。

インストールが終了すると以下の文字がターミナルに現れるはず

言われるがままgulp install を実行し、そのあとに

でサーバー起動すると、勝手にブラウザが立ち上がり以下の画面に。

だがしかし…

雛形完成。試しにadminとuser でログインを試みるも

ログイン失敗と言われる。

デフォルトでadminとuserが用意されていると公式ドキュメントに書いてあるので、初期設定は関係ないはず。

Mavenというものを使ってサーバーを起動して見ることにした。「./mvnw spring-boot:run」で実行できるらしいが、JavaのJDKがないと動かないと言われたので大人しくこちらでインストール

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

ダウンロードファイルをダブルクリックすれば、勝手にインストーラーが起動するはず。

そして下記コマンド実行(かなり時間かかる)

下記画像(公式ドキュメント)にある通り、http://localhost:8080 に接続して見るも接続できない。そもそも『Maven』とは一体…

もう一度、gulp serveを実行し、ログインを試みるも結果はなにも変わらず…

何が原因なのかわからないので、解明に時間がかかりそうですがわかり次第、更新します。

 



スポンサードリンク

記事が役に立ったらシェア!

yoemanでmean環境構築がまたうまくいかねぇorz(gulpとgruntどう違うんですかね)

 

macbookproを新しく購入し、前回挫折したmean環境構築に久しぶりに挑戦しました。

今回はなぜかうまく行きました。だけどもまた落とし穴が…

前回と若干違う行程なので、この記事で触れてないとこでエラーが出た方は下の記事を参考にして見てください。

nodejsのインストール

上の記事でこのmacにもインストールしようとしたらエラーが出たので、違うやり方を紹介します。

以下の記事の通り、nodejsをインストールしてください。

 

node.jsをインストールしたら使えるように設定して行きます。

xの部分で先ほどインストールしたnodejsのバージョンを書き込んでください。

次に実行パスを通します。

xxxxxはUserのHomeDir名を入力してください

次に「.bash_profile」に下記を記述します。

そしてターミナルで以下のコマンドを実行しそれぞれバージョンが表示されればおっけーです。

yoemanでmean構築

ここらは前回同様以下のサイトを参考にyoeman,gulp,grunt,bowerをインストールします。

 

唯一違うのはyoemanの「Angular-fullstack」の公式チュートリアルにある通りgruntではなく「gulp」で実行したところです。

そうすると、勝手にブラウザが動き以下のように正常に起動しました。

 

herokuにデプロイしようとしたら、

ここからherokuにデプロイしようとこちらのサイト(herokuの公式サイト)に従い、コマンドを実行しました。

 

インストールしたのちに以下のコマンドを実行していくとデプロイされるはずなのですが、自分はできませんでした。

heroku login の後に、ユーザー名とパスワードが聞かれますが、自分のherokuアカウントで使っているものを入力してください。

yo angular-fullstack:heroku の後に、アプリケーション名を聞かれますが適当にいれてください。ここで決めた名前がアプリのurl名に使われます。詳細は上でも紹介した「paiza開発日誌」さんを見てください。

そして「そもそも自分さっきgruntじゃなくてgulp使ったじゃん」ということに気づき

の部分を

にしようとgulpを入力するも時すでに遅し。よくわからないエラーがorz

そっからはもう地獄のようでした。

一回herokuへのデプロイは忘れて、雛形とりあえず改造してオリジナルのアプリをローカルで開発しようと躍起になり、

「gulp serve」と入力するも

やべぇデプロイどころかローカルでも普通に起動しなくなった笑

さっき(herokuデプロイするためのインストールをした時)色々コピペでわけわからんコマンド実行しまくったのが、今になって帰ってきた笑

ここには書きませんが、途中パスが無効になってgulpとyoコマンドが使えなくなったり…

本当に…

 

3時間くらいこんな感じ笑

普通に動いていれば、今頃api使って色々遊んでいたかもしれないのに笑


ということでyoemanでのmean環境構築は今回もお預け。

 

ネットにはgulpとgruntでサーバーを起動する方法がありました。その情報が交錯しているのが今回の不祥事の原因だと考察します。

自分はgulpを使っているのでそれを考慮し、しっかり情報を見極めていればこんなことになっていなかったかもしれません。


<追記>

別ディレクトリに再度yoemanやらなにやらを下記手順でインストールしなおしたらうまく行きました!!!

herokuへのデプロイは一回置いといて遊んで見ようと思います。

 



スポンサードリンク

記事が役に立ったらシェア!