Pythonで画像の簡単なカテゴリ分け

これはPython Advent Calendar 2014の16日目です。

実践 機械学習システムを読んでいて画像のパターン認識が面白そうだったので実装して遊んでみました。主に10章のコンピュータビジョンと3章のクラスタリングを参考にしました。ほとんど、NumPyscikit-learnMahotasに丸投げです。

ざっくりとした流れ

今回は用意した複数のjpg画像を教師無しでカテゴライズしてみました。

  1. まず、全ての画像を局所特徴量リストにしました。局所特徴量にはSURFを使用しました。SURFはMahotasのmahotas.features.surf.surfで簡単に取得できます。
  2. そして、すべてのSURFをk-means法でグループ化して基本特徴量(visual word)を求めます。k-means法の計算はsklearn.cluster.KMeans.fitを呼ぶだけでできます。
  3. これを使って画像の局所特徴量リストを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で算出できます。
  4. 最後に、TF-IDFリストをk-means法でカテゴリ分けしておしまいです。

図にするとこんな感じです。

f:id:nihma:20141214221038j:plain

実装

流れの通りに実装しました。
カテゴリ分けしたい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

# image surf
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))

# image surf -> basic feature
concatenated = np.concatenate(alldescriptors)
km = KMeans(feature_category_num)
km.fit(concatenated)

# image surf and basic feature -> features
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)

# features -> tfidf
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(features)
tfidf.toarray() 
# not use tfidf
# tfidf = features

# categorization
km = KMeans(n_clusters=picture_category_num, init='random', n_init=1, verbose=1)
km.fit(tfidf)

# print result
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

f:id:nihma:20141215062009j:plain

乗り物 バイク 3

f:id:nihma:20141215062104j:plain

乗り物 バイク 4

f:id:nihma:20141215062435j:plain

乗り物 バイク 8

f:id:nihma:20141215062532j:plain

乗り物 バイク 9

カテゴリ1

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215003314j:plain

動物 6

f:id:nihma:20141215003413j:plain

動物 7

f:id:nihma:20141215003512j:plain

動物 8

f:id:nihma:20141215013124j:plain

あじさい 0

f:id:nihma:20141215013447j:plain

あじさい 4

f:id:nihma:20141215013637j:plain

あじさい 6

f:id:nihma:20141215013817j:plain

あじさい 8

f:id:nihma:20141215014358j:plain

2

f:id:nihma:20141215014446j:plain

3

f:id:nihma:20141215014530j:plain

4

f:id:nihma:20141215014725j:plain

6

f:id:nihma:20141215014943j:plain

9

f:id:nihma:20141215055210j:plain

ひまわり 0

f:id:nihma:20141215055719j:plain

ひまわり 4

f:id:nihma:20141215055829j:plain

ひまわり 5

カテゴリ2

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215060742j:plain

乗り物 飛行機 3

f:id:nihma:20141215061216j:plain

乗り物 飛行機 5

f:id:nihma:20141215061311j:plain

乗り物 飛行機 6

f:id:nihma:20141215061536j:plain

乗り物 飛行機 9

f:id:nihma:20141215062651j:plain

乗り物 0

f:id:nihma:20141215063218j:plain

乗り物 6

f:id:nihma:20141215063312j:plain

乗り物 7

f:id:nihma:20141215063420j:plain

乗り物 8

カテゴリ3

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215002718j:plain

動物 0

f:id:nihma:20141215002911j:plain

動物 2

f:id:nihma:20141215003616j:plain

動物 9

f:id:nihma:20141215055315j:plain

ひまわり 1

f:id:nihma:20141215060523j:plain

乗り物 飛行機 0

f:id:nihma:20141215060623j:plain

乗り物 飛行機 1

f:id:nihma:20141215061000j:plain

乗り物 飛行機 2

f:id:nihma:20141215061122j:plain

乗り物 飛行機 4

カテゴリ4

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215003058j:plain

動物 4

f:id:nihma:20141215003857j:plain

動物 0

f:id:nihma:20141215004029j:plain

動物 1

f:id:nihma:20141215004132j:plain

動物 2

f:id:nihma:20141215004235j:plain

動物 3

f:id:nihma:20141215004329j:plain

動物 4

f:id:nihma:20141215004436j:plain

動物 5

f:id:nihma:20141215004529j:plain

動物 6

f:id:nihma:20141215004624j:plain

動物 7

f:id:nihma:20141215004706j:plain

動物 8

カテゴリ5

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215001119j:plain

動物 0

f:id:nihma:20141215055436j:plain

ひまわり 2

f:id:nihma:20141215055544j:plain

ひまわり 3

f:id:nihma:20141215061721j:plain

乗り物 バイク 0

f:id:nihma:20141215061806j:plain

乗り物 バイク 1

f:id:nihma:20141215061903j:plain

乗り物 バイク 2

f:id:nihma:20141215062156j:plain

乗り物 バイク 5

f:id:nihma:20141215062248j:plain

乗り物 バイク 6

