著者アーカイブ 杉浦

著者:杉浦

RTKLIBライブラリのSTRSVRでGNSS受信機の信号データを保存する

 RTKLIBはRealTimeKinematic測位を行うことを主な目的としたライブラリです。このライブラリの中には任意の通信方式の信号を任意の通信方式の信号として転送するSTRSVRというアプリケーションが含まれています。この記事ではrtklib_2.4.2_bin.zipに入っているSTRSVRを用います。STRSVR.exeはbinフォルダ直下に入っています。これを起動すると次の様な画面が出ます。初期状態Outputがどれも暗いですが、Typeを指定することで明るくなります。

 例としてhamamatsu-gnssから配信されるテスト用移動局データをファイルに保存してみます。
 StreamのInputにテスト用移動局データを、Outputにファイルを指定していきます。TypeはInput側をNTRIP Client、Output側をFileにします。Ntrip Casterで配信されているデータはType NTRIP Clientで受け取ります。

 Input側のOptをクリックして、詳細設定をします。

 hamamatsu-gnssの下の方に記述されている通りにデータを入力します。hamamatsu-gnss.org:2101は:より前がNTRIP Caster Hostの欄に、:より後がPortの欄に入ります。

 File側のOptをクリックして、詳細設定をします。

 ファイルの保存場所を設定するのみです。…ボタンでエクスプローラを開いて指定できます。
 Startボタンで保存を開始します。Stopボタンで信号の受け取りを打ち切ります。これで保存されます。
 
 u-blox Log FileはRTK測位やu-centerをはじめとした様々なソフトウェアに用いることが可能なファイル形式です。

著者:杉浦

機械学習に用いる学習データの選定

 機械学習において学習、評価に用いられる学習データは出力結果の正しさ、出力までの計算時間に大きく関わります。学習データが小さすぎれば十分な正確さを持てず、大きすぎれば無用な計算時間が大量に増え、偏れば偏った結果しか出ません。
 学習データ数が増えるにつれて出力の正確さは増えます。増え方は対数に近く飽和が起きます。

 飽和している状態でさらに学習を行うのは時間の無駄です。正確さの増加量、飽和点は変数の数などのモデルの柔軟性によって大きく変わります。ディープラーニングの様な柔軟性が高いモデルを用いる場合、特に大量の学習データを用意する必要があります。近年はデータに対して自然にありえるであろう微細な加工を施すことで少ない学習データを大量の学習データをの様に扱う技術が生まれ始めています。
 機械学習の実行にかかる計算時間は学習データの数と項目数に大きく左右されます。計算量はデータ数と項目数の積になりがちです。これにより組み合わせ爆発同様の事態に陥ります。単純な繰り返しによる網羅はあっという間に破綻します。
 学習データの偏り方は学習データの母集団と目的の母集団のずれがバイアスとして現れます。通年の天気のデータを予測するために、夏の天気のデータのみを用いる様なものです。以前書いたアンケートのバイアスの話と同じです。

著者:杉浦

多くのcdnリンクを持つcdnjsの紹介

 cdn(contents download link)はjs,cssのライブラリを簡単に読み込む手法です。オープンソース配信サービス、Google Hosted Librariesの紹介で紹介したGoogle Hosted Librariesの様にcdnは多くの場所で配信されています。cdnjsはそのようなcdnの配信リンクをまとめて検索できるサイトです。
 下の画像の様に検索してリンクをコピーするだけでとりあえず使えます。特定のフォーマットで単一のデータを返してくれるAPIも備わっています。
 

 また、cdnjs上でリンクがコピーされた回数をランキングしています。人気が高く、汎用性の高いライブラリが上位に連なっています。jqueryは格別ですね。

著者:杉浦

変数や関数の使用されている場所を探す

 変数や関数の使用されている場所を探すにはファイルを横断して検索を掛けるという方法が考えられます。正規表現を用いた正規表現によっていくらかは絞り込めますが、完璧に行うには正規表現のみでは力不足です。
 変数名や関数名といった識別子を検索すれば、ある程度、変数や関数の使用されている場所を探すことができます。

 このままではhogeやhogebも検索結果に含んでしまいます。識別子でない文字で括られていることを判断する正規表現で、余分な識別子を検索結果から弾きます。

 [^a-zA-Z\$_]の部分は言語によって異なります。上記の正規表現はJavaScriptの規則に従っています。

