2016年7月23日土曜日

Postgresqlのインストール in Mac

最近は、訳あってデータベースの勉強をしています。

使用するDBMSはPostgresqlです。
理由は、PostGISも合わせて練習したい、ということと、
配列型が使えることに魅力を感じたこと。
あとは、会社で使用しているWebサービスがPostgresqlを使っているから、
というのもあります。
ただ、私自身は直接このWebサービスの業務に関わっているわけでもないので、
これはあまり大きな理由にはなっていないかも(笑)。

そんなわけで、まずは私のPC環境でPostgresqlをインストールしてみます。

インストールの方法としては、私が使用するMacの場合は
homebrewを使った方法が多く紹介されています。

しかし、なぜか私のPC環境のbrewは、私に似ておバカさんなので、
Postgresql自体はインストールできても、psqlを実行できないと。。。


このため、EDBのサイトからインストーラをダウンロードして
インストールしてみることにします。

こちら(EDBのサイト)にアクセスすると、
次のようなページが表示されますので、Mac OS Xを選びます。
ここで、2016.7.23現在、Beta版のVersion9.6がありますが、
年寄りな私は安定が好きなので(笑)、9.5.3の方をダウンロードしました。




ダウンロードしたファイルはdmg形式です。
このdmgをダブルクリックします。



設定によっては、次のようなダイアログが立ち上がることもありますが、
「開く」を選択してください。



あとは、何も設定変更をせずに「次へ」をクリックしていけば問題なく
インストールできるはずです。


インストール作業が完了したら、動作チェック。
まずは、ターミナルを起動して、

  $ sudo su - postgres

でログイン。

この後、psqlコマンドが動作すれば、無事インストールされている。





2015年3月8日日曜日

なぜ20円のチョコでビルが建つのか?

本屋でたまたま見つけたので、立ち読みしたところ
面白いことがいろいろ書いてあったので、即購入。



お菓子販売業界は、薄利なんだそうです。
売り上げをきっちり出すためには多売しなければならないのですが、
スーパーとかでの、お菓子の存在は「ついでに買われるもの」。

そういうお菓子を専門に販売する二木さんのようなお店は、
他の業界以上にシビアな販促戦略を求められるのだそうです。

そんな中でどうやって利益を出し続けて来られたのか、という話が
いろいろ書かれています。


私の印象に残ったものは、次の3つです。

  1. 差別化とは、「自社のビジネスが市場で飽和しているとき、具体策を持って
    自社の唯一性を消費者に理解してもらうための技術」
     
  2. 非効率なことにあえて取り組むことが、差別化につながっていく
     
  3. 理論、理屈でマーケティングすると個性を失う

1つ目は、私が現在勤めている会社が、まさに市場で飽和しているものを
扱っているので、いろいろ考えてしまいました。

大事なのは、具体策があるということ、ということだそうです。
そして、具体案がないとき、他社の成功例を安易にパクっても
効果が薄いとも仰っています。
口で言うのは簡単だけど、実際に具体策を探してみるというのは難しいもんですね。


2つ目は、大手が効率化によって価格を下げる取り組みを行っているので
同じ土俵で戦おうとすると負けてしまう。ならば、大手が避けたがる傾向にある
非効率なことを取り組んでみよう、というものだそうです。

ここで「非効率」という言葉を使うのは語弊がありますが、
要はマジョリティーを狙うのではなく、個人のニーズを叶えられるようにし、
それを積み上げていく、という姿勢を貫け、ということなんだろうと理解しました。


3つ目は、ついついデータマイニングのことを想像してしまいます。
大量のデータを相手にデータマイニングすれば、ある傾向にはたどり着くことができます。
しかも、全体的に最適化されている結果。。。

でも、こういう全体的に最適化された解というのは、
案外みんな何となく知っていることなんじゃないかと思われます。
そんなみんなが何となく知っている一般解を基に戦略を立てようとすれば、
結果的には、他との差別化が図れなくなるのもイメージできてしまいます。

だから、データマイニングはマーケティングに直接使うのではなく、
みんなが何を見ているのか、という点に注目するために使うと良いのかな、
という、この本とは趣旨が異なる面での気付きがありました。



