小さなエンドウ豆

まだまだいろいろ勉強中

ナイーブベイズを勉強中

めっちゃホリデー

2日間暇なので前から気になっていたベイズの定理についてまとめてみることにした。
今までしっかり学んだことがなかったので基本だけでもと思い勉強してみた。

結果的に言うととても面白かった。今まで難しいものだと思っていたけど意外に簡単な数式で表されているのに驚いた。
すべてを理解したとは思っていないけど少しまとめてみたい。

ベイズの定理

ベイズ定理とは事前確率から事後確率を求めるものと理解した。未確定の事象に対して確率を求めることは困難なことであると思われうが、
実は条件付き確率を使うと次の式で表すことができる。

{P(B|A)= \frac{P(A|B)P(B)}{P(A)}}

上記の式は事象Aのもとで事象Bが起こる確率を求める式となっている。このときP(B)が事前確率だとするとP(B|A)は事後確率を呼ばれる。またP(A|B)は尤度と呼ばれる。この式の意味はP(A)が与えられると尤度の除算により、事象Bの確率は事前確率から事後確率へ変わるという意味である。
これを使った事例がモンティホール問題というものがある。簡単に説明すると、
3つのドアがあり、1つはアタリで2つはハズレである。

  1. 挑戦者は1つのドアを選ぶ
  2. 出題者は挑戦者が選んでいないかつハズレのドアを開ける
  3. 挑戦者は残り2つのドアのどちらかを選ぶ(もちろん最初に選んだドアをそのまま選んでも良い)

この問題に当てはめると、

  • P(A) ...出題者が1つのドアを選ぶ確率 (1/2)
  • P(B) ...1つのドアがアタリの確率 (1/3)
  • P(A|B)...選んだドアによって出題者がドアを選ぶ確率 (1/2 or 1)
  • P(B|A)...出題者が選んだドアによってドアがアタリの確率

つまり、ドアが3つある時点でのアタリの事前確率と出題者が1つのドアを開け2つになった場合のアタリの事後確率の変化を式で表すことができるのである。ちなみに出題者がドアを開けたあと選んだドアを変えたほうがアタリの確率は高いとベイズでは言えるらしい。

ナイーブベイズ

ナイーブベイズとは簡単に言うとベイズの定理を用いた分類器である。ベイズの式で置き換えると、ある事象Aが生じたとき、それがクラスBに属する確率をP(B|A)で表すというものである。
応用例として迷惑メールの分類などに応用される。事象Aをメールに含まれる単語だと考えると {A={a_1, a_2 ... a_n}} となる。( {a_i}は単語である)つまり{P(A={a_1, a_2 ... a_n}|B)=P(a_1|B)P(a_2|B)...P(a_n|B)}と表すことができる。P(B)はそのクラスに属する事前確率(迷惑メールかそうでないか)であり、分類をする時は{P(B)P(a_1|B)P(a_2|B)...P(a_n|B)}が最大になるクラスがそのクラスに属する事後確率となりそのクラスに属すると判定することができる。

まとめ

ベイズの定理やナイーブベイズによる分類をまとめて見た。自分では理解しているつもりであるが、抜けてたりとか説明不足な点があったらご了承ください。 説明があまり得意ではないのは自覚しているので式をなるべく丁寧に書いたつもりだったが、あとで見直すとやっぱりわからない。次回辺り実用例を示してもっと有用性をわかってもらうように伝えたいと思った。 ただベイズの定理って面白い!

Pythonでワードクラウド

前回のブログ

こんにちは
前回のブログを今週のPython記事で取り上げてもらいました!
そこでpythonにワードクラウドのパッケージが存在することを教えて頂いてたのでそれを使ってワードクラウドを作ってみた。

f:id:h-piiice16:20160220170703p:plain

できたのものはこんな感じです。ただ作るだけだとつまらないのでアリスの画像でマスク処理をしてみました。

python-wordcloud
ここのexampleを参考に書いてみた。

#coding: utf-8

