<< Pythonによる機械学習2(ロジスティック回帰 1/4)
【Pythonによる機械学習2(ロジスティック回帰 2/4)の目次】
学習データの構造
本講義では、学習データを、以下のような行列構造で表現します。
※教科書によっては、行と列が入れ替わった、データ数N×次元Dの行列表現を用いているものがあるので、注意してください。
人工データの取得
機械学習の分類アルゴリズムを実装する上で、可視化できる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")
【各カテゴリのデータが単峰で簡単な場合】
カテゴリ間に直線(高次元の場合は超平面)を引くことにより、3カテゴリを分割することがきることがわかります。
演習2
data.artificialを用いて、カテゴリ3のデータが以下のように多峰になっていて、直線では識別が難しいデータを作成してみましょう。
【カテゴリがデータが多峰で難しい例】