Main Content

subset

既存のアンサンブル データストアのサブセットから新しいアンサンブル データストアを作成

R2021a 以降

説明

関数 subset を使用すると、大規模なアンサンブル データストアから典型的なアンサンブル データ セットを抽出できます。

subset は、ソースデータが大きすぎて容易には特徴の処理および抽出ができない場合や、診断特徴デザイナーでデータをインポートして実験する場合に使用します。

subset には、組み合わせることで縮小データ セットを作成できる、以下のオプションが用意されています。

  • インデックスによる指定 — インデックス ベクトルを指定して、特定のアンサンブル メンバーを抽出します。

  • クラスまたはアンサンブルのメンバー数による指定 — 各条件クラスまたはアンサンブル全体から選択するメンバーの数を指定します。また、最小クラスまたは最大クラスのサイズに基づいてメンバーの数を指定することもできます。このオプションは、アンサンブルのサイズを縮小するだけでなく、アンサンブル内のクラスのバランスをとり、モデル開発をより効率的にすることができます。

  • 順序による指定 — メンバーを選択する順序を、元のデータの先頭から、またはランダムに指定します。

  • ホールドアウトによる指定 — 選択されたデータを学習アンサンブルとテスト アンサンブルに分割します。

インデックスによるサブセットの指定

sens = subset(ens,idx) は、idx のインデックスに対応するアンサンブル メンバーを抽出して、既存のアンサンブル データストア ens のサブセットから新しいアンサンブル データストア sens を作成します。

この構文は、特定のアンサンブル メンバーまたはアンサンブル メンバーのグループに対してアンサンブルの操作を実行する際に使用します。たとえば、この構文を使用して次のことが可能です。

  • 特定の故障状態のアンサンブル メンバーのみを抽出する。

  • 特定の特性をもつ単一のアンサンブル メンバーを抽出し、メンバーの動作を分離して調べる。

抽出するメンバーをインデックス ベクトル idx を使用して指定します。その後、任意のデータ アンサンブルに使用する手法と同じ手法を使用して、抽出されたアンサンブルを操作できます。

クラスによるサブセットの指定

sens = subset(ens,ConditionVariable=cvName,NumMembers=numMembers) は、各クラスの numMembers メンバーを含むサブセットを使用します。

sens = subset(ens,ConditionVariable=cvName,ImbalancedClass="smallest") は、すべてのクラスのサイズを最小のクラスのサイズに縮小することで、均衡化されたサブセットを作成します。

sens = subset(ens,ConditionVariable=cvName,ImbalancedClass="largest",SampleSize=sampleSize) は、最大クラスのみのサイズを縮小します。sampleSize は、最大クラスの縮小サイズを小数で表される割合またはメンバー数で指定します。この構文は、故障した機器よりも健全な機器を表すデータが多い場合に特に有効です。

sens = subset(___,SelectionOrder=selectionOrder) は、アンサンブルのサイズを縮小する際に subset が保持するメンバーを指定します。この構文は、クラスによるサブセットの指定の構文グループで任意の入力引数を組み合わせて使用できます。

ラベルなしデータのサブセットの指定

sens = subset(ens,NumMembers=numMembers) は、numMembers メンバーを含むサブセットを抽出します。この構文は、条件値として使用できるラベルやクラスがデータに含まれていない場合や、クラス分布を考慮せずにアンサンブル全体を操作する場合に使用します。

sens = subset(ens,NumMembers=numMembers,SelectionOrder=selectionOrder) は、アンサンブルのサイズを縮小する際に subset が保持するメンバーを指定します。

サブセットおよび残りのアンサンブルとインデックスを返す

[sens,sensidx,remens,remidx] = subset(___) は、ens からサブセットを抽出するインデックス sensidx のほか、残りのアンサンブル remens と、残りのアンサンブル インデックス remidx を返します。この構文は、前述の構文の任意の入力引数の組み合わせで使用します。

アンサンブルを学習セットとテスト セットに分割