f:id:nihma:20141215062336j:plain

乗り物 バイク 7

f:id:nihma:20141215062741j:plain

乗り物 1

f:id:nihma:20141215062839j:plain

乗り物 2

f:id:nihma:20141215062935j:plain

乗り物 3

f:id:nihma:20141215063044j:plain

乗り物 4

f:id:nihma:20141215063131j:plain

乗り物 5

f:id:nihma:20141215063506j:plain

乗り物 9

カテゴリ6

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215001449j:plain

動物 1

f:id:nihma:20141215001623j:plain

動物 2

f:id:nihma:20141215001734j:plain

動物 3

f:id:nihma:20141215001844j:plain

動物 4

f:id:nihma:20141215002339j:plain

動物 8

f:id:nihma:20141215002537j:plain

動物 9

f:id:nihma:20141215002818j:plain

動物 1

f:id:nihma:20141215003210j:plain

動物 5

f:id:nihma:20141215013227j:plain

あじさい 1

f:id:nihma:20141215013400j:plain

あじさい 3

f:id:nihma:20141215013931j:plain

あじさい 9

f:id:nihma:20141215014904j:plain

8

f:id:nihma:20141215060055j:plain

ひまわり 7

f:id:nihma:20141215060308j:plain

ひまわり 9

f:id:nihma:20141215061453j:plain

乗り物 飛行機 8

カテゴリ7

画像 大分類 小分類 n

f:id:nihma:20141215061409j:plain

乗り物 飛行機 7

カテゴリ8

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215002028j:plain

動物 5

f:id:nihma:20141215002128j:plain

動物 6

f:id:nihma:20141215002243j:plain

動物 7

f:id:nihma:20141215003004j:plain

動物 3

f:id:nihma:20141215004803j:plain

動物 9

f:id:nihma:20141215013318j:plain

あじさい 2

f:id:nihma:20141215013535j:plain

あじさい 5

f:id:nihma:20141215013727j:plain

あじさい 7

f:id:nihma:20141215014220j:plain

0

f:id:nihma:20141215014313j:plain

1

f:id:nihma:20141215014639j:plain

5

f:id:nihma:20141215014818j:plain

7

f:id:nihma:20141215055938j:plain

ひまわり 6

f:id:nihma:20141215060157j:plain

ひまわり 8

TF-IDFなしの結果

TF-IDFありの場合とどちらが良いのかぱっと見では何とも言えないです。。

カテゴリ0

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215002911j:plain

動物 2

f:id:nihma:20141215003616j:plain

動物 9

f:id:nihma:20141215055210j:plain

ひまわり 0

f:id:nihma:20141215055315j:plain

ひまわり 1

f:id:nihma:20141215055436j:plain

ひまわり 2

f:id:nihma:20141215055544j:plain

ひまわり 3

f:id:nihma:20141215060055j:plain

ひまわり 7

f:id:nihma:20141215060308j:plain

ひまわり 9

f:id:nihma:20141215060523j:plain

乗り物 飛行機 0

f:id:nihma:20141215060623j:plain

乗り物 飛行機 1

f:id:nihma:20141215061000j:plain

乗り物 飛行機 2

f:id:nihma:20141215060742j:plain

乗り物 飛行機 3

f:id:nihma:20141215061122j:plain

乗り物 飛行機 4

f:id:nihma:20141215061216j:plain

乗り物 飛行機 5

f:id:nihma:20141215061311j:plain

乗り物 飛行機 6

f:id:nihma:20141215061409j:plain

乗り物 飛行機 7

f:id:nihma:20141215061453j:plain

乗り物 飛行機 8

f:id:nihma:20141215061536j:plain

乗り物 飛行機 9

f:id:nihma:20141215062104j:plain

乗り物 バイク 4

f:id:nihma:20141215062839j:plain

乗り物 2

f:id:nihma:20141215063312j:plain

乗り物 7

f:id:nihma:20141215063420j:plain

乗り物 8

f:id:nihma:20141215063506j:plain

乗り物 9

カテゴリ1

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215061721j:plain

乗り物 バイク 0

f:id:nihma:20141215061806j:plain

乗り物 バイク 1

f:id:nihma:20141215062156j:plain

乗り物 バイク 5

f:id:nihma:20141215062248j:plain

乗り物 バイク 6

f:id:nihma:20141215062336j:plain

乗り物 バイク 7

f:id:nihma:20141215062435j:plain

乗り物 バイク 8

f:id:nihma:20141215062651j:plain

乗り物 0

f:id:nihma:20141215062935j:plain

乗り物 3

f:id:nihma:20141215063044j:plain

乗り物 4

f:id:nihma:20141215063131j:plain

乗り物 5

カテゴリ2

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215001119j:plain

動物 0

f:id:nihma:20141215001449j:plain

動物 1

f:id:nihma:20141215001734j:plain

動物 3

f:id:nihma:20141215001844j:plain

動物 4

f:id:nihma:20141215002028j:plain

動物 5