JavaScript の識別子は必ずアルファベットかアンダースコア (_) かドル記号 ($) から始まらなくてはなりません。続く文字は数字 (0-9) も使えます。JavaScript は大文字・小文字を区別するため、使えるアルファベットは “A” から “Z”(大文字)と “a” から “z”(小文字)です。
引用 変数 – JavaScript | MDN

 ざっくばらんに行うならこの方法で十分ですがこの方法には問題点があります。問題点はスコープを無視するという点と、変数と関数と文字列の区別をつけない、という点にあります。下の様なコードを検索した場合、一つ目の変数hogeの呼び出しカ所を知りたいのに、関数名hogeや文字列hoge、即時関数内のhogeを検索結果に含んでしまいます。

var hoge = 0;
console.log(hoge);
(function hoge(){
	var hoge = 1;
  console.log(hoge);
})();
console.log(' hoge ');

 スコープを無視する、変数、関数の区別がつかない、という問題の単純な解決法は同名の識別子で宣言を行わないことです。固有な識別子をそれぞれが持つならば、このような問題は起こりません。

著者:杉浦

早めに処理を抜けるソースコード

 条件文を重ねてネストが深くなったソードコードは往々にして読みにくいものです。何々なら処理を行うという意味で作られた条件文を何々なら処理を行わないという条件文に書き換えることでソースコードを読みやすくできることがあります。
 次のコードは、もしデータが未定義でなく、データのidが数字ならば、処理を行う、という動作をそのまま書き下したソースコードです。

function (data){
	if(data !== undefined){
		if(typeof data.id === 'number'){
			//処理
		}else{
			return;
		}
	}else{
		return;
	}
}

 実際のコードでは”//処理”の部分が大きくなり、else以下を読もうとした時このelseの元のifはなんだったか、となることがあります。ならなくともifの中を覚えておくことに記憶領域を一部占有されます。
 このコードの条件文による分岐で行いたいことは”条件に合えば処理を行う”ということであり、これは”条件に合わなければ処理を行わない”と言い換えられます。この言い換えの通りに先のコードを書き換えると次の様になります。

function (data){
	if(data === undefined){
		return;
	}
	if(typeof data.id !== 'number'){
		return;
	}
	//処理
}

 元のコードではelse以下の文を読む時ifの中を記憶したまま”//処理”の部分を通る必要がありましたが、書き換えたコードならば処理を行わない条件に当てはまった場合、処理を行わずに抜けるということがすぐにわかります。これにより条件文の中身を覚えておく必要がなくなりました。またこの例の場合、単純で短い条件文二つ程度なのでさらにまとめて下の様にするのもよいです。

function (data){
	if((data === undefined) || (typeof data.id !== 'number')){
		return;
	}
	//処理
}

 一見、data===undefinedの時にdata.idを参照することによってnull参照でエラーが起きる、と思えますがそうはならない言語が多数です。大体の言語には評価が決まった時点で評価を返す機能である短絡評価機能が備わっています。そのためdata===undefinedの時にはdata===undefinedを読んだ時点で条件はtrueと評価されif節の中に入ります。結果data.idは参照されずエラーは起きません。

著者:杉浦

google trendsの紹介

 googleは世界中で使われている検索エンジンです。google trendsはgoogleで検索された回数を元にその時々の流行みたいなものを見せてくれるページです。流行りみたいなもの、というのはあくまで検索された回数が大本のデータの為です。google検索を滅多に行わない集団の流行などはわかりません。スマホ出現の前後でインターネットのユーザ層は大きく変わったように思えます。あくまで検索回数が元というからにはトレンドというより話題性といった方がよいかもしれません。google trendsの使い方は検索ボックスに調べたいワードを入れるだけです。,区切りで検索ワードの時点で複数ワードの比較を命令できます。

 google trendsは人気度の動向、その言葉が検索された地域、関連したキーワードやトピックを表示してくれます。
 人気度の動向は最も検索されていた時を100として表示します。このためいついつに比べて、何々に比べて、と相対的にものごとを調べる時に使うのが良いです。下図の花粉症の様に、何かの要因で検索頻度が激変している言葉もあります。
 
 その言葉が検索された地域は国単位、国の中の地域(県や州)単位、国の中の都市単位で表示されます。下図の様に地域性で違いが出ます。

 関連したキーワードやトピックは、ユーザが対象のワードを検索した後に行った検索やページ遷移を元に定められています。下図はブログを書いていた時に”google”で検索した時の結果です。