最後に、著者に一言。

菓子の二木のライバルは、「ディズニーランド」ではなく
「ドン・キホーテ」だと思う。。。(笑)






2015年2月10日火曜日

自治体へ営業に行こう

ジュンク堂の中を彷徨っていたら、たまたま見つけた本。
自治体に関わる仕事を担当することになったので、
とりあえず読んでみるか、というノリで買いました。





感想としては、何か久々に発見した気分というか、
新鮮な気持ちで読めて、面白かった。


まず、自治体とは「お金を使うのが仕事」という定義が面白かった。
言われてみれば確かにそうなんだけど、そういう風に考えたことはなくて、
どちらかというと、市民の管理をする人というイメージが強かったですね。

(市民のために)お金を使うのが仕事なので、
自治体からお仕事をいただくためには、市民のためになることを
プッシュしなければダメ。

また、お仕事を取るためには、複数人でプレゼンをするとか、
自治体の人と取引することはできない、とか、
いろいろと取り決めがあって、結構市民に対してとても慎重な姿勢を
自治体はとっているんだというのもよく分かりました。

なお、自治体に仕事に応募するためには、参加資格者名簿へエントリー
されている必要があるようですね。
案外、中小企業が初めて応募するには、この点に壁があるように思えました。

あと、仕事内容の「等」の字に注意、というのは、自治体に限らないかも(笑)。
「それくらい、いーじゃーん??」って言わせる余地を与えているので、
そこをヌルっとするのではなくて、できるだけスコープを明確にするのは
とても重要なことですよね!


今はモノが豊かになり、戦後のように
「まずは道路作ってよ」とか「まずはガスを使えるようにしてよ」
といった市民に共通の要望というものはなくなって、
自治体に求めるものが多様化しています。
しかし、少子高齢化のために税収が減っており、多様化した市民の要望に
対応しきれない現実があるようです。

自治体の方々とお仕事をされたい方は、
相手を少しでも知るという意味で、読んでみても良い本だと思います。

自治体のことに触れた本ですが、文体自体は軽いので、とても読みやすいです。

2013年10月23日水曜日

Jaccard係数

ここ最近、社内の技術発表会の準備で忙しく、
カフェ勉が全然できませんでしたが、
ようやく落ち着いてきたので、再開してみます。

とは言っても、発表会が終わったら
特許出願の準備が控えているので、
またまた忙しい日々になりそうですが
亀ペースでも勉強を続けていきたいところです。


さて、今日はちょっと主旨を変えて、データ検索の話です。


Smart Newsのアルゴリズムに関する資料を
Twitterで知ったので読んでみました。

これです↓
http://www.slideshare.net/kouheinakaji/webmining-27353727


そのうち、複数のほぼ同一の記事を1つにまとめるための技法として
b-bit Minwise Hashingという技術があったので、
少し勉強してみました。

この技法は、Jaccard係数やMinHashの軽量版のような位置づけです。
このため、まずはJaccard係数について説明してみたいと思います。


Jaccard係数とは何か?
これは、2つの集合の類似度を表す1つの数値表現です。
具体的には、分母には2つの集合のORをとったときの要素数,
分子には2つの集合のANDをとったときの要素数が該当します。

例えば、集合A = { a, c, e, f, h}  集合B = {b , c, d, g, h} である場合の
Jaccard係数は、

| A∩B | = | { c, h } | = 2

| A∪B | = | { a,b,c,d,e,f,g,h } | = 8

なので、

2/8 = 1/4 = 0.25

となります。

ここで、| 集合X | は、集合Xの要素数を指します。


この係数の取り得る範囲は、[ 0 , 1 ] となります。
0となるのは、2つの集合が互いに独立な場合です。
逆に1となるのは、2つの集合が完全一致している場合です。

このJaccard係数は、例えば2つの文書の類似度を調べるときに用いられます。
以下は、2つの文書に対するBag Of Words(BoW)です。

文書1={ Apple:1 , 年末商戦:1, パソコン:1 , 売上: 1  }
文書2={ Windows8 :1 , パソコン:1, 激安: 1  }

※↑このBoWは架空の文書をもとにして作っています。