f:id:nihma:20141215002339j:plain

動物 8

f:id:nihma:20141215002818j:plain

動物 1

f:id:nihma:20141215003413j:plain

動物 7

f:id:nihma:20141215003512j:plain

動物 8

f:id:nihma:20141215013124j:plain

あじさい 0

f:id:nihma:20141215013227j:plain

あじさい 1

f:id:nihma:20141215013400j:plain

あじさい 3

f:id:nihma:20141215013447j:plain

あじさい 4

f:id:nihma:20141215013637j:plain

あじさい 6

f:id:nihma:20141215013931j:plain

あじさい 9

f:id:nihma:20141215014358j:plain

2

f:id:nihma:20141215014639j:plain

5

f:id:nihma:20141215014725j:plain

6

f:id:nihma:20141215014943j:plain

9

f:id:nihma:20141215055829j:plain

ひまわり 5

カテゴリ3

画像 大分類 小分類 n

f:id:nihma:20141215063218j:plain

乗り物 6

カテゴリ4

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215002718j:plain

動物 0

f:id:nihma:20141215061903j:plain

乗り物 バイク 2

f:id:nihma:20141215062741j:plain

乗り物 1

カテゴリ5

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215002128j:plain

動物 6

f:id:nihma:20141215002537j:plain

動物 9

f:id:nihma:20141215003004j:plain

動物 3

f:id:nihma:20141215003210j:plain

動物 5

f:id:nihma:20141215003314j:plain

動物 6

f:id:nihma:20141215013318j:plain

あじさい 2

f:id:nihma:20141215013535j:plain

あじさい 5

f:id:nihma:20141215013727j:plain

あじさい 7

f:id:nihma:20141215013817j:plain

あじさい 8

f:id:nihma:20141215014904j:plain

8

f:id:nihma:20141215055719j:plain

ひまわり 4

f:id:nihma:20141215055938j:plain

ひまわり 6

f:id:nihma:20141215062009j:plain

乗り物 バイク 3

f:id:nihma:20141215062532j:plain

乗り物 バイク 9

カテゴリ6

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215001623j:plain

動物 2

f:id:nihma:20141215002243j:plain

動物 7

f:id:nihma:20141215003058j:plain

動物 4

f:id:nihma:20141215003857j:plain

動物 0

f:id:nihma:20141215004029j:plain

動物 1

f:id:nihma:20141215004132j:plain

動物 2

f:id:nihma:20141215004329j:plain

動物 4

f:id:nihma:20141215014220j:plain

0

f:id:nihma:20141215014313j:plain

1

f:id:nihma:20141215014818j:plain

7

f:id:nihma:20141215060157j:plain

ひまわり 8

カテゴリ7

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215004235j:plain

動物 3

f:id:nihma:20141215004436j:plain

動物 5

f:id:nihma:20141215004529j:plain

動物 6

f:id:nihma:20141215004624j:plain

動物 7

f:id:nihma:20141215004706j:plain

動物 8

f:id:nihma:20141215004803j:plain

動物 9

カテゴリ8

画像 大分類 小分類 n 画像 大分類 小分類 n

f:id:nihma:20141215014446j:plain

3

f:id:nihma:20141215014530j:plain

4

評価:TF-IDFあり vs TF-IDFなし

実際のところTF-IDFの変換はした方が良かったのか気になったので、TF-IDFありの場合とTF-IDFなしの場合のどちらが良いのかを評価してみました。クラスタの良さの評価に使った尺度はエントロピーと純度です。エントロピーは低いほど良く、純度は高いほど良いようです。

ここからはPythonではなくRです。エントロピーと純度の算出はR言語プログラミング: クラスター分析 - 階層的クラスタリング - hamadakoichi blogの下記関数を使わせていただきました。

#関数:エントロピー(Entropy)算出, ct:クロス集計表
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))
}

#関数:純度 (Purity)算出
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) #エントロピー(Entropy)の算出
calcPurity(ctbl)  #純度 (Purity)の算出

ctbl <- table(answer2, result1)
ctbl

calcEntropy(ctbl) #エントロピー(Entropy)の算出
calcPurity(ctbl)  #純度 (Purity)の算出

実行するとこうなります。

> 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) #エントロピー(Entropy)の算出
calcPurity(ctbl)  #純度 (Purity)の算出

ctbl <- table(answer2, result2)
ctbl

calcEntropy(ctbl) #エントロピー(Entropy)の算出
calcPurity(ctbl)  #純度 (Purity)の算出

実行するとこうなります。

> 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にしましたが、もうちょっと工夫すると精度は上がるかもしれないです。あと、もうすこしちゃんとした評価もやりたかったですが進捗ダメでしたのであきらめました。人員追加、期日延期、機能削減に迫られたらまず機能削減を考えたいタイプです。
  • 実践 機械学習システムは読みやすくて使えそうな内容ですので機械学習のとっかかりにおすすめの本だと思います。
  • 画像のアップと表の作成がしんどかったです。