import pandas as pd
import MeCab
import re
import numpy as np
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt
from os import path
from PIL import Image

stop_words = [ u'てる', u'いる', u'なる', u'れる', u'する', u'ある', u'こと', u'これ', u'さん', u'して', \
             u'くれる', u'やる', u'くださる', u'そう', u'せる', u'した',  u'思う',  \
             u'それ', u'ここ', u'ちゃん', u'くん', u'', u'て',u'に',u'を',u'は',u'の', u'が', u'と', u'た', u'し', u'で', \
             u'ない', u'も', u'な', u'い', u'か', u'ので', u'よう', u'']

pattern = re.compile('[!-~]')

fpath = "/usr/share/fonts/truetype/fonts-japanese-gothic.ttf"

def text_parse(text):
    words = []
    mt = MeCab.Tagger('-Ochasen')
    res = mt.parseToNode(text)

    while res:
        if res.feature.split(",")[0] in ["形容詞", "動詞","名詞", "副詞"]:
            if res.surface != "" and (not pattern.match(res.surface)):
                words.append(res.surface)
        res = res.next
    return words

d = path.dirname(__file__)
tweets = pd.read_csv('tweets.csv')
texts = " ".join(tweets.text.values)
#print texts
word = text_parse(texts)
#print word


okayama = np.array(Image.open(path.join(d, "alice_mask.png")))
wc = WordCloud(background_color="white", font_path=fpath, mask=okayama, 
                            stopwords=set(stop_words))
wc.generate(" ".join(word).decode('utf-8'))


wc.to_file(path.join(d, "pycloud.png"))

plt.imshow(wc)
plt.axis("off")
plt.figure()

stopwordに何を設定していいかわからなかったのでWord Cloudで文章の単語出現頻度を可視化する。[Python]を参考にさせてもらいました。
あとフォントの指定を行わないと文字化けしてしまうので注意が必要である。
マスク処理を使うとワードクラウドを好きな形で描画することができる!

ツイート分析()

元はといえばこれを使って自己分析をする予定だったので分析してみると自分がよく口語で使う口癖がツイートにそのまま現れいているように思える。またサッカーに関する単語が多いのは自覚している。
まあ自己PRや性格、長所、短所などESや面接で聞かれるようなことに対する答えを考える手がかりになるのではないかなー

ワードクラウドで自己分析

絶賛就職活動中。

こんにちは、就職活動まっただ中でございます。今日は自己分析のために自分のツイートを分析してみた。
ただMeCabとか使って単語をカウントするだけだと見栄えが悪いのでワードクラウドにしてみることにした。

ワードクラウドとは

ワードクラウドとは…単語のカウント数に応じて文字の大きさが変化し,いろんな方向に表示されたデザイン。
f:id:h-piiice16:20160218224644p:plain

まあこんなヤツのことをいいます。というよりこれが分析結果。
何故か地名が多い…思考がばれるw

データの作成(単語のカウント)

全ツイートの取得はTwitterのアカウントの設定からcsvファイルでダウンロードできた。
データの作成はPythonで行った。csvファイルにcount(単語のカウント数)とword(単語)の1組で並ぶフォーマットにしたかった。

count,word
51,岡山
40,熊本
35,日本
34,ユナイテッド
31,東京

そのために書いたPythonスクリプトがこちら

#coding: utf-8

import MeCab
import pandas as pd
import re

def parse_tweet(text, words):
        mt = MeCab.Tagger ("-Ochasen")
        res = mt.parseToNode(text)

        pattern = re.compile("[!-/:-@≠\[-`{-~]")
        pattern2 = re.compile("[!-~]")

        while res:
                if res.feature.split(",")[1] == u"固有名詞".encode("utf-8"):
                        if not(pattern2.search(res.surface)):
                                words.append(res.surface)
                res = res.next

if __name__ == "__main__":
        data = pd.read_csv("tweets.csv")
        texts = data.text
        words = []
        texts = texts.values
        for text in texts:
                parse_tweet(text, words)

        count = []
        word = list(set(words))
        for w in word:
                c = words.count(w)
                count.append(c)

        df = pd.DataFrame({'word' : word,
                           'count': count})
        df = df.sort('count', ascending=False)
        df.to_csv('wc_result.csv', index=False)