[trainsub,trainidx,testsub,testidx] = subset(ens,Holdout=holdout) は、ホールドアウト検証用のランダムな分割を holdout を使用して指定します。これは、関数 cvpartition を使用して整数または分数で表される割合になります。holdout が整数の場合、cvpartition は、テスト セットの観測値 holdout をランダムに選択します。holdout が範囲 (0,1) の値の場合、cvpartitionholdout*n 個の観測値をランダムに選択します。ここで、n は ens のメンバー数です。

この構文は、学習セットとインデックスをそれぞれ trainsubtrainidx で返し、テスト セットとインデックスを testsubtestidx で返します。

[trainsub,trainidx,testsub,testidx] = subset(ens,Holdout=holdout,ConditionVariable=cvName) は、cvName の各クラスの学習セットとテスト セットを作成します。

[trainsub,trainidx,testsub,testidx] = subset(ens,Holdout=holdout,ConditionVariable=cvName,Stratify=stratifyFlag) は、cvpartition 層別フラグを stratifyflag の論理値に設定します。

すべて折りたたむ

アンサンブル データストアから識別するアンサンブル メンバーを抽出し、単一の read コマンドを使用して内容を取得します。

この例では、次のコードを使用して、前に Simulink® モデルをさまざまな故障値で実行して生成されたデータを使って simulationEnsembleDatastore オブジェクトを作成します (generateSimulationEnsembleを参照)。アンサンブルには、モデル パラメーター ToothFaultGain の 5 つの異なる値についてのシミュレーション データが含まれます。データのボリュームにより、unzip 操作には数分かかります。

unzip simEnsData.zip
ens = simulationEnsembleDatastore(pwd,'logsout')
ens = 
  simulationEnsembleDatastore with properties:

           DataVariables: [5x1 string]
    IndependentVariables: [0x0 string]
      ConditionVariables: [0x0 string]
       SelectedVariables: [5x1 string]
                ReadSize: 1
              NumMembers: 5
          LastMemberRead: [0x0 string]
                   Files: [5x1 string]

ems_nm = ens.NumMembers
ems_nm = 5

アンサンブルには 5 つのファイルが含まれています。

4 番目のアンサンブル メンバーを新しい単一メンバーのアンサンブル sens に抽出します。

idx = 4;
sens = subset(ens,idx);
sens_nm = sens.NumMembers
sens_nm = 1

1 つのメンバーが sens に含まれています。ファイル名を表示してメンバー インデックスを確認します。

sens.Files
ans = 
"/tmp/Bdoc24a_2528353_1095265/tpcde5841d/predmaint-ex43507974/TransmissionCasingSimplified_log_4.mat"

sens を最初のメンバーにリセットして内容を読み取ります。

reset(sens)
m4 = read(sens)
m4=1×5 table
    PMSignalLogName           SimulationInput                   SimulationMetadata                   Tacho                Vibration     
    _______________    ______________________________    _________________________________    ___________________    ___________________

      {'logsout'}      {1x1 Simulink.SimulationInput}    {1x1 Simulink.SimulationMetadata}    {20213x1 timetable}    {20213x1 timetable}

抽出されたメンバーのデータが m4 に含まれています。

既存のシミュレーション アンサンブル データストアのサブセットからシミュレーション アンサンブル データストアを作成します。

前に Simulink® モデルをさまざまな故障値で実行して生成されたデータを使って simulationEnsembleDatastore オブジェクトを作成します。

unzip simEnsData.zip
ens = simulationEnsembleDatastore(pwd,'logsout');
ens_nm = ens.NumMembers
ens_nm = 5

アンサンブルには 5 つのファイルが含まれています。ファイル名を表示します。

ens.Files
ans = 5x1 string
    "/tmp/Bdoc24a_2528353_1076626/tp7a95b0de/predmaint-ex46856662/TransmissionCasingSimplified_log_1.mat"
    "/tmp/Bdoc24a_2528353_1076626/tp7a95b0de/predmaint-ex46856662/TransmissionCasingSimplified_log_2.mat"
    "/tmp/Bdoc24a_2528353_1076626/tp7a95b0de/predmaint-ex46856662/TransmissionCasingSimplified_log_3.mat"
    "/tmp/Bdoc24a_2528353_1076626/tp7a95b0de/predmaint-ex46856662/TransmissionCasingSimplified_log_4.mat"
    "/tmp/Bdoc24a_2528353_1076626/tp7a95b0de/predmaint-ex46856662/TransmissionCasingSimplified_log_5.mat"