この場合のJaccard係数は

| 文書1∩文書2 | = 1;
| 文書1∪文書2 | = 6;

なので、1/6です。

そのため、この2つの文書はあまり似ていないという解釈が妥当そうな結果です。
実際に類似判定する際は、予めしきい値を設定して、それ以上になる2つの文書を
「類似」と判定するのが一般的です。

しきい値そのものの設定は、システムの用途や設計者の思想で
決めれば良いのではないでしょうか。


余談ですが、Jaccardの読み方は何が正しいんでしょうか。。。
Google先生に聞いてみると「ジャッカード」に票が集まっています。
私は、ヤコビアンのスペルがJacobianなので、
「ヤッカード係数」って読んでいたんですが、自信はありません(笑)

別の読み方としては、「ジャックカード」とも読めなくもないです。
でも、何だかクレジットカードの名前と勘違いしそうですね(笑)

実際のところはどうなんでしょう。


2013年9月30日月曜日

能動学習のさわりの勉強

能動学習とは、少量の教師データから得られた分類器を使って
ラベルがつけられていないデータの中から分類器学習に効果的な
データを機械的に選ぶことによって、分類器性能の向上を試みる
というものです。

今日は休日で、まとまった時間がとれたので、
以下のPreferred Infrastructure社様が公開されている
ustreamのビデオを見て勉強させていただきました。

http://www.ustream.tv/recorded/19579251



■目的

教師データの作成にかかってしまうコストを下げることにあります。
マジメに教師データを作成するとなると、どうしても時間がかかってしまいます。
時間がかかるということは、それだけお金がかかってしまうということ。
そのため、人手でかかるコストを最小化し、教師データは機械的に集める。
これが能動学習の狙いです。


■アプローチ

3種類のものが紹介されていました。

(1)プールベース型

少量の教師データから得られた分類器を『仮分類器』と呼ぶことにします。
この仮分類器が持っている境界線(例えば、SVMなら超平面)に限りなく近いデータを
教師データとして選んで、分類器を作成します。

境界線に近いデータを選ぶ理由は、判断が明確なデータよりも、
判断に迷うデータに対してラベルをつけた方が汎化能力が高まるという考え方です。

例えば、SVMで言えば、超平面が存在でき得る領域を
効果的に狭めることのできるデータを探しだしていくイメージでしょうか。

ちなみに、東工大の杉山先生の資料を見ると、
超平面の存在でき得る領域のことを『バージョン空間』と
呼ぶそうですね。勉強になります。

http://sugiyama-www.cs.titech.ac.jp/~sugi/2009/NEC-MachineLearning1-jp.pdf


(2)ストリームベース型

仮分類器でラベルなしデータを分類させるところまではやっておいて、
その結果が教師データとして使うのにふさわしいのかどうかを判定する方法
なのだと解釈しました。
そして、判定結果にかかわらず、そのデータが用済みになったら
保存せずに捨てても動作が破綻しないようにした手法のようです。

ここは理解が進まなかったので、推測です。


(3)クエリー型

とにかく自分で事例とラベルを与える方法です。
例えば、手書き文字認識システムにおいて、「3」という数字が
認識できなかったとしたら、それをユーザー自らが
「3」という文字を書いて教える、という感じでしょうか。


■感想

(1)プールベース型は、正例と負例が誰が見ても納得できるようなものになっているのが
前提な気がします。
あと、境界付近のデータは人間が判断しづらいものも少なくないと考えられます。
こういうデータに対して強引にラベルをつけると性能劣化につながりかねないと思います。
この件については、ビデオの質疑応答にもあったのですが、発表者が回答したように
もうどうすることもできない、というのが実態なんでしょうね。
そのため、定義が客観的に明確であるトピックを相手に使うのが良いのだと考えました。

(2)ストリームベース型は、まさしく今ホットなオンライン学習のための手法ですね。
解釈が間違っていなければの前提ですが、人によって曖昧な判断しかできないデータは、
考えても仕方がないので、さっさと捨てて次に進むのも1つの道だと感じました。
ここは、あとで勉強した方が良さそうです。