結果をwc_result.csvというファイルに書きだした。

d3-cloud

D3.jsとd3-cloudというワードクラウドプラグインを使ってワードクラウドを作成。 カウントした結果をSVGに描画するwordcloud.jsを書いていく。

d3.csv("wc_result.csv", function(data){
        var h = 800;
        var w = 800;
        data = data.splice(0, 200);

        var random = d3.random.irwinHall(2)

        var countMax = d3.max(data, function(d){ return d.count} );
        var sizeScale = d3.scale.linear().domain([0, countMax]).range([10, 100])
        var colorScale = d3.scale.category20();

        var words = data.map(function(d) {
                return {
                text: d.word,
                size: sizeScale(d.count)
                };
        });

        d3.layout.cloud().size([w, h])
                .words(words)
                .rotate(function() { return Math.round(1-random())*90; })
                .font("Impact")
                .fontSize(function(d) { return d.size; })
                .on("end", draw)
                .start();

        function draw(words) {
                d3.select("svg")
                .attr({
                        "width": w,
                        "height": h
                })
                .append("g")
                .attr("transform", "translate(150,150)")
                .selectAll("text")
                .data(words)
                .enter()
                .append("text")
                .style({
                        "font-family": "Impact",
                        "font-size":function(d) { return d.size + "px"; },
                        "fill": function(d, i) { return colorScale(i); }
                })
                .attr({
                        "text-anchor":"middle",
                        "transform": function(d) {
                                return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
                        }
                })
                .text(function(d) { return d.text; })
                .on("click", function(d, i){
                        var url = "http://www.google.co.jp/search?q=" + d.text
                        window.open(url, "_blank");[f:id:h-piiice16:20160218224644p:plain]
                });

        }

});

【D3.js】「全ツイート履歴」からWord cloudを作ってみた。スクリプトを参考にさせてもらいました。 またワード一つ一つにgoogleでの検索結果のリンクを付随してみた。

このデザイン好きなのでまた機会があったら使ってみたいと思った!

Scrapyことはじめ

こんばんは

本日2つ目のブログでございます。
この記事では技術系のことについて私が忘れないように最近使ってるScrapyについて使い方を記録しておきたい。

Scrapy

ScrapyとはWebページをダウンロードしてきてパースを行ういわゆるスクレイピングを行うフレームワークである。
試しにPython2系であるページの情報を取得することにしてみた。 とりあえずインストール

$ pip install scrapy

それからあたらしいプロジェクトを作る

$ scrapy startproject testscrapy
$ tree testscrapy
testscrapy/
├── scrapy.cfg
└── testscrapy
    ├── __init__.py
    ├── __init__.pyc
    ├── items.py
    ├── items.pyc
    ├── pipelines.py
    ├── settings.py
    ├── settings.pyc
    └── spiders
        ├── __init__.py
        ├── __init__.pyc
        ├── testspider.py
        └── testspider.pyc

次にitems.pyを編集する。ここは自分なりにページから取得してくる情報をオブジェクトにして定義するものと理解している。

  1 # -*- coding: utf-8 -*-
  2 
  3 # Define here the models for your scraped items
  4 #
  5 # See documentation in:
  6 # http://doc.scrapy.org/en/latest/topics/items.html
  7 
  8 import scrapy
  9 
 10 
 11 class TestscrapyItem(scrapy.Item):
 12     # define the fields for your item here like:
 13     # name = scrapy.Field()
 14     title = scrapy.Field()
 15     url = scrapy.Field()
 16     content = scrapy.Field()

ここでは
- title(ページのタイトル)
- url(ページのURL)
- content(ページの内容)
を取得するように定義

次に同じディレクトリのsettings.py

DOWNLOAD_DELAY=3  
ROBOTSTXT_OBEY=True

