これはPython Advent Calendar 2014の16日目です。
実践 機械学習システムを読んでいて画像のパターン認識が面白そうだったので実装して遊んでみました。主に10章のコンピュータビジョンと3章のクラスタリングを参考にしました。ほとんど、NumPyやscikit-learn、Mahotasに丸投げです。
ざっくりとした流れ
今回は用意した複数のjpg画像を教師無しでカテゴライズしてみました。
- まず、全ての画像を局所特徴量リストにしました。局所特徴量にはSURFを使用しました。SURFはMahotasのmahotas.features.surf.surfで簡単に取得できます。
- そして、すべてのSURFをk-means法でグループ化して基本特徴量(visual word)を求めます。k-means法の計算はsklearn.cluster.KMeans.fitを呼ぶだけでできます。
- これを使って画像の局所特徴量リストをbag-of-wordsリスト(実践 機械学習システムではこうなっていたけどbag-of-keypoints,bag-of-visual-words,bag-of-visual-featuresのほうが一般的なのかも)にします。
それから、(実践 機械学習システムではやってませんが)bag-of-wordsと言えばTF-IDFかなと思ったので今回はbag-of-wordsリストをTF-IDFリストに変換してみました。TF-IDFはsklearn.feature_extraction.text.TfidfTransformerで算出できます。
- 最後に、TF-IDFリストをk-means法でカテゴリ分けしておしまいです。
図にするとこんな感じです。
実装
流れの通りに実装しました。
カテゴリ分けしたいjpgと同じディレクトリで実行するとカテゴリ分けの結果が標準出力されます。変数のpicture_category_numを書き換えるとカテゴリの数が変わります。
import mahotas as mh
import numpy as np
from glob import glob
from mahotas.features import surf
from sklearn.cluster import KMeans
from sklearn.feature_extraction.text import TfidfTransformer
picture_category_num = 9
feature_category_num = 512
images = glob('./*.jpg')
alldescriptors = []
for im in images:
im = mh.imread(im, as_grey=True)
im = im.astype(np.uint8)
alldescriptors.append(surf.surf(im, descriptor_only=True))
concatenated = np.concatenate(alldescriptors)
km = KMeans(feature_category_num)
km.fit(concatenated)
features = []
for d in alldescriptors:
c = km.predict(d)
features.append(np.array([np.sum(c == ci) for ci in range(feature_category_num)]))
features = np.array(features)
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(features)
tfidf.toarray()
km = KMeans(n_clusters=picture_category_num, init='random', n_init=1, verbose=1)
km.fit(tfidf)
images = np.array(images)
print('images')
print(images)
for i in range(picture_category_num):
print('image category{0}'.format(i))
print(images[km.labels_ == i])
とりあえず動かしてみました
写真素材 足成【フリーフォト、無料写真素材サイト】から適当に選んだフリー画像をカテゴリ分けしてみました。動物、花、乗り物からそれぞれ3分類ずつ、1分類から10画像ずつの計90画像使い9カテゴリに分けてみました。基本特徴量の数は512です。
今回やってみたTF-IDFの処理は余計だったかもしれないので、TF-IDFなしの場合も実行してみました。
使用した画像の内訳は次の通りです。
大分類 |
小分類 |
枚数 |
動物 |
猫 |
10枚 |
動物 |
犬 |
10枚 |
動物 |
猿 |
10枚 |
花 |
あじさい |
10枚 |
花 |
桜 |
10枚 |
花 |
ひまわり |
10枚 |
乗り物 |
飛行機 |
10枚 |
乗り物 |
バイク |
10枚 |
乗り物 |
車 |
10枚 |
TF-IDFありの結果
ぱっと見だと検討はずれではないように思いますが何とも言えないです。。
カテゴリ0
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
乗り物 |
バイク |
3 |
|
乗り物 |
バイク |
4 |
|
乗り物 |
バイク |
8 |
|
乗り物 |
バイク |
9 |
カテゴリ1
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
犬 |
6 |
|
動物 |
犬 |
7 |
|
動物 |
犬 |
8 |
|
花 |
あじさい |
0 |
|
花 |
あじさい |
4 |
|
花 |
あじさい |
6 |
|
花 |
あじさい |
8 |
|
花 |
桜 |
2 |
|
花 |
桜 |
3 |
|
花 |
桜 |
4 |
|
花 |
桜 |
6 |
|
花 |
桜 |
9 |
|
花 |
ひまわり |
0 |
|
花 |
ひまわり |
4 |
|
花 |
ひまわり |
5 |
|
|
|
|
カテゴリ2
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
乗り物 |
飛行機 |
3 |
|
乗り物 |
飛行機 |
5 |
|
乗り物 |
飛行機 |
6 |
|
乗り物 |
飛行機 |
9 |
|
乗り物 |
車 |
0 |
|
乗り物 |
車 |
6 |
|
乗り物 |
車 |
7 |
|
乗り物 |
車 |
8 |
カテゴリ3
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
犬 |
0 |
|
動物 |
犬 |
2 |
|
動物 |
犬 |
9 |
|
花 |
ひまわり |
1 |
|
乗り物 |
飛行機 |
0 |
|
乗り物 |
飛行機 |
1 |
|
乗り物 |
飛行機 |
2 |
|
乗り物 |
飛行機 |
4 |
カテゴリ4
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
犬 |
4 |
|
動物 |
猿 |
0 |
|
動物 |
猿 |
1 |
|
動物 |
猿 |
2 |
|
動物 |
猿 |
3 |
|
動物 |
猿 |
4 |
|
動物 |
猿 |
5 |
|
動物 |
猿 |
6 |
|
動物 |
猿 |
7 |
|
動物 |
猿 |
8 |
カテゴリ5
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
猫 |
0 |
|
花 |
ひまわり |
2 |
|
花 |
ひまわり |
3 |
|
乗り物 |
バイク |
0 |
|
乗り物 |
バイク |
1 |
|
乗り物 |
バイク |
2 |
|
乗り物 |
バイク |
5 |
|
乗り物 |
バイク |
6 |
|
乗り物 |
バイク |
7 |
|
乗り物 |
車 |
1 |
|
乗り物 |
車 |
2 |
|
乗り物 |
車 |
3 |
|
乗り物 |
車 |
4 |
|
乗り物 |
車 |
5 |
|
乗り物 |
車 |
9 |
|
|
|
|
カテゴリ6
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
猫 |
1 |
|
動物 |
猫 |
2 |
|
動物 |
猫 |
3 |
|
動物 |
猫 |
4 |
|
動物 |
猫 |
8 |
|
動物 |
猫 |
9 |
|
動物 |
犬 |
1 |
|
動物 |
犬 |
5 |
|
花 |
あじさい |
1 |
|
花 |
あじさい |
3 |
|
花 |
あじさい |
9 |
|
花 |
桜 |
8 |
|
花 |
ひまわり |
7 |
|
花 |
ひまわり |
9 |
|
乗り物 |
飛行機 |
8 |
|
|
|
|
カテゴリ7
画像 |
大分類 |
小分類 |
n |
|
乗り物 |
飛行機 |
7 |
カテゴリ8
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
猫 |
5 |
|
動物 |
猫 |
6 |
|
動物 |
猫 |
7 |
|
動物 |
犬 |
3 |
|
動物 |
猿 |
9 |
|
花 |
あじさい |
2 |
|
花 |
あじさい |
5 |
|
花 |
あじさい |
7 |
|
花 |
桜 |
0 |
|
花 |
桜 |
1 |
|
花 |
桜 |
5 |
|
花 |
桜 |
7 |
|
花 |
ひまわり |
6 |
|
花 |
ひまわり |
8 |
TF-IDFなしの結果
TF-IDFありの場合とどちらが良いのかぱっと見では何とも言えないです。。
カテゴリ0
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
犬 |
2 |
|
動物 |
犬 |
9 |
|
花 |
ひまわり |
0 |
|
花 |
ひまわり |
1 |
|
花 |
ひまわり |
2 |
|
花 |
ひまわり |
3 |
|
花 |
ひまわり |
7 |
|
花 |
ひまわり |
9 |
|
乗り物 |
飛行機 |
0 |
|
乗り物 |
飛行機 |
1 |
|
乗り物 |
飛行機 |
2 |
|
乗り物 |
飛行機 |
3 |
|
乗り物 |
飛行機 |
4 |
|
乗り物 |
飛行機 |
5 |
|
乗り物 |
飛行機 |
6 |
|
乗り物 |
飛行機 |
7 |
|
乗り物 |
飛行機 |
8 |
|
乗り物 |
飛行機 |
9 |
|
乗り物 |
バイク |
4 |
|
乗り物 |
車 |
2 |
|
乗り物 |
車 |
7 |
|
乗り物 |
車 |
8 |
|
乗り物 |
車 |
9 |
|
|
|
|
カテゴリ1
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
乗り物 |
バイク |
0 |
|
乗り物 |
バイク |
1 |
|
乗り物 |
バイク |
5 |
|
乗り物 |
バイク |
6 |
|
乗り物 |
バイク |
7 |
|
乗り物 |
バイク |
8 |
|
乗り物 |
車 |
0 |
|
乗り物 |
車 |
3 |
|
乗り物 |
車 |
4 |
|
乗り物 |
車 |
5 |
カテゴリ2
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
猫 |
0 |
|
動物 |
猫 |
1 |
|
動物 |
猫 |
3 |
|
動物 |
猫 |
4 |
|
動物 |
猫 |
5 |
|
動物 |
猫 |
8 |
|
動物 |
犬 |
1 |
|
動物 |
犬 |
7 |
|
動物 |
犬 |
8 |
|
花 |
あじさい |
0 |
|
花 |
あじさい |
1 |
|
花 |
あじさい |
3 |
|
花 |
あじさい |
4 |
|
花 |
あじさい |
6 |
|
花 |
あじさい |
9 |
|
花 |
桜 |
2 |
|
花 |
桜 |
5 |
|
花 |
桜 |
6 |
|
花 |
桜 |
9 |
|
花 |
ひまわり |
5 |
カテゴリ3
画像 |
大分類 |
小分類 |
n |
|
乗り物 |
車 |
6 |
カテゴリ4
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
犬 |
0 |
|
乗り物 |
バイク |
2 |
|
乗り物 |
車 |
1 |
|
|
|
|
カテゴリ5
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
猫 |
6 |
|
動物 |
猫 |
9 |
|
動物 |
犬 |
3 |
|
動物 |
犬 |
5 |
|
動物 |
犬 |
6 |
|
花 |
あじさい |
2 |
|
花 |
あじさい |
5 |
|
花 |
あじさい |
7 |
|
花 |
あじさい |
8 |
|
花 |
桜 |
8 |
|
花 |
ひまわり |
4 |
|
花 |
ひまわり |
6 |
|
乗り物 |
バイク |
3 |
|
乗り物 |
バイク |
9 |
カテゴリ6
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
猫 |
2 |
|
動物 |
猫 |
7 |
|
動物 |
犬 |
4 |
|
動物 |
猿 |
0 |
|
動物 |
猿 |
1 |
|
動物 |
猿 |
2 |
|
動物 |
猿 |
4 |
|
花 |
桜 |
0 |
|
花 |
桜 |
1 |
|
花 |
桜 |
7 |
|
花 |
ひまわり |
8 |
|
|
|
|
カテゴリ7
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
動物 |
猿 |
3 |
|
動物 |
猿 |
5 |
|
動物 |
猿 |
6 |
|
動物 |
猿 |
7 |
|
動物 |
猿 |
8 |
|
動物 |
猿 |
9 |
カテゴリ8
画像 |
大分類 |
小分類 |
n |
画像 |
大分類 |
小分類 |
n |
|
花 |
桜 |
3 |
|
花 |
桜 |
4 |
評価:TF-IDFあり vs TF-IDFなし
実際のところTF-IDFの変換はした方が良かったのか気になったので、TF-IDFありの場合とTF-IDFなしの場合のどちらが良いのかを評価してみました。クラスタの良さの評価に使った尺度はエントロピーと純度です。エントロピーは低いほど良く、純度は高いほど良いようです。
ここからはPythonではなくRです。エントロピーと純度の算出はR言語プログラミング: クラスター分析 - 階層的クラスタリング - hamadakoichi blogの下記関数を使わせていただきました。
calcEntropy <- function(ct){
-sum( (apply(ct,1,sum)/sum(ct))
* apply(ct,1,calcEntropy0))/log(ncol(ct))
}
calcEntropy0<-function(pv){
p1<-pv/sum(pv)
p2<-p1[p1 !=0]
sum(p2*log(p2))
}
calcPurity <-function(ct){
sum(apply(ct,1,max))/sum(ct)
}
TF-IDFありの算出
各画像ごとのカテゴリは下記の通りです。
id |
大分類 |
小分類 |
n |
カテゴリ |
id |
大分類 |
小分類 |
n |
カテゴリ |
0 |
動物 |
猫 |
0 |
5 |
1 |
動物 |
猫 |
1 |
6 |
2 |
動物 |
猫 |
2 |
6 |
3 |
動物 |
猫 |
3 |
6 |
4 |
動物 |
猫 |
4 |
6 |
5 |
動物 |
猫 |
5 |
8 |
6 |
動物 |
猫 |
6 |
8 |
7 |
動物 |
猫 |
7 |
8 |
8 |
動物 |
猫 |
8 |
6 |
9 |
動物 |
猫 |
9 |
6 |
10 |
動物 |
犬 |
0 |
3 |
11 |
動物 |
犬 |
1 |
6 |
12 |
動物 |
犬 |
2 |
3 |
13 |
動物 |
犬 |
3 |
8 |
14 |
動物 |
犬 |
4 |
4 |
15 |
動物 |
犬 |
5 |
6 |
16 |
動物 |
犬 |
6 |
1 |
17 |
動物 |
犬 |
7 |
1 |
18 |
動物 |
犬 |
8 |
1 |
19 |
動物 |
犬 |
9 |
3 |
20 |
動物 |
猿 |
0 |
4 |
21 |
動物 |
猿 |
1 |
4 |
22 |
動物 |
猿 |
2 |
4 |
23 |
動物 |
猿 |
3 |
4 |
24 |
動物 |
猿 |
4 |
4 |
25 |
動物 |
猿 |
5 |
4 |
26 |
動物 |
猿 |
6 |
4 |
27 |
動物 |
猿 |
7 |
4 |
28 |
動物 |
猿 |
8 |
4 |
29 |
動物 |
猿 |
9 |
8 |
30 |
花 |
あじさい |
0 |
1 |
31 |
花 |
あじさい |
1 |
6 |
32 |
花 |
あじさい |
2 |
8 |
33 |
花 |
あじさい |
3 |
6 |
34 |
花 |
あじさい |
4 |
1 |
35 |
花 |
あじさい |
5 |
8 |
36 |
花 |
あじさい |
6 |
1 |
37 |
花 |
あじさい |
7 |
8 |
38 |
花 |
あじさい |
8 |
1 |
39 |
花 |
あじさい |
9 |
6 |
40 |
花 |
桜 |
0 |
8 |
41 |
花 |
桜 |
1 |
8 |
42 |
花 |
桜 |
2 |
1 |
43 |
花 |
桜 |
3 |
1 |
44 |
花 |
桜 |
4 |
1 |
45 |
花 |
桜 |
5 |
8 |
46 |
花 |
桜 |
6 |
1 |
47 |
花 |
桜 |
7 |
8 |
48 |
花 |
桜 |
8 |
6 |
49 |
花 |
桜 |
9 |
1 |
50 |
花 |
ひまわり |
0 |
1 |
51 |
花 |
ひまわり |
1 |
3 |
52 |
花 |
ひまわり |
2 |
5 |
53 |
花 |
ひまわり |
3 |
5 |
54 |
花 |
ひまわり |
4 |
1 |
55 |
花 |
ひまわり |
5 |
1 |
56 |
花 |
ひまわり |
6 |
8 |
57 |
花 |
ひまわり |
7 |
6 |
58 |
花 |
ひまわり |
8 |
8 |
59 |
花 |
ひまわり |
9 |
6 |
60 |
乗り物 |
飛行機 |
0 |
3 |
61 |
乗り物 |
飛行機 |
1 |
3 |
62 |
乗り物 |
飛行機 |
2 |
3 |
63 |
乗り物 |
飛行機 |
3 |
2 |
64 |
乗り物 |
飛行機 |
4 |
3 |
65 |
乗り物 |
飛行機 |
5 |
2 |
66 |
乗り物 |
飛行機 |
6 |
2 |
67 |
乗り物 |
飛行機 |
7 |
7 |
68 |
乗り物 |
飛行機 |
8 |
6 |
69 |
乗り物 |
飛行機 |
9 |
2 |
70 |
乗り物 |
バイク |
0 |
5 |
71 |
乗り物 |
バイク |
1 |
5 |
72 |
乗り物 |
バイク |
2 |
5 |
73 |
乗り物 |
バイク |
3 |
0 |
74 |
乗り物 |
バイク |
4 |
0 |
75 |
乗り物 |
バイク |
5 |
5 |
76 |
乗り物 |
バイク |
6 |
5 |
77 |
乗り物 |
バイク |
7 |
5 |
78 |
乗り物 |
バイク |
8 |
0 |
79 |
乗り物 |
バイク |
9 |
0 |
80 |
乗り物 |
車 |
0 |
2 |
81 |
乗り物 |
車 |
1 |
5 |
82 |
乗り物 |
車 |
2 |
5 |
83 |
乗り物 |
車 |
3 |
5 |
84 |
乗り物 |
車 |
4 |
5 |
85 |
乗り物 |
車 |
5 |
5 |
86 |
乗り物 |
車 |
6 |
2 |
87 |
乗り物 |
車 |
7 |
2 |
88 |
乗り物 |
車 |
8 |
2 |
89 |
乗り物 |
車 |
9 |
5 |
Rスクリプトの内容は下記の通りです。
answer1 <- c(
"動物","動物","動物","動物","動物","動物","動物","動物","動物","動物",
"動物","動物","動物","動物","動物","動物","動物","動物","動物","動物",
"動物","動物","動物","動物","動物","動物","動物","動物","動物","動物",
"花","花","花","花","花","花","花","花","花","花",
"花","花","花","花","花","花","花","花","花","花",
"花","花","花","花","花","花","花","花","花","花",
"乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物",
"乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物",
"乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物","乗り物"
)
answer2 <- c(
"猫","猫","猫","猫","猫","猫","猫","猫","猫","猫",
"犬","犬","犬","犬","犬","犬","犬","犬","犬","犬",
"猿","猿","猿","猿","猿","猿","猿","猿","猿","猿",
"あじさい","あじさい","あじさい","あじさい","あじさい","あじさい","あじさい","あじさい","あじさい","あじさい",
"桜","桜","桜","桜","桜","桜","桜","桜","桜","桜",
"ひまわり","ひまわり","ひまわり","ひまわり","ひまわり","ひまわり","ひまわり","ひまわり","ひまわり","ひまわり",
"飛行機","飛行機","飛行機","飛行機","飛行機","飛行機","飛行機","飛行機","飛行機","飛行機",
"バイク","バイク","バイク","バイク","バイク","バイク","バイク","バイク","バイク","バイク",
"車","車","車","車","車","車","車","車","車","車"
)
result1 <- c(
5,6,6,6,6,8,8,8,6,6,
3,6,3,8,4,6,1,1,1,3,
4,4,4,4,4,4,4,4,4,8,
1,6,8,6,1,8,1,8,1,6,
8,8,1,1,1,8,1,8,6,1,
1,3,5,5,1,1,8,6,8,6,
3,3,3,2,3,2,2,7,6,2,
5,5,5,0,0,5,5,5,0,0,
2,5,5,5,5,5,2,2,2,5
)
ctbl <- table(answer1, result1)
ctbl
calcEntropy(ctbl)
calcPurity(ctbl)
ctbl <- table(answer2, result1)
ctbl
calcEntropy(ctbl)
calcPurity(ctbl)
実行するとこうなります。
> ctbl <- table(answer1, result1)
> ctbl
result1
answer1 0 1 2 3 4 5 6 7 8
花 0 12 0 1 0 2 6 0 9
乗り物 4 0 8 4 0 12 1 1 0
動物 0 3 0 3 10 1 8 0 5
> calcEntropy(ctbl) #エントロピー(Entropy)の算出
[1] 0.670199
> calcPurity(ctbl) #純度 (Purity)の算出
[1] 0.3777778
> ctbl
result1
answer2 0 1 2 3 4 5 6 7 8
あじさい 0 4 0 0 0 0 3 0 3
バイク 4 0 0 0 0 6 0 0 0
ひまわり 0 3 0 1 0 2 2 0 2
猿 0 0 0 0 9 0 0 0 1
犬 0 3 0 3 1 0 2 0 1
桜 0 5 0 0 0 0 1 0 4
車 0 0 4 0 0 6 0 0 0
猫 0 0 0 0 0 1 6 0 3
飛行機 0 0 4 4 0 0 1 1 0
>
> calcEntropy(ctbl) #エントロピー(Entropy)の算出
[1] 0.4478757
> calcPurity(ctbl) #純度 (Purity)の算出
[1] 0.5111111
>
TF-IDFなしの算出
各画像ごとのカテゴリは下記の通りです。
id |
大分類 |
小分類 |
n |
カテゴリ |
id |
大分類 |
小分類 |
n |
カテゴリ |
0 |
動物 |
猫 |
0 |
2 |
1 |
動物 |
猫 |
1 |
2 |
2 |
動物 |
猫 |
2 |
6 |
3 |
動物 |
猫 |
3 |
2 |
4 |
動物 |
猫 |
4 |
2 |
5 |
動物 |
猫 |
5 |
2 |
6 |
動物 |
猫 |
6 |
5 |
7 |
動物 |
猫 |
7 |
6 |
8 |
動物 |
猫 |
8 |
2 |
9 |
動物 |
猫 |
9 |
5 |
10 |
動物 |
犬 |
0 |
4 |
11 |
動物 |
犬 |
1 |
2 |
12 |
動物 |
犬 |
2 |
0 |
13 |
動物 |
犬 |
3 |
5 |
14 |
動物 |
犬 |
4 |
6 |
15 |
動物 |
犬 |
5 |
5 |
16 |
動物 |
犬 |
6 |
5 |
17 |
動物 |
犬 |
7 |
2 |
18 |
動物 |
犬 |
8 |
2 |
19 |
動物 |
犬 |
9 |
0 |
20 |
動物 |
猿 |
0 |
6 |
21 |
動物 |
猿 |
1 |
6 |
22 |
動物 |
猿 |
2 |
6 |
23 |
動物 |
猿 |
3 |
7 |
24 |
動物 |
猿 |
4 |
6 |
25 |
動物 |
猿 |
5 |
7 |
26 |
動物 |
猿 |
6 |
7 |
27 |
動物 |
猿 |
7 |
7 |
28 |
動物 |
猿 |
8 |
7 |
29 |
動物 |
猿 |
9 |
7 |
30 |
花 |
あじさい |
0 |
2 |
31 |
花 |
あじさい |
1 |
2 |
32 |
花 |
あじさい |
2 |
5 |
33 |
花 |
あじさい |
3 |
2 |
34 |
花 |
あじさい |
4 |
2 |
35 |
花 |
あじさい |
5 |
5 |
36 |
花 |
あじさい |
6 |
2 |
37 |
花 |
あじさい |
7 |
5 |
38 |
花 |
あじさい |
8 |
5 |
39 |
花 |
あじさい |
9 |
2 |
40 |
花 |
桜 |
0 |
6 |
41 |
花 |
桜 |
1 |
6 |
42 |
花 |
桜 |
2 |
2 |
43 |
花 |
桜 |
3 |
8 |
44 |
花 |
桜 |
4 |
8 |
45 |
花 |
桜 |
5 |
2 |
46 |
花 |
桜 |
6 |
2 |
47 |
花 |
桜 |
7 |
6 |
48 |
花 |
桜 |
8 |
5 |
49 |
花 |
桜 |
9 |
2 |
50 |
花 |
ひまわり |
0 |
0 |
51 |
花 |
ひまわり |
1 |
0 |
52 |
花 |
ひまわり |
2 |
0 |
53 |
花 |
ひまわり |
3 |
0 |
54 |
花 |
ひまわり |
4 |
5 |
55 |
花 |
ひまわり |
5 |
2 |
56 |
花 |
ひまわり |
6 |
5 |
57 |
花 |
ひまわり |
7 |
0 |
58 |
花 |
ひまわり |
8 |
6 |
59 |
花 |
ひまわり |
9 |
0 |
60 |
乗り物 |
飛行機 |
0 |
0 |
61 |
乗り物 |
飛行機 |
1 |
0 |
62 |
乗り物 |
飛行機 |
2 |
0 |
63 |
乗り物 |
飛行機 |
3 |
0 |
64 |
乗り物 |
飛行機 |
4 |
0 |
65 |
乗り物 |
飛行機 |
5 |
0 |
66 |
乗り物 |
飛行機 |
6 |
0 |
67 |
乗り物 |
飛行機 |
7 |
0 |
68 |
乗り物 |
飛行機 |
8 |
0 |
69 |
乗り物 |
飛行機 |
9 |
0 |
70 |
乗り物 |
バイク |
0 |
1 |
71 |
乗り物 |
バイク |
1 |
1 |
72 |
乗り物 |
バイク |
2 |
4 |
73 |
乗り物 |
バイク |
3 |
5 |
74 |
乗り物 |
バイク |
4 |
0 |
75 |
乗り物 |
バイク |
5 |
1 |
76 |
乗り物 |
バイク |
6 |
1 |
77 |
乗り物 |
バイク |
7 |
1 |
78 |
乗り物 |
バイク |
8 |
1 |
79 |
乗り物 |
バイク |
9 |
5 |
80 |
乗り物 |
車 |
0 |
1 |
81 |
乗り物 |
車 |
1 |
4 |
82 |
乗り物 |
車 |
2 |
0 |
83 |
乗り物 |
車 |
3 |
1 |
84 |
乗り物 |
車 |
4 |
1 |
85 |
乗り物 |
車 |
5 |
1 |
86 |
乗り物 |
車 |
6 |
3 |
87 |
乗り物 |
車 |
7 |
0 |
88 |
乗り物 |
車 |
8 |
0 |
89 |
乗り物 |
車 |
9 |
0 |
Rスクリプトの内容は下記の通りです。
result2 <- c(
2,2,6,2,2,2,5,6,2,5,
4,2,0,5,6,5,5,2,2,0,
6,6,6,7,6,7,7,7,7,7,
2,2,5,2,2,5,2,5,5,2,
6,6,2,8,8,2,2,6,5,2,
0,0,0,0,5,2,5,0,6,0,
0,0,0,0,0,0,0,0,0,0,
1,1,4,5,0,1,1,1,1,5,
1,4,0,1,1,1,3,0,0,0
)
ctbl <- table(answer1, result2)
ctbl
calcEntropy(ctbl)
calcPurity(ctbl)
ctbl <- table(answer2, result2)
ctbl
calcEntropy(ctbl)
calcPurity(ctbl)
実行するとこうなります。
> ctbl <- table(answer1, result2)
> ctbl
result2
answer1 0 1 2 3 4 5 6 7 8
花 6 0 11 0 0 7 4 0 2
乗り物 15 10 0 1 2 2 0 0 0
動物 2 0 9 0 1 5 7 6 0
>
> calcEntropy(ctbl) #エントロピー(Entropy)の算出
[1] 0.649445
> calcPurity(ctbl) #純度 (Purity)の算出
[1] 0.3888889
>
> ctbl <- table(answer2, result2)
> ctbl
result2
answer2 0 1 2 3 4 5 6 7 8
あじさい 0 0 6 0 0 4 0 0 0
バイク 1 6 0 0 1 2 0 0 0
ひまわり 6 0 1 0 0 2 1 0 0
猿 0 0 0 0 0 0 4 6 0
犬 2 0 3 0 1 3 1 0 0
桜 0 0 4 0 0 1 3 0 2
車 4 4 0 1 1 0 0 0 0
猫 0 0 6 0 0 2 2 0 0
飛行機 10 0 0 0 0 0 0 0 0
>
> calcEntropy(ctbl) #エントロピー(Entropy)の算出
[1] 0.4274223
> calcPurity(ctbl) #純度 (Purity)の算出
[1] 0.5666667
>
評価結果
結果はこうなりました。今回の実施条件と評価尺度だとTF-IDFは使わない方が良いらしいです。
TF-IDF |
分類 |
エントロピー |
純度 |
あり |
大分類 |
0.670199 |
0.3777778 |
あり |
小分類 |
0.4478757 |
0.5111111 |
なし |
大分類 |
0.649445 |
0.3888889 |
なし |
小分類 |
0.4274223 |
0.5666667 |
最後に思った事など
- 何も考えず特徴量をSURFにしましたが、もうちょっと工夫すると精度は上がるかもしれないです。あと、もうすこしちゃんとした評価もやりたかったですが進捗ダメでしたのであきらめました。人員追加、期日延期、機能削減に迫られたらまず機能削減を考えたいタイプです。
- 実践 機械学習システムは読みやすくて使えそうな内容ですので機械学習のとっかかりにおすすめの本だと思います。
- 画像のアップと表の作成がしんどかったです。