机器学习---半监督学习简单示例(标签传播算法)

1. 使用半监督学习方法 Label Spreading 在一个生成的二维数据集上进行标签传播

import numpy as np
import matplotlib.pyplot as plt
from sklearn.semi_supervised import label_propagation
from sklearn.datasets import make_circles# generate ring with inner box
n_samples = 200
X, y = make_circles(n_samples=n_samples, shuffle=False) 
# sklearn.datasets.make_circles(n_samples=100, shuffle=True, noise=None, random_state=None, factor=0.8)
# make_circle和make_moom产生二维二元分类数据集来测试某些算法的性能,可以为数据集添加噪声,可以为二元分类器产生一些球形判决界面的数据
outer, inner = 0, 1
labels = np.full(n_samples, -1.) # 形状n_samples,数据-1
labels[0] = outer
labels[-1] = inner# Learn with LabelSpreading
label_spread = label_propagation.LabelSpreading(kernel='knn', alpha=0.8) # kernel : {‘knn’, ‘rbf’, callable}
label_spread.fit(X, labels)# Plot output labels
output_labels = label_spread.transduction_
plt.figure(figsize=(8.5, 4))
plt.subplot(1, 2, 1)
plt.scatter(X[labels == outer, 0], X[labels == outer, 1], color='navy', # s点的大小,lw线宽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='upper right')
plt.title("Raw data (2 classes=outer and inner)")plt.subplot(1, 2, 2)
output_label_array = np.asarray(output_labels) # 将结构数据转化为ndarray
outer_numbers = np.where(output_label_array == outer)[0]
inner_numbers = np.where(output_label_array == inner)[0]
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='upper right')
plt.title("Labels learned with Label Spreading (KNN)")plt.subplots_adjust(left=0.07, bottom=0.07, right=0.93, top=0.92)
plt.show()

这段代码演示了使用半监督学习方法 Label Spreading 在一个生成的二维数据集上进行标签传播的

过程。Label Spreading 是一种用于利用未标记数据来改善学习模型的技术。

使用 make_circles 函数生成一个包含200个样本的二维数据集,这个数据集形成了两个圆形:一

个内圈和一个外圈。这些数据点将用于演示 Label Spreading 算法的效果。

为了进行半监督学习,我们需要一些已标记的数据。在这个示例中,我们将数据集中的第一个和最

后一个数据点分别标记为外圈和内圈,用数字0和1表示。其余数据点的标签被初始化为-1,表示它

们是未标记的。

使用 LabelSpreading 类来应用标签传播算法。通过设置 kernel='knn 和 alpha=0.8,算法将基于最

近邻(KNN)核来传播标签,其中 alpha 参数控制标签传播过程中的平滑程度。

通过调用 fit 方法,标签传播算法使用已标记和未标记的数据来学习,并预测所有未标记数据点的

标签。代码最后部分使用 matplotlib 生成了两个子图。第一个子图展示了原始数据及其标记,第二

个子图展示了使用 Label Spreading 算法学习得到的标签。这通过比较两个子图来直观展示标签传

播算法的效果。

通过这个示例,可以看到即使只有极少数的数据点被标记,Label Spreading 也能有效地利用数据

集的结构信息来预测未标记数据点的标签,展示了半监督学习在利用未标记数据上的潜力。

2. 使用半监督学习技术(特别是 Label Spreading)和支持向量机(SVM)在鸢尾花

(Iris)数据集上进行分类

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import svm
from sklearn.semi_supervised import label_propagationrng = np.random.RandomState(0)iris = datasets.load_iris()X = iris.data[:, :2]
y = iris.target# step size in the mesh
h = .02y_30 = np.copy(y)
y_30[rng.rand(len(y)) < 0.6] = -1
y_50 = np.copy(y)
y_50[rng.rand(len(y)) < 0.9] = -1
# we create an instance of SVM and fit out data. We do not scale our
# data since we want to plot the support vectors
ls30 = (label_propagation.LabelSpreading().fit(X, y_30),y_30)
ls50 = (label_propagation.LabelSpreading().fit(X, y_50),y_50)
ls100 = (label_propagation.LabelSpreading().fit(X, y), y)
rbf_svc = (svm.SVC(kernel='rbf', gamma=.5).fit(X, y), y)# create a mesh to plot in
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))# title for the plots
titles = ['Label Spreading 30% data','Label Spreading 50% data','Label Spreading 0% data','SVC with rbf kernel']color_map = {-1: (1, 1, 1), 0: (0, 0, .9), 1: (1, 0, 0), 2: (.8, .6, 0)} # (1, 1, 1)白色for i, (clf, y_train) in enumerate((ls30, ls50, ls100, rbf_svc)):# Plot the decision boundary. For that, we will assign a color to each# point in the mesh [x_min, x_max]x[y_min, y_max].plt.subplot(2, 2, i + 1)Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) # 扁平化操作# Put the result into a color plotZ = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)plt.axis('off')# Plot also the training pointscolors = [color_map[y] for y in y_train]plt.scatter(X[:, 0], X[:, 1], c=colors, edgecolors='black')plt.title(titles[i])plt.suptitle("Unlabeled points are colored white", y=0.1)
plt.show()

