one-class(单分类) kNN(K-Nearest Neighbor)算法Matlab实现

2023-11-11

one-class(单分类) kNN(K-Nearest Neighbor)算法Matlab实现

本文的核心是给出了一个基于kNN的单分类(one-class)分类器实现代码,并给出了数据以及运行实例,让读者能更好地理解并使用。代码基于MATLAB平台实现。而多分类的KNN代码已经比较多了,比如https://blog.csdn.net/queyuze/article/details/70195087博客中就给出了其实现。

1.首先是单分类分类器的介绍

1.1二分类问题

首先,学过机器学习的人都应该比较了解二分类SVM,这里引用网上一个比较糊的图,但是能看出这里是针对两种label的数据进行了SVM边界构建。而多分类可以由多个二分类构建,这里非本文重点就不详细介绍了。

查看源图像

1.2单分类问题(one-class)

单分类问题(one-class)不像常见的二分类或多分类问题,其目的并不是将有不同label的数据区分开来,而更像是对单个类别的特征生成一个轮廓与描述(description)。这里感觉轮廓更好理解一点,可以理解为是样本空间中的一个区域,当某个样本落在这个区域外,我们就认为该样本不属于这个类别。单分类方法常用于异常检测,或者类别极度不平衡的分类任务中。

在这里插入图片描述

算法层面:当我们假设数据服从一个概率分布,我们就可以对这个分布中的参数进行估计了。对于一个新样本,如果这个样本在给定类别的概率分布中的概率小于阈值,就会被判定为异常样本。

2.常用单分类SVM的缺点

2.1 SVDD简介

其基本思想是通过在映射到高维的特征空间中找出一个包围目标样本点的超球体(在如上特征降维可视化的二维图片,就是一个包围目标样本点的圆形),并通过最小化该超球体所包围的体积让目标样本点尽 能地被包围在超球体中,而非目标样本点尽可能地排除在超球体中,从而达到正常类以非正常类之间划分的目的。

其训练过程如下:

1.基于合法用户的数据进行训练(通常是多个特征向量)
2.获得SVDD单分类分类器
3.基于此分类器对于一个未知样本进行分类,结果为正常类(可以理解为在上图的黑色边界内)或者异常类(可以理解为在上图的黑色边界外)。

基本所有的单分类分类认证都是这个过程,比如在一些感知认证工作中,由于实际的场景往往只有正样本,所以选择单分类分类器作为其模型。

2.2 SVDD缺点

但是在实际使用中SVDD有一定的缺点,就是这个边界的松紧不能细粒度的调整,以使得我们实验中没法获得全面的分析数据。以第二张图为例,这个边界如果变大了,就是变松一点,那么误拒绝合法用户的概率就会低,因为模型正例的空间域变大了。反之如果边界变小,就是变紧,那么模型正例的空间域变小。这个松紧调整的意义在于我们可以细粒度地对我们的算法性能进行分析。

曾经在我的论文实验中,我十分希望如下以细粒度地调整模型的松紧,如下表所示。

松紧程度 96% 97% 98% 99% 100% 101% 102% 103%
某性能指标

来观察设计的算法性能,比如FAR和FRR的变化,SVDD试了多次发现是不能满足如下这样细粒度要求的,其粒度会比较粗,使得我们无法全方位评估我们算法性能。MATLAB自带的fitsvm函数选下实现SVDD,这个OutlierFraction代表了假设 7% 的观测值是离群值,对预测变量进行标准化。而实际上,当我们的样本数不足100而只有十几个的时候,往往以样本的离群值为代表,就只有较少的粒度。比如可能7%和10%都是代表固定个数样本的离群值。

SVMModel = fitcsvm(traindataout,labeltrain,'KernelFunction','RBF',
'KernelScale','auto','Standardize',true,'OutlierFraction',0.07);

本文核心想法:所以我换了思路,不以训练样本中的离群数代表模型松紧,我们将这个松紧粒度放在分类时进行调整。简单来说,我们利用KNN是基于距离度量的特性,我们获得测试样本与训练样本的距离与训练样本之间的距离,基于这两个值的比值是否小于一个阈值来判断,而我们可以对这个阈值实现细粒度的调整,实现模型松紧的细粒度调整。具体实现如下:

3.基于KNN的单分类分类器实现

3.1训练阶段

给定N个训练样本的特征数据,每一个特征数据向量记为di,i在1-N,其中dij表示第i个特征向量和第j个特征向量之间的曼哈顿距离或者欧式距离。基于M我们可以衡量这个训练样本的簇密度,代表了训练样本数据的特性。
M = ∑ i = 1 N − 1 ∑ j = i + 1 N d i j C N 2 M=\frac{\sum_{i=1}^{N-1}\sum_{j=i+1}^{N}d_{ij}}{C_{N}^{2}} M=CN2i=1N1j=i+1Ndij

