Vergleiche Kreuzzerlegungsmethoden

Machine LearningMachine LearningBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir lernen, wie verschiedene Kreuzzerlegungsmethoden wie PLS Canonical, PLS Regression und CCA verwendet werden, um Kovarianzrichtungen aus multivariaten Datensätzen zu extrahieren.

Tipps für die virtuelle Maschine

Nachdem der Start der virtuellen Maschine abgeschlossen ist, klicken Sie in der linken oberen Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/cross_decomposition("Cross decomposition") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/cross_decomposition -.-> lab-49089{{"Vergleiche Kreuzzerlegungsmethoden"}} ml/sklearn -.-> lab-49089{{"Vergleiche Kreuzzerlegungsmethoden"}} end

Dataset-Erstellung

Wir erstellen einen Datensatz mit zwei multivariaten, kovariierenden zweidimensionalen Datensätzen, X und Y. Anschließend extrahieren wir die Kovarianzrichtungen, d.h. die Komponenten jedes Datensatzes, die die größte gemeinsame Varianz zwischen beiden Datensätzen erklären.

import numpy as np

n = 500
## 2 latente Variablen:
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))

Kanonischer PLS

Wir verwenden den PLS Canonical-Algorithmus, um die Daten zu transformieren. Anschließend erstellen wir einen Streudiagramm der Scores.

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

## Auf der Diagonalen: Plot von X vs Y Scores auf jeder Komponente
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")

## Off-diagonale Plot: Komponenten 1 vs 2 für X und 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 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 Regression mit multivariater Antwort (PLS2)

Wir verwenden den PLS Regression-Algorithmus mit multivariater Antwort, um die Werte einer Matrix B zu schätzen. Anschließend vergleichen wir die geschätzte B mit der wahren 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
## jeder Yj = 1*X1 + 2*X2 + Rauschen
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("Wahre B (so dass: Y = XB + Err)")
print(B)
## Vergleiche pls2.coef_ mit B
print("Geschätzte B")
print(np.round(pls2.coef_, 1))
pls2.predict(X)

PLS Regression mit eindimensionaler Antwort (PLS1)

Wir verwenden den PLS Regression-Algorithmus mit eindimensionaler Antwort, um die Werte von beta zu schätzen.

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)
## beachten Sie, dass die Anzahl der Komponenten größer als 1 (die Dimension von y) ist
print("Geschätzte betas")
print(np.round(pls1.coef_, 1))

CCA (PLS-Modus B mit symmetrischer Deflation)

Wir verwenden den CCA-Algorithmus, um die Daten zu transformieren.

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)

Zusammenfassung

In diesem Lab haben wir gelernt, wie verschiedene Kreuzzerlegungsmethoden verwendet werden, um die Kovarianzrichtungen aus multivariaten Datensätzen zu extrahieren. Wir haben einen Datensatz erstellt, die Daten mit PLS Canonical, PLS Regression und CCA transformiert und die Werte von Matrizen und Betas geschätzt. Wir haben auch Streudiagramme erstellt, um die Scores der Komponenten zu visualisieren.