タグ

ブックマーク / minus9d.hatenablog.com (14)

  • Pythonのコード改善のためのツール5つを試してみた - minus9d's diary

    Pythonのコードを改善するためのツールについて一通り試してみました。各ツールのインストール方法や使い方については Pythonのスタイルガイドとそれを守るための各種Lint・解析ツール5種まとめ! - Sider Blog に詳細にまとまっているのでおすすめです。 サンプルコード 以下のサンプルコードを対象に、各ツールの出力を確かめてみます。 import time import sys import fractions def func1(varA,varB): '''return sum of a and b''' varC = 42 return (varA + varB) print(func1(fractions.Fraction(1, 2), fractions.Fraction(1, 3))) 3 + 5 sys.exit(0) このスクリプトをsample.pyという名

    Pythonのコード改善のためのツール5つを試してみた - minus9d's diary
  • matplotlibをオブジェクト指向スタイルで使う その2 - minus9d's diary

    前にmatplotlibをオブジェクト指向スタイルで使う - minus9d's diaryという記事を書きました。しかし、matplotlib によるデータ可視化の方法 (1) - Qiita および Why do many examples use "fig, ax = plt.subplots()" in Matplotlib/pyplot/python - Stack Overflow によると、plt.subplots()という関数を使うと、より簡潔に書けるようです。この記事ではplt.subplots()の例を紹介します。 なお、以下のコード片では、全て冒頭に import matplotlib.pyplot as plt import numpy as np と書かれているものとします。 一つの図に一つのグラフの場合 まず、一つの図と一つのグラフ領域を持つ絵を、私が前の記事で

    matplotlibをオブジェクト指向スタイルで使う その2 - minus9d's diary
  • SIMD命令を使って高速に計算する - minus9d's diary

    マルチコアを用いた画像処理 from Fukushima Norishige このスライドに出てくるSIMD命令を試したくなったので試してみました。 IntelのCPUSIMD命令を使う場合、SSEという命令セットと、その後継であるAVXという命令セットのどちらかを使うことになると思います。私の手持ちのWindows機に載ってるCPUはCore i7-870とやや古く、SSEしか使えません。 kawa0810 のブログにあるサンプルはAVXを用いたものだったので、コードを改変してSSEでも動くようにしたコードが以下です。Windows 7 + Visual Studio 2013 Expressでビルドできることを確認しています。コードの正当性に自信が持てませんが、とりあえずSSEを使う場合と使わない場合とで結果は一致しています。 #include <stdio.h> #include

    SIMD命令を使って高速に計算する - minus9d's diary
  • pythonでcsvを読む方法 - 標準ライブラリ, pandas, numpy - minus9d's diary

    pythoncsvを読み込む方法についてまとめました。ライブラリによって微妙に読み込み方が異なるので大変です。 この記事では、以下のdata.csvを読み込む場合を考えます。最初の行がヘッダ行で、それ以降の行がデータ行です。 a,b,c 2,5.6,1 1,7.0,0 3,6.2,1 3,7.9,1 方法1: 標準ライブラリのcsvを使う方法 csv.readerオブジェクトを使って一行ずつ読んでいく方法です。ヘッダ行の部分を特別扱いする必要があります。 import csv def open_with_python_csv(filename): data = [] with open(filename, 'r') as filename: reader = csv.reader(filename) # ヘッダ行は特別扱い header = next(reader) # 中身 for r

    pythonでcsvを読む方法 - 標準ライブラリ, pandas, numpy - minus9d's diary
  • ベクトルで微分 - minus9d's diary

    備忘録として、ベクトルで微分することの定義をまとめる。ここでは、分かりやすいようにベクトルはすべて3次元とする。 定義 ベクトルの関数を、ベクトルで(偏?)微分することの定義は以下の通り。 例 よくあるのが をで微分するというもの。ここで、は3x3の正方行列で、全体はスカラー値。これを上の定義に基いて計算してみよう。 まず の値を計算すると、 となる。 ここで、さっきの定義に従って をを偏微分してみると と計算できる。もしAが対称行列なら、さらに と簡単にできる。この結果だけ見ると、高校数学の微分でをで微分するととなるのと似てますね。 他の考え方 サイボウズ・ラボ光成さんのPRML の2 章のための数学によると、の定義はを縦に並べた縦ベクトルとのこと。この定義で覚えたほうがイメージがつかみやすいかも。 参考 PRML の2 章のための数学 Vector and Matrix Differe

  • Pythonで2変数関数に対してニュートン法を用いる - minus9d's diary

    前回、Pythonで2変数関数に対して最急勾配法を用いる - minus9d's diaryにて、2変数関数に対する最急勾配法を Pythonで実装しました。 今回は、最急勾配法よりも収束が早いと言われるニュートン法を実装してみます。私の理解が正しければ、ニュートン法では、初期点が与えられたとき、その点の近くにあるStationary point(停留点)、すなわち微分が0になる点を探します。微分が0になる点なので、必ずしも極値に収束するとは限らず、鞍点に収束する可能性もあります。 ニュートン法の更新式は以下の通りです。 ここでは学習率、はヘッセ行列です。変数名は教科書「言語処理のための機械学習入門 (自然言語処理シリーズ) 」に従っていますが、この教科書は版によってはニュートン法の式が誤っているので注意。 目的関数は前回と同じくです。の極小値の一つを求めるのが目的です。 実装コード Py

  • C++11で数字→文字列はstd::to_string()、文字列→数字はstd::stoi()とかstd::stod()とか - minus9d's diary

    数字から文字列 スクリプト言語でよくある、数字を文字列に変換する関数がC++11でも提供されています。std::to_string(100)などと書くだけで数字が文字列に変換できます。 #include <iostream> #include <string> int main() { std::string str = "Holland, " + std::to_string(1945); std::cout << str << std::endl; return 0; } ただし変換方法はおまかせで高度なフォーマット指定はできません(たぶん)。フォーマットを指定したい場合は、Cの流儀でsprintf()関数を使うか、C++の流儀でstd::ostringstreamを使います。以下は、数字777を、"00777"と0埋め5桁の文字列に変換する例です。(参考:C++ の iostream

    C++11で数字→文字列はstd::to_string()、文字列→数字はstd::stoi()とかstd::stod()とか - minus9d's diary
  • C++11のthreadで遊んでみる - minus9d's diary

    この記事は続き記事です。 第1回:この記事 第2回:C++11のthreadで遊んでみる その2 - mutex編 - minus9dの日記 第3回:C++11のthreadで遊んでみる その3 - condition_variable編 - minus9dの日記 - C++11の標準ライブラリではスレッドのためのライブラリが追加されたという。これまでWindows系では_beginthreadex()、Linux系ではpthread_create()、などと関数を使い分ける必要があったのでうれしい。今回はC++11のスレッドライブラリを使って何ができるかを探ってみたいと思う。 参考にしたのは、書籍 C++ ポケットリファレンス。今のところどの日語のウェブサイトよりもまとまった情報源だと思う。また、この書籍のサンプルコードがcpp-pocketref/sample-code · GitH

    C++11のthreadで遊んでみる - minus9d's diary
  • C++11のthreadで遊んでみる その2 - mutex編 - minus9d's diary

    この記事は続き記事です。目次→C++11のthreadで遊んでみる - minus9dの日記 - mutexを使って排他制御 スレッドを4つ作って、それぞれのスレッドでIDを表示するプログラムを書いてみる。 #include <iostream> #include <thread> #include <vector> void worker() { std::cout << "thread id: " << std::this_thread::get_id() << std::endl; } int main() { // スレッドを4つ作る std::vector<std::thread> ths(4); for (auto& th : ths) { th = std::thread(worker); } // すべてのスレッドが終わるのを待つ for (auto& th : ths)

    C++11のthreadで遊んでみる その2 - mutex編 - minus9d's diary
  • C++11で、chronoライブラリを使って時間を計測する - minus9d's diary

    C++11で新しく加わったchronoライブラリを使うと、簡単に経過時間が計測できる。もう環境依存のコードを書かなくてよくなるなら嬉しい。 サンプルコードは以下。シンプルなのですぐわかると思う。 #include <iostream> #include <chrono> int main() { auto start = std::chrono::system_clock::now(); // 重い処理 long long j = 0; for(int i = 1; i <= 100000000; ++i) { j += i; } auto end = std::chrono::system_clock::now(); // 経過時間をミリ秒単位で表示 auto diff = end - start; std::cout << "elapsed time = " << std::chron

    C++11で、chronoライブラリを使って時間を計測する - minus9d's diary
  • EmacsのflymakeにてC++11の文法を自動チェックさせる - minus9d's diary

    ~/.emacs.d/init.elに以下を加えると、キーを打つたびにC++11の文法チェックが自動で走るようになります。 ;; 参考:http://d.hatena.ne.jp/suztomo/20080905/1220633281 (require 'flymake) (defun flymake-cc-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "g++" (list "-std=c++11" "-Wall" "-Wextra" "-fsyntax-only" l

    EmacsのflymakeにてC++11の文法を自動チェックさせる - minus9d's diary
  • 閉形式(closed-form)とは - minus9d's diary

    前に文献を読んでいて出会った、調べてもいまいち意味の分からなかった「閉形式」。言語処理のための機械学習入門 (自然言語処理シリーズ) を読み直すと、1.2節にあっさり書いてあった。以下、引用。 「加減乗除や初等関数の合成関数による解の表し方を、閉形式(closed-form)という。」 「微分形式でいう閉形式とは異なる。」 「ただし、初等関数としてどれだけの関数を含めるかは、明確に定められていないので、閉形式の定義は曖昧である。しかし、この曖昧さは実用上はほとんど問題にならない。」 これで終わりにしてもよいが、ついでに英語版のWikipediaも見ておく。(Closed-form expression - Wikipedia, the free encyclopedia)。Wikipediaによると、閉形式とは「有限個の、『よく知られた(well-known)』関数によって解析的に表される

  • matplotlibをオブジェクト指向スタイルで使う その1 - minus9d's diary

    Matlabスタイルとオブジェクト指向スタイル matplotlibは、以下のようにmatplotlib.pyplotに属する関数を順番に呼んで使われることが多いです。 import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show() これはMatlabでのグラフ描画の方法に近いので、Matlabスタイルと呼ぶことにします。 Matlabスタイルではmatplotlibが内部に状態を持ってしまいます。この性質は、インタラクティブな環境でコマンドを打ち込んでグラフを描画するときには都合がよいですが、逆にスクリプト作成時には混乱のもとになります。 スクリプト作成時には、Matlabスタイルではなくオブジェクト指向スタイルを採用するのがお勧めです。オブジェクト指向スタイルの書き方につ

    matplotlibをオブジェクト指向スタイルで使う その1 - minus9d's diary
  • scikit-learnのSVMを使って多クラス分類を試す - minus9d's diary

    Pythonのscikit-learnを勉強中です。今回は、公式ページにある、手書き文字を0から9に分類するコード (Recognizing hand-written digits — scikit-learn 0.16.1 documentation) を読み解いてみます。 準備 Python 3でscikit-learnを使えるようにします。今回は Download Anaconda Python Distribution で配布されているAnacondaを使いました。 コード 手書き文字データセット scikit-learnに付属する、8x8の白黒画像で表現された手書き文字データセットを使用します。 from sklearn import datasets digits = datasets.load_digits() このデータセットには1797個分のデータが含まれています。dig

    scikit-learnのSVMを使って多クラス分類を試す - minus9d's diary
  • 1