SVM回归用于预测?

4

我希望使用支持向量机(SVM)进行预测。我已经编写了以下代码,使用matlab函数fitrsvmpredict

tb = table(x,y)                                                  
Mdl = fitrsvm(tb,'y','KernelFunction','gaussian')                                                                          
YFit = predict(Mdl,tb);                                
scatter(x,y);                                                   
hold on                                                
plot(x,YFit,'r.')

我得到的输出结果是这里。这里蓝色代表测试值(tb),红色代表使用SVM算法的预测值。显然,这个预测是错误的。是否有人能告诉我如何改进预测,使其更接近实际测量值?

1
默认情况下,fitrsvm使用线性核函数,从而得到一个线性回归模型。您应该指定您的核函数来执行非线性拟合。请注意,在您的情况下,回归拟合可能更为适当。 - m7913d
你如何按照给出的格式添加内核函数?我尝试了但是给了我一个错误。有什么想法吗? - Ankita
我想要添加高斯核。 - Ankita
我已经尝试过了,但预测仍然不太准确,请看看是否有任何改进的想法? - Ankita
我刚刚完成了。请看一下。 - Ankita
1个回答

3
你应该使用像RBF或高斯函数这样的核函数。 在此输入图像描述 SVM的默认核是K(xi,xj)= xi*xj,它是一个线性核。当然,你只能得到线性回归结果。
代码如下:
x = 0:0.01:5 ;
y = sin(x)+rand(1, length(x)) ;
x = x' ;
y = y' ;
tb = table(x,y) ;
Mdl = fitrsvm(tb,'y','KernelFunction','gaussian');
YFit = predict(Mdl,tb);                                
scatter(x,y);                                                   
hold on                                                
plot(x,YFit,'r.')

=======================================================================
关于结果的准确性,它取决于许多因素,如内核类型、惩罚系数调整或其他因素,通常需要四次调整参数。交叉验证可以帮助您找到一组好的参数。


谢谢您。我也尝试了同样的方法,得到了与问题中显示的输出相同的结果。但是我仍然觉得离测试值还有很大的差距。您能否建议我如何进一步提高我的预测?我听说 BoxConstraint、KernelScale 和 Epsilon 可以帮助提高我的预测能力,但不知道如何将其应用于这个问题。 - Ankita
我认为提高准确性最简单的方法是进行交叉验证,找到具有最佳测试准确性的最佳训练集。至于比例或惩罚系数等其他因素,也可以起作用,但需要调整,这是一项繁琐的工作。 - FesianXu
谢谢您。您能告诉我如何使用交叉验证来找到最佳的训练集的一些示例吗? - Ankita
如果您有足够的训练样本,可以将它们随机分成K个折叠,其中一个(也许是两个或一些您喜欢的数量,但不要太大)作为测试集,其余的作为训练集。使用训练集来训练模型,并使用测试集来测试模型,记录当前模型的准确性和参数,直到所有训练集都被完全使用。然后使用最佳准确度中的模型参数。这通常需要耗费时间。 - FesianXu
有没有Matlab函数的例子?有很多,我被这么多函数搞糊涂了。你能给一个可以做到这个的例子吗? - Ankita
我只是手动进行交叉验证,随机抽样并将训练集馈送给模型就足够了。我不知道MATLAB中是否有一个函数可以自动地适用于所有回归或分类模型。实际上,这并不是很困难,也许你应该先尝试一下。 - FesianXu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接