友之介的つぶやきブログ

PCやらプログラムやらぶつぶつ言ってます

ナイーブベイズ

機械学習 はじめよう」のベイジアンフィルタを参考にナイーブベイズを実装してみました。

gihyo.jp



ついでだったので、他の方もやっていた、形態素解析mecabに変えてみました。

 

# coding: utf-8
import MeCab

partsDic = {}
for par in [u"名詞", u"動詞", u"形容詞", u"副詞", u"連体詞", u"感動詞",]:
    partsDic[par] = True

def split(sentence):
    sentence = sentence.encode("utf-8")
    tgr = MeCab.Tagger("")
    node = tgr.parseToNode(sentence)
    nodes = []
    while node:
        if partsDic.has_key(unicode(node.feature, "utf-8").split(",")[0]):
            nodes.append(unicode(node.surface, "utf-8").lower())
        node = node.next

    return nodes


コメントにもありましたが一番目のが正しいカテゴリに分類されないみたいです。
理由は色々ありますがbowだと出現確率が少ないものは、期待する結果にならないみたいですね。

 

機械学習わかりやすそうなサイトや本を探し

機械学習のサイトや本を見てみるものの、なかなか難しくて苦労してます。
と言うことで、わかりやすそうなサイトや本を探してみました。

まずは、gihyo.jpの機械学習の連載ページ。

gihyo.jp


pythonのサンプルもあってわかりやすいです。


あと、動画で機械学習を勉強できる

https://www.coursera.org/learn/machine-learning


も良さそうです。
英語はわかりませんが、日本語字幕があるので、なんとかなりそうです。


本だと、『ITエンジニアのための機械学習理論入門』がよさ気です。

 

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

 

 
amazonで人気があったので買ってみましたが、こちらもpythonがサンプルなので、
pythonを使う人間には有難いですね。

 

タグ

ケーブルが増えて来たのでタグを付けてみました。
SANWAのファイバータグを買ってみましたが、少し大きめでした。
タグの部分はしっかりした作りで長持ちしそうです。

 

 

サンワサプライ CA-TAG137 ファイバータグ

サンワサプライ CA-TAG137 ファイバータグ

 

 

ハブ

f:id:tomonosuke01:20160214140650j:plain

 

以前から使っていた8ポートのハブが一杯になってしまったので
NETGEARのGS116Eを買ってみました。
使わない気もしますがVLANやQoSまで設定できるみたいですね。

 

 

 

scikit-learnの決定木

scikit-learnの決定木を試してみました。
データは先日と同様のWikipediaのものを使用です。
データの中身は数値にしないといけないみたいなので、適当に変換してみました。

 

 # coding: utf8
from sklearn import tree

data = [ [0,0,0],
    [0,1,0],
    [1,1,0],
    [0,0,1],
    [1,0,0] ]

target = ['鳥類', '哺乳類' , '哺乳類' , '爬虫類' , '鳥類']

clf = tree.DecisionTreeClassifier()
clf = clf.fit(data, target)

tree.export_graphviz(clf, out_file='test.dot',
    feature_names=range(3), class_names=sorted(list(set(target))))

 

 

f:id:tomonosuke01:20160207141829p:plain

 

ID3

Wikipediaの情報を元にpythonでID3の決定木を試してみました。

ID3 - Wikipedia

 

今回は画面に表示するだけにしました。
”余分な変数を削除し”と書いてあった通り、変数が消えてしまいましたが、バグではなくこういうものなんだろうか?

 

 # coding: utf8
import math

label = ['食性', '発生形態', '体温']
data = [['ペンギン', '肉食', '卵生', '恒温', '鳥類'],
    ['ライオン', '肉食', '胎生', '恒温', '哺乳類'],
    ['ウシ', '草食', '胎生', '恒温', '哺乳類'],
    ['トカゲ', '肉食', '卵生', '変温', '爬虫類'],
    ['ブンチョウ', '草食', '卵生', '恒温', '鳥類']]

def getKeys(data, idx):
    return list(set(map(lambda x:x[idx], data)))

def getEntropy(data, keys):
    cls = map(lambda x:x[-1], data)
    denominator = float(len(cls))
    if denominator == 0: return 0

    m = 0
    for key in keys:
        p = cls.count(key) / denominator
        if p != 0:
            m += -p * math.log(p, 3)

    return m

def getExpectation(data, keys, mc, idx, ckeys):
    denominator = float(len(data))
    if denominator == 0: return 0

    m = mc
    for key in ckeys:
        c2 = filter(lambda x:x[idx] == key, data)
        m2 = getEntropy(c2, keys)
        m += -(m2 * (len(c2) / denominator))

    return m

def carateTree(data, keys, idxs, ts=""):
    mc = getEntropy(data, keys)

    maxm = 0
    idx = 0
    for i in idxs:
        m = getExpectation(data, keys, mc, i, getKeys(data, i))
        if maxm < m:
            maxm = m
            idx = i

    print ts + label[idx - 1]
    ts += "\t"
    idxs = filter(lambda x:x != idx, idxs)
    for key in getKeys(data, idx):
        fdata = filter(lambda x:x[idx] == key, data)
        if len(getKeys(fdata, -1)) <= 1:
            print ts + key, fdata[0][-1]
            continue

        print ts + key
        carateTree(fdata, keys, idxs, ts + "\t")


keys = getKeys(data, -1)
idxs = range(1, len(data[0]) - 1)

carateTree(data, keys, idxs)