这段代码演示了如何使用半监督学习技术(特别是 Label Spreading)和支持向量机(SVM)在鸢

尾花(Iris)数据集上进行分类。这个示例展示了在不同比例的数据被标记的情况下,这些算法的

表现。从 `sklearn.datasets` 加载鸢尾花数据集。仅使用前两个特征(为了方便在二维平面上绘

图)。y_30 和 y_50 分别是复制的标签数组,其中 60% 和 90% 的标签被随机置为未知(-1),

用于模拟半监督学习场景。

使用 LabelSpreading 模型分别训练三个不同的数据集(30%、50% 标签数据和100% 标签数据)

以及一个使用 RBF 核的 SVM 模型进行比较。不对数据进行缩放,因为目的是要在图中展示支持

向量。为了绘制决策边界,创建一个网格覆盖数据集的全部范围。使用 numpy.meshgrid 函数生成

网格点的坐标矩阵。

对每个分类器和训练集组合,预测整个网格上的点的标签。使用 plt.contourf 绘制决策区域,并用

不同的颜色表示不同的类别。未标记的点(在 y_30 和 y_50 中被标记为 -1 的点)在图上用白色表

示。使用 plt.scatter 绘制训练点,颜色由 y_train 决定,边界颜色设为黑色以便区分。

为每个子图设置标题以区分不同的训练情况。使用 plt.suptitle 设置总标题。

最终显示图形,展示在不同标签数据比例下的分类效果和决策边界。

3. 使用标签传播(Label Spreading)算法在一个合成的二维数据集上进行半监督学习

import numpy as np
import matplotlib.pyplot as plt
from sklearn.semi_supervised import label_propagation
from sklearn.datasets import make_circles# generate ring with inner box
n_samples = 200
X, y = make_circles(n_samples=n_samples, shuffle=False) 
# sklearn.datasets.make_circles(n_samples=100, shuffle=True, noise=None, random_state=None, factor=0.8)
# make_circle和make_moom产生二维二元分类数据集来测试某些算法的性能,可以为数据集添加噪声,可以为二元分类器产生一些球形判决界面的数据
outer, inner = 0, 1
labels = np.full(n_samples, -1.) # 形状n_samples,数据-1
labels[0] = outer
labels[-1] = inner# Learn with LabelSpreading
label_spread = label_propagation.LabelSpreading(kernel='knn', alpha=0.8) # kernel : {‘knn’, ‘rbf’, callable}
label_spread.fit(X, labels)# Plot output labels
output_labels = label_spread.transduction_
plt.figure(figsize=(8.5, 4))
plt.subplot(1, 2, 1)
plt.scatter(X[labels == outer, 0], X[labels == outer, 1], color='navy', # s点的大小,lw线宽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='upper right')
plt.title("Raw data (2 classes=outer and inner)")plt.subplot(1, 2, 2)
output_label_array = np.asarray(output_labels) # 将结构数据转化为ndarray
outer_numbers = np.where(output_label_array == outer)[0]
inner_numbers = np.where(output_label_array == inner)[0]
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='upper right')
plt.title("Labels learned with Label Spreading (KNN)")plt.subplots_adjust(left=0.07, bottom=0.07, right=0.93, top=0.92)
plt.show()

这段代码演示了如何使用标签传播(Label Spreading)算法在一个合成的二维数据集上进行半监

督学习。标签传播是一种半监督学习算法,它可以利用少量的已标记数据和大量的未标记数据来训

练模型。使用 make_circles 函数生成一个由两个圆形组成的数据集,总共有200个样本。这些样本

被用来模拟一个简单的二分类问题。

初始化一个全是 -1 的标签数组,表示大部分样本都是未标记的。将第一个样本的标签设置为

outer(外圈),最后一个样本的标签设置为 inner(内圈),以此模拟已知的少量标签信息。

创建一个 LabelSpreading 模型实例,使用K近邻(KNN)作为核函数,并设置 alpha=0.8。

使用这个模型和初始的标签来训练数据集。算法将尝试根据少量的已标记数据和数据的分布,推断

出未标记数据的标签。

使用 matplotlib 创建两个子图。第一个子图展示原始数据和初始的少量标签。第二个子图展示标签

