SVM svm_predict_values详解

void svm_predict_values(const svm_model *model, const svm_node *x, double* dec_values)
{
if(model->param.svm_type == ONE_CLASS ||
  model->param.svm_type == EPSILON_SVR ||
  model->param.svm_type == NU_SVR)
{
double *sv_coef = model->sv_coef[0];
double sum = 0;
for(int i=0;il;i++)
sum += sv_coef[i] * Kernel::k_function(x,model->SV[i],model->param);
sum -= model->rho[0];
*dec_values = sum;
}
else
{
int i;
int nr_class = model->nr_class;
int l = model->l;
double *kvalue = Malloc(double,l);
for(i=0;i
{
kvalue[i] = Kernel::k_function(x,model->SV[i],model->param);
// printf("kvalue[%d]: %lf \n",i,kvalue[i]) ;
}

int *start = Malloc(int,nr_class);
start[0] = 0;
for(i=1;i
start[i] = start[i-1]+model->nSV[i-1];   //正负支持向量的个数

int p=0;
for(i=0;i
for(int j=i+1;j
{
double sum = 0;
int si = start[i];
int sj = start[j];
int ci = model->nSV[i];
int cj = model->nSV[j];
int k;
double *coef1 = model->sv_coef[j-1];

double *coef2 = model->sv_coef[i];
for(k=0;k
sum += coef1[si+k] * kvalue[si+k];
for(k=0;k
sum += coef2[sj+k] * kvalue[sj+k];
sum -= model->rho[p];
dec_values[p] = sum;
p++;
}

free(kvalue);
free(start);
}
}

假如有n类,则上述循环每次乘的系数如下表所示,其中(1,2)代表当第一类和第二类比较时,与第一类对应的向量乘的系数,(1,2)代表当第一类和第二类比较时,与第二类对应的向量乘的系数,依次类推。且(1,2)是一个列向量,如果第一类有m个向量与之对应,则(1,2)就是一个m维的列向量。

(1,2)

(1,3)

(1,4)

(1,5)

(1,n)

(2,1)

(2,3)

(2,4)

(2,5)

(3,n)

(3,1)

(3,2)

(3,4)

(3,5)

(4,n)

(4,1)

(4,2)

(4,3)

(4,5)

(5,n)

(5,1)

(5,2)

(5,3)

(5,4)

(6,n)

(n,1)

(n,2)

(n,3)

(n,4)

(n,n-1)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值