最优路径森林OPF

2023-12-02 08:59
文章标签 路径 森林 最优 opf

本文主要是介绍最优路径森林OPF,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最优路径森林 OPF 算法将训练集转换成一个完全图,完全图中的每个节点都是调练集中的一个样本,图中的弧用节点间距离来表示,根据完全图来生成最优路径森林,森林中每棵树上的所有节点都属于同一个类别。在进行分类时,计算待分类样本到哪棵树的距离最近,则其类别就和这棵树的根节点的类别相同。

 OPF 分类器不依赖于任何参数,训练阶段不需要进行参数优化,因此其调练速度和分类速度都非常快。与其他分类算法相比,OPF 算法的分类精度和 SVM 相近而优于其他方法训练、分类速度比 SVM 更快,也不需要对类别的形状做任何假设,能处理多类及有一定程度类别重叠的问题。

OPF算法原理

分类器训练阶段

图(a)(b)中显示了5个训练集样本,其中圆形代表1类,六边形代表2类。

首先构建训练集样本的完全图,计算每两个节点之间的距离(可用欧式距离等衡量)

对此完全图计算最小生成树,在最小生成树中找到连接两个不同类别的节点的弧(图(b)中未显示,实际上就是画了圈的两个节点之间),对应的两个节点作为最优路径森林中的树的根节点。由于连接不同类别节点的弧可能有多个,所以同一类别的树的根节点也可能不止一个

节点上(x,y)中的x代表该节点的代价,y代表该节点的标签。

初始时根节点的代价为0,非节点的代价设为无穷大。

更新非根节点t的代价C(t)C(t)的值即为最优路径上t的前驱节点s的代价C( s)与节点st之间距离d(s,t)的最大值。观察图(b)的右边,可以看到圆圈圈住的根节点的代价为0,与其相邻的节点代价为他们之间的距离0.2,不直接相邻的节点代价为它的前驱节点的代价0.2以及它同前驱节点之间的距离0.1之间的最大值0.2

分类阶段

观察图(c)(d)

对于标签未知的灰方块样本,计算它到每个节点的距离。选取离它最近的根节点的标签作为它的标签,在图中与六边形的距离0.6小于与圆形的距离0.7,故将它分到2类,即使在整张图中离它最近的节点属于1类。代价更新规则同上。

相关的Python包-opfython

GitHub链接:https://github.com/gugarosa/opfython

介绍文档:https://opfython.readthedocs.io/

可直接使用pip安装

pip install opfython

以下是一个使用示例,选用了fashion-MNIST数据集

import torchvision
import torchvision.transforms as transforms # 数据处理模块
import opfython.math.general as g
import opfython.stream.splitter as s
from opfython.models import SupervisedOPF
minst=torchvision.datasets.FashionMNIST(root=r"D:\Code Storage\Pyworking\深度学习",download=False # true则要下载,false则代表文件地址下已经有数据,无需下载,train=True,transform=transforms.ToTensor())
x=minst.data.view(-1,28*28)
y=minst.targets
x_n=x[:5000].numpy()
y_n=y[:5000].numpy()# Splitting data into training and testing sets
X_train, X_test, Y_train, Y_test = s.split(x_n, y_n, percentage=0.5, random_state=1)# Creates a SupervisedOPF instance
opf = SupervisedOPF(distance="log_squared_euclidean", pre_computed_distance=None)# Fits training data into the classifier
opf.fit(X_train, Y_train)# Predicts new data
preds = opf.predict(X_test)# Calculating accuracy
acc = g.opf_accuracy(Y_test, preds)print(f"Accuracy: {acc}")

选取了5000条数据进行实验,其中2500条用于训练,2500条用于验证,运行大约需要40s,准确率为87%

参考文献

[1]沈龙凤, 宋万干, 葛方振, 李想, 杨忆, 刘怀愚, 高向军和洪留荣. 《最优路径森林分类算法综述》. 计算机应用研究 35, 期 1 (2018年): 7-12+23.

[2]Land Use Classification Using Optimum-Path Forest

这篇关于最优路径森林OPF的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/444707

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使