【问题标题】:Very long numbers after adding symbolic variables?添加符号变量后的数字很长?
【发布时间】:2017-02-14 15:46:08
【问题描述】:

所以我想确定我的 SVM 分类器的 alphabetagamma 值,我训练了我的 SVM 分类器并确定了 alpha 和支持向量。我的支持向量每行有 3 个变量,下面是我的支持向量中的十行:

0.0904235536887480  -0.269325475875919  -0.678528701392414
-0.321039098061280  -0.507618180664821  -1.42365662798284
-0.0737761304021185 -0.269641311369441  -0.647521877863172
0.00105779420640393 -0.311226557946309  -0.667506146498475
0.0913098589312967  -0.289462325547514  -0.391261050348894
0.00622693949845773 -0.166248587146820  -0.149546793127464
-0.292302915842567  -0.564676268888150  -1.60153093563523
0.112997393643248   -0.310512134534035  -0.725281274142312
-0.135361511770186  -0.456321702624641  -1.26973221898260
-0.173160731078767  -0.434439033384469  -1.22687774941370

同样,下面是我的 alpha 的十行:

-1
-1
-1
-1
-1
-1
-1
-1
-1
-1

所以我基本上做的是像这样确定系数:

c = (-1)*[0.0904*x1 + (-0.2693)*x2 + (-0.6785)*x3] + (-1)*[(-0.321)*x1 + (-0.5076)*x2 + (-1.4236)*x3].....

以此类推,直到我的alpha 的大小。

所以我在 Matlab 中编写了以下代码

syms x1, syms x2, syms x3;

alpha = SVMStruct.Alpha;
svm_vec = SVMStruct.SupportVectors;

for i = 1:size(alpha,1)
    c(i) = alpha(i)*(svm_vec(i,1)*x1 + svm_vec(i,2)*x2 + svm_vec(i,3)*x3);
end

sum_it = sum(c);

但这产生了一个非常奇怪的输出:

(107845064549358722206080751595348329973204613074833920445585562521882937008164658045489239834546021458299139*x1)/50534761550197893278639420198779799540396107395587434771118149413836407509953624874438129483687080755200 + (95720990302914087945142311872326568914380675701489099929103269189530321664249312169660240242394455632803627*x2)/134178504805697854567421908803656709124500009291732154392279224305703564767807900528680550698065697177600 + (90626366614084720573448362168042659133754200934323766866906741825007634289583081638045482944881264585156183*x3)/125521827076297992982426946945356276277758073208394596044390242092432367040852552107475353878835652198400

这是预期的输出吗?为什么我得到它作为分数?

从输出看,我是否正确地实现了我的方程式?

【问题讨论】:

    标签: matlab vector linear-equation


    【解决方案1】:

    您的计算输入是符号变量,因此使用这些变量的任何计算都将产生一个精确的值,也是一个符号变量。如果您想要结果的近似浮点表示,您需要将总和转换为double

    double(sum_it)
    

    不过,为了做到这一点,您需要为 x1x2x3 指定实际值

    double(subs(sum(c), [x1, x2, x3], [1, 2, 3]))
    

    话虽如此,我认为您实际上想要的是求解方程组。您可以使用\ 运算符来执行此操作

    variables = svm_vec \ alpha;
    

    【讨论】:

    • 感谢您的回复,我不能使用double,因为我不知道x1、x2 和x3 的值,我只对这些变量的系数感兴趣。我不知道\ 实现了什么,我阅读了它,但并不完全理解它的目的。话虽如此,我的实现是否正确?如果是这样,我可以手动将这些数字与x1 相除以获得该系数,对吗?
    • @StuckInPhD:使用vpa。不知道为什么你需要这个应用程序的符号或可变精度数学。
    • @StuckInPhD 你不是要解决x1x2x3 的问题吗?
    • @horchler vpa 是我想要的 谢谢。我只对找到这些变量的系数感兴趣。
    • @Suever 不,我只对找出这些变量的系数感兴趣,基本上是 alpha、beta 和 gamma 的值,它们是这些支持向量的比例因子。
    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 2015-01-23
    • 2021-12-15
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多