を追加する。
次にtestscrapy/testscrapy/spiderstestspider.pyを作る。

$ scrapy genspider testspider [domain]

上記のコマンドでtestspider.pyの雛形を作成することができる。

 1 # -*- coding: utf-8 -*-
  2 import scrapy
  3 
  4 
  5 class TestspiderSpider(scrapy.Spider):
  6     name = "testspider"
  7     allowed_domains = [[domain]]
  8     start_urls = (
  9         'http://[domain]',
 10     )
 11 
 12     def parse(self, response):
 13         pass

start_urlsに設定したURLのページをスクレイピングすることとなる。次のコマンドでクロールを行う。

$ scrapy crawl testspider

次回のブログあたりで実例を書いていこうと思う。今日はつかれた.....

Anaconda

Pythonのお勉強

こんにちは、テストも終わったので好きなことやっていきたい。
そこでPythonのお勉強が中途半端になっていたのでそれをしたいがAnacondaっていう便利なものがあるらしいのでまずはそれをインストールしていく

Anaconda

いかにもPythonディストリビューションらしい名前...私自身蛇は好きではない。
しかしこのAnacondaはインストールするだけでPythonの環境がすぐにできちゃうものらしい。
なのでとりあえずインストールしてみた。 環境はUbuntu14.04
Anaconda
ここからlinuxのAnacondaをPython3.5が使えるAnaconda3-2.4.1-Linux-x86_64.shをダウンロード(Python2.x系が使いたい方はAnaconda2-2.4.1-Linux-x86_64.sh)

#bash Anaconda3-2.4.1-Linux-x86_64.sh

Welcome to Anaconda3 2.4.0 (by Continuum Analytics, Inc.)

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>     
================
Anaconda License
================




cryptography
A Python library which exposes cryptographic recipes and primitives.

Do you approve the license terms? [yes|no]
[no] >>> yes    <-'yes'と入力




[/root/anaconda3] >>>  <-インストール先指定




Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /root/.bashrc ? [yes|no]
[no] >>> yes   <-- bashrcに設定




Thank you for installing Anaconda3!

Share your notebooks and packages on Anaconda Cloud!
Sign up for free: https://anaconda.org

たぶんこれで完了!
しかしpython3と打っても昔作ったPythonの環境が立ち上がるためパスがうまく通ってない模様...力わざでbash_profileに書いてみたら出来ました。

#python3 --version
Python 3.5.0 :: Anaconda 2.4.0 (64-bit)

初投稿

初投稿

こんにちは!
技術的なことを勉強するにあたって忘れないように書き残す場所がほしいなと思いブログを始めました。
3日坊主にならないように頑張ろうと思います!

MarkDown記法

はてブロやGitHubのREADMEなどで使うので自分ために書いておきたい

見出し

見出し1

見出し2

見出し3

# 見出し1(h1)
## 見出し2(h2)
### 見出し3(h3)

強調1

普通の文字
強調した文字

*強調したい文字*

強調2

普通の文字
強調した文字

**強調したい文字**

水平線


---

リンク

Google

[リンク名](リンク先URL)

引用

いろはにほへと ちりぬるを
わかよたれそ つねならむ

いろはにほへと ちりぬるを
わかよたれそ つねならむ

>いろはにほへと ちりぬるを  
>わかよたれそ つねならむ
>>いろはにほへと ちりぬるを  
>>わかよたれそ つねならむ

リスト

  • エビ中
    • 未確認中学生X
    • 頑張ってる途中
    • えびぞりダイアモンド!!
  • 乃木坂
- エビ中   
  * 未確認中学生X
  * 頑張ってる途中
  * えびぞりダイアモンド!!  
- 乃木坂  
  * 君の名は希望
  * 羽根の記憶
  * あらかじめ語られたロマンス

コード1

print('Hello World')

`print('Hello World')`

コード2

import pandas as pd
table = pd.read_csv('file.csv')
print(table)
  ```
  import pandas as pd
  table = pd.read_csv('file.csv')
  print(table)
  ```

例を考えるのにつかれた・・・