function [M] = oneclass_KNN_train(traindata,distype)
% training process
% this function returns the threshold(M)  of traindata.
% It takes 2 input arguments
% which are traindata,distype.
% distype is the cityblock distance(1) or the euclidean distance(2)
    [n,~]=size(traindata);
    M=0;
    for i=1:n%此处计算平均距离
        temp=traindata(i,:);
        for j=i+1:n         % 计算其到所有traindata的距离,并排序
            a=[temp;traindata(j,:)];
            if distype==1
                dis=pdist(a,'cityblock');
            else
               dis=pdist(a,'euclidean');
            end
            M=M+dis;
        end
    end
    M=2*M/((n-1)*n);
end

3.2分类阶段

给定一个测试样本f,我们将其特征数据向量与所有的di进行距离计算,选出其中最小的k个距离值,并求该k个距离值的平均值记为m。

那么基于m与M的比较,我们可以判断测试样本的分类结果。其中我们基于基于λ进行模型松紧的细粒度调整。
T e s t r e s u l t = { l e g i t i m a t e   u s e r , m ≤ λ × M a t t a c k e r , m > λ × M Testresult = \begin{cases} legitimate \ user, & m \leq \lambda \times M \\ attacker, & m > \lambda \times M \end{cases} Testresult={legitimate user,attacker,mλ×Mm>λ×M

function [ positive_num ] = oneclass_KNN_test( traindata,testdata,k,M,ratio,distype)
% testing process
% this function returns the positive number of testdata.
% It takes 6 input arguments
% which are traindata,testdata,k,threshold,ratio,distype.
% k means the parameter of kNN, threshold means the Denisty calculated from
% training process, ratio is the tradeoff between FNR and FPR
% distype is the cityblock distance(1) or the euclidean distance(2)
    [n,~]=size(traindata);
    [n2,~]=size(testdata);
    dis=ones(1,n); %用于计算每一次的距离
    accnum=0;
    for i=1:n2 %对于n2个testdata数据行进行认证测试
        temp=testdata(i,:);
        for j=1:n         % 计算其到所有traindata的距离,并排序
            a=[temp;traindata(j,:)];
            if distype==1
                    dis(j)=pdist(a,'cityblock');
            else
                    dis(j)=pdist(a,'euclidean');
            end
        end
        dis=sort(dis);
        ithreshold=0;
        for p=1:k           % 对于p个距离计算其均值
            ithreshold=ithreshold+dis(p);
        end
        ithreshold=ithreshold/p;
        if(ithreshold<M*ratio)% 如果K均值小于阈值,则认为是合法值
            accnum=accnum+1;
        end
    end
    positive_num = accnum;
end

这里traindata和testdata的数据格式如下

traindata feature1 feature2 feature3
line1 1.1 5.1 2.2
line2 1.0 4.0 2.2
line3 1.2 6.2 2.0

M = d 12 + d 23 + d 13 C 3 2 M=\frac{d12+d23+d13}{C_{3}^{2}} M=C32d12+d23+d13

基于M以及给定的模型松紧参数λ(比如λ = 1.1),以及计算的测试样本距离m,我们可以对一个测试样本向量进行分类

testdata feature1 feature2 feature3 testresult
line1 1.0 5.1 2.2 positive
line2 1.9 2.0 3.2 negative
line3 2.0 4.1 1.1 negative

4.总结

我们基于MATLAB实现了one-class kNN分类器,解决了现有单分类分类器比如SVDD模型松紧不能细粒度调整的问题,并给出了实现代码。

博客系本人原创,如果有转载,请注明出处,如有错误欢迎评论指正,谢谢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

one-class(单分类) kNN(K-Nearest Neighbor)算法Matlab实现 的相关文章

  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • 对多个属性使用一种设置方法 MATLAB

    我有几个属性基本上使用相同的属性set method classdef MyClass properties A B end methods function mc MyClass a b Constructor mc A a mc B b
  • Matlab:如何显示数组的“真实”值?

    我有一个在脚本中计算的向量 计算后 我将值显示到命令窗口 显示如下 finalResults 1 0e 05 0 0001 0 0 0005 0 0002 0 0001 0 0027 0 0033 0 0001 0 0000 0 0000
  • 扩展 MATLAB 函数名称的最大长度

    我编写了一个 MATLAB 程序 可以动态创建自定义 MATLAB 函数 并使用以下命令在其他 MATLAB 实例中启动它们unix命令 我使用这个程序来自动化 fMRI 神经影像分析 使用 SPM8 for MATLAB 一切正常 但是
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • MATLAB 滚动图

    我有一个脑电图数据库 我想绘制它 数据库是一个19 1000 134的矩阵 其中 19 是通道数 在第一种方法中 我只使用一个渠道 1000 个样本大小 采样率为 500 Hz 时为 1000 个点 即 2 秒数据 134 epochs的数
  • MATLAB 中的多个捕获组

    我有一个包含数字或字母的字符串a 可能紧随其后的是r or l 在 MATLAB 中 以下正则表达式返回为 gt gt regexp 10r 0 9 a l r match ans 10r 我希望10 and r分开 因为我有两个捕获组 有
  • Matlab:保存后翻转图例顺序和图例重叠图

    我正在尝试根据以下内容反转我的图例条目顺序matlab条形图中图例颜色的逆序 https stackoverflow com questions 31178005 reverse ordering of legend colors in m
  • 为什么旋转 3D 点云后顶点法线会翻转?

    我有两个人脸 3D 点云样本 蓝色点云表示目标面 红色点云表示模板 下图显示目标面和模板面在不同方向上对齐 目标面大致沿 x 轴 模板面大致沿 y 轴 Figure 1 The region around the nose is displ
  • Matlab 字段名索引[重复]

    这个问题在这里已经有答案了 所以我有一个包含多个表的元胞数组 我试图访问表的第一个列名称 c table1 table2 table3 以下两行都给了我错误 fieldnames c 1 1 fieldnames c 1 1 Error i
  • 什么是 ANN 中的纪元以及它如何转换为 MATLAB 中的代码?

    我试图理解 并可视化 训练人工神经网络的时代到底是什么 我们有一个包含约 7000 个产品的训练集 其中有 10 个特征 输入 这些产品必须根据这 10 个输入分为 7 个类别 我们的 ANN 有 10 个输入 这些输入进入由 10 个神经
  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • 如何将二进制值列表转换为int32类型?

    我在 MATLAB 工作区中有一个小端格式的二进制数列表 我想将它们转换为 int32 a是由 0 和 1 组成的双向量 如下所示 a 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1
  • 黑白随机着色的六角格子

    我正在尝试绘制一个 10 000 x 10 000 随机半黑半白的六边形格子 我不知道如何将该格子的六边形随机填充为黑色和白色 这是我真正想要从这段代码中得到的示例 但我无法做到 https i stack imgur com RkdCw
  • 在 Matlab 中高效获取像素坐标

    我想在 Matlab 中创建一个函数 给定一个图像 该函数将允许人们通过单击图像中的像素来选择该像素并返回该像素的坐标 理想情况下 人们能够连续单击图像中的多个像素 并且该函数会将所有相应的坐标存储在一个矩阵中 有没有办法在Matlab中做
  • matlab中的排列函数是如何工作的

    这是一个有点愚蠢的问题 但我似乎无法弄清楚排列在 matlab 中是如何工作的 以文档为例 A 1 2 3 4 permute A 2 1 ans 1 3 2 4 到底是怎么回事 这如何告诉 matlab 3 和 2 需要交换 哇 这是我迄
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • 如何在 MATLAB 中绘制 3D 曲面图?

    我有一个像这样的数据集 0 1 0 2 0 3 0 4 1 10 11 12 13 2 11 12 13 14 3 12 13 14 15 4 13 14 15 16 我想在 matlab 中绘制 3D 曲面图 使列标题位于 y 轴 行标题

随机推荐

  • MFC中简单上位机框架搭建

    项目源码下载地址 http download csdn net download zhuzemin45 12005663 文章主要分三个部分 一 非模态 模态 对话框创建 二 标签页创建 三 Button调用多标签页的非模态对话框 1 非模
  • “百钱买百鸡”编程详解。

    1 题目描述 百钱买百鸡 是我国古代的著名数学题 3 文钱可以买 1 只公鸡 2 文钱可以买一只母鸡 1 文钱可以买 3 只小鸡 用 100 文钱买100 只鸡 那么各有公鸡 母鸡 小鸡多少只 2 分析 计算机无法通过直接的计算得出具体的数
  • QTimer与事件循环和多线程

    定时器的源码分析 startTimer返回定时器的ID 在定时时间到了后 收到一个QTimerEvent 并覆盖虚函数timerEvent进行处理 该QTimerEvent包括了定时器ID 看QTimer的源码就明白了 QObject st
  • java创建自定义类的数组

    java创建自定义类的数组 错题笔记 学习动态规划做例题hdu 2602遇到的问题 创建自定义类后 新建一个自定义类的数组 向数组赋值时报如下错误 java lang NullPointerException Cannot assign f
  • 【Qt】一篇全面的信号和槽函数机制总结

    信号和槽函数机制 文章目录 信号和槽函数机制 一 信号和槽机制简介 二 信号 2 1 信号的发出 2 2 信号的处理 三 槽函数 3 1 带有默认参数的信号和槽函数 3 2 使用 QObject connect 将信号连接到槽函数的三种方法
  • integer operation result is out of range

    程序中 有如下定义 define UART1 EN 1 lt lt 31 编译后编译器报错 integer operation result is out of range 经查资料是由于溢出所致 宏定义默认常量是有符号型 当左移31位时
  • kerberos认证过程

    KDC Key Distribution Center 密钥分发中心 里面包含两个服务 AS和TGS AS Authentication Server 身份认证服务 TGS Ticket Granting Server 票据授予服务 TGT
  • [python] 使用scikit-learn工具计算文本TF-IDF值

    在文本聚类 文本分类或者比较两个文档相似程度过程中 可能会涉及到TF IDF值的计算 这里主要讲述基于Python的机器学习模块和开源工具 scikit learn 希望文章对你有所帮助 相关文章如下 python爬虫 Selenium获取
  • 铨顺宏RFID:试卷管理中RFID技术智能系统发挥着什么样的作用

    1 项目背景 在我国的教育招生考试中 试卷的管理一直是比较棘手的问题 它涉及试卷的组卷 印刷 封包 运输 发放 回收 入库 阅卷以及历史保存等一系列复杂的流程 且数量巨大 到目前为止 我国的试卷管理主要还是采取的人工管理方式 势必存在安全形
  • 随机抽奖小程序

    本实例使用随机数字生成5位抽奖号码 并显示在窗体的5个文本框中 当用户单击 开始 按钮时 将启动一个线程对象为5个文本框生成随机数字 单击 抽奖 按钮时 线程对象停止运行 并且将准确的中奖号码显示在信息文本框中 开发一个抽奖小工具的实例 1
  • 基于PaddleClas的PP-LCNet实现车辆颜色及车型属性识别

    目录 源码 yolov5源码 1 环境准备 2 数据准备 3 车辆检测
  • 目标检测评价指标合集

    目标检测评价指标 混淆矩阵 confusion matrix 可谓是贯穿了整个目标检测评价体系 衍生了一系列的目标检测评价指标 如精确率 precision 准确率 accuracy 召回率 recall F1 score ROC AUC指
  • ag-grid 学习笔记四:ag-grid方法(重设行数据、增删改、反选、新增列、插入新行、合计行接口、遍历行对象、获取置顶行数量、获取底部合计行对象、获取行对象、刷新、单元格焦点)

    一 setRowData重新设置表格行数据 重新设置表格数据很简单 只需要调用 gridOptions api setRowData 数据集 接口传入数据即可 以下函数为调用方式 function resetGrid 新的数据项 var N
  • Hackinglab(鹰眼)——基础关

    目录 1 key在哪里 2 再加密一次你就得到key啦 3 猜猜这是经过了多少次加密 4 据说MD5加密很安全 真的是么 5 种族歧视 6 HAHA浏览器 7 key究竟在哪里呢 8 key又找不到了 9 冒充登陆用户 10 比较数字大小
  • Lucene使用IK中文分词

    Lucene使用IK中文分词 环境 Lucene 6 x IKAnalyzer2012 u6 也可以通过Maven或Gradle构建工程测试和验证 对于Lucene的最新版本 需要找到IK Analyzer对应的兼容版 传送门 Lucene
  • 最新gcc下载和linux环境变量设置

    最新gcc下载和linux环境变量设置 一 gcc下载 提供最新gcc下载路径 点这里跳转 http ftp gnu org gnu gcc 安装 gcc package configure prefix usr local gcc nam
  • 前端使用代理跨域后后端无法接收Session

    将一个 MVC 项目重构为一个前后端分离项目 前端使用了 react axios vite 在前后端分离项目中 通常都会使用代理来解决跨域问题 vite 需要在 vite config js 文件中配置代理 export default d
  • hive的分组和组内排序

    背景 hive的分组和组内排序 语法 语法 row number over partition by 字段a order by 计算项b desc rank rank是排序的别名 partition by 用于给结果集分组 如果没有指定那么
  • ES内存持续增长问题分析

    环境介绍 es版本 5 6 4 Xms31g Xmx31g XX MaxDirectMemorySize 10g 问题说明 用top命令观察ES使用的物理内存不断增加到54 6G 已知堆内存31G 堆外内存MaxDirectMemorySi
  • one-class(单分类) kNN(K-Nearest Neighbor)算法Matlab实现

    one class 单分类 kNN K Nearest Neighbor 算法Matlab实现 本文的核心是给出了一个基于kNN的单分类 one class 分类器实现代码 并给出了数据以及运行实例 让读者能更好地理解并使用 代码基于MAT