SyntaxHighlighter

2015年8月9日日曜日

Raspberry Pi上でTWE-Lite-2525AからのデータをToCoStickを使って受信する

Raspberry PiにToCoStickを繋いで、加速度センサTWE-Lite-2525Aから送られてきた情報をシリアル通信でモニタリングするために行った作業のメモ。
ToCoStickのアプリはデフォルト(超簡単!TWEアプリ)のまま利用。

Raspberry PiのUSBポートにToCoStickを挿し、dmesgを確認。ttyUSB0として認識されたようだ。
user@raspberrypi ~ $ dmesg
(中略)
[  554.996366] usb 1-1.2: Product: TWE-Lite-USB
[  554.996382] usb 1-1.2: Manufacturer: TOCOS
[  554.996398] usb 1-1.2: SerialNumber: XXXXXXXX
[  555.003578] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected
[  555.003774] usb 1-1.2: Detected FT232RL
[  555.004697] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0
シリアル通信を行うため、cuコマンドを使えるようにする。
しかし、Raspberry Piの初期ユーザであるpi以外で接続を試みると、権限がないと言われてしまう。
user@raspberrypi ~ $ sudo apt-get install cu
user@raspberrypi ~ $ cu -l /dev/ttyUSB0 -s 115200
cu:  open  (/dev/ttyUSB0):  Permission denied
cu:  /dev/ttyUSB0:  Line in use
どうやら、シリアルポートはdialoutというグループに属していないと一般ユーザはもちろん、rootであっても利用できないようだ(初期ユーザであるpiは登録されているので使える)。なので使用しているユーザを追加してやる。
user@raspberrypi ~ $ sudo vigr
- dialout:x:20:pi
+ dialout:x:20:root,user
すると「整合性を保つために /etc/gshadow を変更する必要があるかもしれません。」とメッセージが出る。なので/etc/gshadowも同じように修正する。
user@raspberrypi ~ $ sudo vim /etc/gshadow
- dialout:x:20:pi
+ dialout:x:20:root,user
一度ログアウトし、再度cuコマンドで接続。無事接続され、TWE-Lite-2525Aを叩いたり動かすとログが出力される。ちなみにシリアル通信を終了させるには~.と入力する。Ctrl+Cでは終了できない。
user@raspberrypi ~ $ cu -s 115200 -l /dev/ttyUSB0
Connected.
:788115017B81020950002F2C000BCD00080F403C3A5E5EDE
:788115018A81020950002F34000BCD00010F3E3E3A5E66C6
:788115018A81020950002F3C000BCD00000F3E3E3A5E56CF
:788115017881020950002F44000BCD00000F3E3E3A5E56D9
~.

Disconnected.
続いて、公式で用意されているPythonによる読み出しスクリプトを動かしてみる。

このスクリプト(twelite_read.py)は引数に指定したポートへ接続し、TWE-Lite標準アプリの出力を整理して表示してくれる。
user@raspberrypi ~/python $ python twelite_read.py /dev/ttyUSB0
open serial port: /dev/ttyUSB0

:788115019081020950002F64000BC500010F3E3E3A5E56A8
  command   = 0x81 (data arrival)
  src       = 0x78
  src long  = 0x81020950
  dst       = 0x00
  pktid     = 0x15
  prtcl ver = 0x01
  LQI       = 144 / -48.10 [dbm]
  time stmp = 189.562 [s]
  relay flg = 0
  volt      = 3013 [mV]
  DI1=1/1  DI2=0/1  DI3=0/1  DI4=0/1
  AD1=1000 AD2=0996 AD3=0932 AD4=1508 [mV]
DI0~4はそれぞれ下記の動作に対応している。上記の例ではDI1が1/1になっているので、TWE-Lite-2525Aを1回叩いたことを意味している。
  • DI1: 軽く1回叩く
  • DI2: 軽く2回叩く
  • DI3: 落とす(50cm~?)
  • DI4: 動かす

2015年7月2日木曜日

scikit-learnで作成した決定木をPDF形式で出力

pythonの機械学習ライブラリscikit-learnで作成した決定木をPDF形式で出力する方法のメモ。
環境はCentOS6.6、Python2.7.9。
決定木を作成するコードは以下のサイトから。

Pythonで決定木を描いてみる - 技術情報棚卸し(平日限定)

上記のサイトでは結果をgraph.dotというファイルに出力し、その後コマンドライン上でPDFへ変換している。これを毎回やるのは面倒なので、python内で処理してしまおうというのが目的。

# encoding: utf-8
import pandas as pd
from sklearn import tree
from sklearn.externals.six import StringIO
from graphviz import Digraph
import pydot

