コップの状態分析
Contents
処理方針
まずは加速度データ、磁気コンパスデータ、ジャイロセンサデータをplot そこからどのように動いたのかのおおよその検討をつける 使えそうなデータ全ての平均・最大・最小・分散・中央値・最頻値・標準偏差を計算(今回は3つとも) 入力・出力配列を作成しnprtoolを用いてデータの分類
テーブルとして読み込む
readGlassData2
データを加速度の値の変化に注目して可視化してみる
figure ax = glassdata1.accelX; ay = glassdata1.accelY; az = glassdata1.accelZ; plot3(ax,ay,az); xlabel('x_accel'); ylabel('y_accel'); zlabel('z_accel'); view(58,26);
データを磁気コンパスの値の変化に注目可視化してみる
figure cx = glassdata1.compassX; cy = glassdata1.compassY; cz = glassdata1.compassZ; plot3(cx,cy,cz); xlabel('x_compass'); ylabel('y_compass'); zlabel('z_compass'); view(58,26);
データをジャイロセンサの値の変化に注目して可視化してみる
figure gx = glassdata1.gyroX; gy = glassdata1.gyroY; gz = glassdata1.gyroZ; plot3(gx,gy,gz); xlabel('x_gyro'); ylabel('y_gyro'); zlabel('z_gyro'); view(58,26);
データの総数や、ループの回数を計算する
numData = length(glassdata1.groupID); dataPerSample = 240; % サンプルごとの生データ数 3秒 samplingInterval = 160; % サンプル生成間隔 2秒 numSample = (numData-dataPerSample)/samplingInterval; % サンプル数
state文字列をインデックスに変換
[statenum,statenames]=grp2idx(glassdata1.state);
2秒間隔で過去3秒間を代表するデータを作成する
2秒間隔で3秒の最大最小平均分散中央値最頻値標準偏差を計算 期間の80%以上同じ状態の場合は、それをその期間の状態として設定 80%に満たない場合は、6(stateの種類+1)とする
for n = 1:numSample startSample = (n-1)*samplingInterval+1; endSample = startSample+dataPerSample; ax_mean(n)=mean(ax(startSample:endSample)); ay_mean(n)=mean(ay(startSample:endSample)); az_mean(n)=mean(az(startSample:endSample)); ax_min(n)=min(ax(startSample:endSample)); ay_min(n)=min(ay(startSample:endSample)); az_min(n)=min(az(startSample:endSample)); ax_max(n)=max(ax(startSample:endSample)); ay_max(n)=max(ay(startSample:endSample)); az_max(n)=max(az(startSample:endSample)); ax_var(n)=var(ax(startSample:endSample)); ay_var(n)=var(ay(startSample:endSample)); az_var(n)=var(az(startSample:endSample)); ax_median(n)=median(ax(startSample:endSample)); ay_median(n)=median(ay(startSample:endSample)); az_median(n)=median(az(startSample:endSample)); ax_mode(n)=mode(ax(startSample:endSample)); ay_mode(n)=mode(ay(startSample:endSample)); az_mode(n)=mode(az(startSample:endSample)); ax_std(n)=std(ax(startSample:endSample)); ay_std(n)=std(ay(startSample:endSample)); az_std(n)=std(az(startSample:endSample)); cx_mean(n)=mean(cx(startSample:endSample)); cy_mean(n)=mean(cy(startSample:endSample)); cz_mean(n)=mean(cz(startSample:endSample)); cx_min(n)=min(cx(startSample:endSample)); cy_min(n)=min(cy(startSample:endSample)); cz_min(n)=min(cz(startSample:endSample)); cx_max(n)=max(cx(startSample:endSample)); cy_max(n)=max(cy(startSample:endSample)); cz_max(n)=max(cz(startSample:endSample)); cx_var(n)=var(cx(startSample:endSample)); cy_var(n)=var(cy(startSample:endSample)); cz_var(n)=var(cz(startSample:endSample)); cx_median(n)=median(cx(startSample:endSample)); cy_median(n)=median(cy(startSample:endSample)); cz_median(n)=median(cz(startSample:endSample)); cx_mode(n)=mode(cx(startSample:endSample)); cy_mode(n)=mode(cy(startSample:endSample)); cz_mode(n)=mode(cz(startSample:endSample)); cx_std(n)=std(cx(startSample:endSample)); cy_std(n)=std(cy(startSample:endSample)); cz_std(n)=std(cz(startSample:endSample)); gx_mean(n)=mean(gx(startSample:endSample)); gy_mean(n)=mean(gy(startSample:endSample)); gz_mean(n)=mean(gz(startSample:endSample)); gx_min(n)=min(gx(startSample:endSample)); gy_min(n)=min(gy(startSample:endSample)); gz_min(n)=min(gz(startSample:endSample)); gx_max(n)=max(gx(startSample:endSample)); gy_max(n)=max(gy(startSample:endSample)); gz_max(n)=max(gz(startSample:endSample)); gx_var(n)=var(gx(startSample:endSample)); gy_var(n)=var(gy(startSample:endSample)); gz_var(n)=var(gz(startSample:endSample)); gx_median(n)=median(gx(startSample:endSample)); gy_median(n)=median(gy(startSample:endSample)); gz_median(n)=median(gz(startSample:endSample)); gx_mode(n)=mode(gx(startSample:endSample)); gy_mode(n)=mode(gy(startSample:endSample)); gz_mode(n)=mode(gz(startSample:endSample)); gx_std(n)=std(gx(startSample:endSample)); gy_std(n)=std(gy(startSample:endSample)); gz_std(n)=std(gz(startSample:endSample)); [m,f] = mode(statenum(startSample:endSample)); if f >= dataPerSample*0.5 stateN(n) = m; else stateN(n) = length(statenames); end end clearvars m f
入力・出力配列の作成
inputData=[ax_mean' ay_mean' az_mean'... ax_min' ay_min' az_min'... ax_max' ay_max' az_max'... ax_var' ay_var' az_var'... ax_median' ay_median' az_median'... ax_mode' ay_mode' az_mode'... ax_std' ay_std' az_std'... cx_mean' cy_mean' cz_mean'... cx_min' cy_min' cz_min'... cx_max' cy_max' cz_max'... cx_var' cy_var' cz_var'... cx_median' cy_median' cz_median'... cx_mode' cy_mode' cz_mode'... cx_std' cy_std' cz_std'... gx_mean' gy_mean' gz_mean'... gx_min' gy_min' gz_min'... gx_max' gy_max' gz_max'... gx_var' gy_var' gz_var'... gx_median' gy_median' gz_median'... gx_mode' gy_mode' gz_mode'... gx_std' gy_std' gz_std']; outputData=stateN'; outputs=zeros(length(outputData),length(statenames)); for n=1:length(outputData) row=outputData(n); outputs(n,row)=1; end
生成されたニューラルネットを試してみてみる
makenet; rng(0); r=randi([1 length(outputData)],1,10); testdata=inputData(r,:)'; results=net(testdata); [maxval,maxind]=max(results); [statenames(maxind) statenames(outputData(r))]
performance = 0.0357 ans = 'holdingByHand' 'holdingByHand' 'toast' 'toast' 'holdingByHand' 'holdingByHand' 'onTable' 'toast' 'toast' 'toast' 'holdingByHand' 'holdingByHand' 'walking' 'walking' 'onTable' 'onTable' 'holdingByHand' 'holdingByHand' 'holdingByHand' 'holdingByHand'
Confusionとの比較
処理結果
入力データの数を増やした処理を行った その結果、訓練データや検証データに対しては正答率の向上が見られ、テストデータに対しては逆に低下した 訓練データは約5%ほど、検証データは約15%ほどの向上が見られた テストデータは約5%ほどの低下が見られた 訓練データに対して向上が見られた理由としては、訓練データは学習に用いたデータであるため、抽出データの種類を増やすとそれだけそのデータのアイデンティティーが際立つからだと思われる 検証データの向上から、データを増やしたら過学習によるズレが減少していることが分かる テストデータの結果が低下しているのは、検証データによって反対に過学習が促進されてしまったからであろうか