Введение
В этом лабе мы научимся использовать различные алгоритмы кросс-разложения, такие как PLS Canonical, PLS Regression и CCA, для извлечения направлений ковариации из многомерных наборов данных.
Советы по работе с ВМ
После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике с Jupyter Notebook.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Создание набора данных
Мы создаем набор данных с двумя многомерными коварирующими двухмерными наборами данных, X и Y. Затем мы извлекаем направления ковариации, то есть компоненты каждого набора данных, которые объясняют наибольшую общую дисперсию между обоими наборами данных.
import numpy as np
n = 500
## 2 латентных переменные:
l1 = np.random.normal(size=n)
l2 = np.random.normal(size=n)
латенты = np.array([l1, l1, l2, l2]).T
X = латенты + np.random.normal(size=4 * n).reshape((n, 4))
Y = латенты + 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 для преобразования данных. Затем мы создаем точечный график оценок.
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 vs 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 оценки")
plt.ylabel("y оценки")
plt.title(
"Комп. 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 оценки")
plt.ylabel("y оценки")
plt.title(
"Комп. 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")
## Слева от главной диагонали график компоненты 1 vs 2 для X и Y
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 компонента 1")
plt.ylabel("X компонента 2")
plt.title(
"X компонента 1 vs X компонента 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 компонента 1")
plt.ylabel("Y компонента 2")
plt.title(
"Y компонента 1 vs Y компонента 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)
Мы используем алгоритм Регрессии PLS с многомерным откликом для оценки значений матрицы B. Затем мы сравниваем оцененную 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("Истинная B (такая что: Y = XB + Err)")
print(B)
## сравним pls2.coef_ с B
print("Оцененная B")
print(np.round(pls2.coef_, 1))
pls2.predict(X)
Регрессия PLS с одномерным откликом (PLS1)
Мы используем алгоритм Регрессии PLS с одномерным откликом для оценки значений beta.
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("Оцененные 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, Регрессии PLS и CCA, и оценили значения матриц и betas. Мы также создали точечные диаграммы для визуализации оценок компонентов.