据我所知,我可以从使用一组数据训练后生成的LibSVM模型中解析出支持向量。
生成分类器的公式是什么?
我是否需要文件头中的数据,比如以下内容(内核等…在列出的支持向量之前):
svm_type c_svc kernel_type rbf gamma 0.125 nr_class 4 total_sv 1038 rho -0.859244 -0.876628 -0.958343 0.543365 -1.10722 -1.79433 label 2 1 3 0 nr_sv 364 276 242 156 SV
我的情况是
- 我想在Node.JS中进行分类。但目前还没有LibSVM的绑定可用。
- 由于我的模型不会改变,我希望在Node.JS中进行分类,并将模型保存在内存中。
- 如果这证明速度慢,我宁愿从头开始用C++编写相同的分类,并创建一个包装模块,如果这只是一个简单的计算(正如我所怀疑的那样)。
谢谢。
回答:
您应该能够将C函数翻译成Javascript。
这是相关的代码:
double svm_predict_values(const svm_model *model, const svm_node *x, double* dec_values){ int i; int nr_class = model->nr_class; int l = model->l; double *kvalue = Malloc(double,l); for(i=0;i<l;i++) kvalue[i] = Kernel::k_function(x,model->SV[i],model->param); int *start = Malloc(int,nr_class); start[0] = 0; for(i=1;i<nr_class;i++) start[i] = start[i-1]+model->nSV[i-1]; int *vote = Malloc(int,nr_class); for(i=0;i<nr_class;i++) vote[i] = 0; int p=0; for(i=0;i<nr_class;i++) for(int j=i+1;j<nr_class;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<ci;k++) sum += coef1[si+k] * kvalue[si+k]; for(k=0;k<cj;k++) sum += coef2[sj+k] * kvalue[sj+k]; sum -= model->rho[p]; dec_values[p] = sum; if(dec_values[p] > 0) ++vote[i]; else ++vote[j]; p++; } int vote_max_idx = 0; for(i=1;i<nr_class;i++) if(vote[i] > vote[vote_max_idx]) vote_max_idx = i; free(kvalue); free(start); free(vote); return model->label[vote_max_idx];}
请注意,您需要重新创建以下方程:
唯一的区别是由于您的模型有4个类别,您需要实现投票系统,这基本上就是上面的代码。
希望这对您有帮助。