1 番目、3 番目、および 5 番目のファイルを新しいアンサンブルに抽出します。

idx = [1 3 5];
sens = subset(ens,idx);
sens_nm = sens.NumMembers
sens_nm = 3

3 つのメンバーが新しいアンサンブルに含まれています。ファイル名を表示します。

sens.Files
ans = 3x1 string
    "/tmp/Bdoc24a_2528353_1076626/tp7a95b0de/predmaint-ex46856662/TransmissionCasingSimplified_log_1.mat"
    "/tmp/Bdoc24a_2528353_1076626/tp7a95b0de/predmaint-ex46856662/TransmissionCasingSimplified_log_3.mat"
    "/tmp/Bdoc24a_2528353_1076626/tp7a95b0de/predmaint-ex46856662/TransmissionCasingSimplified_log_5.mat"

インデックスを指定した 3 つのファイルが新しいアンサンブルに含まれています。

ポンプ診断情報を含むワークスペース・アンサンブルであるデータ pEnsemble を読み込みます。

load pumpWEnsemble pEnsemble

pEnsemble の内容を確認します。

pEnsemble
pEnsemble = 
  workspaceEnsemble with properties:

           DataVariables: [2x1 string]
    IndependentVariables: [0x0 string]
      ConditionVariables: "faultCode"
       SelectedVariables: [3x1 string]
                ReadSize: 1
              NumMembers: 240
          LastMemberRead: "Member 240"

240 個のメンバーが pEnsemble に含まれています。

summary を使用して、故障クラスの数を特定します。

pdist = summary(pEnsemble,ConditionVariable="faultCode");
sd = size(pdist)
sd = 1×2

     8     2

アンサンブルには 8 個の故障クラスがあり、1 クラスあたり平均 30 個のメンバーが含まれます。各クラスのメンバーを 15 個に制限し、アンサンブルのサイズを半分に縮小します。

subEns_numclass = subset(pEnsemble,ConditionVariable="faultCode",NumMembers=15)
subEns_numclass = 
  workspaceEnsemble with properties:

           DataVariables: [2x1 string]
    IndependentVariables: [0x0 string]
      ConditionVariables: "faultCode"
       SelectedVariables: [3x1 string]
                ReadSize: 1
              NumMembers: 120
          LastMemberRead: [0x0 string]

アンサンブルのメンバーは半減し (120 個)、それぞれ 15 個のメンバーを含む同じサイズの 8 個のクラスに分散されました。

ポンプ診断情報を含むワークスペース・アンサンブルであるデータ pEnsemble を読み込みます。

load pumpWEnsemble pEnsemble

pEnsemble の内容を確認します。

pEnsemble
pEnsemble = 
  workspaceEnsemble with properties:

           DataVariables: [2x1 string]
    IndependentVariables: [0x0 string]
      ConditionVariables: "faultCode"
       SelectedVariables: [3x1 string]
                ReadSize: 1
              NumMembers: 240
          LastMemberRead: "Member 240"

pEnsemble には、2 つのデータ変数と状態変数 faultCode をもつ 240 個のメンバーが含まれます。

条件値 (クラス) の分布を示すには、summary を使用してヒストグラムを作成します。

summary(pEnsemble, ConditionVariable="faultCode")

完全なアンサンブルのヒストグラムは、各 faultCode 値に関連付けられているアンサンブル メンバーの数を示します。faultCode の値が 0 の場合、完全に健全なデータセットを示します。その他の faultCode 値は故障の組み合わせに対応します。アンサンブルには 8 つのクラスがあります。

