⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 feixianxinghuigui.txt

📁 非线性回归通用程序,稍加修改即可用于各种非线性回归
💻 TXT
字号:
【原创】支持向量机非线性回归通用matlab程序

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    SVMNR.m
%    Support Vector Machine for Nonlinear Regression
%    支持向量机非线性回归通用matlab程序
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [Alpha1,Alpha2,Alpha,Flag,B]=SVMNR(X,Y,Epsilon,C,D)
%  ChengAihua,PLA Information Engineering University,ZhengZhou,China
%  Email:aihuacheng@gmail.com
%  All rights reserved
%本程序使用支持向量机法,实现对数据的非线性回归
%输入参数列表
%  X        输入样本,n×l的矩阵,n为变量个数,l为样本个数
%  Y        输出样本,1×l的矩阵,l为样本个数
%  Epsilon  ε不敏感损失函数的参数,Epsilon越大,支持向量越少
%  C        惩罚系数,C过大或过小,泛化能力变差
%  注意:核函数的设定和修改在函数内部进行,数据预处理在函数外部进行
%输出参数列表
%  Alpha1   α系数
%  Alpha2   α*系数
%  Alpha    支持向量的加权系数(α-α*)向量
%  Flag     1×l标记,0对应非支持向量,1对应边界支持向量,2对应标准支持向量
%  B        回归方程中的常数项

%第一步:构造K矩阵
[n,l]=size(X);
K=zeros(l,l);
for i=1:l
    for j=1:l
        xi=X(:,i);
        xj=X(:,j);
        %K(i,j)=sum(xi.*xj);
        %K(i,j)=(sum(xi.*xj)+1)^20;%注意:核函数在此定义!
        K(i,j)=exp(-(sum((xi-xj).^2)/D));
        %K(i,j)=exp(-(sum((xi-xj))/100));
    end
end
%第二步:构造二次规划模型参数H,Ft,Aeq,Beq,lb,ub
H=[K,-K;-K,K];
H=(H+H')/2;
Ft=[Epsilon*ones(1,l)-Y,Epsilon*ones(1,l)+Y];
Aeq=[ones(1,l),-ones(1,l)];
Beq=0;
lb=eps.*ones(2*l,1);
ub=C*ones(2*l,1);
%第三步:调用优化工具箱quadprog函数求解二次规划
OPT=optimset;
OPT.LargeScale='off';
OPT.Display='off';
[Gamma,Obj]=quadprog(H,Ft,[],[],Aeq,Beq,lb,ub,[],OPT);
%[Gamma,Obj]=fmincon('myfun',5.*ones(18,1),[],[],Aeq,Beq,lb,ub);
%第四步:整理输出参数
Alpha1=(Gamma(1:l,1))';
Alpha2=(Gamma((l+1):end,1))';
Alpha=Alpha1-Alpha2;
Flag=2*ones(1,l);
%第五步:支持向量的分类
Err=0.0000000000001;
for i=1:l
    AA=Alpha1(i);
    BB=Alpha2(i);
    if (abs(AA-0)<=Err)&&(abs(BB-0)<=Err)
        Flag(i)=0;
    end
    if (AA>Err)&&(AA<C-Err)&&(abs(BB-0)<=Err)
        Flag(i)=2;
    end
    if (abs(AA-0)<=Err)&&(BB>Err)&&(BB<C-Err)
        Flag(i)=2;
    end
    if (abs(AA-C)<=Err)&&(abs(BB-0)<=Err)
        Flag(i)=1;
    end
    if (abs(AA-0)<=Err)&&(abs(BB-C)<=Err)
        Flag(i)=1;
    end
end
%第六步:计算B
B=0;
counter=0;
for i=1:l
    AA=Alpha1(i);
    BB=Alpha2(i);
    if (AA>Err)&&(AA<C-Err)&&(abs(BB-0)<=Err)
        %计算支持向量加权值
        SUM=0;
        for j=1:l
            if Flag(j)>0
                %SUM=SUM+Alpha(j)*sum(X(:,j).*X(:,i));
                %SUM=SUM+Alpha(j)*(sum(X(:,j).*X(:,i))+1)^20;
                SUM=SUM+Alpha(j)*exp(-(sum((X(:,j)-X(:,i)).^2)/D));
                %SUM=SUM+Alpha(j)*exp(-(sum((X(:,j)-X(:,i)))/100));
            end
        end
        b=Y(i)-SUM-Epsilon;
        B=B+b;
        counter=counter+1;
    end
    if (abs(AA-0)<=Err)&&(BB>Err)&&(BB<C-Err)
        SUM=0;
        for j=1:l
            if Flag(j)>0
                %SUM=SUM+Alpha(j)*sum(X(:,j).*X(:,i));
                %SUM=SUM+Alpha(j)*(sum(X(:,j).*X(:,i))+1)^20;
                SUM=SUM+Alpha(j)*exp(-(sum((X(:,j)-X(:,i)).^2)/D));
                %SUM=SUM+Alpha(j)*exp(-(sum((X(:,j)-X(:,i)))/100));
            end
        end
        b=Y(i)-SUM+Epsilon;
        B=B+b;
        counter=counter+1;
    end
end
B=B/counter;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -