Gaußsche Prozesse auf diskreten Datenstrukturen#

Dieses Beispiel veranschaulicht die Verwendung von Gaußschen Prozessen für Regressions- und Klassifikationsaufgaben auf Daten, die nicht in Form von Feature-Vektoren fester Länge vorliegen. Dies wird durch die Verwendung von Kernel-Funktionen erreicht, die direkt auf diskrete Strukturen wie Sequenzen variabler Länge, Bäume und Graphen operieren.

Insbesondere sind hier die Eingabevariablen einige Gen-Sequenzen, die als Strings variabler Länge gespeichert sind und aus den Buchstaben 'A', 'T', 'C' und 'G' bestehen, während die Ausgabevariablen Gleitkommazahlen und Wahr/Falsch-Labels bei den Regressions- bzw. Klassifikationsaufgaben sind.

Ein Kernel zwischen den Gen-Sequenzen wird mittels R-Konvolution [1] definiert, indem ein binärer buchstabenweiser Kernel über alle Buchstabenpaare einer Zeichenkette integriert wird.

Dieses Beispiel generiert drei Abbildungen.

In der ersten Abbildung visualisieren wir den Wert des Kernels, d.h. die Ähnlichkeit der Sequenzen, mithilfe einer Farbskala. Eine hellere Farbe bedeutet hier eine höhere Ähnlichkeit.

In der zweiten Abbildung zeigen wir einige Regressionsergebnisse auf einem Datensatz von 6 Sequenzen. Hier verwenden wir die 1., 2., 4. und 5. Sequenz als Trainingsmenge, um Vorhersagen für die 3. und 6. Sequenz zu treffen.

In der dritten Abbildung demonstrieren wir ein Klassifikationsmodell, indem wir 6 Sequenzen trainieren und Vorhersagen für weitere 5 Sequenzen treffen. Die Ground Truth ist hier einfach, ob mindestens ein 'A' in der Sequenz vorhanden ist. Hier trifft das Modell vier korrekte Klassifikationen und scheitert bei einer.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
import numpy as np

from sklearn.base import clone
from sklearn.gaussian_process import GaussianProcessClassifier, GaussianProcessRegressor
from sklearn.gaussian_process.kernels import GenericKernelMixin, Hyperparameter, Kernel


class SequenceKernel(GenericKernelMixin, Kernel):
    """
    A minimal (but valid) convolutional kernel for sequences of variable
    lengths."""

    def __init__(self, baseline_similarity=0.5, baseline_similarity_bounds=(1e-5, 1)):
        self.baseline_similarity = baseline_similarity
        self.baseline_similarity_bounds = baseline_similarity_bounds

    @property
    def hyperparameter_baseline_similarity(self):
        return Hyperparameter(
            "baseline_similarity", "numeric", self.baseline_similarity_bounds
        )

    def _f(self, s1, s2):
        """
        kernel value between a pair of sequences
        """
        return sum(
            [1.0 if c1 == c2 else self.baseline_similarity for c1 in s1 for c2 in s2]
        )

    def _g(self, s1, s2):
        """
        kernel derivative between a pair of sequences
        """
        return sum([0.0 if c1 == c2 else 1.0 for c1 in s1 for c2 in s2])

    def __call__(self, X, Y=None, eval_gradient=False):
        if Y is None:
            Y = X

        if eval_gradient:
            return (
                np.array([[self._f(x, y) for y in Y] for x in X]),
                np.array([[[self._g(x, y)] for y in Y] for x in X]),
            )
        else:
            return np.array([[self._f(x, y) for y in Y] for x in X])

    def diag(self, X):
        return np.array([self._f(x, x) for x in X])

    def is_stationary(self):
        return False

    def clone_with_theta(self, theta):
        cloned = clone(self)
        cloned.theta = theta
        return cloned


kernel = SequenceKernel()

Sequenzähnlichkeitsmatrix unter dem Kernel#

import matplotlib.pyplot as plt

X = np.array(["AGCT", "AGC", "AACT", "TAA", "AAA", "GAACA"])

K = kernel(X)
D = kernel.diag(X)

plt.figure(figsize=(8, 5))
plt.imshow(np.diag(D**-0.5).dot(K).dot(np.diag(D**-0.5)))
plt.xticks(np.arange(len(X)), X)
plt.yticks(np.arange(len(X)), X)
plt.title("Sequence similarity under the kernel")
plt.show()
Sequence similarity under the kernel

Regression#

X = np.array(["AGCT", "AGC", "AACT", "TAA", "AAA", "GAACA"])
Y = np.array([1.0, 1.0, 2.0, 2.0, 3.0, 3.0])

training_idx = [0, 1, 3, 4]
gp = GaussianProcessRegressor(kernel=kernel)
gp.fit(X[training_idx], Y[training_idx])

plt.figure(figsize=(8, 5))
plt.bar(np.arange(len(X)), gp.predict(X), color="b", label="prediction")
plt.bar(training_idx, Y[training_idx], width=0.2, color="r", alpha=1, label="training")
plt.xticks(np.arange(len(X)), X)
plt.title("Regression on sequences")
plt.legend()
plt.show()
Regression on sequences

Klassifizierung#

X_train = np.array(["AGCT", "CGA", "TAAC", "TCG", "CTTT", "TGCT"])
# whether there are 'A's in the sequence
Y_train = np.array([True, True, True, False, False, False])

gp = GaussianProcessClassifier(kernel)
gp.fit(X_train, Y_train)

X_test = ["AAA", "ATAG", "CTC", "CT", "C"]
Y_test = [True, True, False, False, False]

plt.figure(figsize=(8, 5))
plt.scatter(
    np.arange(len(X_train)),
    [1.0 if c else -1.0 for c in Y_train],
    s=100,
    marker="o",
    edgecolor="none",
    facecolor=(1, 0.75, 0),
    label="training",
)
plt.scatter(
    len(X_train) + np.arange(len(X_test)),
    [1.0 if c else -1.0 for c in Y_test],
    s=100,
    marker="o",
    edgecolor="none",
    facecolor="r",
    label="truth",
)
plt.scatter(
    len(X_train) + np.arange(len(X_test)),
    [1.0 if c else -1.0 for c in gp.predict(X_test)],
    s=100,
    marker="x",
    facecolor="b",
    linewidth=2,
    label="prediction",
)
plt.xticks(np.arange(len(X_train) + len(X_test)), np.concatenate((X_train, X_test)))
plt.yticks([-1, 1], [False, True])
plt.title("Classification on sequences")
plt.legend()
plt.show()
Classification on sequences
/home/circleci/project/sklearn/gaussian_process/kernels.py:440: ConvergenceWarning:

The optimal value found for dimension 0 of parameter baseline_similarity is close to the specified lower bound 1e-05. Decreasing the bound and calling fit again may find a better value.

Gesamtlaufzeit des Skripts: (0 Minuten 0.165 Sekunden)

Verwandte Beispiele

Induktives Clustering

Induktives Clustering

Gauß-Prozess-Klassifikation (GPC) auf dem Iris-Datensatz

Gauß-Prozess-Klassifikation (GPC) auf dem Iris-Datensatz

Gauß-Prozesse Regression: grundlegendes Einführungsexempel

Gauß-Prozesse Regression: grundlegendes Einführungsexempel

RBF SVM Parameter

RBF SVM Parameter

Galerie generiert von Sphinx-Gallery