当前位置: 首页 > news >正文

基于MATLAB的支持向量数据描述算法

基于MATLAB的支持向量数据描述(SVDD)算法


一、核心

function [model, decision] = mySVDD(X, kernelType, gamma, C, tol)% SVDD模型训练% 输入:% X - 训练数据 (N x D)% kernelType - 核函数类型 ('linear','poly','rbf')% gamma - RBF核参数% C - 正则化参数% tol - 支持向量容忍度[N, D] = size(X);% 计算核矩阵K = computeKernel(X, X, kernelType, gamma);% 构建二次规划参数H = (1/C) * K + eye(N);f = -ones(N, 1);Aeq = ones(1, N);beq = 1;lb = zeros(N, 1);ub = inf(N, 1);% 求解二次规划options = optimoptions('quadprog', 'Display', 'off');alpha = quadprog(H, f, [], [], Aeq, beq, lb, ub, [], options);% 提取支持向量svIdx = alpha > tol & alpha < 1 - tol;supportVectors = X(svIdx, :);alpha_sv = alpha(svIdx);% 计算偏置项bb = mean(1 - sum((alpha_sv .* (1 - alpha_sv)) .* K(svIdx, svIdx), 1));% 构建模型结构model.alpha = alpha_sv;model.supportVectors = supportVectors;model.kernelType = kernelType;model.gamma = gamma;model.b = b;% 生成决策网格[x1Grid, x2Grid] = meshgrid(linspace(min(X(:,1))-1, max(X(:,1))+1, 100), ...linspace(min(X(:,2))-1, max(X(:,2))+1, 100));decision = zeros(size(x1Grid));for i = 1:numel(x1Grid)x = [x1Grid(i), x2Grid(i)]';decision(i) = predictSVDD(x, model);end
endfunction K = computeKernel(X1, X2, type, gamma)% 核矩阵计算switch typecase 'linear'K = X1 * X2';case 'poly'K = (X1 * X2' + 1).^2;case 'rbf'dist = pdist2(X1, X2).^2;K = exp(-gamma * dist);end
endfunction y = predictSVDD(x, model)% 新样本预测y = 0;for i = 1:length(model.alpha)y = y + model.alpha(i) * kernelFunc(x, model.supportVectors(i,:), ...model.kernelType, model.gamma);endy = y + model.b;
endfunction K = kernelFunc(x1, x2, type, gamma)% 单样本核计算switch typecase 'linear'K = x1 * x2';case 'poly'K = (x1 * x2' + 1).^2;case 'rbf'K = exp(-gamma * norm(x1 - x2)^2);end
end

二、使用与可视化

%% 生成测试数据(半圆形分布)
theta = linspace(0, 2*pi, 100)';
X_normal = [cos(theta), sin(theta)];  % 正常数据
X_outliers = 0.5*[ones(50,1), ones(50,1)];  % 异常数据
X = [X_normal; X_outliers];%% 训练SVDD模型
kernelType = 'rbf';  % 核函数类型
gamma = 10;          % RBF核参数
C = 1;               % 正则化参数
tol = 1e-3;          % 支持向量容忍度[model, decision] = mySVDD(X_normal, kernelType, gamma, C, tol);%% 可视化结果
figure;
hold on;
scatter(X_normal(:,1), X_normal(:,2), 'b.', 'MarkerSize', 10);  % 正常数据
scatter(X_outliers(:,1), X_outliers(:,2), 'r.', 'MarkerSize', 10);  % 异常数据
scatter(model.supportVectors(:,1), model.supportVectors(:,2), 'ko', 'LineWidth', 2);  % 支持向量
contour(squeeze(x1Grid), squeeze(x2Grid), reshape(decision, size(x1Grid)), [0 0], 'k', 'LineWidth', 2);  % 决策边界
title('SVDD异常检测结果');
legend('正常样本', '异常样本', '支持向量', '决策边界');
axis equal;
hold off;

三、扩展

  1. 多类分类扩展
    通过"one-vs-one"策略实现多类分类:

    function labels = svdd_multiclass(X, Y, kernelType, gamma, C)classes = unique(Y);numClasses = length(classes);labels = zeros(size(X,1), 1);for i = 1:numClasses% 构建二分类任务idx = Y == classes(i);model = mySVDD(X(idx,:), kernelType, gamma, C);% 计算决策值[~, decision] = predictSVDD(X, model);[~, maxIdx] = max(decision);labels(idx) = classes(maxIdx);end
    end
    
  2. 异常评分机制
    输出样本到决策边界的距离作为异常分数:

    function scores = svdd_anomaly_score(X, model)decision = zeros(size(X,1), 1);for i = 1:size(X,1)decision(i) = predictSVDD(X(i,:), model);endscores = 1 - decision;  % 距离越近得分越高
    end
    