著者:杉浦

機械学習の各手法やディープラーニングの共通部分

 この記事では機械学習の各種手法のアルゴリズムに共通する部分を述べます。この記事において、ディープラーニングは機械学習の一手法と扱います。アルゴリズムや処理の仕方という手法の面においてディープラーニングは機械学習の枠組みに収まっています。
 ディープラーニングの技術の成立の流れは、閾値判定、閾値判定のネットワークであるパーセプトロン、滑らかな閾値判定を行うロジスティック回帰、パーセプトロンとロジスティック回帰を合成したニューラルネットワーク、ニューラルネットワークを巨大で複雑にしたディープラーニング、というものに沿っています。これまで用いられてきた機械学習の手法がディープラーニングにつながってきているわけです。ディープラーニングが機械学習と別者の様に注目される理由はディープラーニングがこれまでの機械学習手法とは格別のパフォーマンスを持っているためです。ディープラーニングは性能面では今までの機械学習と別物扱いできますが、技術的な面では機械学習の一手法です。
 機械学習のアルゴリズムの概略図が下図です。

 それぞれのパーツの説明が次です。パーツ単位でまとめていますが、図中の観測データからの流れに沿って読むと気持ち少しわかりやすいはずです。

予測部 予測部はその名の通り観測されたデータから何かを予測する部分です。予測部のみで、入力された画像からその画像が何を表した画像か予測する、盤面から次の一手を予測する、身長から体重を予測する、といったことができます。任意の係数を定数として予測部のみを用いることによって、わずかな計算時間で値の予測ができます。
学習部 学習部はより良い評価値を出力できるように任意の係数を最適に近づけます。予測し、最適に近づけ、を繰り返すループを形成します。このループが学習に見立てられ余す。ループを重ねる程より最適化された任意の係数がわかります。ループを重ねる程より良い結果になる、多量にループを重ねたい、というのが機械学習において計算量が重要視される要因の一つです。

関数

カーネル関数 カーネル関数は観測データを使いやすく加工する関数です。この関数を通すことで計算量を削減したり、素の観測データそのものでは得にくいものを得たりします。
モデル関数 モデル関数は観測データと任意の係数を入力として、予測値と評価値の元になるパラメータを出力します。この関数は機械学習の手法によって中身が大きく変わります。
評価関数 評価関数はモデル関数の出力を入力として評価値を出力します。複数の項目にわたる予測値をまとめたり、値の正規化を行うことが多いです。
学習関数 学習関数は任意の係数と評価値を入力とする関数です。評価値と前状態の任意の係数を元により良い評価値を得られそうな方向に任意の係数を変化させます。

観測データ 観測データは主に実世界から得たデータです。画像識別でいえば入力画像、識別して欲しい画像達のことです。
予測値 予測値は観測データと任意の係数を入力としたモデル関数から出力される値です。画像識別では画像に付けられる銘になります。
任意の係数 任意の係数はモデル関数に与えられる値です。この任意の係数を最適化してより正確な予測をします。任意の係数の最適化を行う過程は人間の学習に似ています。
評価値 評価値は予測値が良い予測値なのか、悪い予測値なのかを評価した値です。任意の係数を変化させて、評価値を最大化ないし最小化しようとするアルゴリズムが機械学習です。

 いずれの機械学習も、モデルに沿った最高の評価を得る任意の係数を求める、という最適化問題を解こうとしています。機械学習は、何々から何々の最適な予測を行う、という言葉に落とし込める問題には全て挑めます。課題はどの様に入力、予測、評価を数値化するか、どの様なモデルを作成するか、どの様に入力データを得るか、です。また機械学習は応用できます。近年、注目されているディープラーニングを用いた自動画像生成アルゴリズムであるGANは、入力された画像からその画像が自動生成された画像であるか生の画像であるかの最適な予測を行う機械学習とノイズから生の画像に近づける変化の最適な予測を行う機械学習をつなげることで実現されます。

