Kernel-Dichteschätzung

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

Die Kernel-Dichteschätzung (Kernel Density Estimation, KDE) ist eine nicht-parametrische Dichteschätzungsmethode. In diesem Lab werden wir lernen, wie man KDE verwendet, um neue Datensamples zu generieren. Wir werden die Bibliothek scikit-learn verwenden, um diese Methode umzusetzen.

Tipps für die virtuelle Maschine (VM)

Nachdem die VM gestartet ist, klicken Sie in der oberen linken 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 während des Lernens 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 sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neighbors("Nearest Neighbors") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/decomposition("Matrix Decomposition") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/neighbors -.-> lab-49109{{"Kernel-Dichteschätzung"}} sklearn/model_selection -.-> lab-49109{{"Kernel-Dichteschätzung"}} sklearn/decomposition -.-> lab-49109{{"Kernel-Dichteschätzung"}} sklearn/datasets -.-> lab-49109{{"Kernel-Dichteschätzung"}} ml/sklearn -.-> lab-49109{{"Kernel-Dichteschätzung"}} end

Daten laden

Zunächst laden wir den Digits-Datensatz aus scikit-learn. Dieser Datensatz enthält 8x8-Bilder von Ziffern von 0 bis 9. Wir werden die Hauptkomponentenanalyse (Principal Component Analysis, PCA) verwenden, um die Dimension des Datensatzes auf 15 zu reduzieren.

from sklearn.datasets import load_digits
from sklearn.decomposition import PCA

## ladet den Digits-Datensatz
digits = load_digits()

## reduziert die Dimension des Datensatzes auf 15 mit PCA
pca = PCA(n_components=15, whiten=False)
data = pca.fit_transform(digits.data)

Bandbreite optimieren

Wir verwenden das Grid Search Cross-Validation, um den Bandbreitenparameter der KDE zu optimieren. Der Bandbreitenparameter steuert die Glätte der Dichteschätzung.

from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV
import numpy as np

## Verwenden Sie das Grid Search Cross-Validation, um die Bandbreite zu optimieren
params = {"bandwidth": np.logspace(-1, 1, 20)}
grid = GridSearchCV(KernelDensity(), params)
grid.fit(data)

print("beste Bandbreite: {0}".format(grid.best_estimator_.bandwidth))

## Verwenden Sie den besten Schätzer, um die Kernel-Dichteschätzung zu berechnen
kde = grid.best_estimator_

Neue Samples generieren

Wir verwenden den besten Schätzer, um 44 neue Punkte aus den Daten zu entnehmen. Anschließend transformieren wir die neuen Daten zurück in ihre ursprüngliche 64-Dimension mit der Inverse der PCA.

## entnehmen Sie 44 neue Punkte aus den Daten
new_data = kde.sample(44, random_state=0)
new_data = pca.inverse_transform(new_data)

Ergebnisse plotten

Wir plotten die ursprünglichen Ziffern und die neu resamplten Ziffern nebeneinander in einem 4x11-Gitter.

import matplotlib.pyplot as plt

## wandeln Sie die Daten in ein 4x11-Gitter um
new_data = new_data.reshape((4, 11, -1))
real_data = digits.data[:44].reshape((4, 11, -1))

## plotten Sie die echten Ziffern und die neu resamplten Ziffern
fig, ax = plt.subplots(9, 11, subplot_kw=dict(xticks=[], yticks=[]))
for j in range(11):
    ax[4, j].set_visible(False)
    for i in range(4):
        im = ax[i, j].imshow(
            real_data[i, j].reshape((8, 8)), cmap=plt.cm.binary, interpolation="nearest"
        )
        im.set_clim(0, 16)
        im = ax[i + 5, j].imshow(
            new_data[i, j].reshape((8, 8)), cmap=plt.cm.binary, interpolation="nearest"
        )
        im.set_clim(0, 16)

ax[0, 5].set_title("Auswahl aus den Eingabedaten")
ax[5, 5].set_title('"Neue" Ziffern, die aus dem Kernel-Dichtemodell gezogen wurden')

plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man die Kernel-Dichteschätzung (Kernel Density Estimation, KDE) verwendet, um neue Datensamples zu generieren. Wir haben die scikit-learn-Bibliothek verwendet, um diese Technik umzusetzen. Wir haben den Bandbreitenparameter der KDE mithilfe des Grid Search Cross-Validations optimiert. Anschließend haben wir neue Datenpunkte entnommen und sie mithilfe der PCA zurück in ihre ursprüngliche Dimension transformiert. Schließlich haben wir die ursprünglichen Ziffern und die neu resamplten Ziffern nebeneinander in einem 4x11-Gitter geplottet.