Main Content

体脂肪の推定

この例では、関数近似ニューラル ネットワークを使用して、解剖学的測定値に基づいて体脂肪率を推定する方法を説明します。

問題: 体脂肪率の推定

この例では、以下の 13 の身体的属性で表される人の体脂肪率を推定できるニューラル ネットワークの構築を試みます。

  • 年齢 (歳)

  • 体重 (ポンド)

  • 身長 (インチ)

  • 首周り (cm)

  • 胸囲 (cm)

  • 腹囲 (cm)

  • ヒップ回り (cm)

  • 太もも周り (cm)

  • 膝周り (cm)

  • 足首周り (cm)

  • (腕を伸ばした状態での) 二頭筋周り (cm)

  • 前腕周り (cm)

  • 手首周り (cm)

これは、関連付けられるターゲット出力に入力が適合している近似問題の例です。与えられた既知の入力に既知のターゲットを推定するだけでなく、解の設計に使用されなかった入力に対しても出力を正確に推定するように汎化できるニューラル ネットワークを作成します。

ニューラル ネットワークを使用する理由

ニューラル ネットワークは、関数近似問題に非常に適しています。十分な要素 (ニューロンと呼ばれる) が含まれるニューラル ネットワークは、任意のデータに任意の精度で当てはめることができます。特に、非線形問題への対応には非常に適しています。体脂肪の増加のような実際の現象には非線形特性があるため、ニューラル ネットワークはこの問題を解くことのできる適切な候補であると言えます。

13 の身体的属性がニューラル ネットワークへの入力となり、体脂肪率がターゲットとなります。

ネットワークは、体脂肪率が既知である身体の解剖学的な数値を使用して設計し、ターゲットの評価値を生成するように学習を行います。

データの準備

入力行列 X とターゲット行列 T の 2 つの行列にデータを整理することによって、ニューラル ネットワークに関数近似問題用のデータを設定します。

入力行列の i 番目の列にはそれぞれ、体脂肪率が既知である身体を表す 13 の要素が含まれます。

ターゲット行列の対応する各列には、体脂肪率を表す 1 つの要素が含まれます。

ここで、このようなデータセットが読み込まれます。

[X,T] = bodyfat_dataset;

入力 X およびターゲット T のサイズを表示できます。

X と T の両方に 252 の列があることに注意してください。これらは 252 の体格 (入力) と関連付けられる体脂肪率 (ターゲット) を表します。

入力行列 X には、13 の属性に対する 13 の行があります。各例に目的の出力 (体脂肪率) が 1 つしかないため、ターゲット行列 T は 1 行のみになります。

size(X)
ans = 1×2

    13   252

size(T)
ans = 1×2

     1   252

ニューラル ネットワークによる関数の近似

次の手順では、体脂肪率の推定を学習するニューラル ネットワークを作成します。

ニューラル ネットワークはランダムな初期重みで開始するため、この例で得られる結果は実行するたびに多少異なります。このようなランダム性を回避するには、乱数シードを設定します。ただし、これはユーザー独自のアプリケーションには不要です。

setdemorandstream(491218382)

2 層 (1 つの隠れ層) のフィードフォワード ニューラル ネットワークは、隠れ層に十分なニューロンがある場合、任意の入出力関係に当てはめることができます。出力層ではない層は、隠れ層と呼ばれます。

この例では、15 個のニューロンがある 1 つの隠れ層を試します。一般的に、難しい問題ほど多くのニューロンが、そしておそらくは多くの層が必要になります。簡単な問題では、必要なニューロンが少なくなります。

ネットワークはまだ入力データとターゲット データに一致するように構成されていないため、入力と出力のサイズは 0 です。ネットワークの学習時にはこのようになります。

net = fitnet(15);
view(net)

これでネットワークの学習の準備が整いました。サンプルが学習セット、検証セット、およびテスト セットに自動的に分割されます。学習セットは、ネットワークに教えるために使用されます。検証セットに対してネットワークの改善が続いている限り、学習が続行されます。テスト セットを使用することで、ネットワークの精度を完全に独立して測定できます。

Neural Network Training Tool を使用すると、学習するネットワークと、学習に使用されているアルゴリズムが表示されます。さらに、学習中には学習の状態が表示され、学習を停止した条件が緑で強調表示されます。

下部にあるボタンを使用すると、便利なプロットを開くことができます。これらのプロットは、学習中および学習後に開くことができます。アルゴリズム名およびプロット ボタンの隣のリンクを使用すると、これらに関するドキュメンテーションを開くことができます。

[net,tr] = train(net,X,T);

学習中にネットワーク性能がどのように改善されているかを確認するには、学習ツールの [パフォーマンス] ボタンをクリックするか、PLOTPERFORM を呼び出します。

性能は、平均二乗誤差で測定され、対数スケールで表示されます。これは、ネットワークの学習が進むと急激に低下します。

性能は、学習セット、検証セット、およびテスト セットのそれぞれについて表示されます。最終的なネットワークは、検証セットに対して最も性能の良いネットワークです。

figure
plotperform(tr)

ニューラル ネットワークのテスト

学習済みニューラル ネットワークの平均二乗誤差をテスト サンプルについて測定できるようになりました。これにより、実際のデータに適用した場合にネットワークがどの程度一致しているかを把握できます。

testX = X(:,tr.testInd);
testT = T(:,tr.testInd);

testY = net(testX);

perf = mse(net,testT,testY)
perf = 36.9404

ニューラル ネットワークがどの程度データに当てはまるかを測定するもう 1 つの方法は、回帰プロットです。ここで、すべてのサンプルに対して回帰がプロットされます。

回帰プロットには、関連付けられるターゲット値でプロットされた実際のネットワーク出力が表示されます。ネットワークがデータに適切に当てはまることを学習した場合、この出力とターゲットの関係に対する線形近似は、プロットの左下隅および右上隅の近くを交差している必要があります。

そうなっていない場合は、追加学習を行うか、隠れニューロンを増やしてネットワークの学習を行うことをお勧めします。

Y = net(X);

figure
plotregression(T,Y)

ニューラル ネットワークがどの程度データに当てはまるかを測定する 3 つ目の方法は、誤差ヒストグラムです。これは、誤差の大きさがどのように分布しているかを示します。一般的にほとんどの誤差は 0 に近く、0 と大幅に異なる誤差はごくわずかです。

e = T - Y;

figure
ploterrhist(e)

この例では、身体的特性から体脂肪率を推定するニューラル ネットワークを設計する方法を説明しました。

ニューラル ネットワークとそのアプリケーションの詳細は、他の例およびドキュメンテーションを参照してください。