著者:杉浦

npmの紹介

 npmはnpmはNode.jsのパッケージマネージャです。Node.jsはサーバサイドjavascript環境です。雑に特徴を抜き出した言い方をすると、javascriptと銘打ってありますがブラウザを必要としない環境です。ローカルのサーバのみで終わることが出来るため、単体で完結しているアプリ同然のように思えるパッケージも少なくありません。Chrome等ブラウザ上の自動テスト画像の差分出力各ブラウザに対応している記法チェックオプションがこれでもかと付けられるLintなど様々です。
 また、それぞれを組み合わせることも可能です。例えば、ブラウザ上の自動テストで期待する画面のスクリーンショットをあらかじめ用意しておき、調べたい状態でスクリーンショットを取得、期待する画面のスクリーンショットと比較することで大量のテストを楽に行うこともできます。

著者:杉浦

ソースコード中のコメントした方がいいこと、悪いこと

 ソースコード中には自由にコメントを書くことができます。コメントの良い点はプログラミング言語の記法に縛られることなく自然言語で書き手の意図を読み手に知らせることが出来る点です。コメントの悪い点はソースコード中の文字数が増えるところです。
 良い点が悪い点を超える際にのみコメントを記述することが理想になります。しかしながら困ったことに読み手がどのような人かによって良い点が悪い点を超える瞬間は大きく左右されます。例えば、次のようなコードがあります。

array_object = Array.prototype.slice.call(array_like_object)//array_like_objectを配列に変換する

Array.prototype.slice.callはjavascriptで配列っぽいオブジェクトを配列として変換したい時によく使われる慣用句みたいなものです。”Array.prototype.slice.call”(完全一致)でググると約171,100件もヒットします。散々使われ倒しているため、javascriptをやり込んでいる少なくない人にとって、このコメントは余分な情報で邪魔者です。一方で、Array.prototype.slice.call(引数)という文面には引数を配列に変換するという意味の単語はまるで使われていません。これがarray_like_objectを配列に変換するコードだと連想することは難しいでしょう。初めて読んだ時は自分も何だこれとなりました。javascriptを学んでいる途中の人にはこのコメントは必要でありがたいものです。慣れという部分でコメントをするべきしないべきかが変わり境界は曖昧です。
 明確にコメントを行うべきでないという場合はソースコード中の記述がそのままコメントの内容と同じになるときです。javascriptのES6記法では配列っぽいオブジェクトを配列として変換したい時に次の様な記述ができます。

array_object = Array.from(array_like_object)//array_like_objectを配列に変換する

 コメントはいらないのではないかというくらい動作を連想しやすい記述です。そのまま英語として読めるくらいです。このような際にコメントは多くの人にとって邪魔なものになるでしょう。
 おまけに極端な場合を紹介します。
 情報を伝えないコメントは単に無駄なだけでするべきでないコメントです。コメントアウトされている過去のコードは特にこの手のコメントになりやすいです。
 コメント行がより多くのコード行を説明できる場合、コメントは有用になりやすいです。プログラム、ファイル、関数のようなまとまり全体を説明する場合、大体これにあてはまります。コメント十行でコード数百行を説明するような感じです。

著者:杉浦

任意の本の色合いからカラーチャートを得るColor of Book

Color of Book – 雑誌の色からhtml,cssで利用できるカラーチャートの紹介
 Color of Bookは任意の本の色合いからカラーチャートを得るサービスです。Color of BookではAmazonに存在する本の表紙画像から画像を取得し、その画像中で多く使われている色、特徴的に使われている色を見つけ、それを図示してくれます。本の指定は自由検索、ファッション誌、スポーツ誌のジャンル選択の三種類です。0から作るのが面倒な時、ほげほげの本みたいな雰囲気の色を作りたい時などに特に利用できます。盗作にならない程度に使いましょう。
 このサイトはhttp://colorchart.jp/color/[ISBN-10]のアドレスでamazonで表示される任意の本の表紙を参照することが出来ます。ISBN-10はamazonの書籍商品ページのアドレスのdp/以下に表示されています。これを利用して検索機能のより充実したamazonページを経由してアクセスできるようにすればなお便利です。