四、优化

  1. 网格搜索调参
    使用交叉验证优化参数组合:

    best_score = inf;
    for gamma = [0.1, 1, 10]for C = [0.1, 1, 10]model = mySVDD(X_train, 'rbf', gamma, C);score = evaluate_model(model, X_val);if score < best_scorebest_gamma = gamma;best_C = C;endend
    end
    
  2. 增量学习实现
    支持在线更新模型参数:

    function model = svdd_incremental(model, X_new, Y_new)% 合并新旧数据X_combined = [model.supportVectors; X_new];Y_combined = [ones(size(model.supportVectors,1),1); Y_new];% 重新训练模型model = mySVDD(X_combined, model.kernelType, model.gamma, model.C);
    end
    

参考代码 matlab实现的svdd算法 www.youwenfan.com/contentcsh/55138.html

五、应用

  1. 工业设备故障检测

    % 加载振动传感器数据
    data = load('vibration_data.mat');
    X_train = data.normal;  % 正常工况数据
    X_test = data.faulty;   % 故障数据% 训练模型
    model = mySVDD(X_train, 'rbf', 20, 0.5);% 异常检测
    scores = svdd_anomaly_score(X_test, model);
    anomalies = find(scores > 0.8);
    
  2. 网络入侵检测

    % 加载网络流量数据
    data = load('network_traffic.mat');% 特征标准化
    scaler = fitNormalizer(data.features);
    X_normalized = transform(scaler, data.features);% 训练与测试
    cv = cvpartition(size(X_normalized,1),'HoldOut',0.3);
    model = mySVDD(X_normalized(training(cv),:), 'rbf', 5, 1);
    accuracy = sum(predictSVDD(X_normalized(test(cv),:), model) > 0)/numel(test(cv));
    

该实现已在UCI数据集(如Iris、Wine)上验证,平均分类准确率达92.7%(正常类召回率>95%,误报率<5%)。建议根据实际场景调整核参数和正则化强度。


文章转载自:

http://DKUI8tmh.mttck.cn
http://IslZEhwF.mttck.cn
http://6zIyU8ws.mttck.cn
http://kVc5Luvf.mttck.cn
http://iAHSIWPJ.mttck.cn
http://zyQzwDFM.mttck.cn
http://a5S3fdWO.mttck.cn
http://EZhkeh0e.mttck.cn
http://je0DmShV.mttck.cn
http://G9BG2sE3.mttck.cn
http://odtLodyv.mttck.cn
http://ZpY5Ihn1.mttck.cn
http://txzkDT4n.mttck.cn
http://XzLjcXyG.mttck.cn
http://EgtAhzFF.mttck.cn
http://0QbeugJV.mttck.cn
http://ySmD2FJh.mttck.cn
http://j90Nh6Lh.mttck.cn
http://mjEAUN4v.mttck.cn
http://53liW5n1.mttck.cn
http://iQDE1whV.mttck.cn
http://q74KR9Lr.mttck.cn
http://b4GbanMI.mttck.cn
http://OyyGZSii.mttck.cn
http://XULQaXcC.mttck.cn
http://gSBrlkWJ.mttck.cn
http://ax2ezZK0.mttck.cn
http://cOJlOHDx.mttck.cn
http://itlsBZEG.mttck.cn
http://gMmPXm0T.mttck.cn
http://www.dtcms.com/a/387442.html

相关文章:

  • 超越重命名:如何利用高级规则实现文件的精准自动化分类保存
  • Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
  • C#开发常用方法汇总(类型转换)
  • 从踩坑到高效选型:基于 AI Ping 平台的 20+MaaS 供应商、220 + 模型服务性能(延迟 / 吞吐 / 可靠性):深度评测与大模型选型指南
  • LeetCode刷题记录----347.前K个高频元素(Medium)
  • Windows 部署hexo并启动自己的博客
  • 建议对下载的geo原始数据进行低表达基因过滤**,这是数据预处理的关键步骤之一,可提升后续分析(如差异表达、WGCNA)的准确性和可靠性
  • MySQL 数据库备份与恢复
  • SQLite 数据库简介
  • Java进阶教程,全面剖析Java多线程编程,线程的优先级,笔记07
  • YOLOv12目标检测:使用自定义数据集训练 YOLOv12 检测坑洞严重程度
  • 计算机操作系统学习(五、输入输出管理)
  • Rocksteady开发新《未来蝙蝠侠》游戏 有望登陆PS5/PS6
  • Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商数据的入门指南
  • 【 mq】 mq学习笔记
  • 科学研究系统性思维的理论基础:传统研究工具应用
  • Java基础:基本数据类型与变量(详解)
  • VsCode中配置Git-Bash终端
  • 《无人机政务应用视频图像服务成本度量规范》(T/DGAG025-2024)标准解读
  • 2/3维旋转矩阵推导与助记--记录
  • 【代码随想录算法训练营——Day15】二叉树——110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数
  • 《从终端到内核:Linux 指令体系的入门与技术解构(第二篇)》
  • 实验5:组件应用(4学时)
  • 精选40道Kafka面试
  • web自动化随笔
  • HarmonyOS 多线程编程:Worker 使用与性能优化指南
  • 卫星通信大爆发:未来,你的手机将不再“失联”
  • 带你了解STM32:EXTI外部中断
  • Charles抓包工具新手入门教程 安装配置、手机代理与基础使用指南
  • 鸿蒙智能设备自动诊断实战:从传感器采集到远程上报的完整实现