web-dev-qa-db-ja.com

scikit-learnの複数出力ガウスプロセス回帰

データを予測するガウスプロセス回帰(GPR)演算に scikit learn を使用しています。私のトレーニングデータは次のとおりです。

x_train = np.array([[0,0],[2,2],[3,3]]) #2-D cartesian coordinate points

y_train = np.array([[200,250, 155],[321,345,210],[417,445,851]]) #observed output from three different datasources at respective input data points (x_train)

平均と分散/標準偏差を予測する必要があるテストポイント(2-D)は次のとおりです。

xvalues = np.array([0,1,2,3])
yvalues = np.array([0,1,2,3])

x,y = np.meshgrid(xvalues,yvalues) #Total 16 locations (2-D)
positions = np.vstack([x.ravel(), y.ravel()]) 
x_test = (np.array(positions)).T

ここで、GPR(GausianProcessRegressor)フィットを実行した後(ここでは、ConstantKernelとRBFの積がGaussianProcessRegressorのカーネルとして使用されます)、平均と分散/標準偏差は次の行で予測できます。コードの:

y_pred_test, sigma = gp.predict(x_test, return_std =True)

予測平均(y_pred_test)と分散(sigma)、コンソールに次の出力が表示されます。

enter image description here

予測値(平均)では、内部配列内に3つのオブジェクトを持つ「ネストされた配列」が出力されます。内部配列は、各2次元テストポイント位置での各データソースの予測平均値であると推定できます。ただし、印刷された分散には、16個のオブジェクト(おそらく16個のテストロケーションポイント)を持つ単一の配列のみが含まれます。分散が推定の不確実性を示すことを知っています。したがって、各テストポイントでの各データソースの予測分散を期待していました。私の期待は間違っていますか?各テストポイントで各データソースの予測分散を取得するにはどうすればよいですか?間違ったコードが原因ですか?

ありがとうございました!

16
santobedi

さて、あなたはうっかりして氷山にぶつかった...

序文として、分散と標準偏差の概念がスカラー変数に対してのみ定義されていることを明確にしましょう。ベクトル変数(ここでの独自の3d出力のような)の場合、分散の概念は意味がなくなり、代わりに共分散行列が使用されます( Wikipediaウォルフラム )。

プレリュードを続けると、sigmaのscikit-learn docs に従って、predictの形状は実際に期待どおりです(つまり、コーディングあなたのケースではエラー):

戻り値

y_mean:配列、形状=(n_samples、[n_output_dims])

クエリポイントの予測分布の平均

y_std:配列、形状=(n_samples、)、オプション

クエリポイントでの予測分布の標準偏差。 return_stdがTrueの場合にのみ返されます。

y_cov:配列、形状=(n_samples、n_samples)、オプション

クエリポイントの同時予測分布の共分散。 return_covがTrueの場合にのみ返されます。

共分散行列についての以前のコメントと組み合わせると、最初の選択は、代わりにpredict関数を引数return_cov=Trueで試してみることです(varianceベクトル変数の意味はありません);しかし、これも3x3ではなく16x16行列になります(3つの出力変数の共分散行列の予想される形状)...

これらの詳細を明確にしたので、問題の本質に進みましょう。


問題の中心には、実際および関連するチュートリアルでめったに言及されない(または示唆さえされる)ものがあります。複数の出力を伴うガウス過程回帰は非常に重要ですそしてまだ活発な研究の分野。おそらく、少なくともいくつかの関連する警告を発行せずに表面的にはそうであるように見えるという事実にもかかわらず、scikit-learnは実際にはケースを処理できません。

最近の科学文献でこの主張の裏付けを探しましょう:

複数の応答変数によるガウス過程回帰 (2015)-引用(鉱山を強調):

ほとんどのGPR実装は、単一の応答変数のみをモデル化します。これは、相関だけでなく、相関する複数の応答変数の共分散関数の定式化が難しいためです。データポイント間だけでなく、応答間の相関も。本稿では、[...]という考えに基づいて、マルチレスポンスGPRの共分散関数を直接定式化することを提案します。