(3)クエリー型は、大昔のViaVoiceにあった「エンロール」ってヤツじゃない?
ユーザーの声の特徴を把握するために、少量の音声データを与えて
不特定話者用の音響モデルをユーザーの声に認識しやすいものに更新する
って機能ですし。。。
歴史は案外長そうです。


これらは実際に使ってみなければ何とも言えないのですが
早めに取り組んでみたいですね。



2013年9月29日日曜日

潜在意味解析

潜在意味解析(LSA)とは、高次元のデータを低次元に圧縮する技術(次元圧縮と呼びます)です。
主成分分析をご存知の方は、そちらをイメージすると理解が早いです。

■用途

①文書分類
②検索ワードとは異なる表現をした文書の検索
③情報推薦



■考え方

どのデータも、予め決められたいくつかの素材データの組み合わせで
構成されていると考えます。
つまり、データの差分は、素材データが使われた量の違いであると考えるのです。
(量がマイナスになるものもありますが、ここはご愛嬌ってことで・・・^-^;)

この素材データが何であるのか、という点と、その使用量の2つを推測し、
これらを何らかの形で活用しましょう、という発想がLSAです。

「何らかの形で」と表現をぼかした理由は、用途によって使い方が違うからです。


■特異値分解(SVD)

LSAのメインはSVDです。
SVDとは、1つの行列を、3つの行列の積として表現するための処理方法で、
先ほどの考え方の項目で書いた「素材データ」と「その使用量」を
求めるために使用します。

式で書くと、こんな感じです。

 D = U・S・V*   ・・・(式1)

Dは分解前の行列で、n x m 行列です。

Uはn x k の直交行列です。ここで、kはnとmのうち小さい数値が入ります。
Vはm x k の直交行列です。V*はVの転置行列です。
Sは、k x k の対角行列であり、特異値が並ぶ対角行列となっています。 

ここで、特異値とは、行列Aと行列A*との積を固有値分解し、
その平方根をとったものです。非負値です。


ここで注目するべきところは、行列Uと行列Vが
それぞれ直交行列である点です。

これは、行列Dの部分空間にあたる基底ベクトルが
行列Uあるいは行列Vであることを示しています。
ここで基底ベクトルとは、先ほどの「考え方」のところで書いた
素材データのことを言います。

よって、(式1)が言わんとすることは、
行列Dとして表現されたデータは、
行列Uで表された素材データを
行列(S・V*)*で表される量だけ配合したもの、
と見ることができるのです。

(かなり説明を飛ばしましたが、ここは行列としての本質になるので
 後で改めて説明しましょう。気が向いたら・・・ですが・・・(^-^;;))


ちなみに、具体的なSVDの数値計算の仕方は私も分かりませんm(_ _)m
こちらは、必要に迫られたときに勉強したいと思いますが、
今のところは、Rのライブラリがあるので、有難く使わせてもらうにとどめています(^^)



■次元圧縮

LSAでは、SVDを行った際に得られる3つの行列(式1を参照)のうち
行列Sにあたるものが、次元圧縮の鍵を握っています。

行列Sは、特異値が対角に並んでいる行列でした。
この特異値は、要は固有値そのものです。
つまり、行列Uあるいは行列Vで表される素材データの
量にあたるものです。

つまり、特異値が小さいものを使わないようにすることによって、
情報を抽象化したり、演算量を削減したりするわけです。

実際には、(式1)でいうkの値を小さくすることによって実現します。



■分析の仕方の例

ここでは、冒頭で書いた3つの用途について書いてみます。

①文書分類

単語文書行列(ここでは文書を行ベクトルで表現する。素性は単語)を
SVDして、行列Vを求めます。

行列Vは、行列Dで表される各データを
行列Uの各列を基底ベクトルに持つ部分空間へ
射影した後の座標です。

この行列Vとその転置行列であるV*との積を取ることによって
各文書が他のどの文書に近いのかを把握することができます。
この行列積の各要素の大きさを基にしてデンドログラムを作成していけば
クラスタリングの結果を得ることができます。


単語の抽象化が必要なければ、行列Dと行列Uとの積をとり、
各要素の最大値を調べることによって、行列Dの各列データが
どこに所属するのかを決めても良いと思います。


