最优路径森林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

相关文章

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:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop