LS-SVM的核函数选取问题

  统计/机器学习 回归分析 开放问题    浏览次数: 441
0

编写了一个最小二乘支持向量机的程序,然后想先试一下有没有bug

于是选用了

X=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]

Y=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]T


其中X每一个数就是一个样本点,样本点在一维空间内,Y是值,这样其实就是一个y=x的函数,给了20个训练点

我首先使用了Gauss核函数进行LS-SVM拟合,

K=exp(-||X_i-X_j||^2/(2*σ^2)),σ=0.1,

结果Gauss核函数表现出了良好的局部特性,在训练点点的附近有很好的精度,但是当我要做预测时,比如输入一个X_i=25,得出来的结果完全不着边

然后又试着使用混合核函数:采用Gauss核函数与多项式核函数相结合:

K=λ*exp(-||X_i-X_j||^2/(2*σ^2))+(1-λ)*(X_i•X_j+1)^d,σ=0.1,d=2,

我更改了好几个λ的值,但是加了多项式核函数之后,不仅没有使得预测性变好,甚至连训练点附近也变得不对了


所以,以上我的使用有错误么?我检查了好像没有,为什么表现出这么差的预测性呢?是因为我的训练点取得太少了?针对这个简单的 y=x 的回归问题,应该怎么选取核函数?


 

CE_PAUL   2018-06-08 17:47



   1个回答 
3



1.Guassian核函数是做interpolation,也就是预测点周围要有训练点去支撑。你可以去掉Gaussian试试。

2.对于x=25,其实是利用线性模型做extrapolation。所以你不需要核。

3.核方法是针对高纬线性不可分问题的。

-------------------------------------------------------------------------

引用论文里公式


我写的Matlab代码。

clear,clc,close all;
x=[1:20]';
y=[1:20]'+rand(20,1)*0;
omega_train=omega(x);
gamma=10^10;
n=20;
I=ones(n,1);
% As=t
A=[0 I'
    I omega_train+1/gamma*eye(n)];
t=[0;y];
rank_A=rank(A)
s=inv(A)*t;
b=s(1)
lambda=s(2:end)
w=lambda'*x; % for linear kernel
figure;plot(lambda)
%% test
n_test=10;
x_test=100+[1:n_test]';
y_test=x_test;
y_test_hat=zeros(n_test,1);

for i=1:n_test
    xi=x_test(i);
    y_test_hat(i)=f1(xi,x,lambda,b);
end
figure;hold on
plot(x_test,y_test,'*')
plot(x_test,y_test_hat,'ro')
legend('ytest','ytest hat')
xlabel('x')
ylabel('y')
function K_out=K1(xi,xj)
% Gausssian kernel
%     sigma_sqr=10^10;
%     K_out=exp(-norm(xi-xj)^2/sigma_sqr);
% Linear Kernel
    K_out=xi'*xj;
end
function omega_out=omega(x)
    n=size(x,1);% number of data point
    omega_out=zeros(n,n);
    for i=1:n
        for j=1:n
            omega_out(i,j)=K1(x(i,:)',x(j,:)');
        end
    end
end
function f_out=f1(xi,x,lambda,b)
    n=size(x,1);
    f_out=b;
    ttemp=zeros(n,1);
    for i=1:n
        ttemp(i,1)=K1(xi,x(i));
        f_out=f_out+lambda(i)*ttemp(i);
    end
end

在你的数据,y中的error都很小,接近(等于)0。根据公式7第3行,当$\xi$很小时$\gamma$需要很大,比如10^10.

如果用Gaussian核时,如果预测很远的值,比如x=100,需要$\sigma^2$=10^10,也就是Gaussian的方差很大。每一个训练点都可以影响很远的点。

对于你的数据,以下参数可以有较好的结果:当linear核时,$\xi$>=1; 当Gaussian 核时,$\xi$>=10^10,$\sigma^2$=10^10。


Zealing   2018-06-08 22:19

十分感谢回答。 另外,我想,就是如何去判断问题是不是一个高维不可分问题也会出现问题,这是一个一维点的问题,如果点的坐标有28维,那么其实很难凭借直观印象去判断那个问题在28维空间内线性可分,因此可能在一些本可以使用线性核函数的情况下会误使用Gauss核函数这样的对应于隐式的更高维空间的核函数,请问这可以避免么? - CE_PAUL   2018-06-08 23:19
好的好的!十分谢谢! - CE_PAUL   2018-06-09 22:37


  相关主题

如何对大型线性回归进行并行计算?   2回答

Sigmoid核函数是不是对新输入的需要预测的点的测量误差不敏感?   1回答

线性回归是机器学习算法吗?   3回答

什么是“维数灾难”,为什么说引入核函数就避免“维数灾难”   1回答

有序的分类变量的预测是回归问题还是多分类问题?   3回答

泊松回归有哪些应用场景?   2回答

常用的回归模型中,哪些具有较好的鲁棒性(robustness)?   2回答

怎么处理真值大部分为0的回归问题   3回答

与基于一般形式的支持向量回归相比,最小二乘支持向量回归更准确?   2回答

在线性回归模型中存在epoch的说法吗?   2回答

怎么理解分位数回归quantile regression的目标函数?   1回答

如果迫使一个线性回归模型的截距为0,会有什么坏处吗?   2回答



回答问题时需要注意什么?

我们谢绝在回答前讲“生动”的故事。

我们谢绝“这么简单,你自己想”、“书上有的,你认真看”这类的回答;如果你认为对方的提问方式或者内容不妥,你可以直接忽略该问题,不用进行任何作答,甚至可以对该问题投反对票。

我们谢绝答非所问。

我们谢绝自己不会、硬要回答。

我们感激每一个用户在编写答案时的努力与付出!