覚え書きブログ

Pythonによる機械学習2(ロジスティック回帰 2/4)

<< Pythonによる機械学習2(ロジスティック回帰 1/4)

【Pythonによる機械学習2(ロジスティック回帰 2/4)の目次】



学習データの構造

本講義では、学習データを、以下のような行列構造で表現します。
※教科書によっては、行と列が入れ替わった、データ数N×次元Dの行列表現を用いているものがあるので、注意してください。
f:id:hirotaka_hachiya:20181128093930p:plain

人工データの取得

機械学習の分類アルゴリズムを実装する上で、可視化できる2次元の人工データを用いると非常に便利です。ここでは、intelligentSystemTrainingフォルダにあるdata.pyにて定義されている、人工データの生成とプロットができるartificialクラスを用います。

data.artificialクラスでは、3つのカテゴリのデータを、それぞれ2次元の正規分布に従って生成することができます。以下のように、各カテゴリの正規分布の平均(中心座標)と、全カテゴリ共通の共分散行列を設定することができます。

> myData =  data.artificial(学習データ数, 評価データ数, mean1=カテゴリ1の平均,
                      mean2=カテゴリ2の平均, mean3=カテゴリ3の平均, mean3multi=カテゴリ3のもう一つの平均(省略可), cov=分散共分散行列)

それでは、Pythonをインタラクティブモードで起動し、data.pyを使ってみます。
インタラクティブモードを起動するために、シェル上で「python」を入力し、Enterを押してください。

> python
>>> import data
# 正規分布に従って人工データの生成
>>> myData =  data.artificial(30,15,mean1=[1,2],mean2=[-2,-1],mean3=[2,-2],cov=[[1,-0.8],[-0.8,1]])
# 学習用の入力データx(2次元 x 30個)を表示
>>> myData.xTrain
array([[ 0.11434782,  1.19488978, -0.98185905,  0.98057262,  0.34551092,
         1.46698195,  1.22219624,  1.59693752,  1.27818379,  0.57591925,
        -2.33919205, -3.3798551 , -0.80635899, -2.20322774, -2.1717145 ,
        -2.83012957, -1.19407115, -2.74653338, -1.25826631, -1.74330797,
         2.8365229 ,  2.94966505,  1.41800507,  1.41634364,  1.102733  ,
         1.77212125,  2.60131834,  1.94244396,  2.63332979,  3.32224072],
       [ 2.38266847,  1.139544  ,  3.45586017,  1.4327257 ,  2.31066508,
         1.6992902 ,  1.9015966 ,  2.40662443,  1.7639666 ,  2.34093731,
         0.77102368, -0.99803479, -2.73724758, -0.60407945, -0.06580228,
        -1.52872515, -1.66438346,  0.39605501, -1.01879198, -1.85891147,
        -2.87945849, -3.85545312, -2.01853397, -0.58924469, -2.04651775,
        -2.33165586, -3.17583415, -1.79182349, -1.81746514, -2.47260466]])
# 学習用のカテゴリデータt(3カテゴリ x 30個, one-hot表現)を表示
>>> myData.tTrain
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1]])
# 評価用の入力データxのサイズを表示
>>> myData.xTest.shape
(2, 15)
# 評価用のカテゴリデータtのサイズを表示
>>> myData.tTest.shape
(3, 15)

カテゴリデータtがone-hot表現で生成されていることがわかります。

次に、生成したデータをplotメソッドを用いて可視化してみます。

> python
>>> import Data
# 簡単な場合
>>> myDataEasy = data.artificial(300,150,mean1=[1,2],mean2=[-2,-1],mean3=[2,-2],cov=[[1,-0.8],[-0.8,1]])
>>> myDataEasy.plot(prefix="easy")

【各カテゴリのデータが単峰で簡単な場合】
f:id:hirotaka_hachiya:20171125095414p:plain
カテゴリ間に直線(高次元の場合は超平面)を引くことにより、3カテゴリを分割することがきることがわかります。

演習2

data.artificialを用いて、カテゴリ3のデータが以下のように多峰になっていて、直線では識別が難しいデータを作成してみましょう。
【カテゴリがデータが多峰で難しい例】
f:id:hirotaka_hachiya:20171125095428p:plain

Pythonによる機械学習2(ロジスティック回帰 3/4) >>