传播算法学习到的标签。在第一个子图中,已标记的外圈和内圈样本分别用不同颜色表示,未标记

的样本用第三种颜色表示。在第二个子图中,根据标签传播算法的结果,所有样本都被标记,并用

相应的颜色表示外圈和内圈。通过这种方式,可以直观地看到标签传播算法是如何利用少量的标签

信息来推断整个数据集的标签分布的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/454580.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北斗卫星在物联网时代的应用探索

北斗卫星在物联网时代的应用探索 在当今数字化时代&#xff0c;物联网的应用已经深入到人们的生活中的方方面面&#xff0c;让我们的生活更加智能便捷。而北斗卫星系统作为我国自主研发的卫星导航系统&#xff0c;正为物联网的发展提供了强有力的支撑和保障。本文将全面介绍北…

前端复杂 table 渲染及 excel.js 导出

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 现在我们有一个如图&#xff08;甚至更复杂&#xff09;的表格需要展示到页面上&#xff0c;并提供下载为 excel 文件的功能。 前端表格渲染我们一般会使用 element-ui 等组件库提供的 table 组件&#xff0c;这些组件一般…

企业飞书应用机器人,使用python自动发送文字内容到群消息

文章目录 创建企业应用与开通机器人飞书发送信息的工具函数 创建企业应用与开通机器人 需要先创建应用&#xff0c;然后进入应用后&#xff0c;点击添加应用能力创建机器人&#xff1a; 参考官方文档&#xff0c;获取两个参数&#xff1a;app_id与app_secret 官方说明文档&…

JAVA代理模式详解

代理模式 1 代理模式介绍 在软件开发中,由于一些原因,客户端不想或不能直接访问一个对象,此时可以通过一个称为"代理"的第三者来实现间接访问.该方案对应的设计模式被称为代理模式. 代理模式(Proxy Design Pattern ) 原始定义是&#xff1a;让你能够提供对象的替代…

#Z0458. 树的中心2

题目 代码 #include <bits/stdc.h> using namespace std; struct ff {int z,len; }; vector<ff> vec[300001]; int n,u,v,w,dp[300001][2],ans 1e9; void dfs(int x,int fa) {for(int i 0;i < vec[x].size();i){ff son vec[x][i];if(son.z ! fa){dfs(son.z,…

router路由跳转的两种模板

<router-link><router-link/> <router-view><router-view/> link &#xff1a;链接&#xff0c;联系 view&#xff1a;指看见展现在人们面前的、可以稳定地进行详细审视的事物 将语境拉回到router里&#xff0c;抽象概括一下 router-link就是一个…

如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏

文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 本教程主要介…

C++后端开发之Sylar学习三:VSCode连接Ubuntu配置Gitee

C后端开发之Sylar学习三&#xff1a;VSCode连接Ubuntu配置Gitee 为了记录学习的过程&#xff0c;学习Sylar时写的代码统一提交到Gitee仓库中。 Ubuntu配置Gitee 安装git sudo apt-get install -y git配置用户名和邮箱 git config --global user.name 用户名 …

ChatGPT生产力|chat gpt实战介绍

标注说| ⭐ : 使用稳定&#xff0c;推荐 | &#x1f604; : 免费使用 | &#x1f511; : 需要登陆或密码 | ✈️ : 需waiwang进行访问 | ChatGPT 1PoePoe - Fast, Helpful ...&#x1f511;&#x1f604;&#x1f517;2 AItianhuGPT4&#x1f604;⭐&#x1f517;3 PhantoNa…

Mysql索引优化建议

1&#xff0c;最左前缀法则 如果为一张表创建了多列的组合索引&#xff0c;要遵守最左前缀法则。就是指查询从索引的最左前列开始并且不要跳过索引中的列。&#xff08;因为Mysql的InnoDB引擎的索引树是一个按顺利排序存储的数据结构&#xff08;BTREE&#xff09;&#xff0c…

看论文利器:paperswithcode

paperswithcode&#xff0c;从名字就可以看出来&#xff0c;有源代码的paper。 写论文&#xff0c;很关键的就是能够复现论文内容。 这个网站提供了“论文代码”的参考文献。 以【图像加密】领域为例&#xff0c;搜索一下&#xff1a; 图像分割&#xff1a; 除了论文&#x…

python实现全国省份下城市气温分析计算,基于随机森林模型完成气温预测分析与对比可视化

2023年马上就要步入尾声了&#xff0c;在这年末时刻&#xff0c;各地纷纷下起了大雪&#xff0c;温度也是骤降&#xff0c;这也难挡大家出行的热情&#xff0c;我很快也要加入出行的大军&#xff0c;朝着心中的归宿前行。 正好今天有点时间就想着以温度为切入点做点有趣的工作…