②検索ワードとは異なる表現をした文書の検索

検索対象とする文書データ全体に対して単語文書行列を作成します。
そして、この単語文書行列の転置行列に対してSVDを行います。

行列Uは、部分空間の基底ベクトルの集合となるので、
こんどは検索文字列にあたる入力ベクトルの左から
行列Uの転置行列をかけて、次元圧縮を行います。

この次元圧縮後の入力ベクトルと、行列Vとの積をとると
検索対象の文書データとの類似度がそれぞれ求まりますから、
この中から一定値以上のものを検索結果として出せばよいでしょう。


③情報推薦

基本的な考え方は②と同じです。
②において、次元圧縮後の入力ベクトルと、行列Vとの積で得られた
列ベクトルのうち、もっとも要素値が高くなった文書を
推薦結果として出せばよいでしょう。



次回は、サンプルプログラムを用意しようと思っています。

サンプルは、あらびきさんのソースコードがとても分かりやすいので、
以下のサイトを参照して頂くのが良いかと。。。


■参考資料

潜在的意味インデキシング(LSI)徹底入門(あらびき日記)
http://d.hatena.ne.jp/a_bicky/20120324/1332591498

LSAの概要と実行(猪原敬介さんの資料)
http://www.educ.kyoto-u.ac.jp/cogpsy/personal/Kusumi/datasem09/inohara.pdf


2013年9月27日金曜日

ソーシャルメディアを利用したセレンディピティな情報推薦

Gunosyがどんなアルゴリズムで動作しているのか知りたくて
あれこれググってみたら、以下の論文を見つけました。
表題はそのタイトルです。

ソーシャルメディアを利用したセレンディピティな情報推薦
https://kaigi.org/jsai/webprogram/2012/pdf/358.pdf

結構先端の技術を使っているというので、難しい確率分布が出てきたりするのかと
ドキドキしました(理解力の弱い自分がきちんと理解できるのかという意味です)が、
蓋を開けてみればとてもシンプルでした。良かった。


アルゴリズムのポイントは、文書についたソーシャルタグ(ユーザーがつけるタグ)
に対するTF-IDFを使うところですね。

ユーザーのプロファイル情報としては、過去に投稿したTwitterやFacebookの
文書に付与されたURLを使います。
URLであれば、はてブのAPIでソーシャルタグを取ることが可能です。
それを使って、ユーザーの発信したURLに対するソーシャルタグのTF-IDFをとり、
その上位100位までのソーシャルタグを抽出します。
これをユーザープロファイルと扱います。

次に、ユーザーの隠れた好みを抽出するための情報を求めます。
この情報を抽出するにあたっては、タグの共起グラフを利用します。
ソーシャルタグは、基本的には1つのURLに対して複数つけられるので、
1つのページに一緒につけられたタグを手がかりにして共起グラフを作成します。
これを使って、ユーザープロファイルに近く、かつユーザープロファイルに
存在しないしないタグを隠れた好みの情報として扱います。

最後に、Webページに付与されたタグと、先ほど求めた隠れた好みの情報とを比較し、
共起の割合が高いものから順に推薦する、という流れになっています。
Webページの情報については、具体的なことが書かれていないので想像になりますが、
多分はてブのタグをそのまんま使ったのではないかと予想しています。


この手法の長所と短所を勝手に考えてみました。
以下の通りです。

■長所

  • とにかくシンプルで実装しやすい。
  • 仕込みを機械的に行える(運用の面では、結構ここ重要だと思う)
  • ポータルを持っている会社には、自社サイトを中心に紹介するエンジンに作れるので、広告費で儲かりそうだという妄想を抱ける(笑)

■短所
  • ユーザーが発信した情報の中にURLが入っていないとレコメンドできない。
  • いろいろと解釈ができそうなサイトがレコメンドされにくい。
  • リアルタイムな情報をレコメンドできない。(これは協調フィルタそのものの問題かも)

とにかくシンプルなのが良いですね。
有識者が集まってアイデア出しをすれば、いろいろと用途が発掘できそうな予感がします。
(発掘できなくても責任は持てませんが。。。(^^;))