"均衡化された"、つまり各クラスに同じ数のメンバーを含む、pEnsemble のサブセットを作成します。名前と値の引数 ImbalancedClass"smallest" に設定して、すべてのクラスが最小のクラスと同じ数のメンバーを含むように指定します。これにより、ヒストグラムは 17 個のメンバーが含まれていることを示します。したがって、サブセットには各クラスに 17 個、合計 136 個のメンバーが含まれることになります。

subEns_smallest = subset(pEnsemble,ConditionVariable="faultCode",ImbalancedClass="smallest");
totalmembers = subEns_smallest.NumMembers
totalmembers = 136

サブセット アンサンブルのヒストグラムを調べます。

summary(subEns_smallest,ConditionVariable="faultCode")

サブセット アンサンブルのヒストグラムには、同じサイズのクラスが含まれます。

データ pEnsemble を読み込み、そのクラス分布のヒストグラムをプロットします。

load pumpWEnsemble pEnsemble
summary(pEnsemble,ConditionVariable="faultCode")

最大クラスのラベルは 0 であり、42 個のメンバーを含みます。このクラスのサイズを 30 個に縮小します。

subEns_largest = subset(pEnsemble,ConditionVariable="faultCode",...
    ImbalancedClass="largest",SampleSize=30);
summary(subEns_largest,ConditionVariable="faultCode")

これで、元のアンサンブルでの最大クラスのメンバーは 30 個になりました。

データ pEnsemble を読み込みます。

load pumpWEnsemble pEnsemble

pEnsemble のメンバー数を決定します。

numM = pEnsemble.NumMembers
numM = 240

アンサンブルには 240 個のメンバーがあります。メンバー数を 100 個に削減します。サブセット アンサンブルと残りのアンサンブル、およびそれらのインデックスを返します。

[sens100,sensidx,rens100,rensidx] = subset(pEnsemble,NumMembers=100);

選択の順序を表示します。

sfirst10 = sensidx(1:10)'
sfirst10 = 1×10

     1     2     3     4     5     6     7     8     9    10

メンバーはアンサンブルの最初から選択されます。

残りのインデックスを表示します。

rfirst10 = rensidx(1:10)'
rfirst10 = 1×10

   101   102   103   104   105   106   107   108   109   110

残りのアンサンブルの選択はメンバー 101 から始まります。

SelectionOrder を使用してメンバーをランダムに選択します。

[sens100r,sensidxr] = subset(pEnsemble,NumMembers=100,SelectionOrder="random");
first10r = sensidxr(1:10)'
first10r = 1×10

     3     6     7    11    16    22    28    30    32    33

メンバーはランダムに、しかし単調な順序で選択されます。

SelectionOrder を使用して最後のメンバーを使用します。

[sens100l,sensidxl,rens100,rensidxl] = subset(pEnsemble,NumMembers=100,SelectionOrder="last");
slast10l = sensidxl(1:10)'
slast10l = 1×10

   141   142   143   144   145   146   147   148   149   150

残りのアンサンブルの最後のインデックスを表示します。

rlast10l = rensidxl(end)
rlast10l = 140

残りのアンサンブルには、最初の 140 個のメンバーが含まれています。

データ pEnsemble を読み込みます。

load pumpWEnsemble pEnsemble

Holdout に値 0.1 を使用して、pEnsemble を学習サブセットとテスト サブセットに分割します。

[trainsub,trainidx,testsub,testidx] = subset(pEnsemble, Holdout=0.1);

アンサンブルのサイズを比較します。

numfull = pEnsemble.NumMembers
numfull = 240
numtrain = trainsub.NumMembers
numtrain = 216
numtest = testsub.NumMembers
numtest = 24

テスト アンサンブルには、元のアンサンブルの 10% が含まれます。

データ pEnsemble を読み込みます。

load pumpWEnsemble pEnsemble

クラス "faultCode" によるアンサンブルのメンバーのヒストグラムをプロットします。

summary(pEnsemble,ConditionVariable="faultCode")

Holdout に値 0.1 を使用して、pEnsemble を学習データ セットとテスト データ セットに分割します。

[trainsub,trainidx,testsub,testidx] = subset(pEnsemble,Holdout=0.1,...
    ConditionVariable="faultCode");

学習用区画とテスト用区画のヒストグラムをプロットします。

