标签传播算法演示

标签传播算法是一种半监督学习技术,它通过已知标签的样本来推断未知标签样本的标签。在下面的示例中,生成了一个包含两个同心圆的数据集,其中外圈标记为“红色”,内圈标记为“蓝色”。由于两组标签都位于它们自己的独立形状内,可以看到标签在圆周上正确传播。

首先,使用Python的NumPy和scikit-learn库来生成数据集。创建了200个样本点,并将它们分为两组:外圈和内圈。每个样本点都与一个标签关联,标签为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

接下来,使用matplotlib库来绘制原始数据。可以看到,外圈的样本点被标记为“navy”色,内圈的样本点被标记为“c”色,而未标记的样本点则以“darkorange”色显示。

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="外圈标记", s=10) plt.scatter(X[labels == inner, 0], X[labels == inner, 1], color="c", marker="s", lw=0, label="内圈标记", s=10) plt.scatter(X[labels == -1, 0], X[labels == -1, 1], color="darkorange", marker=".", label="未标记") plt.legend(scatterpoints=1, shadow=False, loc="center left") plt.title("原始数据(2类:外圈和内圈)") plt.show()

标签传播算法的目标是为那些最初未知标签的样本点分配标签。使用scikit-learn的LabelSpreading类来实现这一点,其中使用了KNN核函数和alpha参数为0.8。

from sklearn.semi_supervised import LabelSpreading label_spread = LabelSpreading(kernel="knn", alpha=0.8) label_spread.fit(X, labels)

在Jupyter环境中,重新运行此单元格以显示HTML表示,或信任笔记本。在GitHub上,HTML表示无法渲染,请尝试使用nbviewer.org加载此页面。

现在,可以检查当标签最初未知时,每个样本点被分配了哪些标签。使用LabelSpreading类的transduction_属性来获取预测的标签,并将它们转换为NumPy数组。然后,找到被分配为外圈和内圈标签的样本点的索引。

output_labels = label_spread.transduction_ output_label_array = np.asarray(output_labels) outer_numbers = np.where(output_label_array == outer)[0] inner_numbers = np.where(output_label_array == inner)[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="外圈学习") plt.scatter(X[inner_numbers, 0], X[inner_numbers, 1], color="c", marker="s", lw=0, s=10, label="内圈学习") plt.legend(scatterpoints=1, shadow=False, loc="center left") plt.title("使用标签传播(KNN)学习到的标签") plt.show()

这个脚本的总运行时间为:(0分钟0.144秒)。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485