さまざまなモデリングタスクに対するGPRの採用率が高いにもかかわらず、GPRメソッドには未だいくつかの未解決の問題があります。このホワイトペーパーで特に興味深いのは、複数の応答変数をモデル化する必要性です。 伝統的に、1つの応答変数はガウス過程として扱われ、複数の応答はそれらの相関を考慮せずに独立してモデル化されます。この実用的で簡単なアプローチは多くの場合に採用されましたアプリケーション(例[7、26、27])、ただし理想的ではありません。多重応答ガウス過程をモデル化する鍵は、データポイント間の相関だけでなく、応答間の相関も記述する共分散関数の定式化です。

マルチ出力ガウスプロセス回帰に関する注釈 (2018)-引用(元の強調):

典型的なGPは通常、出力がスカラーである単一出力シナリオ用に設計されています。ただし、さまざまな分野でマルチ出力の問題が発生しています[...]。 T出力{f(t}、1≤t≤T)を近似しようとすると、1つの直感的なアイデアは、単一出力GP(SOGP)を使用して、関連するトレーニングデータを使用してそれらを個別に近似することですD(t) = {X(t)、y(t)}、図1(a)を参照)出力が何らかの方法で相関していることを考えると、それらを個別にモデル化すると、そのため、貴重な情報が失われるため、図1(b)に概念的に示されている多出力GP(MOGP)のサロゲートモデリングのためのエンジニアリングアプリケーションの多様化が進んでいます。

MOGPの研究には長い歴史があり、地球統計学コミュニティでは多変量クリギングまたは共クリギングとして知られています。 [...] MOGPは、出力が何らかの方法で相関しているという基本的な仮定で問題を処理します。したがって、MOGPの重要な問題は、出力の相関関係を活用して、出力を個別にモデリングする場合と比較してより正確な予測を提供するために、出力が互いに情報を利用できるようにすることです

enter image description here

複数の出力を持つガウスプロセスの物理学ベースの共分散モデル (2013)-引用:

複数の出力を持つプロセスのガウスプロセス分析は、スカラー(単一出力)の場合と比較して、共分散関数の適切なクラスがはるかに少ないという事実によって制限されます。 [...]

複数の出力に対して「良い」共分散モデルを見つけることの難しさは、重要な実用的な結果をもたらす可能性があります。共分散行列の構造が誤っていると、不確実性の定量化プロセスの効率が大幅に低下するだけでなく、クリギングの推論における予測効率も低下する可能性があります[16]。したがって、共分散モデルは共クリギングにおいてさらに深い役割を果たす可能性があると主張します[7、17]。この引数は、通常そうであるように、データから共分散構造が推論されるときに適用されます。


したがって、私の理解は、私が言ったように、ドキュメントでそのような何かが言及または示唆されていないという事実にもかかわらず、sckit-learnはそのようなケースを実際に処理することができないということです(関連する問題をプロジェクトページ)。これは この関連SOスレッド でも、GPML(Matlab)についても このCrossValidatedスレッド での結論のようです。ツールボックス。

そうは言っても、単純に各出力を個別にモデル化するという選択に戻ることとは別に(3D出力要素間の相関関係から有用な情報を捨てている可能性があることを念頭に置いている限り、無効な選択ではありません)、少なくとも1つのPythonツールボックスがあり、複数出力GPをモデル化できるようです。つまり、runlmc(- papercodedocumentation )。

11
desertnaut

まず第一に、使用されるパラメーターが「シグマ」である場合、それは分散ではなく標準偏差を指します(思い出してください、分散は標準偏差の2乗です)。

分散はデータポイントから集合の平均までのユークリッド距離として定義されるため、分散を使用して概念化する方が簡単です。

あなたの場合、2D点のセットがあります。これらを2D平面上の点と考えると、分散は各点から平均までの距離になります。標準偏差は、分散の正の根になります。

この場合、16個のテストポイントと16個の標準偏差値があります。各テストポイントには、セットの平均からの距離が定義されているため、これは完全に理にかなっています。

ポイントのSETの分散を計算する場合は、各ポイントの分散を個別に合計し、それをポイントの数で除算してから、平均二乗を引くことで実行できます。この数の正の根は、セットの標準偏差を生成します。

ASIDE:これは、挿入、削除、または置換によってセットを変更すると、すべてのポイントの標準偏差が変化することも意味します。これは、平均が新しいデータに対応するために再計算されるためです。この反復プロセスは、k平均クラスタリングの背後にある基本的な力です。

2
jmkmay