summary(trainsub,ConditionVariable="faultCode")

ヒストグラムは完全なアンサンブルにほぼ比例しています。

summary(testsub,ConditionVariable="faultCode")

このヒストグラムは、クラスのサイズが小さいことから、これまでのヒストグラムと同じ一般的なパターンを示しています。

入力引数

すべて折りたたむ

メンバーを抽出するソース アンサンブル データストア。fileEnsembleDatastore オブジェクト、simulationEnsembleDatastore オブジェクト、または workspaceEnsemble オブジェクトとして指定します。アンサンブル データストアからメンバーを抽出する例については、アンサンブル データストアからの特定のメンバーの抽出を参照してください。

抽出するソース アンサンブル メンバーのインデックス。数値ベクトル、整数ベクトル、または logical ベクトルとして指定します。ベクトルの要素の数が ens のメンバーの数を超えてはなりません。数値ベクトルまたは整数ベクトルの場合、すべてのインデックスが正でなければなりません。logical ベクトルの場合、要素の数は ens のアンサンブル メンバーの数と等しくなければなりません。インデックス ベクトルの作成と使用の例については、アンサンブル データストアのサブセットの作成を参照してください。

アンサンブルのクラスへの分割を決定する状態変数。ensConditionVariable プロパティの値でなければならない string として指定します。cv を指定するには、ConditionVariable=cv の形式を使用します。

クラス関連の基準によって決定されるサブセットを抽出する場合は常に、ConditionVariable を指定します。

サブセットのアンサンブルまたはクラスに含まれるメンバーの数。アンサンブルまたはクラス内のメンバーの合計数を超えない正の整数として指定します。numMembers を指定するには、NumMembers=numMembers の形式を使用します。

クラスに依存するサブセットを抽出する場合、つまり cvName を設定する場合、numMembers は該当するクラスのメンバーの目標数を表します。

クラスを無視するサブセットを抽出する場合、numMembers はアンサンブル全体のメンバーの目標数を表します。

ImbalancedClass="largest" を使用してサブセットを抽出する場合の最大クラスの目標サイズ。範囲 (0–1) のスカラーで表される割合、または ens の最大クラスのサイズより小さい正の整数として指定します。

クラスに依存するサブセットを抽出する場合、つまり cvName を設定する場合、numMembers は該当する各クラスまたは複数クラスのメンバーの目標数を表します。

サブセット メンバーの選択基準。次のいずれかの string として指定します。

  • "first" — アンサンブルの最初からメンバーを選択します。

  • "last" — アンサンブルの最後からメンバーを選択します。

  • "random" — メンバーをランダムに選択します。

ホールドアウト分割のサイズ。範囲 (0–1) のスカラーで表される割合、または正の整数として指定します。holdout が整数の場合、cvpartition は、テスト セットの観測値 holdout をランダムに選択します。holdout が範囲 (0,1) の値の場合、cvpartitionholdout*n 個の観測値をランダムに選択します。ここで、n は trainsub のメンバー数です。

cvpartition の層別フラグ。true または false として指定します。holdout と状態変数 cvName を指定した場合のみ、stratifyFlag を指定できます。

出力引数

すべて折りたたむ

抽出されたアンサンブル データストア。ens と同じ型のオブジェクトとして返されます。

sens のメンバー選択インデックス。正の整数のベクトルとして返されます。

残りのアンサンブル データストア。ens と同じ型のオブジェクトとして返されます。remens には、sens に選択されなかった ens のメンバーが含まれます。

remens のメンバー選択インデックス。正の整数のベクトルとして返されます。sensidremidx はともに、ens のすべてのメンバーにインデックスを付けます。

学習セット。ens と同じ型のオブジェクトとして返されます。

trainset のメンバー選択インデックス。正の整数のベクトルとして返されます。

テスト セット。ens と同じ型のオブジェクトとして返されます。remens には、sens に選択されなかった ens のメンバーが含まれます。

testsub のメンバー選択インデックス。正の整数のベクトルとして返されます。

バージョン履歴

R2021a で導入

すべて展開する