data = pd.read_table('iris.txt')
# 説明変数
variables = ['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width']
classifier = tree.DecisionTreeClassifier()
# 目的変数はSpecies
classifier = classifier.fit(data[variables], data['Species'])

# 結果をPDFで出力
dot_data = StringIO()
tree.export_graphviz(classifier, out_file=dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf('iris.pdf')

実行してみると、以下のエラーが表示された。
Couldn't import dot_parser, loading of dot files will not be possible.
Traceback (most recent call last):
  File "decision_tree.py", line 18, in 
    graph = pydot.graph_from_dot_data(dot_data.getvalue())
  File "/usr/local/lib/python2.7/site-packages/pydot.py", line 199, in graph_from_dot_data
    return dot_parser.parse_dot_data(data)
NameError: global name 'dot_parser' is not defined

結論だけ書くとpydotをアンイストールしてpydot2を入れることで解決、無事PDFが作成された。
$ sudo pip uninstall pydot
$ sudo pip install pydot2

参考:

2014年7月23日水曜日

推薦システム勉強会で使用した文献

を、まとめておく。

第1回

  • 推薦システムのアルゴリズム
  • 神嶌敏弘, 人工知能学会誌, Vol. 22, No. 6, pp. 826-837, 2007.
  • 人工知能学会誌, Vol. 23, No. 1, pp. 89-103, 2008.
  • 人工知能学会誌, Vol. 23, No. 2, pp. 248-263, 2008.

この分野ではお馴染みのサーベイ論文。基本から幅広く知識を習得できる。3回にわたって人工知能学会誌に掲載されたが、今は著者によりまとめられたものがWeb上に公開されている。

第2-3回


こちらも超有名なサーベイ論文で、10年前のものだが今でも十分通用する内容。推薦精度に関する評価指標を中心に紹介されている。精度以外の指標にも触れているが、確立された手法がなかったため簡単な言及に留めている(今でも確立されていないが)。

第4回


Wikipediaの情報をLOD (Linked Open Data) 形式で公開しているDBpediaを情報源として映画の推薦を行う手法。ジャンルや監督、出演俳優といった属性とその値を用いているところが特徴で、こういった内容ベース的なアプローチと構造化された情報を扱うDBpediaは相性が良い。

第5回


Amazonに投稿されているレビューから,カメラであれば重量や価格といった観点(=属性)に対する嗜好を抽出する。この既存ユーザの嗜好情報を用いて、完全に把握できていない新規ユーザの嗜好 (partial preference) の欠損値を補う手法。レビューの選択基準が不明瞭だが、新規ユーザに対する推薦精度改善手法として面白いアプローチ。

第6回


ユーザが好む(高く評価する)可能性が高いアイテムを推薦する、というのがほとんどの推薦システムにおいて目的となっている。その中で、この手法はサービス提供者(主に企業)の利益を最大化することを目的としている。価格(利益)の高い商品や、キャンペーンや在庫処分などの理由でとある商品を優先的に推薦する、というのは企業では既にある程度やっていることだとは思う。ただ、アカデミックな分野ではあまりこういった目的での手法は見られなかったので、面白い手法と思う。

第7回


少し古い文献だが、推薦時に理由(なぜそのアイテムが推薦されたが)を併せて提示することでユーザの満足度向上を試みた手法。提案手法は3つあるが、そのなかのNeighbor Style Explanation(協調フィルタリングによる近傍ユーザの評価値分布を推薦理由としてユーザに提示する手法)において、ユーザがその評価に影響され推薦アイテムに対して高い評価をしがちであるという結果。この結果に対して、推薦理由の提示により高い評価に影響を受ける=推薦アイテムを過大評価することに繋がり満足度が低下する、という考察が興味深い。

第8回


ホテルに対するレビューを対象として、属性(立地、サービス、部屋など)への言及の度合いを自然言語処理により推定し、コンテキストベースの推薦に用いている手法。新規ユーザやアイテムに対して推薦精度が低下するcold-start問題への解決策として、コンテキストベースの推薦を行う手法は広く行われている。新規ユーザに対して特に有効なアプローチだが、いずれの手法もアイテムに対する情報が事前に十分得られていることが前提となっている。

第9回


いわゆる「ロングテール」に着目し、不人気アイテムを推薦することに重きを置いた手法。タイトルにAccuracyとあるが精度の検証はせず、アイテムの人気度を考慮した再現率を評価指標としている。着眼点は面白いが、データセットを用いたオフライン実験で検証できる範囲は限られており、そのあたり限界を感じる。

2014年2月6日木曜日

情報推薦の研究に使えるデータセット

海外・国内それぞれで公開されているデータセットをまとめました。
情報推薦(推薦システム)に関する研究で利用することを想定し、アイテム(商品や映画等)とそれに対する評価情報がペアになっているものをピックアップしています。

<海外>

GroupLens Dataset

最も有名で、最も利用されているデータセット。
データサイズは100k, 1M, 10Mの3種類が用意されている。


The Book-Crossing Dataset

Book-Crossingと呼ばれる「書籍に旅をさせる」プロジェクトから収集されたデータセット。


Yelp Dataset

飲食店やお店に関するクチコミを掲載しているYelpのデータセット。利用には申請が必要。
面白いのは業績に対する賞金が充実していること。例えば査読付き論文誌に掲載されると1,000ドル貰えるし、学生なら賞金5,000ドルのAwardもある。
その他、与えられたテキストからカテゴリを予測するといったことも行える(詳細はGitHubのページで)。

EachMovie Dataset

MovieLensと並んでよく利用されていたが、現在は公開終了。

<国内>

楽天データ公開

  • http://rit.rakuten.co.jp/rdr/
  • 楽天市場(みんなのレビュー):商品に対する5段階評価 (1-5)
  • 楽天トラベル:ホテルに対する5段階評価、項目別評価あり (1-5)
大学・研究機関のみ利用可能で、事前申請が必要。
様々なデータが公開されているが、情報推薦の分野で活用できそうのなのは楽天市場、楽天トラベル、GORA(ゴルフ場)に関する評価データ。
楽天市場(みんなのレビュー)は膨大なレビューが利用可能。しかし「レビューを書くと送料無料」といった施策の影響か、コピペレビューがとても多い上に評価が5(最高値)に大きく偏っている。そのため、これらを踏まえた前処理が必須。実際に行った前処理の結果については下記参照。
[追記] 楽天市場のレビューを用いた論文が無料でDLできます(要ID登録)

Zhongjie Mao, Shunichi Hattori and Yasufumi Takama, Analysis of Online Reviews for Evaluating Informative Reviews, SCIS&ISIS2012, W2-44-2, 2012.

楽天トラベルではコピペは少ないが、それでも評価は(他セットとくらべて)好評寄りに偏っている。

SUSHI Preference Data Sets

寿司についての嗜好を調査したデータセット。詳細は下記の文献を参照。

T. Kamishima, Nantonac Collaborative Filtering: Recommendation Based on Order Responses, KDD2003, pp.583-588, 2003. [PDF]



2013年5月14日火曜日

PassengerでRailsアプリケーションをデプロイ

Passengerを用いてRailsアプリケーションをサーバへデプロイする際に行ったことをメモ。
サーバのOSはCentOS 6.4、DBはMySQL 5.6.10で、Passengerがインストールされていることを前提に。Passengerのインストールについては下記ページが参考になる。

Apache上でRuby on Railsアプリケーションを動かす/Passenger(mod_rails for Apache)の利用

アプリケーションのアップロード

Apacheのドキュメントルート(/var/www/html/など)にフォルダごとFTPでアップロードする。httpd.confの設定を変えれば、他の場所にしても構わない。

所有者を変更

Passengerはroot権限でrailsアプリケーションを動作させることができないので、chownコマンドでフォルダの所有者を変更する。
% chown -R username:group /var/www/html/RAILS_ROOT

database.ymlの設定

開発機とサーバ機でMySQLのソケットやユーザ名が異なる場合は、development(開発用)、test(テスト用)、production(本番用)それぞれについてdatabase.ymlを修正する必要がある。

RAILS_ROOT/config/database.yml
production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: railsapp_production
  pool: 5
  username: username
  password: pass
  socket: /tmp/mysql.sock
修正する必用があるのは多くの場合、username/password/socket欄だろうか。
mysql.sockの場所が分からないのであれば下記コマンドを実行する。パスワードを求められるので、指定したユーザに対応するパスワードを入力する。
% mysqladmin -u username -p version
出力結果(下記11行目)にソケットの場所が表示されている。
mysqladmin  Ver 8.42 Distrib 5.6.10, for osx10.8 on x86_64
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version          5.6.10
Protocol version     10
Connection          Localhost via UNIX socket
UNIX socket          /tmp/mysql.sock
Uptime:               29 days 23 hours 20 min 24 sec

Threads: 3  Questions: 37312  Slow queries: 0  Opens: 100  Flush tables: 1  Open tables: 67  Queries per second avg: 0.014

mysql2アダプタをインストール

まずはMySQLの開発ライブラリをインストール。
% sudo yum install mysql-devel
Gemfileに以下を記述。

RAILS_ROOT/Gemfile
gem 'mysql2'
その後でbundle installを実行。

本番用データベースを作成

Passenger上で動くrailsアプリケーションは標準でproductionモードでの動作となるので、それに対応するデータベースをサーバ上で作成する必要がある。
% rake db:create RAILS_ENV=production
% rake db:migrate RAILS_ENV=production
これで完了。

2013年5月13日月曜日

TeXworksでBibTeXを扱う

Windows版TeXworksでBibTeXを使う時に引っ掛かったのでメモ。

デフォルトで用意されているBibTeXは欧文専用であり、日本語を利用するためにはpBibTeXを追加する必要がある。

Texworksの設定

Texworksを起動し、「編集」から「設定」を開いてタイプセットタブへ移動する。


上記のように「タイプセットの方法」欄があるので、「+」ボタンを押して開いたウィンドウ「タイプセットの方法を設定する」にて下記のように入力する。


これで、タイプセットのプルダウンからpBibTeXが選択できるようになる。

タイプセット手順

あとはBibTeX同様、下記手順でタイプセットを行う。

  1. pLatexでタイプセット
  2. pBibTeXでタイプセット(.bblファイルが作成される)
  3. もう一度pLatexでタイプセット(引用関係がリンクされる)

参考:

TeXworks/設定/Windows - TeX Wiki

2013年4月2日火曜日

DBpedia日本語版:SPARQLをRubyから実行

前回のSPARQLをRubyから実行する。Rubyのバージョンは1.9.3。

まずはgemをインストール。
% gem install linkeddata
% gem install sparql

SPARQLをRubyで実行するコード。
#-*- coding: utf-8 -*-
require "sparql/client"
 
client = SPARQL::Client.new("http://ja.dbpedia.org/sparql")
results = client.query("
  SELECT ?resource ?title
  WHERE {
    <http://ja.dbpedia.org/resource/織田裕二> dbpedia-owl:wikiPageWikiLink ?resource .
    ?resource rdf:type dbpedia-owl:Film .
    ?resource rdfs:label ?title .
  }
")
results.each do |solution|
  puts "#{solution[:resource]} | #{solution[:title]}"
end
結果は以下のとおり。
http://ja.dbpedia.org/resource/踊る大捜査線_THE_MOVIE | 踊る大捜査線 THE MOVIE
http://ja.dbpedia.org/resource/踊る大捜査線_THE_MOVIE_2_レインボーブリッジを封鎖せよ! | 踊る大捜査線 THE MOVIE 2 レインボーブリッジを封鎖せよ!
http://ja.dbpedia.org/resource/ホワイトアウト_(小説) | ホワイトアウト (小説)
http://ja.dbpedia.org/resource/湘南爆走族 | 湘南爆走族
http://ja.dbpedia.org/resource/県庁の星 | 県庁の星
http://ja.dbpedia.org/resource/彼女が水着にきがえたら | 彼女が水着にきがえたら
http://ja.dbpedia.org/resource/椿三十郎_(2007年の映画) | 椿三十郎 (2007年の映画)
http://ja.dbpedia.org/resource/BEST_GUY | BEST GUY
http://ja.dbpedia.org/resource/将軍家光の乱心_激突 | 将軍家光の乱心 激突
http://ja.dbpedia.org/resource/T.R.Y. | T.R.Y.
http://ja.dbpedia.org/resource/就職戦線異状なし | 就職戦線異状なし
http://ja.dbpedia.org/resource/波の数だけ抱きしめて | 波の数だけ抱きしめて
http://ja.dbpedia.org/resource/卒業旅行_ニホンから来ました | 卒業旅行 ニホンから来ました
http://ja.dbpedia.org/resource/アマルフィ_女神の報酬 | アマルフィ 女神の報酬
http://ja.dbpedia.org/resource/踊る大捜査線_THE_MOVIE3_ヤツらを解放せよ! | 踊る大捜査線 THE MOVIE3 ヤツらを解放せよ!
http://ja.dbpedia.org/resource/きけ、わだつみの声_Last_Friends | きけ、わだつみの声 Last Friends
http://ja.dbpedia.org/resource/エンジェル_僕の歌は君の歌 | エンジェル 僕の歌は君の歌
http://ja.dbpedia.org/resource/アンダルシア_女神の報復 | アンダルシア 女神の報復
http://ja.dbpedia.org/resource/踊る大捜査線_THE_FINAL_新たなる希望 | 踊る大捜査線 THE FINAL 新たなる希望

コードは以下を参考に、というかほぼそのまま。
RDF.rb - LinkedData.jp Wiki