はじめに
この実験では、PLS Canonical、PLS Regression、CCA などのさまざまなクロス分解アルゴリズムを使用して、多変量データセットから共分散の方向を抽出する方法を学びます。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
データセットの作成
2 つの多変量共分散 2 次元データセット X と Y を持つデータセットを作成します。その後、共分散の方向、つまり両データセット間で最も多くの共通分散を説明する各データセットのコンポーネントを抽出します。
import numpy as np
n = 500
## 2 つの潜在変数:
l1 = np.random.normal(size=n)
l2 = np.random.normal(size=n)
latents = np.array([l1, l1, l2, l2]).T
X = latents + np.random.normal(size=4 * n).reshape((n, 4))
Y = latents + np.random.normal(size=4 * n).reshape((n, 4))
X_train = X[: n // 2]
Y_train = Y[: n // 2]
X_test = X[n // 2 :]
Y_test = Y[n // 2 :]
print("Corr(X)")
print(np.round(np.corrcoef(X.T), 2))
print("Corr(Y)")
print(np.round(np.corrcoef(Y.T), 2))
標準 PLS
データを変換するために PLS Canonical アルゴリズムを使用します。その後、スコアの散布図を作成します。
from sklearn.cross_decomposition import PLSCanonical
plsca = PLSCanonical(n_components=2)
plsca.fit(X_train, Y_train)
X_train_r, Y_train_r = plsca.transform(X_train, Y_train)
X_test_r, Y_test_r = plsca.transform(X_test, Y_test)
import matplotlib.pyplot as plt
## 各コンポーネントにおける対角線上のプロット:X と Y のスコア
plt.figure(figsize=(12, 8))
plt.subplot(221)
plt.scatter(X_train_r[:, 0], Y_train_r[:, 0], label="train", marker="o", s=25)
plt.scatter(X_test_r[:, 0], Y_test_r[:, 0], label="test", marker="o", s=25)
plt.xlabel("x scores")
plt.ylabel("y scores")
plt.title(
"Comp. 1: X vs Y (test corr = %.2f)"
% np.corrcoef(X_test_r[:, 0], Y_test_r[:, 0])[0, 1]
)
plt.xticks(())
plt.yticks(())
plt.legend(loc="best")
plt.subplot(224)
plt.scatter(X_train_r[:, 1], Y_train_r[:, 1], label="train", marker="o", s=25)
plt.scatter(X_test_r[:, 1], Y_test_r[:, 1], label="test", marker="o", s=25)
plt.xlabel("x scores")
plt.ylabel("y scores")
plt.title(
"Comp. 2: X vs Y (test corr = %.2f)"
% np.corrcoef(X_test_r[:, 1], Y_test_r[:, 1])[0, 1]
)
plt.xticks(())
plt.yticks(())
plt.legend(loc="best")
## 対角線外のプロット:X と Y のコンポーネント 1 とコンポーネント 2
plt.subplot(222)
plt.scatter(X_train_r[:, 0], X_train_r[:, 1], label="train", marker="*", s=50)
plt.scatter(X_test_r[:, 0], X_test_r[:, 1], label="test", marker="*", s=50)
plt.xlabel("X comp. 1")
plt.ylabel("X comp. 2")
plt.title(
"X comp. 1 vs X comp. 2 (test corr = %.2f)"
% np.corrcoef(X_test_r[:, 0], X_test_r[:, 1])[0, 1]
)
plt.legend(loc="best")
plt.xticks(())
plt.yticks(())
plt.subplot(223)
plt.scatter(Y_train_r[:, 0], Y_train_r[:, 1], label="train", marker="*", s=50)
plt.scatter(Y_test_r[:, 0], Y_test_r[:, 1], label="test", marker="*", s=50)
plt.xlabel("Y comp. 1")
plt.ylabel("Y comp. 2")
plt.title(
"Y comp. 1 vs Y comp. 2, (test corr = %.2f)"
% np.corrcoef(Y_test_r[:, 0], Y_test_r[:, 1])[0, 1]
)
plt.legend(loc="best")
plt.xticks(())
plt.yticks(())
plt.show()
多変量応答付き PLS 回帰 (PLS2)
行列 B の値を推定するために、多変量応答付き PLS 回帰アルゴリズムを使用します。その後、推定された B と真の B を比較します。
n = 1000
q = 3
p = 10
X = np.random.normal(size=n * p).reshape((n, p))
B = np.array([[1, 2] + [0] * (p - 2)] * q).T
## 各 Yj = 1*X1 + 2*X2 + ノイズ
Y = np.dot(X, B) + np.random.normal(size=n * q).reshape((n, q)) + 5
from sklearn.cross_decomposition import PLSRegression
pls2 = PLSRegression(n_components=3)
pls2.fit(X, Y)
print("True B (such that: Y = XB + Err)")
print(B)
## pls2.coef_ と B を比較
print("Estimated B")
print(np.round(pls2.coef_, 1))
pls2.predict(X)
単変量応答付き PLS 回帰 (PLS1)
beta の値を推定するために、単変量応答付き PLS 回帰アルゴリズムを使用します。
n = 1000
p = 10
X = np.random.normal(size=n * p).reshape((n, p))
y = X[:, 0] + 2 * X[:, 1] + np.random.normal(size=n * 1) + 5
pls1 = PLSRegression(n_components=3)
pls1.fit(X, y)
## コンポーネントの数が 1(y の次元) を超えていることに注意
print("Estimated betas")
print(np.round(pls1.coef_, 1))
CCA(対称デフレーション付き PLS モード B)
データを変換するために CCA アルゴリズムを使用します。
cca = CCA(n_components=2)
cca.fit(X_train, Y_train)
X_train_r, Y_train_r = cca.transform(X_train, Y_train)
X_test_r, Y_test_r = cca.transform(X_test, Y_test)
まとめ
この実験では、多変量データセットから共分散の方向を抽出するために、さまざまなクロスデコンポジションアルゴリズムをどのように使用するかを学びました。データセットを作成し、PLS Canonical、PLS 回帰、および CCA を使用してデータを変換し、行列とベータの値を推定しました。また、コンポーネントのスコアを視覚化するための散布図も作成しました。