标签传播算法是一种半监督学习方法,它能够利用少量的标记数据来预测大量未标记数据的标签。本文将通过一个具体的例子来展示标签传播算法如何学习数据的复杂内部结构,并展示其预测效果。
首先,生成一个包含两个同心圆的数据集。每个样本都与一个标签相关联,标签为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
上述代码首先导入了必要的库,然后生成了一个包含200个样本的同心圆数据集。接着,为每个样本分配了一个初始标签,其中第一个样本和最后一个样本的标签分别被设置为0和1,其余样本的标签被设置为-1。
为了直观地展示数据的分布情况,可以使用matplotlib库来绘制原始数据。
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")
plt.title("原始数据(2类:外圆和内圆)")
上述代码使用matplotlib库绘制了原始数据的散点图,其中外圆的样本用蓝色标记,内圆的样本用青色标记,未标记的样本用橙色点表示。通过这个图,可以清晰地看到数据的分布情况。
接下来,使用标签传播算法来学习数据的标签。标签传播算法的目标是为那些初始标签未知的样本分配一个标签。
from sklearn.semi_supervised import LabelSpreading
label_spread = LabelSpreading(kernel="knn", alpha=0.8)
label_spread.fit(X, labels)
上述代码首先导入了标签传播算法的类,然后创建了一个标签传播算法的实例,并设置了核函数为knn,alpha参数为0.8。接着,使用fit方法来训练模型。
训练完成后,可以查看模型为那些初始标签未知的样本分配的标签。
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")
plt.title("使用标签传播算法学习后的标签(KNN)")
plt.show()
上述代码首先获取了模型为每个样本分配的标签,然后筛选出属于外圆和内圆的样本的索引。接着,使用matplotlib库绘制了学习后的标签的散点图,其中外圆的样本用蓝色标记,内圆的样本用青色标记。通过这个图,可以直观地看到标签传播算法的效果。