Распространение меток по кругам: Обучение сложной структуре#

Пример обучения LabelPropagation сложной внутренней структуры для демонстрации "обучения многообразию". Внешний круг должен быть помечен как "красный", а внутренний — "синий". Поскольку обе группы меток находятся внутри своих отдельных форм, мы видим, что метки правильно распространяются по кругу.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Мы генерируем набор данных с двумя концентрическими окружностями. Кроме того, с каждым образцом набора данных связана метка: 0 (принадлежность к внешней окружности), 1 (принадлежность к внутренней окружности) и -1 (неизвестно). Здесь все метки, кроме двух, помечены как неизвестные.

import numpy as np

from sklearn.datasets import make_circles

n_samples = 200
X, y = make_circles(n_samples=n_samples, shuffle=False)
outer, inner = 0, 1
labels = np.full(n_samples, -1.0)
labels[0] = outer
labels[-1] = inner

Построить исходные данные

import matplotlib.pyplot as plt

plt.figure(figsize=(4, 4))
plt.scatter(
    X[labels == outer, 0],
    X[labels == outer, 1],
    color="navy",
    marker="s",
    lw=0,
    label="outer labeled",
    s=10,
)
plt.scatter(
    X[labels == inner, 0],
    X[labels == inner, 1],
    color="c",
    marker="s",
    lw=0,
    label="inner labeled",
    s=10,
)
plt.scatter(
    X[labels == -1, 0],
    X[labels == -1, 1],
    color="darkorange",
    marker=".",
    label="unlabeled",
)
plt.legend(scatterpoints=1, shadow=False, loc="center")
_ = plt.title("Raw data (2 classes=outer and inner)")
Raw data (2 classes=outer and inner)

Целью LabelSpreading состоит в присвоении метки образцу, где метка изначально неизвестна.

from sklearn.semi_supervised import LabelSpreading

label_spread = LabelSpreading(kernel="knn", alpha=0.8)
label_spread.fit(X, labels)
LabelSpreading(alpha=0.8, kernel='knn')
В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы показать HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может отображаться, попробуйте загрузить эту страницу с помощью nbviewer.org.


Теперь мы можем проверить, какие метки были связаны с каждым образцом, когда метка была неизвестна.

output_labels = label_spread.transduction_
output_label_array = np.asarray(output_labels)
outer_numbers = (output_label_array == outer).nonzero()[0]
inner_numbers = (output_label_array == inner).nonzero()[0]

plt.figure(figsize=(4, 4))
plt.scatter(
    X[outer_numbers, 0],
    X[outer_numbers, 1],
    color="navy",
    marker="s",
    lw=0,
    s=10,
    label="outer learned",
)
plt.scatter(
    X[inner_numbers, 0],
    X[inner_numbers, 1],
    color="c",
    marker="s",
    lw=0,
    s=10,
    label="inner learned",
)
plt.legend(scatterpoints=1, shadow=False, loc="center")
plt.title("Labels learned with Label Spreading (KNN)")
plt.show()
Labels learned with Label Spreading (KNN)

Общее время выполнения скрипта: (0 минут 0.131 секунд)

Связанные примеры

Граница решения полуконтролируемых классификаторов против SVM на наборе данных Iris

Граница решения полуконтролируемых классификаторов против SVM на наборе данных Iris

Демонстрация алгоритма Spectral Biclustering

Демонстрация алгоритма Spectral Biclustering

Полу-контролируемая классификация на текстовом наборе данных

Полу-контролируемая классификация на текстовом наборе данных

Распространение меток на цифрах: Демонстрация производительности

Распространение меток на цифрах: Демонстрация производительности

Галерея, созданная Sphinx-Gallery